表示の多言語化

作成日:2006-04-15
最終更新日:

1. 多言語化対応:テンプレートとgettext

Namazu は複数の言語で検索結果を表示できるようにしている。 その仕組みは大きく2つからなる。 一つは言語のテンプレートであり、もう一つは gettext による表示である。 言語テンプレートについては、 テンプレートの使い方 というページで述べたので、 ここでは GNU gettext による表示を調べてみよう。

GNU gettext とは、表示を多言語対応させる仕組みである。 テンプレートは CGI に対応して言語だけでなくHTML全体を制御する。 一方、GNU gettextはソースコードの表示を、 簡単な操作で多言語対応させるための仕組みである。 gettext は GNU 以外の実装もあるが、 以下は GNU gettext の例である。

2. テンプレートと gettext の違い

では、テンプレートと gettext のどこが違うのか。 namazu というキーワードを検索した結果のドイツ語表示を見てみよう。

よく見ると、上部の
Results:
References: [ namazu: 20 ]
Total 20 documents matching your query.
や、下部の
Current List: 1 - 20
Page: [1]
は、英語になっている。つまり、ドイツ語化できていない。 この領域はテンプレートで変更することはできず、 gettextを利用して多言語対応(この場合はドイツ語対応)することになる。

3. 多言語化の実際

では、多言語化を実際に行ってみよう。エスペラントでの表示を目標とする。

まず、ソースのあるディレクトリの po というディレクトリにいく。 そこには、ja.po, ja_JP.SJIS.po, es.po, fr.po など、 拡張子が po であるファイルがいくつかある。これが、 言語表示を可能にしているファイルである。このような拡張子が po であるファイルを地域化ファイルと呼ぶ。 ここではエスペラントの言語表示を可能にするため、 eo.po というファイル名をつける。 eo はエスペラントを表す英字2文字である。 また、CGI の lang 変数でもある。

なお、CGI ではないプログラム、たとえば、namazu や mknmz なども、 多言語化されている。 このときの言語を決める環境変数は、LANGではなく、LANGUAGE を使う。 LANGUAGE では、優先順位を決めることができる。たとえば、 bash の場合、環境変数設定を
export LANGUAGE=eo:es
としておけば、まずは言語 eo 、すなわちエスペラントが優先され、 もしエスペラントがない場合には言語 es 、 すなわちスペイン語が使われる。

さて、eo.po は、es.po をもとにして作ることにしよう。 es.po はスペイン語を表すファイルであるが、 スペイン語とエスペラントはよく似ているから、好都合である。 まず、コピーをしてしまおう。

$ cp es.po eo.po

これだけでは、言語は切り替わらず、そのままである。 CGIプログラムが解釈できる形式に変換して、 CGIプログラムが参照するディレクトリにインストールしなければならない。 eo.po があるディレクトリの Makefile の41行めから44行めを、 次のように書き換える。 行の最後に eo.(po|gmo|po-update|nop)を加えている。

POFILES =  ja.po ja_JP.SJIS.po es.po fr.po eo.po
GMOFILES =  ja.gmo ja_JP.SJIS.gmo es.gmo fr.gmo eo.gmo
UPDATEPOFILES =  ja.po-update ja_JP.SJIS.po-update es.po-update fr.po-update eo.po-update
DUMMYPOFILES =  ja.nop ja_JP.SJIS.nop es.nop fr.nop eo.nop

75行めも同様に書き換える(eo.gmoの付加)。

CATALOGS = ja.gmo ja_JP.SJIS.gmo es.gmo fr.gmo eo.gmo

make を実行すると、結果は次のようになる。

$ make
make 'all' に対して行うべき事はありません

これは正しい挙動だと思われるが、 ここで行いたいのは、eo.gmo を作ることである。そこで、 ターゲットを指定する。

$ make eo.gmo
/usr/bin/msgfmt -c --statistics -o eo.gmo eo.po
139 個の翻訳メッセージ, 7 個の翻訳があいまいです, 10 個の未訳のメッセージ.

