【问题标题】:C++, Multilanguage/Localisation supportC++,多语言/本地化支持
【发布时间】:2011-07-22 21:54:12
【问题描述】:

向 C++ 程序添加多语言支持的最佳方法是什么?

如果可能,应该从包含键值对(§WelcomeMessage§ "Hello %s!")之类的纯文本文件中读取语言。

我想到了添加一个返回已加载语言文件字符串的本地化字符串(键)函数。有没有更好或更有效的方法?

//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§);

【问题讨论】:

标签: c++ localization translation multilingual


【解决方案1】:

没有外部库的最简单方法:

// 字符串.h

enum
{
     LANG_EN_EN,
     LANG_EN_AU
};

enum
{
     STRING_HELLO,
     STRING_DO_SOMETHING,
     STRING_GOODBYE
};

// 字符串.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++ 的答案道歉。

【讨论】:

  • 谢谢,但可以这样使用非拉丁文本(如中文或俄文)吗?
  • 制作字符串unsigned char,然后使用utf-8。
【解决方案2】:

Space_C0wb0w 的建议不错。我们目前在我们的产品中成功地使用了 ICU。

回应您对他的回答的评论:确实很难说 ICU 是“小、干净、简单”。 ICU 中的“意外”复杂性来自其“Java-ish”接口,但很大一部分复杂性和规模仅仅来自于它正在解决的问题域的复杂性和规模。

如果您不需要 ICU 的全部功能并且只对“消息翻译”感兴趣,您可能需要查看GNU gettext,根据您的平台和许可要求,它可能是“更小、更清洁、更少- 复杂的”替代方案。

Boost.Locale 项目也是一个有趣的选择。事实上,它的“Messages Formatting”功能是基于gettext模型的。

【讨论】:

  • 哇,Boost.Locale 看起来制作精良!
【解决方案3】:

由于您要求最佳方式(并且没有提及平台),我会推荐GNU Gettext。

可以说它是最完整、最成熟的 C/C++ 编程国际化库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多