ZF2复数转换器,为什么是阵列?

时间:2014-10-19 08:31:18

标签: php zend-framework2 zend-translate

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进行翻译,而只是在carcars之间进行选择而不进行翻译

但是,如果translatePlural仅查看$num,则使用pluralRule在单数(汽车)或复数(汽车)之间进行选择。然后使用translate帮助器翻译单数或复数,您可以轻松配置,默认消息突然再次工作;

'car' => 'auto',
'cars' => 'autos',

没有奇怪的钥匙,你不需要英文翻译或其他奇怪的东西。

所以问题/ tldr;

为什么ZF2复数使用数组而不只是检查使用哪一个并翻译那个?对我来说似乎是一种更好的方法。

1 个答案:

答案 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之间翻转是不够的。 (我在我的博客上发布了这个答案的一个版本,但我不知道在答案中链接博客是否犹豫不决)