我已阅读GNU Gettext manual about Translating plural forms并查看其示例:
#, c-format
msgid "One file removed"
msgid_plural "%d files removed"
msgstr[0] "%d slika je uklonjena"
msgstr[1] "%d datoteke uklonjenih"
msgstr[2] "%d slika uklonjenih"
为什么msgid_plural与msgid不同,并且这不会破坏翻译能够识别复数形式的目的吗?
我认为我可以做这样的事情(英语):
#, c-format
msgid "X geese"
msgstr[0] "%d goose"
msgstr[1] "%d geese"
#, c-format
msgid "sentence_about_geese_at_the_lake"
msgstr[0] "There is one goose at the lake."
msgstr[1] "There are %d geese at the lake."
(仅使用一个msgid)。
然后在我的代码中,我会有类似的东西:
<?php echo $this->translate('X geese', $numberA); ?>
<?php echo $this->translate('sentence_about_geese_at_the_lake', $numberB); ?>
如果$ numberA为3,则会说“3只鹅”。
如果$ numberB为0,下一行会说“湖上有0只鹅。”
(因为对于英语,规则是(n!= 1),因此复数用于任何等于0或大于1的数字。
对于我来说,为同一个短语集合指定2个msgids似乎是多余的。
感谢您的帮助!
答案 0 :(得分:4)
gettext背后的一个想法是从源文件中提取msgid
以创建POT文件,这些文件用作存储在PO文件中的翻译的基础,然后编译为MO文件。如果找不到合适的翻译,也会使用msgid
。
msgid
不是用户不可读的“密钥”;这是一个可以在程序中使用的真实短语。因此,当您在代码中请求复数转换时(此处为伪代码):
ngettext("One file removed", "%d files removed", file_count)
...这两个字符串将用于a)从源代码中提取消息;当找不到适合当前语言环境的翻译时,这些消息将作为翻译者的指南b)作为默认字符串。
这就是为什么复数字符串有两个msgid
:以显示它们在源程序中的定义(对于翻译者)并用作默认值(不存在翻译时)。
在其他本地化系统中,例如Android String Resources或Rails YAML files,它的工作方式与您想象的相同 - 即使对于复数,相当于msgid
的单个“关键字”,但是源代码中不使用真实短语,即使对于原始语言,定义翻译也是两步操作。