Пример организации интернационализации через 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 расширения, поэтому опустил описание как и где хранить переводы и некоторые прочие вещи. Не обессудьте.
