preload
1月 22

先日試したqcodoは国際化対応しているので、自動生成されたコード中のテーブル名やらカラム名やらボタン名やらは外部設定ファイルで翻訳情報を設定しておくことができる。php であれば gettext() という関数( _() というエイリアスで書かれていることも多い) があり、これを使った実装を心がけておけば、いつの日か自前アプリを世界発信(インターネットに置いた時点で世界発信だが)することになったときに、国際化対応に苦労することも無い、のかもしれない(なにしろ国際化対応アプリなぞ作ったことが無いので、そのときの苦労はわからない)。

ということで、gettext の使いかた。UNIXコマンドラインで使えるので、まずはこれの使いかたを押さえておく。PHP でさくっと使ってみるなら、 ウノウの方のエントリ がわかりやすい。

$ gettext -s “internationalization”
国際化

こんな感じで、gettext の引数に翻訳対象文字列を渡すと、あらかじめ作っておいた辞書ファイルを参照し、文字列を翻訳して返してくれる。では、その辞書ファイルはどうやって作って、どのように gettext で(その辞書ファイルを)指定してやるのか。

簡単にいうと、*.po というファイル名で辞書ファイルを作り、msgfmt というコマンドで *.mo というファイルに変換してやる。最後に、この *.mo の場所を gettext のオプションまたは環境変数で指定してやるという流れになる。

まず、*.po の作り方。msgid と msgstr というエントリを改行区切りで書いてやる。これを ja.po とする。xgettext というコマンドを使って、翻訳対象のソースコードからこの *.po のベースを生成することもできる。

$ cat ja.po
msgid “internationalization”
msgstr “国際化”

msgid “hello”
msgstr “こんにちは”

こんなかんじで、複数エントリは1行開けて書く。次に、msgfmt で、このファイルをコンパイルする。-o オプションで出力ファイル名を指定できる(指定しないと messages.mo というファイル名で保存される)。

$ msgfmt -o ja.mo ja.po

生成された ja.mo を /usr/share/locale/ja_JP/LC_MESSAGES/ja.mo として保存する。これで準備完了。

ja.mo の ja の部分は TEXTDOMAIN 環境変数で指定することもできるし、gettext の -d オプションでも指定できる。PHP だと textdomain() で指定する。つまり、標準で以下の設定になっているのであれば、上の gettext コマンドは、

$ gettext -d ja “internationalization”
国際化

という形でも実行できる。あとは gettext に渡す各種設定。

gettext コマンドでは、上記 *.mo を設置する /usr/share/locale ディレクトリを TEXTDOMAINDIR という環境変数で指定することができる(TEXTDOMAINDIR が指定されていない場合は、/usr/share/locale が標準利用される)。PHP だと bindtextdomain() で指定できるのが、コレ。詳しくは gettext –help とか参照。

なお、ja_JP は利用環境 LANG から取得されるので、echo $LANG とかで確認して、違っているようであればその通りのディレクトリ名にしてやる。PHP だと LC_ALL という定数を define 指定するのがコレ。

今度、これを踏まえて qcodo の国際化機能利用について書く。なお、上に挙げたウノウの方のエントリにあるが、i18n という言葉は internationalization の i と n の間の文字数から来ているそうだ。

関連していそうなエントリ:

Comments are closed.