【问题标题】:Using GNU gettext on Win32在 Win32 上使用 GNU gettext
【发布时间】:2009-03-10 00:38:01
【问题描述】:

我正在编写一个主要针对 GNU/Linux 和 Mac OS X 系统的游戏,但我一直在我的大部分代码中保持相当可移植性。

我已经将几乎所有特定于操作系统的东西都移植到了 Windows;唯一剩下的是i18n。

我的问题是这个

我应该如何将 Win32 的 setlocale() 函数与 gettext 一起使用?

到目前为止,我一直在使用 ISO 638/ISO 3166 代码(例如 de_DE.utf8),但这些代码似乎不适用于 Windows。

我尝试了 setlocale(LC_ALL, "German"),它成功了,但是 gettext 无法正确找到翻译后的字符串,即使在使用 bindtextdomain 之后也是如此。

有什么提示吗?我想坚持使用 GNU gettext 以避免重写大量代码。

【问题讨论】:

    标签: winapi gettext


    【解决方案1】:

    好吧,经过一番挖掘,我找到了答案:Windows 上的 setlocale() 对 gettext 没有任何作用。 gettext 使用用户的环境和线程的区域设置(请参阅 GetThreadLocale、SetThreadLocale)。如果使用线程的区域设置,则返回的 LCID 将转换为具有 ISO 639 和 3166 的语言字符串(例如 en_US),并且在 *nix 上进行查找。

    【讨论】:

    • 你能把你的端口发给我吗?我实际上遇到了同样的问题,周围只有过时的 win32 垃圾箱:(
    【解决方案2】:

    如果您能阅读 Python 示例,那么我的小项目有助于将 Windows 区域设置 ID 转换为 gettext 语言代码,例如 de_DE:https://launchpad.net/gettext-py-windows

    简而言之,您需要使用函数GetUserDefaultLCID() 获取LCID,它会返回一个整数id。然后您需要将此值映射到字符串代码。在 Python 中,标准模块 locale.py 中有映射:请参阅文件底部附近的 windows_locale 字典 http://svn.python.org/view/python/trunk/Lib/locale.py?view=markup

    您可以在此处找到 Windows 区域设置 ID 列表:http://msdn.microsoft.com/en-us/library/dd318693%28VS.85%29.aspx

    获得语言代码 (de_DE) 后,您需要将其直接传递给 gettext 库或使用环境变量 LANGUAGE 间接传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多