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