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