在zf2
中,您拥有了视图助手translatePlural
。可以按照以下方式使用;
echo $this->translatePlural('car', 'cars', $num);
所以,当$num == 1
表示car
时,cars
(取决于复数规则,但现在使用英国规则)。
按文件翻译。你必须使用像;
这样的数组'car' => [
'auto',
'autos',
],
现在,如果auto
其他$num == 1
,则会获得autos
。
如果您的代码中有其他地方可以翻译car
,那么您可以translate('car')
,但会返回通知array to string coverstion
,这显然不是我们想要的。
因此,为了能够翻译car
并使用复数,我现在必须将代码修改为类似的内容;
echo $this->translatePlural('car_plural', 'cars', $num);
语言配置;
'car_plural' => [
'auto',
'autos',
],
'car' => 'auto',
您需要为car_plural
添加英文翻译。因此,translatePlural
默认邮件在默认设置中变得无用,除非您使用translatePlural
进行翻译,而只是在car
或cars
之间进行选择而不进行翻译
但是,如果translatePlural
仅查看$num
,则使用pluralRule
在单数(汽车)或复数(汽车)之间进行选择。然后使用translate
帮助器翻译单数或复数,您可以轻松配置,默认消息突然再次工作;
'car' => 'auto',
'cars' => 'autos',
没有奇怪的钥匙,你不需要英文翻译或其他奇怪的东西。
所以问题/ tldr;
为什么ZF2复数使用数组而不只是检查使用哪一个并翻译那个?对我来说似乎是一种更好的方法。
答案 0 :(得分:2)
我也被这个困惑了。经过同事的一些帮助和大量的研究,我发现这有一个合理的建筑理由。 (我知道!我也很惊讶!)
事实证明,某些语言对单数与复数的定义不同。有些只有1种形式既可以是单数形式也可以是复数形式,而其他形式则有3种或更多种形式。
translatePlural方法无法满足这些其他语言形式,因此它引用了Gettext处理方法。在gettext文件中,英语的复数翻译如下处理:
msgid "Found %d Result"
msgid_plural "Found %d Results"
msgstr[0] "Found %d Result"
msgstr[1] "Found %d Results"
因此,奇数/复数值用于通过msgid查找数组,然后语言的复数索引用于选择msgstr [0]或msgstr [1]。
在具有3种复数形式的语言中,本地化将如下所示:
msgid "Found %d Result"
msgid_plural "Found %d Results"
msgstr[0] "singular translation"
msgstr[1] "plural translation"
msgstr[2] "super plural translation"
所以这就是Zend使用数组的原因,为什么只在$ singular和$ plural之间翻转是不够的。 (我在我的博客上发布了这个答案的一个版本,但我不知道在答案中链接博客是否犹豫不决)