Yii2: перевод сообщений
17 октября 2013
Доделали полностью перевод сообщений. В Yii2 он намного лучше, чем в 1.1. Удалось выкинуть мегабайты данных CLDR и использовать вместо всего этого расширение intl. Синтаксис и возможности поразительные. Например, можно вот так:
echo \Yii::t('app', '{n,number} is spelled as {n, spellout}', array( 'n' => 42, ));
При переводе эта строка честно выдаст нам 42 проговаривается как сорок два
.
echo \Yii::t('app', '{name} is {gender} and {gender, select, female{she} male{he} other{it}} loves Yii!', array( 'name' => 'Snoopy', 'gender' => 'dog', ));
Выдаст без перевода Snoopy is dog and it loves Yii!
.
Множественные формы также никуда не делись:
echo \Yii::t('app', 'There {n, plural, =0{are no cats} =1{is one cat} other{are # cats}}!', array( 'n' => 0, ));
Строка перевода будет вот такая:
Здесь {n, plural, =0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}!
Не обошлось, правда, без исследования исходника расширения и исправления найденных багов средствами PHP, но результат радует.
Комментарии RSS по email OK
Прям только только переделали? Я где то месяц назад версию для поковырять качал, там этого нет?
2Слава судя по активности на Гихабе в аккурат вчера вечером доделали :)
только недавно из Yii2 узнал про intl действительно серьёзная вещь, порадовал тот же Transliterator класс, да всевозможные костыли типа кастомных NumberFormatter-ов можно забыть.
Кстати, кому интересно как подключить файл с переводом:
и что еще хорошо, так это то, что файл переводов на русский из версии 1.1.14 отличо подошел для 2 версии, ну для форм точно.
Андрей, спасибо за напоминание. Дописал доку в этом месте.
А существует ли в природе документация по миграции проекта с 1.x на 2.x? Хотелось бы оценить насколько это сложный процесс и реально ли перевести наш достаточно большой и активно развивающийся проект на новую версию фреймверка в разумное время.
Алексей, вот основные моменты: github.com/yiisoft/yii2/blob/master/docs/guide/upgrade-from-v1.md
Мне кажется основная проблема с миграцией будет с экстеншнами, если в проекте их использовано довольно много (а скажем у меня как раз так).
Пробовал недавно мигирировать экстеншн генератор RSS фидов на Yii2 - github.com/2amigos/efeed, в итоге бросил и написал на коленке свой very basic компонент для этого. Т.к. есть моменты - а-ля полное отстутсвие аналогов некоторых вещей типа CMap, CTypedList и т.п. и сходу очень трудно сообразить чем это заменить, а когда экстеншн большой и сложный (и писали его не вы :) ) это выльется в полное переписывание. Так что имхо "разумное время" зачастую может не сростись (но всё сильно зависит от того как интенсивно использовались служебный классы фрэймворка по проекту).
to iJackUA: после перехода на yii2 я перестал смотреть на "екстеншены" для yii2, а активно начал использовать packagist.org/ для того же rss я использовал suin/php-rss-writer
2Андрей спасибо, хороший совет, вот я пока с трудом на пакагист перестраиваюсь, всё дедовскими методами :) Но а вопрос с миграцией старого приложения (если те самый экстеншны активно использовались) всё равно останется.
Александр, до сих пор не могу понять, почему метод работы с количественным выводом работает неправильно (
Вот пример кода:
Он почему-то возвращает:
Когда должен возвращать "котов". Пример кода взят из документации по адресу: stuff.cebe.cc/yii2docs/guide-tutorial-i18n.html
Ильдар,
sourceLanguage
приложения русский?Александр, параметр sourceLanguage стоял по-умолчанию. Поменял на 'ru-RU' и все заработало как нужно. Спасибо большое.
sourceLanguage задавать по мне это не правильно, а если я хочу в одном шаблоне на разных языках вывести? Наверное правильно по параметру $language в функции Yii::t. Вообще мне нравится как plural сделан в друпале.
Добрый день, Хотел узнать если возможность в yii2 создавать иерархию поддиректорий в messages для одного языка? Например в проекте все переводы связанные с объектом продукт размещать в messages/ru/catalog/product.php категории message/ru/catalog/category.php заказы message/ru/sale/order.php и так далее
к сожалению, есть один жирный минус - не все хостинги имеют intl, даже сейчас
Вопрос выбора механизма: php, db или getText? Где-то читал, что getText не очень хорошо реализован в yii2, а Db создает нагрузку на БД. Что в итоге лучше с точки зрения производительности для мультиязычного интерфейса, где в будущем будет много языков. Вопрос удобства правки переводов на втором месте.
gettext нормально реализован. Работает. Пользуются.
Я пользуюсь переводами в PHP-файлах.
@Sam
Не подскажешь как специалист по ICU, возможно ли как-то заставить в данном примере не форматировать число
ЗЫ: хммм.. интересно, а почему нет тега HTML5
Хотя тег Time есть...
Для решения этой проблемы сделал какой-то костыль
Насколько знаю,
#
plural всегда прогоняется через форматтер number. То есть повлиять можно только поменяв настройки для локали.Коллеги, подскажите, а как вы делаете перевод больших абзацев текста? Допустим есть мульти язычная форма, и у нее есть мульти язычные подсказки (это целые абзацы текста с использованием plural).
Использовать длинный текст в виде ключа к переводу как то получается не очень удобно. Подскажите, кто и как выходил из данной ситуации.
Ну ключом не обязательно весь текст ставить. К примеру можно так
а в файле или базе для нужного языка сам текст.
можно текст брать из файла или базы и делать так