zend-framework - 为什么在 gettext 翻译文件中需要 msgid_plural?

标签 zend-framework translation gettext

我已阅读 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 个 msgid 似乎是多余的。

谢谢你的帮助!

最佳答案

gettext 背后的想法之一是 msgid从源文件中提取以创建 POT 文件,这些文件用作存储在 PO 文件中的翻译的基础,然后编译为 MO 文件。一个 msgid如果找不到合适的翻译,也可以使用。

一个 msgid不是用户无法读取的“ key ”;这是一个可以在程序中使用的真实短语。因此,当您在代码中请求复数翻译时(此处为伪代码):

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

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

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

在其他本地化系统中,例如 Android String ResourcesRails YAML files ,它就像你想象的那样工作——相当于 msgid即使对于复数,也是一个单一的“键”,但是源代码中没有使用真正的短语,即使对于原始语言,定义翻译也是一个两步操作。

关于zend-framework - 为什么在 gettext 翻译文件中需要 msgid_plural?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18110916/

相关文章:

php - 缩小大型处理作业

zend-framework - 使用基本 Controller 时,如何在 preDispatch 或 Action 初始化中处理 Zend_Exception?

django - 在 Django 中设置翻译 - Makemessages 不创建文件

c# - .NET 3.5 上的单声道 GetText

php - 如何从 .mo 获取 .po 文件

internationalization - gettext (gettext-commons) 或坚持使用 java i18n

zend-framework - 我如何在教义 where 子句中写不等于?

php - 从 Zend 2 中的连接获取数据

c++ - Fortran 77 代码到 C++ 的转换

php - 设置 JText 的语言::_()