Аргерих Л. О языке РНР. Часть 5. Страница 42


xgettext нашла в файле одну строку, которую можно перевести. Строка иден­тифицируется с помощью msgid, чтобы на этапе исполнения можно было най­ти и получить ее. Переводчик не должен изменять ID сообщения, связываю­щий его с источником. Должно быть заполнено только пустое поле msgstr.

msgfmt

Полученный переведенный файл должен быть конвертирован в двоичный формат, чтобы можно было пользоваться переводом. Для этой цели предна­значена программа msgfmt:

msgfmt helloworld.ро -о helloworld.mo

Полученный двоичный файл называется he!Loworid.mo. Расширения файлов . pc и , mc указывают, что это переносимые объекты (portable objects) и ма­шинные объекты (machine objects), или двоичные файлы.

Затем необходимо обеспечить дерево каталогов для локалей. Для этого сле­дует создать каталог locale или intl, после чего внутри этого каталога соз­дать каталог для каждого языка.

Названия языкам можно дать по кодам стран в стандарте ISO 639 (http:// http://www.oasis-open.org/cover/iso639a.html"> www.oasis-open.org/cover/iso639a.html ). Внутри каждого каталога языка соз­дадим еще один каталог с именем LC_MESSAGES. Сюда мы поместим helloworld ро и nel lowo rid. mo. После этого структура каталога будет выглядеть так:

/myApp/helloworld. php otherscripts.php

locale/en/LC_MESSAGES/helloworld. ро helloworld.mo da/LC_MESSAGES/helloworld.po helloworld.mo

bindtextdomain()

Для того чтобы сценарий мог читать строки, хранящиеся в этих каталогах, надо настроить текстовый домен (textdomain). Это делается с помощью

функции bindtextdomain():

bindtextdomain("helloworld", "./locale");

Благодаря этой функции gettext() знает, что сообщения для домена hello­world хранятся в каталоге . /locale/. В качестве имени текстового домена вы­ступает то же имя, что и у файлов .то, но без суффикса. gettext() знает об особой структуре каталогов и сможет теперь найти локали. Однако, заре­гистрировав несколько доменов, надо выбрать один из них, который будет до­меном по умолчанию. В нашем примере домен всего один, но и его надо уста­новить как используемый по умолчанию:

textdomain("helloworld");

putenv()

Наконец, мы должны установить переменную окружения LC_ALL, чтобы ука­зать язык по умолчанию. По этому значению gettext () будет выбирать требу­емый подкаталог . /locale/, поэтому следует задать язык, который там уже есть. Переменная окружения устанавливается с помощью putenv():

putenv("LC_ALL=da");