Локализация приложения
Приложение поддерживает работу с локализациями, возможен как перевод фраз интерфейса так и перевод данных указываемых в админ-панели.
Перевод фраз интерфейса
Для перевода фраз используется дополнение php gettext в основе которого библиотека интернационализации Gettext. Кроме установленного дополнения php также необходимо чтобы в системе (на сервере) была установлена соответствующая локализация. Проверить список доступных локализаций можно выполнив следующую консольную команду на сервере:
locale -a
Результатом выполнения которой будет подобный текст:
en_AU
en_AU.UTF-8
en_US
en_US.ISO8859-1
en_US.UTF-8
ru_RU
ru_RU.UTF-8
Который сообщает что в системе установлены локали: en_AU, en_US и ru_RU. В случае если требуемая локаль отсутствует, обратитесь с данным вопросом к системному администратору.
В коде приложения для перевода фраз используются методы _t
, _te
, _tejs
, где в качестве первого параметра указывается контекст,
обычно это название модуля, что в дальнейшем поможет облегчить понимание в контексте какого модуля используется данная фраза.
В файлах php шаблонов это выглядит следующим образом:
<div><?= _t('shops', 'Наименование магазина:'); ?></div>
В примере в качестве контекста указан модуль shops, что в общем понятно и из текста фразы.
Все фразы доступны для перевода в файле перевода со специальным форматом *.po
или *.pot
, формируется
данный файл динамически в момент его скачивания в админ-панели в разделе "Настройки сайта / Локализация".
Файл представляет из себе простой текстовый файл, где пример фразы выше будет иметь следующий вид:
msgid "shops|Наименование магазина:"
msgstr ""
Она состоит из следующих блоков:
-
msgid
- исходная фраза, которую необходимо оставить в неизменном виде -
shops|
- префикс контекста, не входит в саму фразу, префиксы стоят слева от фразы и всегда отделяются вертикальной чертой|
-
msgstr
- фраза перевода, поле в котором указывается текст перевода, в случае если поле пустое""
, будет использоваться исходная фраза
Рассмотрим пример фразы в админ-панели:
<div><?= _t('docs', 'Перейдите по ссылке: [url]', [
'url'=>'<a href="example.com">http://example.com</a>
']); ?></div>
В файле перевода она будет иметь следующий вид:
msgctxt "admin"
msgid "docs|Перейдите по ссылке: [url]."
msgstr "Follow this url: [url]"
И состоять из следующих блоков:
-
msgctxt
- контекст перевода"admin"
указывает на то что она используется только в панели администратора, если же данная строка отсутствует, фраза используется в пользовательской части сайта -
msgid
- исходная фраза -
docs|
- префикс контекста -
[url]
- макрос, вместо которого будут подставлены данные, в данном случае ссылка, макросы всегда имеют вид текста латиницей в квадратных скобках, они не переводятся и подставляются во фразу перевода в неизменном виде -
msgstr
- фраза перевода, где для примера указан перевод на английский, также
Работать с файлом перевода можно как в специальном редакторе для переводчика http://poedit.net/ так и в обычном текстовом файле.
В случае если в тексте перевода встречаются символ кавычки вида "
, перед ними следует ставить слеш \"
.
Доступны следующие функции перевода:
_t('context', 'Текст');
_t('context', 'Ссылка: [url]', ['url'=>'http://example.com']);
В случае если требуется экранировать специальные символы используется функция _te()
:
<input type="button" value="<?= _te('users', 'Сохранить') ?>">
При вставке фразы в javаscript код используйте специальную функцию _tejs
:
<script>
alert('<?= _tejs('users', 'Спасибо!') ?>');
</script>
Локализация дополнений
Плагины и темы также поддерживают локализацию, подробнее о том как это работает читайте в разделе Дополнения / Локализация
Компонент
Для работы с текущим языком в рамках приложения следует использовать компонент bff::locale()
Основные доступные методы:
// ключ текущего языка в двухбуквенном формате 'ru'
bff::locale()->getCurrentLanguage();
// получаем язык приложения по умолчанию
bff::locale()->getDefaultLanguage();
// получаем список всех используемых языков приложения, настроить которые можно
// в разделе "Настройки сайта / Локализация / Настройки"
bff::locale()->getLanguages();
Также доступен метод модуля Site возвращающий список видимых для пользователя языков:
$languages = Site::languagesList();