yii2 Интернационализация/мультиязычность - перевод интерфейса на несколько языков,как организовать -PhpMessageSource пример кода

Не сразу всё заработало, так что думаю кому-то окажется полезной данная заметка.

Итак будет делать мультиязчность. В Yii2 можно делать отдельный перевод для каждого из приложений (application), но в данной заметке я покажу как сделать систему перевода общей для сайта - для всех приложений, ведь в реальности одни и те же фразы на один и тот же язык переводятся одинаково (гарантированно работающий код).

Конфигурация i18n

Поправим файл

/common/config/main.php 

так чтобы он выглядит вроде того (нам важна для перевода секция i18n):

<?php
return [
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'i18n' => [ // компонент мультизязычности
            'translations' => [
                'app*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@common/messages', // ВАЖНО! этот путь к папке с переводами
                    'sourceLanguage' => 'en-US', // базовым языком путь будет инглиш
                    'fileMap' => [
                        'app' => 'app.php', // группа фраз и её файл-источник
                        'app/error' => 'error.php', // для ошибок (тоже какое-то подмножетсво переводимых фраз)
                    ],
              ],
            ],
        ],
    ],
];

Обратите внимание на:

'basePath' => '@common/messages'

Это указание на путь к папке переводов. В данном примере используется псевдоним @common -- по идее он должен быть определён как путь до папки /common -- общих моментов для всех приложений. В любом случае, если перевод не работает убедитесь что даннымй параметр ('basePath') указывает именно на ту папку перевода, которую мы настроим ниже, либо на иную, которую вы хотите использовать.

Файлы перевода

Создадим папку

/common/messages/ 

-- в ней будут располагаться подпапки языков.
В этой папке создадим поддиректорию для языка перевода ru-Ru:

/common/messages/ru-Ru/

-- а в неё уже будем забрасывать файлы для групп фраз данного языка, например группа для группы app создадим файл:

/common/messages/ru-Ru/app.ru

С таким содержимым:

<?php
// перевод на русский
/*массив соответсвия фраз между базовым языком (именно на нём далее мы будем записывать 
фразы в функцию t() и иным языком в данном случае русским -
под выбранным нами обозначением ru-Ru)*/
return [ 
    'Clients' => 'Клиенты',
    'Cat' => 'Кот',
];

Установка нужного языка

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

\Yii::$app->language = 'ru-Ru';

(например, перед всеми действиями контроллера).

Перевод фразы

А теперь в каком-нибудь действии вашего контроллера, точнее в представлении (view) этого действия напишите строчку:

<?= \Yii::t('app', 'Clients') ?>

(заметьте - мы указали группу и фразу для перевода, а вот конкретный язык должен быть установлен заранее).
В результате вы должны получить на экране строку:

Клиенты

Теперь можно закомментировать приведённое выше выше "указание" на язык:

 // \Yii::$app->language = 'ru-Ru';

И обновив страницу того же действия контроллера получим фразу на базовом языке:

 Clients

Система перевода с помощью файлов .php рассмотренную здесь особенно удобно использовать для перевода интерфейсом, например, виджетов.

Ну вот, собственно и всё) Желаю удачи!

Источники:

  • Интернационализация (офф. документация):
    yiiframework.com/doc-2.0/guide-tutorial-i18n.html
  • Интернационализация Yii2 (на русском):
    https://yiiframework.com.ua/ru/doc/guide...
  • Вопрос, содержащий пример файла перевода:
    toster.ru/q/174691
  • Yii2 - Интернационализация проекта (мультиязычность):
    http://atoumus.github.io/yii2-i18n.html
  • Ответ, который дал подсказку (хотя инструкция там несколько избыточна):
    stackoverflow.com/questions/32831288/yii2-translation-does-not-work