i18nЕсли мы создаем модуль или расширение для Yii2 и планируем выложить его в открытый доступ, то хотелось бы сделать возможность перевода контента. Названия кнопок, заголовки и прочие элементы пользовательского интерфейса.

Во фреймворке Yii и в 1-ой и во 2-ой версии можно брать переводы либо из файла, либо из базы. Для расширений (а я заострю внимание именно на расширениях). всё-таки хранение в базе данных избыточно.

В Yii2 , впрочем ещё со времён Yii версии 1, есть стандартная функция для перевода Yii::t() – работает она очень просто:

т.е. если мы используем хранение переводов в файлах в папке messages будет подпапка, к примеру, ru_RU  и в ней файл app.php – и в файле настройки приложения config/main.php будут указаны переменные:

в файле app.php следующее содержимое:

И на выходе получим слово “Сохранить”.

Есть интересная возможность, которая описана в документации – это сбор всех нужных для перевода слов в файл. Делается это с помощью консольной команды

но сначала надо создать конфигурационный файл в папке messages – это можно сделать с помощью следующей команды:

Переводы для расширений

в случае для расширения надо указать правильные пути и для файла конфига и для папки с сообщениями.

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

Вот таким:

Теперь можно в коде можно использовать – указывая категорию перевода.

После этого запускаем команду

И получаем сгенерированый файл с переводами, которые впрочем ещё надо заполнить самостоятельно. Но это гораздо проще, чем искать их по всему коду и добавлять вручную.

Но как же заставить приложение искать переводы в директории расширения, а не основной директории переводов messages?

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

Итак в папке почти каждого расширения есть файл Module.php – инициирующий запуск расширения.

В нем надо зарегистрировать переводы:

Метод init() запускается автоматически – и мы просто добавили функцию registerTranslations()

В ней мы просто добавляем новую категорию yii2ext (это произвольное имя) – описываем  с какого перевода переводим – параметр ‘sourceLanguage’, путь к директории с переводами – параметр ‘basePath’  и всё.

теперь я, к примеру, в описании атрибутов модели расширения использую:

и т.д.

см. выше – если у нас появились новые переводы, после каких то модификаций кода, то запускаем опять

и переводим то что записалось в файл yii2ext.php 

Получилось немного сумбурно – но…. читаем доки, смотрим как у других сделано, если что задаем вопросы – тут или на форуме Yii2.ru

Полезные ссылки:

http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html

Yii2 – перевод модулей и расширений
Метки: