dcgettext的目的是什么?

时间:2014-07-27 02:54:09

标签: c linux internationalization gettext

GNU gettext手册描述了dcgettext函数,如下所示:

  

两者都在第一个位置附加一个参数,它对应于textdomain的参数。 dcgettext的第三个参数允许使用另一个区域设置类别但LC_MESSAGES。 但我真的不知道它在哪里有用。如果domain_name为NULL或类别除已知值之外的值,则结果是未定义的。还应注意,此函数不是此函数系列的第二个已知实现的一部分,该函数系列可在Solaris中找到。

来源:https://www.gnu.org/software/gettext/manual/html_node/Ambiguities.html

是否有任何用于为邮件转换提供与默认LC_MESSAGES不同的类别?它甚至会做什么? (它是否使用该不同类别的区域设置而不是LC_MESSAGES的区域设置?如果设置了LANGUAGE会发生什么 - 无论如何都不会覆盖该类别,或者它是否仅覆盖LC_MESSAGES?)因为即使是文档编写者也在努力寻找这个功能的目的,我真的质疑它是否有任何目的。试图

ls /usr/share/locale/*/LC_[^M]*

没有文件,所以似乎没有人使用这个。但是,任何人都可以提供有关此功能的用途以及它是否有用的见解吗?

2 个答案:

答案 0 :(得分:2)

编辑更好的例子:

  • 朋友'生日提醒小工具

    这需要dcgettext()dcngettext(),因为应该使用LC_TIME类别而不是LC_MESSAGES类别(对于一个本地化字符串, " It's %s's birthday today!"),因为用户希望LC_TIME环境变量控制窗口小部件的语言,就像它对例如date命令。

  • 餐馆账单拆分器小工具

    为了便于理解和拆分其他国家/地区的帐单(尤其是您几乎无法理解帐单的国家/地区),这会对帐单字段使用LC_MONETARY类别,以便用户可以按以下方式选择货币更改LC_MONETARY环境变量。

    假设小部件适用于旅行用户,或者可能由简单的服务器后端支持,后端存储描述和数字量,但没有货币单位。每个账单都是一个简单的数据集,包含区域设置,总金额,描述字符串和参与者列表,每个参与者由字符串和数字指定。数字的总和应该总是至少是总数量,额外的是提示。

    使用LC_MESSAGES类别将用户界面(菜单,选项等)正常本地化,但每个帐单区域设置覆盖LC_NUMERICLC_MONETARY区域设置类别,以及应用程序 - 小部件中的特定字符串 - " total"," tip"等等 - 使用本地化文件中的LC_MONETARY类别。 (因此代码将具有dcgettext(NULL,"Total",LC_MONETARY),`dcgettext(NULL,"提示",LC_MONETARY)等等。)

    创建新帐单时,只需在LC_MONETARY和/或LC_NUMERIC类别中切换到所需的区域设置即可实现区域设置选择。

    您希望这样做的原因很简单:您可以根据本地本地化(每个餐厅区域设置)显示典型账单的用户界面,而其他用户界面,尤其是工具提示,提示, help et cetera,仍然是主要的语言环境/语言(由LC_MESSAGES确定)。

    无论小部件是图形Qt / GTK +还是命令行小部件,它总是可以使用常规环境变量来定义其初始区域设置(LC_MESSAGES用户界面LC_MONETARY和新法案LC_NUMERIC

    大多数程序员可能会使用配置文件或管理器或注册表项来存储语言环境,但由于它很简单,标准化,为什么要复制功能?此外,用户可以创建简单设置不同初始区域设置(对于这两个类别)的别名或快捷方式,并且可以使用不同的计费区域设置打开窗口小部件的多个实例,例如用于比较或理解账单。


gettext(msgid)相当于dgettext(NULL,msgid)相当于dcgettext(NULL,msgid,LC_MESSAGES)

事实上,在当前的GNU gettext中,gettext(msgid)dcgettext(NULL,msgid,LC_MESSAGES)的包装,而dgettext(domain,msgid)是一个包装器 dcgettext(domain,msgid,LC_MESSAGES)

dcgettext()的类别参数允许您选择用于确定区域设置的类别。例如,如果您使用dcgettext(NULL, "FOO", LC_MONETARY),则LC_MONETARY类别将用于确定要使用的实际区域设置。由于C库提供了类别特定的功能,例如strftime()(使用LC_TIME类别)和strcoll()(使用LC_COLLATE类别),因此大多数应用程序仅显式使用{ {1}}类别。 (但是,它们通过C库函数使用其他类别。)

用户可以通过环境变量控制每个类别的区域设置。

对于GNU C库,环境变量被解释为as follows

  1. 如果LC_MESSAGES不为空,则会定义所有类别的区域设置。

    否则:

  2. 如果LC_ALL不为空,则会定义类别LC_CATEGORY的区域设置。

    否则:

  3. 如果CATEGORY不为空,则定义区域设置。

    否则:

  4. 语言环境为C / POSIX。

  5. 换句话说,LANG被忽略,LANGUAGE仅在LANG和相关LC_ALL环境变量都为空或未定义时使用。

    根据我的经验,其他具有gettext或类似本地化支持的操作系统具有相同的环境变量支持模式 - LC_category是覆盖,LC_ALL是特定设置,LC_category (如果没有设置其他内容,则可能LANG)作为默认值。


    使用混合语言环境非常有用,其中LANGUAGE未定义或为空,某些LC_ALL环境变量定义为特定语言环境,其他环境变量未定义或为空或{ {1}},可能定义了默认LC_,以确定。

    我个人有时会使用

    C

    作为LANG的别名。它列出了指定目录中的文件和目录,使用C / POSIX语言环境,除了使用芬兰语规则的字符串排序规则(字符串排序顺序)之外的所有内容。这给了我根据典型的芬兰规则排序的输出,但一切都在C / POSIX语言环境中。

    我可能会切换到使用ISO 8601日期的LC_ALL= \ LC_TIME=C \ LC_NUMERIC=C \ LC_CTYPE=C \ LC_MESSAGES=C \ LC_COLLATE=fi_FI.utf8 ls -laF --color=auto 区域设置,或者可能是人性化版本的ISO 8601(YYYY-MM-DD HH:MM:SS.ttt TZ)。只是还没有足够的关心来寻找一个或自己写一个。

    有问题吗?

答案 1 :(得分:1)

显然dcgettext已提供"兼容性。"

引用GNU C Library的Translation with gettext部分,从底部开始第三段:

  

dcgettext函数仅用于与具有gettext函数的其他系统兼容。实际上并没有任何情况需要(或有用)使用不同的值,但LC_MESSAGES用于类别参数。我们在这里处理消息,任何其他选择只会令人恼火。

(我个人认为这并不是一个特别令人满意的答案,因为它没有暗示 "其他系统"他们正在寻求兼容 - 但它是我迄今为止发现的唯一权威解释。)