2013-08-07 53 views
1

我读过GNU Gettext manual about Translating plural forms,看看它的例子:为什么在gettext转换文件中必须使用msgid_plural?

#, 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 msgid_plural不同,不在于打败有翻译了解复数形式的目的是什么?

我认为我可以做这样的事情(英文):

#, 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),所以复数用于任何数量的比等于1 0或更大)。

对于我来说,为同一个短语集合指定2个msgids似乎是多余的。

感谢您的帮助!

回答

4

一个后面的gettext的想法是,msgid从源文件解压缩以创建POT文件,这些文件被用作基础对存储在文件PO翻译,后来编译为MO文件。如果找不到合适的翻译,也使用A msgid

A msgid不是用户不可读的“关键”这是一个可以在程序中使用的真实词组。所以当你的代码请求翻译为复数(伪这里):

ngettext("One file removed", "%d files removed", file_count) 

...这两个字符串将使用)来提取源代码信息;这些信息将作为翻译人员的指南b)当没有找到适合当前语言环境的翻译时作为默认字符串。

这就是为什么复数字符串有两个msgid:显示它们是如何在源程序中定义的(对于翻译人员)并用作默认(当不存在翻译时)。

在其他定位系统,像Android String ResourcesRails YAML files,它就像你想象 - 相当于一个msgid是一个单一的“钥匙”即使是复数,但后来真正的短语没有在源代码中使用,并即使对于原始语言,定义翻译也是两步操作。

相关问题