【问题标题】:ZF2 plural translator, why an array?ZF2复数翻译器,为什么是数组?
【发布时间】:2015-03-10 08:18:34
【问题描述】:

zf2 中,您有视图助手translatePlural。可以如下使用;

echo $this->translatePlural('car', 'cars', $num);

所以当$num == 1 它说car 否则cars (取决于复数规则,但现在使用英文规则)。

要翻译这个,按文件。您必须使用类似的数组;

'car' => [
  'auto',
  'autos',
],

所以现在你得到auto if $num == 1 else 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 复数使用数组而不只是检查使用哪个数组并翻译那个数组?在我看来,这是一种更好的方法。

【问题讨论】:

标签: php zend-framework2 zend-translate


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多