Rya*_*yan 5 translation zend-framework gettext
我已经阅读了关于翻译复数形式的GNU Gettext 手册并查看其示例:
#, 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"
Run Code Online (Sandbox Code Playgroud)
为什么 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."
Run Code Online (Sandbox Code Playgroud)
(仅使用一个 msgid)。
然后在我的代码中,我会有类似的东西:
<?php echo $this->translate('X geese', $numberA); ?>
<?php echo $this->translate('sentence_about_geese_at_the_lake', $numberB); ?>
Run Code Online (Sandbox Code Playgroud)
如果 $numberA 是 3,它会说“3 只鹅”。
如果 $numberB 是 0,下一行会说“湖边有 0 只鹅”。
(因为对于英语,规则是(n != 1),所以复数用于任何等于 0 或大于 1 的数字)。
要求为相同的短语集合指定 2 个 msgid 对我来说似乎是多余的。
谢谢你的帮助!
gettext 背后的想法之一是msgid从源文件中提取 POT 文件,这些文件用作存储在 PO 文件中的翻译的基础,然后编译为 MO 文件。msgid如果找不到合适的翻译,也可以使用A。
Amsgid不是用户无法读取的“密钥”;这是一个可以在程序中使用的真实短语。因此,当您在代码中请求复数翻译时(此处为伪代码):
ngettext("One file removed", "%d files removed", file_count)
Run Code Online (Sandbox Code Playgroud)
...这两个字符串将用于 a) 从源代码中提取消息;这些消息将作为翻译人员的指南 b) 当没有找到适合当前语言环境的合适翻译时,这些消息将作为默认字符串。
这就是为什么复数字符串有两个msgid:显示它们在源程序中是如何定义的(对于翻译器)和用作默认值(当不存在翻译时)。
在其他本地化系统中,例如Android String Resources或Rails YAML files,它的工作方式与您想象的一样 - 相当于 amsgid是单个“键”,即使对于复数,但真正的短语并未在源代码中使用,并且定义即使对于原始语言,翻译也是一个两步操作。
| 归档时间: |
|
| 查看次数: |
1667 次 |
| 最近记录: |