Новый модуль yii2-translate-manager предоставляет простой механизм для организации многоязычных приложений. Среди его особенностей — автоматическое определение новых языков (путем сканирования проекта). Повторяющиеся элементы автоматически отфильтровываются в процессе сканирования. Неиспользуемые элементы могут быть удалены при оптимизации базы данных. Сканирование включает в себя и js-файлы, что позволяет управлять переводами сообщений, формирующихся на стороне клиенты при помощи javascript.
На стороне сервера доступ к переводам может быть получен через одномерный массив или функцию Yii::t. Так же, реализована возможность исключения файлов или каталогов из перевода.
Установка
Предпочтительнее производить установку при помощи composer.
Для этого достаточно добавить следующую строку в раздел require файла composer.json вашего приложения:
"lajax/yii2-translate-manager": "1.*"
или выполнить команду:
php composer.phar require --prefer-dist lajax/yii2-translate-manager "1.*"
Использование
Настройка
Простой пример:
'language' => 'en-US',
'components' => [
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\DbMessageSource',
'db' => 'db',
'sourceLanguage' => 'xx-XX', // Язык разработчика
'sourceMessageTable' => 'language_source',
'messageTable' => 'language_translate',
'cachingDuration' => 86400,
'enableCaching' => true,
],
],
],
],
Подключение модуля
Простой пример подключения модуля:
'modules' => [
'translatemanager' => [
'class' => 'lajax\translatemanager\Module',
],
],
Более сложный пример, включающий указание таблицы базы данных для хранения переводов:
'modules' => [
'translatemanager' => [
'class' => 'lajax\translatemanager\Module',
'root' => '@app', // Начальная директория сканирования проекта.
'layout' => 'language', // Имя используемой layout. При использовании своей layout можно присвоить ‘null’.
'allowedIPs' => ['127.0.0.1'], // IP адреса, с которых будет доступен интерфейс переводов.
'roles' => ['@'], // Уровень доступа к интерфейсу переводов.
'tmpDir' => '@runtime', // Каталог для временных файлов, доступный для записи.
// ВАЖНО: должен совпадать с каталогом временных файлов приложения, так как AssetsManager ищет js-файлы с переводами в этом каталоге).
'ignoredCategories' => ['yii'], // Категории, которые не будут включены в перевод.
'ignoredItems' => ['config'], // Файлы, исключенные из сканирования.
'tables' => [ // Индивидуальные настройки
[
'connection' => 'db', // Идентификатор подключения к базе данных
'table' => 'language', // Имя таблицы
'columns' => ['name', 'name_ascii'] // Имена столбцов
],
],
],
],
Перевод frontend
'bootstrap' => ['translatemanager'],
'component' => [
'translatemanager' => [
'class' => 'lajax\translatemanager\Component',
],
]
Миграции
Для выполнения миграции нужно выполнить следующие команды:
На linux:
yii migrate/up --migrationPath=@vendor/lajax/yii2-translate-manager/migrations
На windows:
yii.bat migrate/up --migrationPath=@vendor/lajax/yii2-translate-manager/migrations
Для перевода клиентских сообщений в js-файлах, необходимо зарегистрировать скрипты, используя метод файлы\lajax\translatemanager\helpers\Language::registerAssets() в каждом экшене. Простой пример:
namespace common\controllers;
use lajax\translatemanager\helpers\Language;
// ВАЖНО: Все контроллеры должны наследовать этот контроллер!
class Controller extends \yii\web\Controller {
public function init() {
Language::registerAssets();
parent::init();
}
}
Простой пример для отображения кнопки переключения языка frontend:
\lajax\translatemanager\widgets\ToggleTranslate::widget();
Более сложный пример отображения кнопки:
\lajax\translatemanager\widgets\ToggleTranslate::widget([
'position' => \lajax\translatemanager\widgets\ToggleTranslate::POSITION_TOP_RIGHT,
'template' => '<a href="javascript:void(0);" id="toggle-translate" class="{position}" data-language="{language}"><i></i> {text}</a><div id="translate-manager-div"></div>',
'frontendTranslationAsset' => 'lajax\translatemanager\bundles\FrontendTranslationAsset',
'frontendTranslationPluginAsset' => 'lajax\translatemanager\bundles\FrontendTranslationPluginAsset',
]);
Как использовать Translate Manager в коде
Пример для javascript
[js]Yii::t(‘category’, ‘Apple’);
Yii::t(‘category’, ‘Hello {name}!’, [‘name’ => ‘World’]);
Yii::t(‘category’, "Don’t be so upset.");[/js]
Примеры для php
Использование в методах:
Yii::t('category', 'Apple');
Yii::t('category', 'Hello {name}!', ['name' => 'World']);
Yii::t('category', "Don't be so upset.");
Функции php для перевода frontend:
use lajax\translatemanager\helpers\Language as Lx;
Lx::t('category', 'Apple');
Lx::t('category', 'Hello {name}!', ['name' => 'World']);
Lx::t('category', "Don't be so upset.");
Массивы php:
/**
* @translate
*/
private $_STATUSES = [
self::STATUS_INACTIVE => 'Inactive',
self::STATUS_ACTIVE => 'Active',
self::STATUS_DELETED => 'Deleted'
];
/**
* Returning the ‘status’ array on the site’s own language.
* return array
*/
public function getStatuses() {
return \lajax\translatemanager\helpers\Language::a($this->_STATUSES);
}
/**
* @translate
*/
private $_GENDERS = ['Male', 'Female'];
/**
* Returning the ‘genders’ array in German
* return array
*/
public function getGenders() {
return \lajax\translatemanager\helpers\Language::a($this->_GENDERS, 'de-DE');
}
Использование с базой данных:
namespace common\models;
use lajax\translatemanager\helpers\Language;
/**
* This is the model class for table "category".
*
* @property string $category_id
* @property string $name
* @property string $description
*/
class Category extends \yii\db\ActiveRecord {
// afterFind & beforeSave:
/**
* @var Returning the ‘name’ attribute on the site’s own language.
*/
public $name_t;
/**
* @var Returning the ‘description’ attribute on the site’s own language.
*/
public $description_t;
...
public function afterFind() {
$this->name_t = Language::d($this->name);
$this->description_t = Language::d($this->descrioption);
parent::afterFind();
}
public function beforeSave($insert) {
if (parent::beforeSave($insert)) {
Language::saveMessage($this->name);
Language::saveMessage($this->description);
return true;
}
return false;
}
// or GETTERS:
/**
* @return string Returning the ‘name’ attribute on the site’s own language.
*/
public function getName($params = [], $language = null) {
return Language::d($this->name, $params, $language);
}
/**
* @return string Returning the ‘description’ attribute on the site’s own language.
*/
public function getDescription($params = [], $language = null) {
return Language::d($this->description, $params, $language);
}
}
Средства перевода
Ссылки на специальные средства:
/translatemanager/language/list // List of languages and modifying their status /translatemanager/language/scan // Scan the project for new multilingual elements /translatemanager/language/optimizer // Optimise the database
Пример реализации меню служебного меню для обслуживания переводов:
$menuItems[] = [
'label' => Yii::t('language', 'Language'), 'items' => [
['label' => Yii::t('language', 'Languages'), 'url' => ['/translatemanager/language/list']],
['label' => Yii::t('language', 'Scan'), 'url' => ['/translatemanager/language/scan']],
['label' => Yii::t('language', 'Optimize'), 'url' => ['/translatemanager/language/optimizer']],
]
];
Не подскажете нубу, как разрешить доступ со всех IP.
И вот эта штука » ‘roles’ => [‘@’] » выдаёт ошибку.
1. Для разрешения доступа с любого IP, измените соответствующее правило: ‘allowedIPs’ => [‘*’]
2. Были пропущены запятые при перечислении элементов массива. Исправил код — проверьте.
Спасибо, покопался и уже тоже нашел решения.
Для использования ‘roles’ => [‘@’] надо было включить authManager.
Не подскажете ещё такую проблему: в сторонних модулях сообщения находит, можно их перевести в админке, но на фронтенде просто не переводит…
Блин, уже нашел ответ… В самом модуле гвоздями прибили папку для переводов и они тянулись только оттуда…
Основная фишка этого менеджера в самом модуле. С ним упрощается редактирования всех текстов. Не могу разобраться в настройке модуля.
1. Как настроить правильное сканирование?
2. Что означает Optimize?
Добрый день!
Не вижу разницы между примерами для php и JavaScript, очевидно, в JS этот код работать не будет. Как же на самом деле переводить JS? И еще не могу понять, зачем для php-фронтэнда отдельный способ перевода?
Ага, в родной документации автора нашел для JavaScript: lajax.t(‘Apple’);
Думаю, вам стоит поправить у себя.
Про хэлпер вопрос так и остается: зачем оно надо, если можно родной фреймворковой Yii::t() пользоваться?
Опять сам отвечаю на свой вопрос про хэлпер для фронтэнда (может еще кому поможет быстро оценить возможности модуля без полного прочтения документации от автора).
Конструкции
use lajax\translatemanager\helpers\Language as Lx;
Lx::t(‘category’, ‘Apple’);
Lx::t(‘category’, ‘Hello {name}!’, [‘name’ => ‘World’]);
Lx::t(‘category’, «Don’t be so upset.»);
Нужны для того, чтобы можно было редактировать переводы этих фраз непосредственно на фронтэнд-странице сайта, не открывая админку. Редактирование включается кнопкой-виджетом: \lajax\translatemanager\widgets\ToggleTranslate::widget();который по умолчанию отображается в левом нижнем углу экрана, если у пользователя есть права редактирования переводов. В атрибутах тэгов типа «title» работает некорректно!