В окончательном виде программа выглядит так: <?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 следует заключить в оболочку. Эта оболочка должна искать строку в базе данных. Если проект небольшой, проще всего хранить строки в массиве РНР, а в большом проекте целесообразно использовать базу данных. Следует также создать какой-нибудь инструментарий для преобразования файлов . ро в формат избранной базы данных.