Віджет багатомовності в 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' => ['uk', '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' => 'ua']
)); ?>
</li>
</ul>
</div>

Висновок

В цілому реалізація інтернаціоналізації в Yii2 не представляє нічого складного, вийшов простий віджет, з трьома файлами.

UrlManager.php взято звідси. MultiLang.php просто рендерить подання. View.php саме уявлення.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.