Ваш сайт должен говорить на разных языках, а Yii2 уже всё умеет — надо только правильно приготовить. В этой статье разберём, как настроить мультиязычность в Yii2-приложении: от базовой конфигурации до перевода URL и сообщений. Никакой магии, только практика и примеры кода.
Зачем вообще нужна мультиязычность и как она работает в 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() и тестировать переключение языков на всех страницах.
Теперь ваш сайт заговорит на любом языке, который вы захотите. Удачи в разработке!

