Урок 17: Локализация и мультиязычность в Yii 2. Переводы, переключение языка, форматирование данных.

В 17-ом уроке мы изучим тему, которая сделает ваше приложение доступным для пользователей из разных стран. Локализация это не просто перевод текста, а адаптация форматов дат, чисел и даже логики под культурные особенности аудитории. В Yii 2 всё это реализуется элегантно и эффективно.

Перевод текстов с помощью компонента i18n

Первое, с чем сталкивается разработчик при создании мультиязычного приложения, это необходимость переводить статический текст: кнопки, заголовки, сообщения. В Yii 2 за это отвечает компонент i18n (сокращение от internationalization).

Чтобы начать работу, нужно настроить компонент в конфигурации приложения. Откройте файл config/web.php и добавьте секцию i18n:

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

Здесь:

  • app* — шаблон, определяющий категории переводов (например, appapp/error).
  • PhpMessageSource — используем PHP-файлы для хранения переводов (можно заменить на DbMessageSource для БД).
  • basePath — путь к папке с языковыми файлами.

Для перевода текста в коде используется метод Yii::t(). Например:

php
echo Yii::t('app', 'Welcome to our site!');

Практическая задача 1:
Создайте базовую конфигурацию i18n и переведите фразу «Hello, world!» на русский язык. Проверьте результат на странице.

Создание языковых файлов

Языковые файлы хранят соответствия между исходными строками и их переводами. В Yii 2 они обычно располагаются в папке messages, а их структура зависит от локали (например, ru-RUen-US).

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

messages/
├── en-US/
│   └── app.php
└── ru-RU/
    └── app.php

Содержимое ru-RU/app.php:

php
return [
    'Welcome to our site!' => 'Добро пожаловать на наш сайт!',
    'You have {n, plural, =0{no items} =1{one item} other{# items}}.' => 
        'У вас {n, plural, =0{нет элементов} =1{один элемент} other{# элементов}}.',
];

Особенности:

  • Поддерживаются плейсхолдеры (например, {n}) и плюрализация.
  • Для сложных проектов файлы можно группировать в подпапки (например, messages/ru-RU/app/error.php).

Практическая задача 2:
Добавьте в языковой файл фразу с плюрализацией для отображения количества товаров в корзине. Используйте её в шаблоне.

Динамическое переключение языка

Чтобы пользователи могли выбирать язык, нужно реализовать механизм переключения. Чаще всего это делается через URL-параметр, куки или сессию.

Добавим в контроллер действие actionSetLanguage:

php
public function actionSetLanguage($lang)
{
    Yii::$app->language = $lang;
    Yii::$app->session->set('userLanguage', $lang);
    return $this->redirect(Yii::$app->request->referrer);
}

Теперь в шаблоне можно разместить переключатель:

php
<?= Html::a('Русский', ['site/set-language', 'lang' => 'ru-RU']) ?>
<?= Html::a('English', ['site/set-language', 'lang' => 'en-US']) ?>

Важно:

  • Убедитесь, что выбранный язык сохраняется между запросами (например, в сессии).
  • Для SEO добавьте альтернативные ссылки с атрибутом hreflang.

Практическая задача 3:
Создайте виджет «Выбор языка», который отображает флаги стран и сохраняет выбор пользователя в куки.

Локализация дат и чисел

Разные регионы используют разные форматы. Например, в США дата пишется как «MM/DD/YYYY», а в Германии «DD.MM.YYYY». Yii 2 предоставляет форматтеры для автоматического преобразования.

Форматирование даты:

php
echo Yii::$app->formatter->asDate('2024-01-15', 'long'); // 15 января 2024 г.

Форматирование чисел:

php
echo Yii::$app->formatter->asDecimal(1234.567, 2); // 1 234,57 (для ru-RU)

Настройка локали:
Форматтер использует текущий язык приложения. Если нужно переопределить локаль, сделайте это в конфиге:

php
'components' => [
    'formatter' => [
        'locale' => 'ru-RU',
        'dateFormat' => 'php:d.m.Y',
    ],
],

Практическая задача 4:
Выведите текущее время в формате «14:30» для английского и «14 час. 30 мин.» для русского языка, используя настройки форматтера.

Заключение

Локализация важный этап в разработке международных приложений. Сегодня вы научились работать с переводами, динамически менять язык и адаптировать форматы данных. Не забывайте тестировать приложение на разных языках, чтобы убедиться в корректности отображения.

Если вы хотите глубже освоить Yii 2, посмотрите полный курс для начинающих. Там вас ждёт ещё больше практики и примеров!

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий