2014-10-19 11 views
0

В zf2 у вас есть помощник вида translatePlural. Который может использоваться следующим образом;ZF2 множественный переводчик, почему массив?

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

Так что, когда он говорит $num == 1car еще 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

Взгляните на эту дискуссию: https://github.com/zendframework/zf2/issues/4939 –

ответ

1

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

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

Смежные вопросы