「翻訳があいまい」については第4章を参照のこと。 「未訳のメッセージ」については、eo.po のうち、 msgstr で本来訳出されているべき翻訳メッセージが空文字列のままになって いることを表していると思われる。この意味については、追って考えてみたい。

大事なことは、 同じディレクトリに eo.gmo というファイルができていることだ。 これが、表示に使われる。

ただし、この eo.gmo ができただけでは、 まだ CGI プログラムや mknmz, namazu コマンドなどには反映されていない。 反映にはインストール作業が必要である。これには、 make で install ターゲットを指定する。

$ sudo make install

これにより、eo.gmo が多言語を扱うディレクトリ (デフォルトでは /usr/local/share/locale/eo/LC_MESSAGES/namazu.mo) に namazu.mo という名前でコピーされた。 すなわち、インストールされた。

これで、表示できる準備が整った。 namazu の CGI プログラムで、lang=eo を指定する。 この結果、Results: の表示が消え、Resultados: の表示になっているはずだ。 Resultados: はスペイン語であるが、 もとは lang=es だったから、スペイン語表記で正しい。

では、次にエスペラントを試してみよう。スペイン語 Resultados: を エスペラント Rezultoj: にしてみる。eo.po の該当部分を変更して、 make eo.gmo と make install を行う。 そこで検索を前回と同じように行ってみる。 Resultados: の表示から Rezultoj: になっているだろう。

さて、make eo.gmo で表示された次の表示を検討しよう。 139 個の翻訳メッセージ, 7 個の翻訳があいまいです, 10 個の未訳のメッセージ.

未訳のメッセージについては、 msgstr が空文字列になっている個所と見当を付けられる。 だから、msgstrの空文字列を埋められれば、 個数が減少するはずだ。 手始めに、198行の msgstr を埋めてみよう。 エスペラントならば、
msgstr "Alio: %-20s\t%s\n"
でよいはずだ。この結果、未訳のメッセージの結果は 9 個となるはずだ。

$ make eo.gmo
rm -f eo.gmo && /usr/bin/msgfmt -c --statistics -o eo.gmo eo.po
140 個の翻訳メッセージ, 7 個の翻訳があいまいです, 9 個の未訳のメッセージ.

未訳のメッセージはわかった。 では、「7 個の翻訳があいまいです。」とは何か。 おそらく、eo.po ファイルの中で、 行頭が #, fuzzy で始まっている個所を指していると思われる。 この理由、またあいまいさを解消する方法は残念ながらわからない。

4. あいまいさの解消

上記の最後の段落は、未解決のまま放置したままになっていた。 あるとき、上記の解説をメールで頂いた。 メールを送ってくださった岩井さんに感謝します。以下、 引用します。

引用開始

> 未訳のメッセージはわかった。では、「7 個の翻訳があいまいです。」とは 何か。
> おそらく、行頭が #, fuzzy で始まっている個所を指していると思われる。
> この理由、またあいまいさを解消する方法は残念ながらわからない。

この箇所です。
まず、「fuzzy」になっているところが 「あいまい」となっている点はMARUYAMA Satosiさんの ご推察の通りです。 では、なぜ「あいまい」となっているのかですが、 これは翻訳がなされた後に元の英語部分が 更新された場合に「あいまい」な翻訳ということになります。

たとえば、
「Page:」という箇所を「ペイジ:」と翻訳していたとします。 その後、「Page:」が「Pages:」に変更されたとします。 この場合、翻訳元の文字列が変更されているため、 「ペイジ:」という翻訳が正しいか否かはgettextには判断をつけることができません。 そのため、gettextはその箇所に 「fuzzy」という印をつけます。 つまり、「fuzzy」になっている箇所については、 その翻訳が妥当であるか否かについて人間が判断する必要があります。

また、「あいまいさの解消」ですが、 これは人間がfuzzyな箇所をチェックし、必要に応じて 新たに翻訳しなおした後に「fuzzy」を削除する必要があります。

引用終了

これで霧が晴れた。少しずつあいまいさを解消しよう。

まりんきょ学問所全文検索システム Namazu > 表示の多言語化


MARUYAMA Satosi