C++,多语言/本地化支持

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++答案道歉.


Bjö*_*lex 6

ICU库只是为此设计.

  • 但我不想要兆字节的额外库和依赖项.我需要一种小巧,干净,简单的方法来为程序添加其他语言字符串. (6认同)

Éri*_*ant 5

Space_C0wb0w的建议很好.我们目前在我们的产品中成功使用ICU.

回应你对他的回答的评论:确实很难说ICU"小巧,干净,简单".ICU的"Java-ish"界面存在"偶然"复杂性,但其复杂性和大小的很大一部分来自于它所解决的问题域的复杂性和大小.

如果您不需要ICU的全部功能并且只对"消息转换"感兴趣,您可能需要查看GNU gettext,根据您的平台和许可要求,它可能是"更小,更清洁,更简单"的替代方案.

Boost.Locale项目也是一个有趣的选择.实际上,它的" 消息格式化 "功能基于gettext模型.