16

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

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

编辑:

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

4

6 回答 6

12

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

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

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

于 2008-10-12T14:14:27.947 回答
2

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

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

于 2008-10-12T14:51:18.760 回答
1

看看GNU gettext

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

于 2008-10-12T13:42:12.940 回答
1

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

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

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

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

于 2008-10-12T13:52:37.630 回答
0

对于 UTF-8 支持,请查看UTF-8 CPP库。

于 2008-10-12T15:06:10.633 回答
-3

You do not need libraries to accomplish this task. See the MS guide for Satellite DLLs here.

If you specify to use Unicode in the project settings and use Unicode String functions (instead of char) then the standard use of Satellite DLLs to hold locale specific data (dialog boxes, Strings etc) will be enough.

Windows itself will take care of finding the correct resource so long as the DLL is correctly named. The suffixs needed for the satellite DLLs are here .

于 2009-11-15T20:40:14.507 回答