gettextの履歴

多言語アプリを作るときに使用するライブラリ

Unixでは標準的な国際化方法なのだけれども、欠点もある。

gettextの利点と欠点(2010年11月追加しました)


gettextは多くの場所で使われているので、専用の翻訳ツールがあったりして比較的、翻訳以外の場所で労力をかけることがない。

が、しかし、欠点もある。元となった言語に小さな誤りがあった場合に、修正がめんどくさいということ。

翻訳用のファイルはこのコードを元に生成される。が、元の文言のみにその言語上の間違いがあった場合に、すべての言語の翻訳用ファイルを修正しないといけない。

たとえば、こういう文(コード)があるとする。

gettext('This is a apple.');


この文を修正しようとするとかなりめんどくさい。

gettext('This is an apple.');


こうやって修正すると、全ての言語の翻訳ファイルを修正する必要が出てくる。

もちろん、英語->英語の翻訳ファイルを準備しても良いのだけれども、維持管理がめんどくさいと思うので、なんだかなぁという気がするのです。

POTファイルの作り方


特定の拡張子のソースを全部探してきてPOTを作る場合には、こんな作り方が便利

find . -name '*.php' |\n   xargs xgettext --from-code 'UTF-8' -p ディレクトリ -o 適度なファイル名.pot


自分はPOファイルはここから作り始めるようにしている。

ヒアドキュメントは使えない?


ヒアドキュメントを使っていると、PHPでPOファイルを作るときにヒアドキュメントの箇所だけメッセージが抜け落ちてしまうので注意!

ロケール


ロケールはサーバーのロケールを使う。サーバーのロケールは /usr/lib/locale/ にあるものが使える。

moファイル編集したのに何かがおかしい!


Apacheのモジュール版でmoファイルを編集したのに、編集結果が反映されなかったり、リクエストごとに変更前と変更後のものが交互に表示されることがある。

どうやらgettextは内部でキャッシュをしているようなので、Apacheを再起動してみても良いかもしれない。

... GNU gettext caches previous translation results. When the same translation is requested twice, with no new message catalogs being loaded in between, gettext will, the second time, find the result through a single cache lookup.

http://www.gnu.org/software/gettext/manual/gettext.html#gettext