目前我在编译时选择语言,如下:
#define FRENCH_LANG 0
#define ZULU_LANG 0
#define ENGLISH_LANG 1
#if(FRENCH_LANG == 1)
const char PROMPT_HELLO[] = "Bonjour";
const char PROMPT_THANKS[] = "Merci";
#elif(ZULU_LANG == 1)
const char PROMPT_HELLO[] = "Sawubona";
const char PROMPT_THANKS[] = "Ngiyabonga";
#elif(ENGLISH_LANG == 1)
const char PROMPT_HELLO[] = "Hello";
const char PROMPT_THANKS[] = "Thanks";
#endif
int main(int argc, char *argv[]) {
printf("%s\r\n", PROMPT_HELLO);
printf("%s\r\n", PROMPT_THANKS);
return 0;
}
我想更改我的代码,以便编译所有语言,并且用户可以选择所需的语言。有没有一种聪明的方法来做到这一点,这样我就不必复制或复制我的 printf 了?
作为Someprogrammer dude答案的变体,您可以使用结构和保持当前语言的全局指针。不需要枚举,通过删除一级间接访问更容易:
struct strings {
const char *hello;
const char *thanks;
};
const struct strings strings_english = {
.hello = "Hello",
.thanks = "Thanks",
};
const struct strings strings_zulu = {
.hello = "Sawubona",
.thanks = "Ngiyabonga",
};
const struct strings_french = {
.hello = "Bonjour",
.thanks = "Merci",
};
static const struct strings *current_strings = NULL;
void set_language(const char *code)
{
if(strcmp(code, "en") == 0)
current_strings = &strings_english;
...
}
int main(void)
{
set_language("en");
printf("%s\n", current_strings->hello);
return 0;
}
当然这里有很多地方需要改进,但它可以是体面的。.hello =
在初始值设定项中重复成员名称(等等)使验证更容易一些,如果/当您采取步骤构建工具来提取/更新文本时,也可能使生活更轻松。有时翻译不是由程序员完成的,这需要一种将文本输入和输出程序的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句