【问题标题】:Is there a way to access the locale used by gettext under windows?有没有办法在windows下访问gettext使用的语言环境?
【发布时间】:2010-05-02 15:49:23
【问题描述】:

我有一个程序,其中 i18n 由 gettext 处理。该程序运行良好,但出于某种原因,我需要知道在 win32 下运行时 gettext 使用的语言环境的名称(类似于“fr_FR”)。

我查看了 gettext 源,有一个非常可怕的函数可以在所有平台上计算它(gl_locale_name,在一个名为“localename.h/c”的 C 文件中)。但是,这个文件似乎没有与 gettext 或 libintl 一起安装,所以我似乎无法调用该函数。 gettext 是否提供了另一个函数来获取此值?或者在另一个包中(boost,glib,什么?)

(在相关说明中,C++ 标准库中有一个叫做 std::locale 的东西,根据调用 std::locale("") 的文档,应该使用系统的设置创建一个语言环境,除非我弄错了......但是在windows下名称是'C'。这是获取语言环境名称的可行方法吗?我做错了什么?)

【问题讨论】:

    标签: c++ c windows gettext


    【解决方案1】:

    在 Windows 上通常使用函数GetUserDefaultLCID,它会返回区域设置标识符的整数值。要将 LCID 转换为像 'fr_FR' 这样的字符串,您需要根据来自 http://msdn.microsoft.com/en-us/library/ms776260 的信息对其进行映射

    【讨论】:

    • 是的,我已经从 gettext 的内部看到了多头 hydra 中提到的函数“gl_locale_name”。逻辑和映射也在那里完成,我暗暗希望我可以,你知道,调用一个函数并获取值,因为它必须被计算来翻译任何消息。我想我的希望太高了。该睡觉了。
    • @phtrivier 您还应该知道 LANGUAGE 环境变量会影响 gettext 并覆盖 Windows 设置。
    【解决方案2】:

    原来“gl_locale_name”函数不是 gettext 的一部分,而是 gnulib 的一部分 - http://www.gnu.org/software/gnulib。我今天才发现这个包裹。

    因此,在我的项目中获得臭名昭著的 localename.h 标头只是

    gnulib-tool --import localename
    

    然后 gl_locale_name 函数在交叉编译时工作得很好。

    感谢大家的回答!

    【讨论】:

      【解决方案3】:

      您可以使用 setlocale(NULL) 从 CRT 中提取语言环境。但是从Windows,我不知道。此外,gettext 是一个非常通用的函数,您必须更具体地了解 gettext 是什么。

      【讨论】:

      • 不确定我是否理解您的评论...我正在使用 gettext 包中的 gettext() 函数翻译字符串...在运行时它在 GNU/Linux 和 windows 下都可以很好地翻译两者我已经翻译了字符串的语言环境。但是我需要在运行时知道用户的语言环境。我想既然 gettext (或者可能是 libintl ?)设法做到这一点,一定有办法得到它。
      • 所以我尝试了这个:setlocale(LC_MESSAGES, ""); char * l = setlocale(LC_MESSAGES, NULL); printf("语言环境:%s\n", l); (在我的一些神经元克服了要获得语言环境的事实之后,你必须调用,啊哼,setlocale。)在linux下,我在windows下得到了正确的语言环境(在与mingw-cross-env交叉编译之后,整洁的包装,去看看),它只是打印“(空)”。我想有时候是真的该睡觉了。
      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      相关资源
      最近更新 更多