Вы когда-нибудь задумывались, почему ваш сайт на Yii2 до сих пор говорит только на одном языке? В современном мире, где границы стираются, а пользователи из разных стран заходят на ваш ресурс, мультиязычность — это не роскошь, а необходимость. Но как её настроить без боли и лишних нервов? В этой статье я расскажу, как превратить ваш Yii2-проект в многоязычного полиглота, используя проверенные методы и избегая типичных граблей.
Почему мультиязычность — это просто (если знать секрет)
Мультиязычность в Yii2 — это не магия, а комбинация нескольких стандартных инструментов. Секрет в том, чтобы правильно их соединить. Вам понадобятся:
- Компонент i18n — встроенный в Yii2 механизм для перевода сообщений.
- Настройка языка приложения — чтобы Yii2 знал, какой язык показывать пользователю.
- Хранение переводимого контента — например, отдельные поля в базе данных для каждого языка.
Представьте, что ваш сайт — это швейцарский нож. Каждый язык — отдельное лезвие. Без правильной настройки вы просто не сможете переключиться с одного лезвия на другое. Но как только вы разберётесь, всё станет элементарно.
Шаг 1. Настройка компонента i18n
Первым делом займёмся конфигурацией приложения. В файле config/web.php (или common/config/main.php, если у вас продвинутый шаблон) добавьте компонент i18n. Это как настроить радиостанцию: вы указываете частоту, а Yii2 будет ловить нужные переводы.
'components' => [
'i18n' => [
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@app/messages',
'sourceLanguage' => 'ru-RU',
'fileMap' => [
'app' => 'app.php',
'app/error' => 'error.php',
],
],
],
],
],
Здесь мы говорим Yii2: «Слушай, у нас есть переводы в папке messages, и исходный язык — русский». Теперь все строки, которые вы обернёте в функцию Yii::t(), будут искаться в соответствующих файлах.
Не забудьте создать структуру папок. Например, для английского перевода — messages/en-US/app.php, для немецкого — messages/de-DE/app.php. Внутри файла — обычный массив с ключами и переводами.
// messages/en-US/app.php
return [
'Привет, мир!' => 'Hello, World!',
'Добро пожаловать' => 'Welcome',
];
Совет: не храните переводы в базе данных для статических строк — это медленно. Используйте PHP-файлы, они кэшируются и работают молниеносно.
Yii::t() для вывода текста в представлениях. Никогда не хардкодьте строки — иначе потом будете плакать, когда придётся переводить сотни мест.
Шаг 2. Определяем язык пользователя
Теперь нужно, чтобы Yii2 понимал, на каком языке общаться с конкретным посетителем. Обычно язык передаётся через URL или сессию. Самый простой способ — использовать параметр language в запросе.
Добавьте в config/web.php обработку языка:
'language' => 'ru-RU', // язык по умолчанию
'components' => [
'request' => [
'class' => 'yii\web\Request',
'enableCookieValidation' => true,
'enableCsrfValidation' => true,
'cookieValidationKey' => 'ваш-ключ',
],
],
А в коде, например в базовом контроллере, определите язык:
public function beforeAction($action)
{
if (Yii::$app->request->get('lang')) {
Yii::$app->language = Yii::$app->request->get('lang');
}
return parent::beforeAction($action);
}
Теперь, если пользователь перейдёт на ?lang=en-US, Yii2 переключится на английский. Можно также использовать куки или поддомены — но это уже на ваш вкус.
Шаг 3. Переводим контент из базы данных
Статические строки — это половина дела. А как быть с динамическим контентом: статьями, товарами, категориями? Здесь подход другой. Нужно хранить переводы в отдельных таблицах или полях.
Предположим, у вас есть таблица post с полями title и content. Чтобы сделать её мультиязычной, создайте таблицу post_lang:
CREATE TABLE post_lang (
id INT PRIMARY KEY AUTO_INCREMENT,
post_id INT NOT NULL,
language VARCHAR(10) NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
FOREIGN KEY (post_id) REFERENCES post(id) ON DELETE CASCADE
);
Затем в модели Post настройте связь:
public function getTranslations()
{
return $this->hasMany(PostLang::className(), ['post_id' => 'id']);
}
public function getTranslation($language = null)
{
$language = $language ?: Yii::$app->language;
return $this->hasOne(PostLang::className(), ['post_id' => 'id'])
->where(['language' => $language]);
}
Теперь в представлении можно получить переведённый заголовок так:
$post = Post::findOne($id);
$translation = $post->getTranslation()->one();
echo $translation ? $translation->title : $post->title; // fallback на оригинал
Этот подход гибкий и позволяет легко добавлять новые языки. Но будьте внимательны: не забывайте про индексы и внешние ключи, чтобы не получить тормоза на больших объёмах данных.
Шаг 4. Переключатель языка в интерфейсе
Чтобы пользователь мог сам выбирать язык, добавьте виджет переключателя. Это может быть простой выпадающий список или ссылки с флагами стран.
Пример с использованием URL-параметра:
<ul class="language-switcher">
<li><a href="?lang=ru-RU">Русский</a></li>
<li><a href="?lang=en-US">English</a></li>
</ul>
Красиво и просто. Но если вы используете ЧПУ, лучше передавать язык через компонент urlManager. Например, с префиксом в URL: /en/post/view?id=1. Это уже тема для отдельной статьи, но имейте в виду — такой подход более профессиональный.
Также не забывайте про сохранение выбранного языка в куки, чтобы при следующем визите пользователь не перенастраивал всё заново.
yii\i18n\Formatter для локализации дат и чисел. Например, Yii::$app->formatter->asDate($date) автоматически подстроится под текущий язык.
Шаг 5. Тестирование и отладка
Когда всё настроено, обязательно проверьте, что переводы работают корректно. Включите режим отладки Yii2 и посмотрите, нет ли ошибок в файлах переводов. Частая проблема — неправильный формат ключей или отсутствие перевода для какой-то строки.
Используйте встроенный инструмент yii message/extract для автоматического сбора всех строк, которые нужно перевести. Это сэкономит кучу времени.
./yii message/extract @app/messages/config.php
После выполнения команды вы получите файлы с переводами, где будут все строки из вашего кода. Останется только заполнить переводы.
Что в итоге
Мультиязычность в Yii2 — это не так страшно, как кажется. Главное — правильно настроить компонент i18n, определить язык пользователя и организовать хранение переводов. Используйте PHP-файлы для статических строк и отдельные таблицы для динамического контента. Не забывайте про переключатель языка и тестирование.
Следуя этим шагам, вы быстро сделаете свой сайт доступным для пользователей со всего мира. И помните: лучше потратить время на настройку сейчас, чем потом переделывать всё с нуля. Удачи в кодинге!


