Пример интернационализации сайта на Yii2 на двух языках: ru и en.
В Yii2 уже встроен компонент отвечающий за интернационализацию, называется он i18n. Для того что бы можно было начать им пользоваться, достаточно добавить его в конфигурацию приложения в раздел components.
Я использую шаблон advanced поэтому расположение файлов могут отличаться.
Цель
- переключение сайта между двумя языками: ru и en;
- отображение языка в адресной строке в виде site.com/en/;
- автоматическое перенаправление пользователя на наиболее подходящий для него язык, если он перешел на сайт без указания языка;
- хранение переводов должно осуществляться в 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/
Добавить комментарий