Yii::t() ICU - логическая ошибка?

Уже исправленные репорты или принятые предложения
Ответить
tol171
Сообщения: 6
Зарегистрирован: 2015.03.19, 13:29

Yii::t() ICU - логическая ошибка?

Сообщение tol171 » 2016.03.21, 11:20

Исходные данные: PHP 5.6.3, INTL_ICU_VERSION = 53.1, MessageFormatter работает без ошибок.
Yii2 Basic настройки:
'language' => 'ru-RU',
'sourceLanguage' => 'en-US',

Код: Выделить всё

echo \Yii::t('app', '{n,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# котэ}}!', ['n' => 5]); 
Out:
5 котэ!

Согласно руководству результат верный:
- базовый язык, как рекомендовано en-US
- строка не найдена в базе переводов и поэтому применяются plural rules для sourceLanguage
- для английского, это "other" = "котэ"

Но ожидается "5 котов!"

Мои предложения:
Функция yii\i18n\I18N::translate()

Код: Выделить всё

91:             return $this->format($message, $params, $messageSource->sourceLanguage); 
заменить на:

Код: Выделить всё

91:             return $this->format($message, $params, $language); 
Так мы можем поменять локаль, передаваемую в MessageFormatter, сейчас она жестко установлена в sourceLanguage.
У себя я этот вариант проверил - выводит все правильно "5 котов".

Аватара пользователя
samdark
Администратор
Сообщения: 8624
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii::t() ICU - логическая ошибка?

Сообщение samdark » 2016.03.21, 13:35

Вы используете русский текст с английскими правилами. Если базовый sourceLanguage у вас en, то и исходный для перевода текст должен быть на английском.

zelenin
Сообщения: 10164
Зарегистрирован: 2013.04.20, 11:30

Re: Yii::t() ICU - логическая ошибка?

Сообщение zelenin » 2016.03.21, 13:39

разжую:
'sourceLanguage' => 'en-US', - язык источника - английский.
Источник - это то, что написано в коде, т.е. echo \Yii::t('app', '{n,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# котэ}}!', ['n' => 5]);

'language' => 'ru-RU', - язык приложения. тот язык, на на который будет переводиться источник.
соотвественно вот это правило - {n,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# котэ}} - должно у вас быть в переводе ru_RU/app.php

tol171
Сообщения: 6
Зарегистрирован: 2015.03.19, 13:29

Re: Yii::t() ICU - логическая ошибка?

Сообщение tol171 » 2016.03.21, 13:56

Спасибо большое, разобрался.

Ответить