Новый модуль 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» работает некорректно!