Локализация приложения

Приложение поддерживает работу с локализациями, возможен как перевод фраз интерфейса так и перевод данных указываемых в админ-панели.

Перевод фраз интерфейса

Для перевода фраз используется дополнение 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();