【问题标题】:What are gettext's categories?gettext 的类别是什么?
【发布时间】:2023-02-10 23:45:17
【问题描述】:

在我们的项目中实现 gettext 时,我看到一些对“类别”的淡淡提及,但它仍然令人困惑......

通过PHP Manual,我看到它们是那些本地化常量,如LC_MESSAGESLC_MONETARY等。
我以前在我的 Linux 机器上选择本地化选项时见过这些(例如,我使用美国英语的系统,但使用英国英语的日期,所以我的周从星期一开始)。

我知道它们意味着不同类别的本地化工作,如 gettext manual itself 中所述,但是.........手册还指出 gettext 是关于翻译字符串(因此,属于 LC_MESSAGES

讯息
最明显的区域是区域设置中的语言支持。这就是 GNU gettext 为开发人员和用户提供轻松更改软件用于与用户交流的语言的方法的地方。


因此:
有人会如何将 gettext 用于其他类别,例如时间、货币、字符集或数字?

我用一个 PHP 函数作为例子,但你可以用任何语言的例子来回答——如果你认为 PHP 有自己的一套工具来改变货币、格式化日期和数字等,我想这甚至更有意义。

【问题讨论】:

    标签: localization internationalization translation gettext


    【解决方案1】:

    tl;dr:始终使用LC_MESSAGES

    gettext 系列函数只能翻译字符串。它不能神奇地转换日期或格式化数值。

    检索翻译最灵活的函数是dcgettext(domainname, msgid, category),其中domainname是您的文本域,msgid是您要翻译的字符串,category是区域设置类别,例如LC_MESSAGESdgettext(domainname, msgid) 使用类别LC_MESSAGES,普通gettext(msgid) 使用LC_MESSAGES 和您使用textdomain(domainname) 或默认文本域“消息”设置的文本域。

    这个答案的其余部分主要是有根据的猜测。试一试,实在不行就验证一下。

    为了确定当前语言环境,gettext 执行setlocale(category, NULL),其中categorydcgettext 的第三个参数。如果您使用另一个类别调用 dcgettext,例如 LC_NUMERIC,它可能会使用该类别而不是 LC_MESSAGES。因此,如果您将LC_MESSAGES 设置为“de_DE”并将LC_NUMERIC 设置为“it_IT”,它可能会搜索意大利语翻译。

    另一方面是翻译文件的搜索路径(.mo文件)。如果你执行bindtextdomain("yourtextdomain", "/usr/local/share/locale"),意大利语翻译文件应该在“/usr/local/share/locale/it/LC_MESSAGES/yourtextdomain.mo”。我的猜测是“LC_MESSAGES”将被替换为“LC_NUMERIC”。但同样,我不确定。

    请记住,使用 LC_MESSAGES 以外的任何其他语言环境类别都没有意义,至少在我看来是这样。

    有趣的事实:LC_MESSAGES 是 POSIX 的一部分,但不是 ANSI C 的一部分。如果操作系统没有为 LC_MESSAGES 定义值,GNU gettext 将使用 1729。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2011-09-19
      • 1970-01-01
      相关资源
      最近更新 更多