首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么msgid_plural在gettext翻译文件中是必需的?

为什么msgid_plural在gettext翻译文件中是必需的?
EN

Stack Overflow用户
提问于 2013-08-07 18:24:24
回答 1查看 2.1K关注 0票数 5

我已经阅读了翻译复数形式的Gettext手册并看到了它的示例:

代码语言:javascript
复制
 #, 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不同,而这难道没有达到让翻译意识到复数形式的目的吗?

我想我可以这样做(为了英语):

代码语言:javascript
复制
 #, 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)。

那么在我的代码中,我会有这样的东西:

代码语言:javascript
复制
<?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似乎是多余的。

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-12 13:06:43

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

msgid不是用户不可读的“键”;它是一个真正的短语,可以在程序中使用。因此,当您在代码中请求一个复数的翻译时(这里是伪代码):

代码语言:javascript
复制
ngettext("One file removed", "%d files removed", file_count)

...these两个字符串将用于( a)从源代码中提取消息;这些消息将作为翻译程序的指南( b)作为默认字符串,当没有为当前区域设置找到合适的转换时。

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

在其他本地化系统中,如Android字符串资源Rails YAML文件,它的工作方式与您想象的一样--即使对于复数,msgid的等效也是一个“键”,但在源代码中并没有使用真正的短语,而且定义翻译是一个两步的操作,甚至对于原始语言也是如此。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18110916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档