向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§);
没有外部库的最简单方法:
// 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 + C一半的答案表示歉意。
ICU library专为此设计。
Space_C0wb0w的建议是一个好建议。我们目前在产品中成功使用ICU。
回应您对他的回答的评论:确实很难说ICU是“小巧,干净,简单”。 ICU的“ Java-ish”界面有“偶然的”复杂性,但是很大一部分的复杂性和规模仅仅是它要解决的问题域的复杂性和规模。
[如果您不需要ICU的全部功能,而只对“消息翻译”感兴趣,则可能要看GNU gettext,根据您的平台和许可要求,它可能是“更小,更干净,更便宜-复杂”的替代方法。
Boost.Locale项目也是一个有趣的选择。实际上,其“ Messages Formatting”功能基于gettext模型。
由于您要求的是[[best方式(并且未提及平台),所以我建议GNU Gettext。
可以说,它是C / C ++编程最完整,最成熟的国际化库。