GNUgettext
手册对dcgettext
功能的描述如下:
这两个参数都在第一个地方附加了一个参数,对应于textdomain的参数。dcgettext的第三个参数允许使用除LC_消息之外的其他语言环境类别。但我真的不知道这在哪里有用。如果域名为空或类别的值在已知值的旁边,则结果未定义。还应注意的是,此函数不是此函数族的第二个已知实现(在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]*
没有找到任何文件,因此似乎没有人在使用此文件。但是,有谁能提供这个功能的用途和是否有用的见解呢?
最佳答案
为了更好的例子而编辑:
好友生日提醒小部件
这需要dcgettext()
或dcngettext()
,因为它应该使用LC_TIME
类别而不是LC_MESSAGES
类别(对于一个本地化字符串,“It's %s's birthday today!
”),因为用户希望LC_TIME
环境变量控制小部件的语言,就像它对date
命令所做的那样。
餐厅账单拆分器小部件
为了更容易理解和拆分其他国家(尤其是您几乎无法理解票据的国家)的票据,这将对“票据”字段使用LC_MONETARY
类别,以便用户可以通过更改LC_MONETARY
环境变量来选择货币。
假设这个小部件是为旅行用户设计的,或者可能由一个简单的服务器后端支持,它存储描述和数字量,但是没有货币单位。每个帐单都是一个简单的数据集,包含区域设置、总金额、描述字符串和参与者列表,每个参与者由字符串和数字指定。总的数字应该至少是总数,额外的是小费。
用户界面(菜单、选项等)使用LC_MESSAGES
类别进行正常本地化,但每个bills区域设置都会覆盖LC_NUMERIC
和LC_MONETARY
区域设置类别,以及小部件中的应用程序特定字符串--“total
”、“tip
”等--使用本地化文件中的LC_MONETARY
类别。(因此,代码应该有dcgettext(NULL,"Total",LC_MONETARY)
,`dcgettext(NULL,“Tip”,LC-MONETARY)等等。)
创建新帐单时,只需在LC_MONETARY
和/或LC_NUMERIC
类别中切换到所需的区域设置,即可实现区域设置选择。
您想要这样做的原因很简单:您可以有一个用户界面,根据本地本地化(每个餐厅区域设置)显示典型的账单,而其余的用户界面,特别是工具提示、提示、帮助等,仍然在主区域设置/语言中(由LC_MESSAGES
确定)。
无论小部件是图形Qt/GTK+还是命令行小部件,它都可以使用普通环境变量来定义其初始区域设置(对于用户界面,LC_MESSAGES
和新帐单,LC_MONETARY
)。
大多数程序员可能会使用配置文件、管理器或注册表项来存储区域设置,但是由于它是很容易获得的、标准化程度很高的,为什么要重复功能?此外,用户可以创建别名或快捷方式,这些别名或快捷方式只需为两个类别设置不同的初始区域设置,并且可以使用不同的计费区域设置(例如,用于比较或理解帐单)打开小部件的多个实例。LC_NUMERIC
等于gettext(msgid)
等于dgettext(NULL,msgid)
。
实际上,在当前的GNU gettext中,dcgettext(NULL,msgid,LC_MESSAGES)
是对gettext(msgid)
的包装,dcgettext(NULL,msgid,LC_MESSAGES)
是对dgettext(domain,msgid)
的包装dcgettext(domain,msgid,LC_MESSAGES)
。dcgettext()
的category参数允许您选择用于确定区域设置的类别。例如,如果您使用dcgettext(NULL, "FOO", LC_MONETARY)
,那么LC_MONETARY
类别将用于确定要使用的实际区域设置。因为C库提供了特定于类别的函数,比如strftime()
(使用LC_TIME
类别)和as follows(使用strcoll()
类别),所以大多数应用程序只显式使用LC_COLLATE
类别。(但是,它们确实通过C库函数使用其他类别。)
用户可以通过环境变量控制每个类别的区域设置。
对于GNU C库,环境变量被解释为:
如果LC_MESSAGES
不是空的,它将定义所有类别的区域设置。
否则:
如果LC_ALL
不为空,则定义类别LC_CATEGORY
的区域设置。
否则:
如果CATEGORY
不为空,则定义区域设置。
否则:
区域设置是C/POSIX。
换句话说,LANG
被忽略,并且只有当LANGUAGE
和相关的LANG
环境变量都为空或未定义时,LC_ALL
才被使用。
根据我的经验,其他支持gettext或类似本地化的操作系统都有相同的环境变量支持模式--LC_category
是覆盖,LC_ALL
是特定设置,如果没有其他设置,则使用LC_category
(可能还有LANG
)作为默认设置。
使用混合区域设置环境非常有用,其中LANGUAGE
未定义或为空,一些LC_ALL
环境变量定义为特定区域设置,其他未定义或为空或LC_
,可能定义了默认C
以确保安全。
我个人有时用
LC_ALL= \
LC_TIME=C \
LC_NUMERIC=C \
LC_CTYPE=C \
LC_MESSAGES=C \
LC_COLLATE=fi_FI.utf8 ls -laF --color=auto
作为
LANG
的别名。它列出了指定目录中的文件和目录,除了使用芬兰语规则的字符串排序规则(string sort order)之外,其他都使用C/POSIX语言环境。这给了我根据典型的芬兰语规则排序的输出,但是一切都在C/POSIX语言环境中。我可能会切换到使用ISO 8601日期的
ll
区域设置,或者可能切换到对人类友好的iso8601版本(yyy-MM-DD HH:MM:SS.ttt TZ)。只是还没有足够的兴趣去寻找一个或者自己写一个。问题?
关于c - dcgettext的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24977489/