为C ++程序添加多语言支持的最佳方法是什么?
如果可能,应该从包含键值对的纯文本文件中读取语言(§WelcomeMessage§“Hello%s!”)。
我想到了添加一个localizedString(key)函数,它返回加载的语言文件的字符串。是否有更好或更有效的方法?
//half-pseudo code
//somewhere load the language key value pairs into langfile[]
string localizedString(key)
{
//do something else here with the string like parsing placeholders
return langfile[key];
}
cout << localizedString(§WelcomeMessage§);
答案 0 :(得分:10)
没有外部库的最简单方法:
// strings.h
enum
{
LANG_EN_EN,
LANG_EN_AU
};
enum
{
STRING_HELLO,
STRING_DO_SOMETHING,
STRING_GOODBYE
};
// strings.c
char* en_gb[] = {"Well, Hello","Please do something","Goodbye"};
char* en_au[] = {"Morning, Cobber","do somin'","See Ya"};
char** languages[MAX_LANGUAGES] = {en_gb,en_au};
这会给你你想要的。显然你可以从文件中读取字符串。即。
// en_au.lang
STRING_HELLO,"Morning, CObber"
STRING_DO_SOMETHING,"do somin'"
STRING_GOODBYE,"See Ya"
但是你需要一个字符串名称列表来匹配字符串标题。即。
// parse_strings.c
struct PARSE_STRINGS
{
char* string_name;
int string_id;
}
PARSE_STRINGS[] = {{"STRING_HELLO",STRING_HELLO},
{"STRING_DO_SOMETHING",STRING_DO_SOMETHING},
{"STRING_GOODBYE",STRING_GOODBYE}};
上面的内容应该在C ++中稍微容易一些,因为你可以使用枚举类toString()方法(或者不管怎么样 - 不能费心去查找它。)
您需要做的就是解析语言文件。
我希望这会有所帮助。
PS:并访问字符串:
languages[current_language][STRING_HELLO]
PPS:对C ++答案的半个半答案道歉。
答案 1 :(得分:6)
ICU library就是为此设计的。
答案 2 :(得分:5)
Space_C0wb0w的建议很好。我们目前在我们的产品中成功使用ICU。
回应你对他的回答的评论:确实很难说ICU“小巧,干净,简单”。 ICU的“Java-ish”界面存在“意外”的复杂性,但其复杂性和大小的很大一部分来自于它所解决的问题域的复杂性和大小。
如果您不需要ICU的全部功能并且只对“消息转换”感兴趣,您可能需要查看GNU gettext,这取决于您的平台和许可要求,可能是“更小,更干净”而不那么复杂的“替代方案。
Boost.Locale项目也是一个有趣的选择。实际上,它的“Messages Formatting”功能基于gettext模型。
答案 3 :(得分:3)
由于您要求最佳方式(并且没有提及平台),我建议GNU Gettext。
可以说它是用于C / C ++编程的最完整,最成熟的国际化库。