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