Расширение gettext

Задача
Необходима комплексная система для работы с каталогами сообщений.

Решение
Задействуйте расширение PHP gettext, позволяющее применять утилиты GNU gettext:

bindtextdomain('gnumeric','/usr/share/locale');
textdomain('gnumeric');
$languages = array('en_CA','da_DK','de_AT','fr_FR');
foreach ($languages as $language) {
setlocale(LC_ALL, $language);
print gettext(" Unknown formula")."\n";
}

Обсуждение
Расширение gettext представляет собой набор инструментов, облегчающих генерацию сообщений на разных языках в приложении. Компиляция PHP с параметром --with-gettext открывает доступ к функциям, позволяющим извлекать текст из каталогов сообщений в формате gettext; кроме того, существует множество внешних инструментов редактирования каталогов сообщений.

В случае применения gettext все сообщения делятся на домены, при этом все сообщения из одного домена хранятся в одном файле. Функция bindtextdomain() сообщает gettext, где искать каталог сообщений для определенного домена. Вызов:

bindtextdomain('gnumeric','/usr/share/locale')

означает, что каталог сообщений для домена gnumeric в локали en_CA находится в файле /usr/share/locale/en_CA/LC_MESSAGES/gnumeric.mo.

Функция textdomain('gnumeric') устанавливает в качестве домена по умолчанию домен gnumeric.


Вызов gettext() извлекает сообщение из домена по умолчанию. Существуют и другие функции, например dgettext(), позволяющие извлекать сообщения из различных доменов.

Когда вызывается функция gettext() (или dgettext()), она возвращает требуемое сообщение для текущей локали. Если в каталоге текущейлокали нет сообщения, которое соответствовало бы переданному ей аргументу, то функция gettext() (или dgettext()) просто возвращает сам аргумент. В результате программа печатает все почему-либо не переведенные сообщения на английском языке (или на любом языке, который является базовым).

Установка домена по умолчанию с помощью функции textdomain() делает каждое последующее извлечение сообщения из домена более кратким, поскольку вместо вызова dgettext('domain','Good morning') достаточно сделать вызов gettext('Good morning'). Однако если даже строка gettext('Good morning') выглядит слишком длинной, то можно воспользоваться преимуществом недокументированного синонима _() для функции gettext(). Вместо gettext('Good morning') можно написать _('Good morning').

На веб-сайте расширения gettext можно найти полезную и подробную информацию по управлению потоком данных между программистами и переводчиками и о том, как эффективно использовать расширение gettext. Сайт также содержит информацию о других инструментах, позволяющих управлять каталогами сообщений, например о специальном режиме GNU Emacs.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Использование определенной локали
Локализация включаемых файлов
Локализация дат и времени
Локализация денежных значений
Локализация изображений