<rmcreative>

RSS

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

  1. №8455
    Слава
    Слава 17 окт. 2013 г., 8:59:31

    Прям только только переделали? Я где то месяц назад версию для поковырять качал, там этого нет?

  2. №8456
    iJackUA
    iJackUA 17 окт. 2013 г., 11:25:52

    2Слава судя по активности на Гихабе в аккурат вчера вечером доделали :)

    только недавно из Yii2 узнал про intl действительно серьёзная вещь, порадовал тот же Transliterator класс, да всевозможные костыли типа кастомных NumberFormatter-ов можно забыть.

  3. №8458
    Андрей
    Андрей 17 окт. 2013 г., 12:54:59

    Кстати, кому интересно как подключить файл с переводом:

    'i18n'=>array(
      'translations' => array(
        'yii' => array(
          'class' => 'yii\i18n\PhpMessageSource',
          'basePath' => '@app/messages',
          'sourceLanguage' => 'en_US',
          'fileMap' => array(
            'yii' => 'yii.php',
          ),
        )
      ),
    )

    и что еще хорошо, так это то, что файл переводов на русский из версии 1.1.14 отличо подошел для 2 версии, ну для форм точно.

  4. №8459
    Sam
    Sam 17 окт. 2013 г., 15:38:44

    Андрей, спасибо за напоминание. Дописал доку в этом месте.

  5. №8463
    Алексей
    Алексей 18 окт. 2013 г., 0:46:50

    А существует ли в природе документация по миграции проекта с 1.x на 2.x? Хотелось бы оценить насколько это сложный процесс и реально ли перевести наш достаточно большой и активно развивающийся проект на новую версию фреймверка в разумное время.

  6. №8464
    Sam
    Sam 18 окт. 2013 г., 3:43:11

    Алексей, вот основные моменты: github.com/yiisoft/yii2/blob/master/docs/guide/upgrade-from-v1.md

  7. №8466
    iJackUA
    iJackUA 18 окт. 2013 г., 11:21:02

    Мне кажется основная проблема с миграцией будет с экстеншнами, если в проекте их использовано довольно много (а скажем у меня как раз так).

    Пробовал недавно мигирировать экстеншн генератор RSS фидов на Yii2 - github.com/2amigos/efeed, в итоге бросил и написал на коленке свой very basic компонент для этого. Т.к. есть моменты - а-ля полное отстутсвие аналогов некоторых вещей типа CMap, CTypedList и т.п. и сходу очень трудно сообразить чем это заменить, а когда экстеншн большой и сложный (и писали его не вы :) ) это выльется в полное переписывание. Так что имхо "разумное время" зачастую может не сростись (но всё сильно зависит от того как интенсивно использовались служебный классы фрэймворка по проекту).

  8. №8467
    Андрей
    Андрей 18 окт. 2013 г., 12:49:51

    to iJackUA: после перехода на yii2 я перестал смотреть на "екстеншены" для yii2, а активно начал использовать packagist.org/ для того же rss я использовал suin/php-rss-writer

  9. №8468
    iJackUA
    iJackUA 18 окт. 2013 г., 13:19:35

    2Андрей спасибо, хороший совет, вот я пока с трудом на пакагист перестраиваюсь, всё дедовскими методами :) Но а вопрос с миграцией старого приложения (если те самый экстеншны активно использовались) всё равно останется.

  10. №9122
    Ильдар
    Ильдар 25 июля 2014 г., 13:46:13

    Александр, до сих пор не могу понять, почему метод работы с количественным выводом работает неправильно (

    Вот пример кода:

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

    Он почему-то возвращает:

    Здесь 127 кота!

    Когда должен возвращать "котов". Пример кода взят из документации по адресу: stuff.cebe.cc/yii2docs/guide-tutorial-i18n.html

  11. №9123
    Sam
    Sam 26 июля 2014 г., 14:39:44

    Ильдар, sourceLanguage приложения русский?

  12. №9125
    Ильдар
    Ильдар 28 июля 2014 г., 10:49:19

    Александр, параметр sourceLanguage стоял по-умолчанию. Поменял на 'ru-RU' и все заработало как нужно. Спасибо большое.

  13. №9788
    Владимир
    Владимир 13 мая 2015 г., 18:31:19

    sourceLanguage задавать по мне это не правильно, а если я хочу в одном шаблоне на разных языках вывести? Наверное правильно по параметру $language в функции Yii::t. Вообще мне нравится как plural сделан в друпале.

  14. №9848
    Алмаз
    Алмаз 18 июня 2015 г., 11:20:23

    Добрый день, Хотел узнать если возможность в yii2 создавать иерархию поддиректорий в messages для одного языка? Например в проекте все переводы связанные с объектом продукт размещать в messages/ru/catalog/product.php категории message/ru/catalog/category.php заказы message/ru/sale/order.php и так далее

  15. №10438
    mindochin
    mindochin 06 апр. 2016 г., 10:36:11

    к сожалению, есть один жирный минус - не все хостинги имеют intl, даже сейчас

  16. №10578
    marad3r
    marad3r 11 июля 2016 г., 14:33:38

    Вопрос выбора механизма: php, db или getText? Где-то читал, что getText не очень хорошо реализован в yii2, а Db создает нагрузку на БД. Что в итоге лучше с точки зрения производительности для мультиязычного интерфейса, где в будущем будет много языков. Вопрос удобства правки переводов на втором месте.

  17. №10580
    Sam
    Sam 11 июля 2016 г., 18:10:00

    gettext нормально реализован. Работает. Пользуются.

    Я пользуюсь переводами в PHP-файлах.

  18. №10706
    Артур
    Артур 20 окт. 2016 г., 12:04:39

    @Sam

    Не подскажешь как специалист по ICU, возможно ли как-то заставить в данном примере не форматировать число

    Yii::t('app', '{n,plural,one{Оставлен # отзыв} few{Оставлено # отзыва} many{Оставлено # отзывов} other{Оставлено # отзывов}}', ['n' => $this->getAggregateRatingCount()])
     
    // хочу получить "Оставлено 100500 отзывов"
    // он мне выдает "Оставлено 100 500 отзывов" ("100 500" - это слеганца не то число - особенно для SEO)

    ЗЫ: хммм.. интересно, а почему нет тега HTML5

    <number value="100500">Стцо ПяДЬтцот</numer>

    Хотя тег Time есть...

  19. №10707
    Артур
    Артур 20 окт. 2016 г., 12:42:55

    Для решения этой проблемы сделал какой-то костыль

    public static function plural($number, $one, $few, $many, $other, $digitFormat = false)
        {
            $pluralString = Yii::t('app', "{n,plural,one{{$one}} few{{$few}} many{{$many}} other{{$other}}}", ['n' => $number]);
            if($digitFormat) {
                return $pluralString;
            } else {
                return str_replace(Yii::t('app', '{n, duration}', ['n' => $number]), $number, $pluralString);
            }
        }
  20. №10708
    Sam
    Sam 21 окт. 2016 г., 1:26:32

    Насколько знаю, # plural всегда прогоняется через форматтер number. То есть повлиять можно только поменяв настройки для локали.

  21. №10851
    Серж
    Серж 10 февр. 2017 г., 10:25:04

    Коллеги, подскажите, а как вы делаете перевод больших абзацев текста? Допустим есть мульти язычная форма, и у нее есть мульти язычные подсказки (это целые абзацы текста с использованием plural).
    Использовать длинный текст в виде ключа к переводу как то получается не очень удобно. Подскажите, кто и как выходил из данной ситуации.

    echo \Yii::t('app', 'оооо.... оочень длинный текст с  plural');
  22. №10852
    Владимир
    Владимир 11 февр. 2017 г., 16:52:26

    Ну ключом не обязательно весь текст ставить. К примеру можно так

    echo \Yii::t('app', 'text-label-about');

    а в файле или базе для нужного языка сам текст.

    можно текст брать из файла или базы и делать так

    $text = Model::findOne($id);
    echo \Yii::t('app', $text);
  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.