Yii2: Translate Manager

yii2 translate managerНовый модуль 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']],
    ]
];

8 thoughts on “Yii2: Translate Manager

  1. Юзверь

    Не подскажете нубу, как разрешить доступ со всех IP.

    И вот эта штука » ‘roles’ => [‘@’] » выдаёт ошибку.

    1. nix Автор записи

      1. Для разрешения доступа с любого IP, измените соответствующее правило: ‘allowedIPs’ => [‘*’]
      2. Были пропущены запятые при перечислении элементов массива. Исправил код — проверьте.

  2. Юзверь

    Спасибо, покопался и уже тоже нашел решения.
    Для использования ‘roles’ => [‘@’] надо было включить authManager.

    Не подскажете ещё такую проблему: в сторонних модулях сообщения находит, можно их перевести в админке, но на фронтенде просто не переводит…

  3. Юзверь

    Блин, уже нашел ответ… В самом модуле гвоздями прибили папку для переводов и они тянулись только оттуда…

  4. Николай

    Основная фишка этого менеджера в самом модуле. С ним упрощается редактирования всех текстов. Не могу разобраться в настройке модуля.

    1. Как настроить правильное сканирование?
    2. Что означает Optimize?

  5. pilum

    Добрый день!
    Не вижу разницы между примерами для php и JavaScript, очевидно, в JS этот код работать не будет. Как же на самом деле переводить JS? И еще не могу понять, зачем для php-фронтэнда отдельный способ перевода?

    1. pilum

      Ага, в родной документации автора нашел для JavaScript: lajax.t(‘Apple’);
      Думаю, вам стоит поправить у себя.

      Про хэлпер вопрос так и остается: зачем оно надо, если можно родной фреймворковой Yii::t() пользоваться?

      1. pilum

        Опять сам отвечаю на свой вопрос про хэлпер для фронтэнда (может еще кому поможет быстро оценить возможности модуля без полного прочтения документации от автора).

        Конструкции
        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» работает некорректно!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *