Виджет мультиязычности в YII2 без использования базы данных

в 13:46, , рубрики: yii, yii2, yii2 multi language

Пример интернационализации сайта на Yii2 на двух языках: ru и en.

В Yii2 уже встроен компонент отвечающий за интернационализацию, называется он i18n. Для того что бы можно было начать им пользоваться, достаточно добавить его в конфигурацию приложения в раздел components.

Я использую шаблон advanced поэтому расположение файлов могут отличаться.

Цель

  1. переключение сайта между двумя языками: ru и en;
  2. отображение языка в адресной строке в виде site.com/en/;
  3. автоматическое перенаправление пользователя на наиболее подходящий для него язык, если он перешел на сайт без указания языка;
  4. хранение переводов должно осуществляться в PHP файлах в виде массивов;


Конфигурация
Правим файл конфигурации, в моем случаи это frontendconfigmain.php

return [
    'language'=>'en',
// язык по умолчанию, на который будет перенаправлен пользователь в случае невозможности определения для него наиболее подходящего языка на основе данных предоставляемых его браузером.
    'components' => [
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'class' => 'frontendwidgetsMultiLangcomponentsUrlManager',
// заменяем стандартный урл.менеджер на наш.
            'languages' => ['ru', 'en'],
//список языков на который переводим сайт
            'enableDefaultLanguageUrlCode' => true,    
// показываем идентификатор языка по умолчанию, если false, то при в корне сайта не будет виден идентификатор языка  www.site.com/   , с true – www.site.com/ru
            'rules'=>[
                '/' => 'site/index',
                '<controller:w+>/<action:w+>/'=>'<controller>/<action>',

            ],
        ],
        'i18n' => [
            'translations' => [
                'app*' => [
// app название нашего php файла переводов который нужно создать app.php (может быть любым)
                    'class' => 'yiii18nPhpMessageSource',
                    'basePath' => '@frontend/messages',
// путь для нашего файла переводов frontend/messages/ru/app.php
                    'sourceLanguage' => 'en',
// язык с какого переводим, то есть, в проекте все надписи пишем на английском
                ],
            ],
        ],
    ],

'class' => 'frontendwidgetsMultiLangcomponentsUrlManager', содержание файла взято отсюда, можно следовать инструкции разработчика и использовать composer, но мы то делаем виджет, по этому просто скопируем UrlManager.php в наш виджет.

Файл со списком переводов frontend/messages/ru/app.php, должен содержать массив

return [
    ...
    'Example text...' => 'Пример текста...',
    ...
];

Используем встроенный метод t

<?= Yii::t('app', 'Example text...') ?>

В первом аргументе указываем категорию, у нас она одна – app, вы можете создать много файлов переводов. Во втором аргументе пишем английский текст в том виде как он должен отображаться на сайте.

Переключение языков.

Создаем папку MultiLang в папке с виджетами, у меня это выглядит так:

Frontend
    Widgets
       MultiLang
	  Components
	    UrlManager.php
	  Views
	    View.php
	  MultiLang.php

Для показа переключателя языка в любом месте вызываем

<?= MultiLang::widget(['cssClass'=>'pull-right language']); ?>

Не забудьте прописать путь к виджету

use frontendwidgetsMultiLangMultiLang;

Содержание класса frontendwidgetsMultiLangMultiLang.php

<?php
namespace frontendwidgetsMultiLang;

use yiihelpersHtml;

class MultiLang extends yiibootstrapWidget
{
    public $cssClass;
    public function init(){}

    public function run() {

        return $this->render('view', [
            'cssClass' => $this->cssClass,
        ]);

    }
}

Содержание представление frontendwidgetsMultiLangviewsview.php

<?php
namespace frontendwidgetsMultiLang;
use yiihelpersHtml;
use Yii;
?>

<div class="btn-group <?= $cssClass; ?>">
    <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
        <span class="uppercase"><?= Yii::$app->language; ?></span>
        <span class="caret"></span>
    </a>
    <ul class="dropdown-menu">
        <li class="item-lang">
            <?= Html::a('Go to English', array_merge(
                Yii::$app->request->get(),
                [Yii::$app->controller->route, 'language' => 'en']
            )); ?>
        </li>
        <li class="item-lang">
            <?= Html::a('Перейти на русский', array_merge(
                Yii::$app->request->get(),
                [Yii::$app->controller->route, 'language' => 'ru']
            )); ?>
        </li>
    </ul>
</div>

Заключение
В целом реализация интернационализации в Yii2 не представляет ничего сложного, получился простой виджет, с тремя файлами.

UrlManager.php взят отсюда.
MultiLang.php просто рендерит представление.
View.php само представление.

Автор: xelaxela

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js