【问题标题】:Resources for I18N in C++C++ 中的 I18N 资源
【发布时间】:2008-10-12 13:40:48
【问题描述】:

我正在玩 c++ 中的语言环境和 I18N 的东西,并且一直在寻找真实世界的例子。我在他的book(C++11 的第 2 版将于 2012 年 4 月发布)中通读了有关 I18N 的 Josuttis 章节,发现它很有用,但没有可借鉴的真实世界示例我不知道我是否'm 遵循最佳实践正在犯初学者错误。 StackOverflow 可以为我在网络上和印刷品上提供哪些资源来用 C++ 做 I18N 的事情?

还有哪些可用于 C++ 的库使 i18n 更容易?标准库中没有什么需要?乍一看,标准库中似乎不存在 UTF8 支持。

编辑:

在做了更多阅读之后,似乎 C 和 C++ 都是 Unicode“不可知论”。似乎还需要使用第三方库来处理以 Unicode/UTF8/16/32 编码的数据。关键在于标准库本身只考虑 ISO 8859 和相关字符页面,这些页面会根据您的语言环境设置而改变。这意味着我可能想将 ICU 库用于字符串,而不是使用 std::string 甚至 std::wstring

【问题讨论】:

    标签: c++ internationalization


    【解决方案1】:

    您已被指向GNU gettext,它允许您在运行时用本地化版本替换文字字符串 - 本地化的一个方面(这是在您完成国际化之后发生的事情,当有人实际使用您的国际化特定语言环境中的代码)。您还被指向Boost(特别是Boost.Locale)库;对于与 C++ 相关的任何事情,这通常是一个很好的答案。

    您可能会看到的另一个地方是ICU(Unicode 国际组件)项目。作为数据源,您可能会将CLDR(通用区域设置数据存储库)视为有关不同区域设置的信息源; Unicode 网站还包含许多关于不同文化其他方面的信息,因为它涉及多种语言。

    作为目前的最后一个资源,一个相当专业的资源,有Olson Time Zone database,它每年都会更新多次,以跟踪不同国家如何改变他们关于何时在冬季和夏季之间改变的规则(夏令时和标准)时间。

    【讨论】:

      【解决方案2】:

      看看wxWidgets 的国际化示例。它有一个在gettext 中使用的翻译机制的非gnu 实现(前面提到过)。您甚至可以在商业应用中使用它,因为 wxWidgets 许可证允许您这样做。

      如果您只是在寻找一种将应用程序国际化的方法,那么 gettext 就是起点。

      【讨论】:

        【解决方案3】:

        看看GNU gettext

        知道您使用的是哪个 C++ 库会很有趣,因为一些 GUI 库已经提供 i18n 支持。

        【讨论】:

          【解决方案4】:

          我第二个 GNU gettext。然而,如果你使用 Qt(如果你想用 C++ 做 GUI,机会很大),Qt 有它自己的 gettext 版本和一个很好的翻译工具(Qt Linguist),它使事情变得更容易,也可以使用从非 GUI 应用程序无需开销。我们甚至在服务中也有它。

          但是,关于 C++ 缺乏什么,我想到的是:

          • 完全支持数字、日期或货币的区域设置。请记住,语言环境的不同不仅仅是小数分隔符,包括排序,这让我想到了第二点:
          • C++ 本身没有支持有序参数的格式函数(因为在另一种语言中,词序可能与您的语言不同)。您可以为此使用 boost::format 。 Qt 当然也支持它。

          还要看看你必须为自己做些什么,即使这些事情是受支持的。例如,.NET 附带了一个完整的语言环境列表,可供使用。

          【讨论】:

          • Qt 不是真正的 C++,因为它使用 MOC,一个元对象编译器,但是没问题。看看 Copperspice 真正移植到 Qt 的 C++。
          【解决方案5】:

          有关 UTF-8 支持,请查看 UTF-8 CPP 库。

          【讨论】:

            【解决方案6】:

            您不需要库来完成此任务。请参阅卫星 DLL 的 MS 指南here

            如果您在项目设置中指定使用 Unicode 并使用 Unicode 字符串函数(而不是 char),那么标准使用 Satellite DLL 来保存特定于语言环境的数据(对话框、字符串等)就足够了。

            只要 DLL 被正确命名,Windows 本身就会负责查找正确的资源。附属 DLL 所需的后缀是 here

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多