Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Переводы и языки

Чтобы сайт работал на нескольких языках, тексты интерфейса не пишут прямо в шаблонах, а пропускают через функцию перевода. Она ищет строку в файле перевода для текущего языка. Эту область называют i18n — сокращение от слова internationalization.

Язык приложения

В config/web.php задают два языка:

// config/web.php
$config = [
    'sourceLanguage' => 'en-US',
    'language' => 'ru-RU',
    // ...
];

sourceLanguage — язык, на котором строки написаны в коде (по умолчанию английский), language — язык, на который их нужно перевести. Сообщения самого фреймворка — ошибки форм, подписи кнопок — после этого станут русскими.

Функция перевода

В шаблонах текст оборачивают в Yii::t():

<?php
// views/post/index.php
?>
 
<h1><?= Yii::t('app', 'Posts') ?></h1>

Первый аргумент — категория, то есть имя файла перевода; для своих текстов принято app. Второй — исходная строка. Пока перевода нет, на странице останется «Posts».

Файл перевода

Переводы лежат в папке messages, в подпапке с кодом языка. Создайте вручную messages/ru-RU/app.php:

// messages/ru-RU/app.php
return [
    'Posts' => 'Статьи',
    'Read more' => 'Читать дальше',
    'Hello, {name}!' => 'Здравствуйте, {name}!',
];

Обновите страницу — заголовок станет «Статьи». Категория app и папка messages в стандартном проекте работают без дополнительной настройки.

Подстановка значений

Изменяемые части строки записывают в фигурных скобках и передают третьим аргументом:

echo Yii::t('app', 'Hello, {name}!', ['name' => 'Анна']);

Результат — «Здравствуйте, Анна!». Место подстановки переводчик может передвинуть, как требует язык.

Переключение языка

Язык можно менять для каждого запроса — например, по выбору посетителя, сохранённому в сессии. Свойство задают до вывода страницы:

Yii::$app->language = Yii::$app->session->get('language', 'ru-RU');

Удобное место для этой строки — метод beforeAction() общего базового контроллера. Сохраняет выбор отдельное действие, которое записывает код языка в сессию.

Даты и числа

Компонент formatter выводит даты и числа по правилам текущего языка:

echo Yii::$app->formatter->asDate($post->created_at, 'long');   // 2 марта 2026 г.
echo Yii::$app->formatter->asDecimal(1234.5, 2);                // 1 234,50
echo Yii::$app->formatter->asCurrency(19.99, 'EUR');            // 19,99 €

Для английского языка те же вызовы дадут «March 2, 2026» и «1,234.50». Для такого форматирования в PHP должно быть включено расширение intl.

Свои категории

Другие имена категорий подключают в компоненте i18n:

// config/web.php
'components' => [
    'i18n' => [
        'translations' => [
            'shop*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@app/messages',
            ],
        ],
    ],
],

Вызов Yii::t('shop', 'Cart') будет искать перевод в файле messages/ru-RU/shop.php.

Частая ошибка

Строку нельзя собирать по частям: Yii::t('app', 'Hello, ') . $name не оставляет переводчику возможности поменять порядок слов, а ключ 'Hello, ' с пробелом легко не найти в файле. Передавайте в Yii::t() целую фразу с местами подстановки в фигурных скобках.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.