since 2012-02-07
資料
MacPorts で PHP のアプリを gettext 対応してみる。
まず port install で入れた apache2/php5 に gettext を入れる:
sudo port install php5-gettext sudo /opt/local/apache2/bin/apachectl restart
sudo port install xgettext
index.php こんな感じ:
<?php $language ='ja_JP'; putenv("LANG=$language"); setlocale(LC_ALL, $language); $domain = 'messages'; bindtextdomain($domain, "./locale"); textdomain($domain); echo gettext("Hello");
$ mkdir -p locale/ja_JP/LC_MESSAGES $ xgettext -n index.php $ mv messages.po locale/ja_JP/LC_MESSAGES/
アプリ版の poedit で messages.po を編集する。
# SOME DESCRIPTIVE TITLE. (omitted) "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: index.php:25 msgid "Hello" msgstr "ほげ"
messages.mo ファイルを作る:
$ cd locale/ja_JP/LC_MESSAGES/ $ msgfmt messages.po
これで echo gettext('') の内容が「ほげ」になっていることが確認できる。
echo _('Hello');
と書くこともできる。
msgfmt しても翻訳が更新されない場合は apache を再起動。面倒だな。。
翻訳が終わった po ファイルと、xgettext しなおしてメッセージが増えてしまった po ファイルをマージするには:
msgmerge locale/ja_JP/LC_MESSAGES/messages.po locale/messages.po > _tmp.po mv locale/ja_JP/LC_MESSAGES/messages.po locale/ja_JP/LC_MESSAGES/_messages.po mv _tmp.po locale/ja_JP/LC_MESSAGES/messages.po
PHP 標準 gettext との重複を回避するためにアンダースコア2個の関数を使うことが多いらしい。
$ sudo pear install channel://pear.php.net/File_Gettext-0.4.1