Мультиязычный сайт на Yii2 (i18n)

Генерация переводов

Первое что необходимо сделать это в местах, где будут использоваться переводы применить функцию Yii::t. Например:

class LoginForm extends Model
{
...
    public function attributeLabels()
    {
        return [
            'username' => Yii::t('app/user', 'Username'),
            'password' => Yii::t('app/user', 'Password'),
            'rememberMe' => Yii::t('app/user', 'Remember Me'),
        ];
    }
}

После нам необходимо создать файл конфигурации для сканера сообщений. Код необходимо выполнить в командной строке с правами администратора в корневом каталоге проекта.

cd <путь к каталогу с Yii2>
yii message/config-template common/config/messages.php

В Yii2 есть 3 варианта работы с переводами это

  1. PHP файл с переводами
  2. Gettext файл (*.po, *.mo)
  3. Перевод с БД

Я буду использовать 2 вариант Gettext. Содержимое файла common/config/messages.php меняем на:

<?
return [
    'sourcePath' => 'frontend',
    'languages' => ['kz'],
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'markUnused' => true,
    'only' => ['*.php'],
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    // php вариант
    // 'format' => 'php',
    // 'messagePath' => 'frontend/messages',
    // 'overwrite' => true,


    // 'po' output format is for saving messages to gettext po files.
    'format' => 'po',
    // Root directory containing message translations.
    'messagePath' => 'frontend/messages',
    // Name of the file that will be used for translations.
    'catalog' => 'messages',
    // boolean, whether the message file should be overwritten with the merged messages
    'overwrite' => true,


    'ignoreCategories' => [
        'yii',
    ],
];

Ниже приведенный код выполнит сбор всех текстов, где используется Yii::t. Выполняем в командной строке

yii message common/config/messages.php 

После выполненного кода в каталоге frontend/messages появятся каталоги с файлами *.po

Использование переводов

Подключаем мультиязычность в проекте. В файле common/config/main.php добавляем следующий код в раздел components:

'i18n' => [
    'translations' => [
        'app*' => [
            'class' => 'yii\i18n\GettextMessageSource',
            'sourceLanguage' => 'ru',
        ],
    ],
],

Теперь можно в главном файле views/layout/main.php после body добавить язык по умолчанию

 <?Yii::$app->language = 'kz';?>

Для удобного редактирования файлов перевода (*.po) можно использовать программу PoEdit