Многоязычные приложения с использованием PHP и GetText (статья)

kvf77

Red Devil
Многоязычные приложения с использованием PHP и GetText (статья)

Перевод статьи по использованию GetText. Добавил и расширил примеры, описал установку под Windows. Если ошибок не накопаете, то можно поместить в FAQ
http://php.russofile.ru/Using_GetText.html
 

Макс

Старожил PHPClub
вопросы
1. Где лежит оригинал ?
2. Согласован ли перевод с автором статьи ?

Замечания
1. Неплохо бы код подсветить
2. Неплохо сделать небольшой пример скрипта, полностью готовый к работе, в котором в зависимости от языка, выбранного пользователем выводилась фраза на том или ином языке

А вообще по поводу статей обратись к young-у
 

kvf77

Red Devil
Ну открой ссылку, там все указано и адрес оригинала и архив с примером там есть.
Код сверять смысла нет - потому что там всего несколько строк и они работают (см. пример внутри)
Что касается согласований с автором - то не знаю зачем это нужно. Там всеравно 50/50 его и моего. Скажем так это довольно вольный перевод. Потому что внесено много всяких дополнений и то, что было в оригинале как раз не очень-то и работало.
В общем-то, смотрите сами.
Что касается PHP Inside - я другим изданиям ее и не отдавал, а то что выложил ее на своей страничке авторской помоему проблемы нет.
 

svetasmirnova

маленький монстрик
Спасибо!

Хорошая статья.

Бегло просмотрела, попробовала тест: легко написано, всё работает.

Маленькая опечатка (болдом):
Перевод подразумевает под собой только перевод строк в коде. Вы можете подойти к этому с умом, а можете просто просматривать весь код и переводить внем все строки.
 

betik

Новичок
А накой оно надо?
В приципе все мессаджи можно держать в lang-файлах и подключать из нужной папки просто ланг-файл.
Работает зато на всех хостингах.. А так - ИМХО изврат.
 

Profic

just Profic (PHP5 BetaTeam)
betik
Зачем?
1) Не нужно лезть в lang файл, чтобы добавить строку
2) При отсутствии какого-либо перевода автоматом берется оригинал
3) Очень удобные утилиты для работы с po файлами.
4) Перекодировка на лету из кодировки po файла в нужную в данный момент времени
Продолжать? :)
 

slach

Новичок
в общем, gettext в серьезном мультиязыковом проекте, вещь незаменимая
 

kvf77

Red Devil
Вот еще один интересный пример, демонстрирующий удобство GetText.
Исходная задача: поместить в базу данных текст. Заранее известно, что он должен содержать (текст статичен), нужно выводить его на разных языках.
Как поступить в таком случае? Хранить в базе данные на всех языках проекта? GetText позволяет упростить задачу.
Мы помещаем в базу условную строку, которая будет ассоциироваться с нужным нам текстом:
$text = _("section_user_management");
tobase("section_user_management");
Поместили мета-строку в базу. Создали .po файл, перевели его, создали .mo файл, поместили на сервер.
Печатаем нужную нам строку на нужном языке:
_(frombase("section_user_management"));
GetText найдет перевод для нашего мета-тега и заменит его переводом.
Есть еще много интересных моментов, которые облегчают жизнь.
 

Макс

Старожил PHPClub
kvf77
вот только это не прокатит если по этим текстам (на разных языках) нужен поиск :)
 

kvf77

Red Devil
у меня катит - потому что я обычно все свои сайты индексирую поисковиком-пауком - а не парюсь с базой
 

slach

Новичок
kvf77
к статье необходима поправка
xgettext -a
лучше не использовать
жрет все строки какие только может
все что надо и ненадо

лучше уж тогда явно указать
xgettext --language=PHP --from-code=cp1251

wildcard's в качестве имени файла xgettext не понимает...
поэтому предварительно, лучше всего собрать нужный список файлов через

dir /b *.php >> xgettext.files

а потом делать
xgetext [...параметры выше] --files-from=xgettext.files
 

Profic

just Profic (PHP5 BetaTeam)
у меня есть парочка сриптов для создания po-шек и mo-шек :) правда написаны на sh

генерирует po файл и сливает сгенерированный файл с уже существующими переводами (про msgmerge в статье вообще не слова :()
contrib/gen_po.sh
PHP:
#!/bin/sh
NAME=isps
cd ..
xgettext --keyword=_ -C -o po/$NAME.pot *.php
cd po
for POF in `ls *.po`; do
    mv $POF $POF.old
    msgmerge $POF.old $NAME.pot > $POF
    rm $POF.old
done
генерирует mo файлы из po и раскладывает их в нужные каталоги
contrib/gen_po.sh
PHP:
#!/bin/sh
NAME=isps
cd ../po
for POF in `ls *.po`; do
    LNG=`basename $POF .po`
    [ ! -d ../locale/$LNG/LC_MESSAGES ] && mkdir -p ../locale/$LNG/LC_MESSAGES
    msgfmt $POF -o ../locale/$LNG/LC_MESSAGES/$NAME.mo
done
 

kvf77

Red Devil
Это хоть и значительно расширенный, но перевод - обратите внимание.
 
Сверху