Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Пример организации интернационализации через Yii::t для расширения на Yii2

Пример организации интернационализации через Yii::t для расширения на Yii2

При написании более-менее серьезного расширения каждый разработчик должен задуматься на тему удобстве его использования другими. Это относится не только к удобству использования кода, интерфейса, но и понятного языка этого самого интерфейса. Поэтому хочу поделиться с вами одним из вариантов организации интернационализации расширения на yii framework 2.

Будь уникальным!

Как вы знаете, в компоненте интернационализации yii\i18n\I18N категория перевода хранится в качестве ключа массива источника перевода, поэтому крайне желательно сделать название категории уникальной. Для этого можно использовать имя владельца и название пакета. Например, vasyaSuperCoder_awesomeExtension.

Как же это переводить?

Возникает резонный вопрос. Как это дальше использовать? Неужели писать Yii::t('vasyaSuperCoder_awesomeExtension', 'Hello')? Это неудобно! И вы чертовски правы, удобством тут и не пахнет. Именно поэтому создадим хелпер с методом перевода в котором реализуем метод t без первого параметра - категории.

Пример реализации

namespace VasyaSuperCoder\AwesomeExtension\helpers;

use Yii;

class MyExt
{
	public static function t($message, $params = [], $language = null)
	{
		return Yii::t('vasyaSuperCoder_awesomeExtension', $message, $params, $language);
	}
}

Теперь в местах вывода текста с переводом просто указываем echo MyExt::t('Hello'). Как правило, в качестве языка оригинала всегда используется английский и именно он переводится потов во все остальные.

Быстрый старт вашего расширения у стороннего разработчика

Теперь ваше приложение готово завоевать сердца не только русскоязычных разработчиков, а абсолютно всех. Но для этого необходимо облегчить установку расширения через composer путем автоматической регистрации источника переводов.

Раз мы пишет расширение для Yii2, то в composer.json необходимо указать yii2-extension в секции type. Расширения данного типа поддерживают выполнение Bootstrap файла. Для этого создадим его.

namespace VasyaSuperCoder\AwesomeExtension;

use Yii;

class Bootstrap implements \yii\base\BootstrapInterface
{
    /**
     * Bootstrap method to be called during application bootstrap stage.
     * @param \yii\base\Application $app the application currently running
     */
    public function bootstrap($app)
    {
        Yii::$app->i18n->translations['vasyaSuperCoder_awesomeExtension'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en-US',
            'basePath' => '@VasyaSuperCoder/AwesomeExtension/messages',
        ];
    }
}

Теперь укажем, что его необходимо добавить в автозагрузку. Снова поправим composer.json, добавив "bootstrap": "VasyaSuperCoder\\AwesomeExtension\\Bootstrap" в секцию extra.

Несколько слов напоследок

В данной заметке я хотел лишь описать принцип реализации переводов для Yii framework 2 расширения, поэтому опустил описание как и где хранить переводы и некоторые прочие вещи. Не обессудьте.

  • 2016-07-16 18:47:21