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

0

Решение

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]