Содержание


I18n (Переводчик)


I18n, ЗФ2, Zend Framework 2, ZF2, ру, ru




Zend\I18n поставляется с готовым набором для перевода, который поддерживает все основные форматы и включает в себя популярные функции, такие как множественное число переводов и текст областей. Компонент Translator в основном бесплатен, за исключением некоторых случаев.

Переводчик сам инициализируется без каких-либо параметров. Переводчик изначально ничего не делает кроме того, что возвращает идентификатор сообщения.

Добавление перевода 

 

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

Для добавления одного файла в переводчик используйте метод addTranslationFile ():

use Zend\I18n\Translator\Translator;
 
$translator = new Translator();
$translator->addTranslationFile($type, $filename, $textDomain, $locale);

Тип - это имя одного из форматов загрузчика, перечисленные в следующем разделе. Имя файла указывает на файл, содержащий файл, содержащий переводы и текстовый домен определяет имя категории для переводов. Если текстовый домен не указан, то по умолчанию будет значение «по умолчанию». Стандарт определяет с какого языка переводится текст и требуется только для форматов, которые содержат переводы для одного языка.

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

 

При сохранении одного языка на файл, вы должны указать остальные файлы с помощью шаблона. Это позволяет добавлять новые переводы в файловой системе, не трогая код. Шаблоны добавляются с помощью метода addTranslationFilePattern():

use Zend\I18n\Translator\Translator;
 
$translator = new Translator();
$translator->addTranslationFilePattern($type, $pattern, $textDomain);

Параметры для добавления шаблонов очень похожи на добавление отдельных файлов, кроме того, что не обязательно указывать язык и местоположение файла шаблона sprtinf. Язык передается в Sprintf, так что вы можете использовать шаблоны %sили % 1$s, которые будут заменены. Так что, если ваши файлы перевода находятся в /VAR/messages/LOCALE/messages.mo, вы должны указать ваш шаблон как /VAR/messages/%s/messages.mo.

 

Поддерживаемые форматы

 

Переводчик поддерживает следующие основные форматы перевода:

- PHP массивы

- Gettext

- Tmx

- XLIFF

Установка локали

По умолчанию, переводчик получит язык для использования от класса Locale с расширением Intl. Если вы хотите установить альтернативный язык явно, вы можете сделать это путем передачи его в SetLocale () метод.

Когда нет перевода для определенного идентификатора сообщения в языке, идентификатор сообщения сам будет возвращен по умолчанию. Или же вы можете установить резервный язык, который будет использоваться для получения резервного перевода. Чтобы сделать это, передайте его в setFallbackLocale() метод.

 

Перевод сообщений

Перевод сообщений может осуществляться путем вызова метода translate():

$translator->translate($message, $textDomain, $locale);

Сообщение - это ID вашего сообщения для перевода. Если оно не существует в загрузчике переводчика или пустое, то будет возвращен оригинальный идентификатор сообщения. Параметр текстовый домен – это параметр, который вы указали при добавлении перевода. Если он опущен, будет использоваться область текста по умолчанию. Языковой параметр, как правило, не должен использоваться в этом контексте, так как по умолчанию язык взят из языка, установленного в переводчик.

Чтобы перевести множественные сообщения, вы можете использовать метод translatePlural (). Он работает так же как и translate(), но вместо одного сообщения требует множественное значение и дополнительные целое число, на котором основывается форма множественного числа:

$translator->translatePlural($singular, $plural, $number, $textDomain, $locale);

Множественные переводы доступны только если основной формат поддерживает транспорт множественных сообщений и определения множественных правил.


Кэширование

В продакшене имеет смысл кэшировать переводы. Это не только избавит вас от загрузки и разбора отдельных форматов каждый раз, но и гарантирует оптимизацию процедуры загрузки. Чтобы включить кэширование, просто передайте Zend\Cache\Storage\Adapterв метод setCache (). Чтобы отключить кэш, вы можете просто передать нулевое значение.