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


В окончательном виде программа выглядит так: <?php

putenv("LC_ALL=da");

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

print(_("Hello World!")); ?>

Модификация перевода

Переводы время от времени приходится обновлять по мере добавления в про­грамму новых строк или изменения существующих. Применяя gettextO, надо обращать особое внимание на выводимые данные, следя за тем, чтобы они были переведены, поскольку никакие предупреждения или ошибки при запросе непереведенной строки не отображаются. Метод gettextO просто ис­пользует исходные строки и строки перевода, если они заданы.

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

Эту задачу выполняет программа msgme где из пакета Gettext. Например, мы поместили все строки, извлеченные из программы, в файл new. ро, а прежние переведенные строки хранятся в файле old. ро; выполним в командной стро­ке msgmerge:

msgmerge old.po new.po -o merged, po

Результат сохранен в merged, ро. В этом файле должны сохраниться все преж­ние переводы, сохранившие свою силу, а также ID новых сообщений, кото­рые должны быть переведены. Сделав это, слитые файлы можно передать в CVS или обеспечить их доступность переводчикам иными средствами, чтобы они могли обновить локали отсутствующими строками.

Недостатки Gettext

PHP компилируется без поддержки Gettext, если не потребовать ее явно при выполнении сценария configure, указав ключ --with-gettext[=DIR]. DIR требу­ется только при установке Gettext в нестандартной конфигурации. Допол­нительные сведения о настройке РНР приведены в главе 2.

Убедитесь, что ваш ISP поддерживает Gettext, прежде чем начать им пользовать­ся. Кроме того, если РНР выполняется в защищенном режиме, проверьте, есть ли у вас права для установки переменной окружения, необходимой Gettext, т. е. LC_ALL.

Если есть сценарий, использующий Gettext, который надо перенести на дру­гой сервер, не поддерживающий Gettext, то все обращения к gettextO следу­ет заключить в оболочку. Эта оболочка должна искать строку в базе данных. Если проект небольшой, проще всего хранить строки в массиве РНР, а в большом проекте целесообразно использовать базу данных. Следует также создать какой-нибудь инструментарий для преобразования файлов . ро в формат избранной базы данных.