Ваш сайт должен говорить на разных языках, а Yii2 уже всё умеет — надо только правильно приготовить. В этой статье разберём, как настроить мультиязычность в Yii2-приложении: от базовой конфигурации до перевода URL и сообщений. Никакой магии, только практика и примеры кода.

Digital-студия WNDER

Зачем вообще нужна мультиязычность и как она работает в Yii2

Представьте, что вы открыли интернет-магазин, и к вам заходят покупатели из разных стран. Если сайт не говорит на их языке, они уйдут. Yii2 предлагает готовые инструменты для интернационализации (i18n) и локализации (l10n). Первое — это перевод интерфейса, второе — адаптация форматов (даты, валюты). В Yii2 за это отвечает компонент i18n и механизм перевода сообщений через файлы.

Основные понятия:

  • Язык приложения (language) — текущий язык интерфейса.
  • Исходный язык (sourceLanguage) — язык, на котором написаны оригинальные строки (обычно английский или русский).
  • Переводы — файлы с парами «оригинал => перевод».

Yii2 поддерживает несколько способов хранения переводов: PHP-массивы, gettext (.po/.mo), базы данных. Мы рассмотрим самый простой и популярный — PHP-файлы.

Настройка компонента i18n и базовые переводы

Начнём с конфигурации. Откройте файл config/web.php (или console.php для консольных приложений) и добавьте настройки в компонент i18n. По умолчанию Yii2 уже имеет базовую настройку, но мы её расширим.

'components' => [
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
                'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],

Здесь мы указали, что переводы для категории app* будут храниться в PHP-файлах в папке @app/messages. Для каждого языка создаётся своя подпапка: messages/ru-RU/app.php, messages/en-US/app.php и т.д. Внутри файла возвращается массив:

 'Привет',
    'Welcome to our site' => 'Добро пожаловать на наш сайт',
];

Теперь в коде можно использовать функцию Yii::t('app', 'Hello'), и она вернёт перевод для текущего языка. Язык задаётся через Yii::$app->language = 'ru-RU'.

Совет: чтобы не создавать файлы вручную, используйте консольную команду yii message/extract — она просканирует проект и создаст заготовки переводов.

Как сделать переключение языка и перевод URL

Просто установить язык в конфиге недостаточно — пользователь должен иметь возможность переключиться. Самый простой способ — добавить параметр language в URL. Например, https://example.com/ru/site/about.

Для этого нужно настроить компонент urlManager и добавить правило маршрутизации. Вот пример конфигурации:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        '//' => '/',
        '' => 'site/index',
    ],
],

Теперь в контроллере можно получать язык из запроса и устанавливать его в приложении. Например, в beforeAction базового контроллера:

public function beforeAction($action)
{
    $lang = Yii::$app->request->get('language');
    if ($lang && in_array($lang, ['ru', 'en'])) {
        Yii::$app->language = $lang === 'ru' ? 'ru-RU' : 'en-US';
    }
    return parent::beforeAction($action);
}

Чтобы ссылки на другие страницы сохраняли язык, можно использовать хелпер Url::to с параметром language. Или создать свой компонент для генерации URL с языковым префиксом.

Правило: Всегда используйте полные коды локалей (например, ru-RU, en-US), а не просто ru или en. Это избавит от проблем с форматами дат и чисел в будущем.

Продвинутые приёмы: перевод контента из базы данных и локализация форматов

Часто нужно переводить не только статические строки, но и динамический контент (например, названия товаров). Для этого можно использовать поведение TranslatableBehavior или хранить переводы в отдельной таблице. Yii2 не имеет встроенного решения, но есть популярные расширения, например, lajax/translatable-behavior.

Для локализации форматов (даты, числа, валюта) используйте компонент formatter. Он автоматически подстраивается под текущий язык:

echo Yii::$app->formatter->asDate('2025-04-01', 'long');
// Для ru-RU выведет: 1 апреля 2025 г.
// Для en-US: April 1, 2025

Также не забывайте про часовые пояса и валюты — всё это настраивается через Yii::$app->formatter.

Сравнение способов хранения переводов:

Способ Плюсы Минусы
PHP-массивы Простота, высокая скорость, версионирование Сложно редактировать переводчикам без доступа к коду
Gettext (.po/.mo) Стандарт, поддержка инструментов Требует компиляции, сложнее в настройке
База данных Удобно редактировать через админку Медленнее, нужна дополнительная реализация

Практические советы и лайфхаки

  • Используйте Yii::t('app', 'Текст') везде, где есть текст для пользователя. Даже если сейчас один язык — потом пригодится.
  • Для перевода названий месяцев и дней недели используйте Yii::$app->formatter->asDate() — он автоматически подставит нужный язык.
  • Храните переводы в отдельных файлах для каждой категории (app, error, admin) — так проще ориентироваться.
  • Настройте кэширование переводов (например, через yii\caching\FileCache), чтобы не читать файлы при каждом запросе.
  • Для переключения языка без перезагрузки страницы можно использовать AJAX и сохранять выбор в куки или сессии.
Лайфхак: Добавьте в компонент i18n настройку 'on missingTranslation' => ['yii\i18n\I18N', 'handleMissingTranslation'] — это позволит логировать отсутствующие переводы и быстро их находить.

Что в итоге

Настройка мультиязычности в Yii2 — задача не из сложных, но требует внимания к деталям. Мы разобрали базовую конфигурацию i18n, перевод URL, работу с динамическим контентом и локализацию форматов. Главное — использовать полные локали, не забывать про Yii::t() и тестировать переключение языков на всех страницах.

Теперь ваш сайт заговорит на любом языке, который вы захотите. Удачи в разработке!

Студия WNDER