Переводчик множественного числа ZF2, почему массив?

В 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 используется массив, а не просто проверить, какой из них использовать, и перевести его? Мне кажется, это лучший метод.


person MKroeders    schedule 19.10.2014    source источник
comment
Взгляните на это обсуждение: github.com/zendframework/zf2/issues/4939   -  person mabe.berlin    schedule 10.03.2015


Ответы (1)


Я тоже был озадачен этим. После некоторой помощи коллеги и большого количества исследований я обнаружил, что для этого была веская архитектурная причина. (Я знаю! Я тоже удивлен!)

Оказывается, в некоторых языках есть другое определение единственного и множественного числа. Некоторые имеют только 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. (Я разместил версию этого ответа в своем блоге, но не знаю, кошерно ли связывать блоги в ответах)

person Beryllium    schedule 10.03.2015