blu*_*rnd 7 c++ multilingual translation localization
为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§);
Run Code Online (Sandbox Code Playgroud)
PAn*_*ine 10
没有外部库的最简单方法:
// strings.h
enum
{
LANG_EN_EN,
LANG_EN_AU
};
enum
{
STRING_HELLO,
STRING_DO_SOMETHING,
STRING_GOODBYE
};
Run Code Online (Sandbox Code Playgroud)
// 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};
Run Code Online (Sandbox Code Playgroud)
这会给你你想要的.显然你可以从文件中读取字符串.即
// en_au.lang
STRING_HELLO,"Morning, CObber"
STRING_DO_SOMETHING,"do somin'"
STRING_GOODBYE,"See Ya"
Run Code Online (Sandbox Code Playgroud)
但是你需要一个字符串名称列表来匹配字符串标题.即
// 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}};
Run Code Online (Sandbox Code Playgroud)
上面的内容应该在C++中稍微容易一些,因为你可以使用枚举类toString()方法(或者它的任何东西 - 不能打扰查找它).
然后你要做的就是解析语言文件.
我希望这有帮助.
PS:并访问字符串:
languages[current_language][STRING_HELLO]
Run Code Online (Sandbox Code Playgroud)
PPS:为半个C++答案道歉.
Space_C0wb0w的建议很好.我们目前在我们的产品中成功使用ICU.
回应你对他的回答的评论:确实很难说ICU"小巧,干净,简单".ICU的"Java-ish"界面存在"偶然"复杂性,但其复杂性和大小的很大一部分来自于它所解决的问题域的复杂性和大小.
如果您不需要ICU的全部功能并且只对"消息转换"感兴趣,您可能需要查看GNU gettext,根据您的平台和许可要求,它可能是"更小,更清洁,更简单"的替代方案.
该Boost.Locale项目也是一个有趣的选择.实际上,它的" 消息格式化 "功能基于gettext模型.
| 归档时间: |
|
| 查看次数: |
11764 次 |
| 最近记录: |