Страница 1 из 1

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

Добавлено: 2016.03.21, 11:20
tol171
Исходные данные: 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 котов".

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

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

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

Добавлено: 2016.03.21, 13:39
zelenin
разжую:
'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

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

Добавлено: 2016.03.21, 13:56
tol171
Спасибо большое, разобрался.