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

Digital-студия WNDER

Почему мультиязычность — это просто (если знать секрет)

Мультиязычность в 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-файлы для статических строк и отдельные таблицы для динамического контента. Не забывайте про переключатель языка и тестирование.

Следуя этим шагам, вы быстро сделаете свой сайт доступным для пользователей со всего мира. И помните: лучше потратить время на настройку сейчас, чем потом переделывать всё с нуля. Удачи в кодинге!

Студия WNDER