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

от автора

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

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

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

Цель

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


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

return [     'language'=>'en', // язык по умолчанию, на который будет перенаправлен пользователь в случае невозможности определения для него наиболее подходящего языка на основе данных предоставляемых его браузером.     'components' => [         'urlManager' => [             'enablePrettyUrl' => true,             'showScriptName' => false,             'class' => 'frontend\widgets\MultiLang\components\UrlManager', // заменяем стандартный урл.менеджер на наш.             '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' => 'yii\i18n\PhpMessageSource',                     'basePath' => '@frontend/messages', // путь для нашего файла переводов frontend/messages/ru/app.php                     'sourceLanguage' => 'en', // язык с какого переводим, то есть, в проекте все надписи пишем на английском                 ],             ],         ],     ],

‘class’ => ‘frontend\widgets\MultiLang\components\UrlManager’, содержание файла взято отсюда, можно следовать инструкции разработчика и использовать 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 frontend\widgets\MultiLang\MultiLang;

Содержание класса frontend\widgets\MultiLang\MultiLang.php

<?php namespace frontend\widgets\MultiLang;  use yii\helpers\Html;  class MultiLang extends \yii\bootstrap\Widget {     public $cssClass;     public function init(){}      public function run() {          return $this->render('view', [             'cssClass' => $this->cssClass,         ]);      } }

Содержание представление frontend\widgets\MultiLang\views\view.php

<?php namespace frontend\widgets\MultiLang; use yii\helpers\Html; 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 само представление.
ссылка на оригинал статьи https://habrahabr.ru/post/317828/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *