Kay で多言語に対応してみる

kay documentation の 「14. メッセージの国際化」 を読む。
カタログファイルとは、翻訳内容が入っているテキストの事です。マークとは、変換したい文章です。ドキュメントではマークといってますが、これが msgid になります。
ID なので一般的には文章にはしません。setting.py にあるような 環境変数名にします。より解るように _ (アンダーバー)から始まるようにします。
あと、このドキュメントには書いていませんが(別の場所には書いてあります。)、setting.py に

USE_I18N = True
DEFAULT_LANG = 'en'

と入れます。
なぜ en かというと、カタログファイルが無い国の人が閲覧したときに、英語ならなんとかなるからです。

python コード (*.py) の中に含めるときは、

from kay.i18n import gettext as _

とインポートして、使用したいテキストに

_('_RESULT_SCUCCES_UPDATE')

とする。テンプレート (*.html) に含めるときは、

{{ _('_MENU_TITLE')}}

とします。

JavaScript の場合は、ちょっと手間が増えるので別の記事にします。

次はカタログのテンプレートファイルを作ります。

python manage.py extract_messages myapp

myapp に i18n フォルダが作られて message.pot ファイルが置かれます。これがカタログのテンプレートになります。メッセージが追加されたら、その度に extract_messages をします。このとき、このファイルは新規で上書き保存されます。
ドキュメントでは雛形といっています。

次に en のカタログを作ります。

python manage.py add_translations myapp -l en

-l オプションで対応したい言語を指定します。新規に作るときだけ使用します。言語名のフォルダに LC_MESSAGES/message.po ファイルが作られます。これがカタログファイルです。

言語の表記は ISO 639-2 Language code list で定義されています。ISO 639-1 が二文字で、ISO 639-2 が三文字で表現されています。二文字表記で行って下さい。

このコードリストを見ればわかるとおもうのですが、 English と Franch の表記があります。ちなみに、某ゲームの移植をしたときに、「ヨーロッパで販売をするならフランス語対応は必須」と言っていました。ご参考にして下さい。

この *.po ファイルを編集します。
出来上がったら、カタログファイルをコンパイルします。

python manage.py compile_translations myapp

準備は以上です。

言語の切り換えは、 USE_I18N が True ならブラウザの言語を見て表示してくれます。TwitterFacebook などは、この方法ですね。

ユーザーに使用する言語を選択させる場合は、「14.7 言語を設定するためのリンクを作成する」の通りにします。

ブラウザの言語と違う、たとえばアカウントの設定項目に「言語」を設けて、そちらを優先したいという場合は、別の機会で説明したいと思います。(kay.i18n.view.set_language がヒントです。)

メッセージが追加されたら、extract_messages をします。そして、カタログファイル(message.po)とテンプレートファイル(message.pot)が合わなくなるので、カタログファイルを更新をして追加されたメッセージを編集します。

python manage.py update_translations myapp

-l オプションを付けないと、全言語のカタログが更新されます。ドキュメントには -l を指定していますが、個別にやる意味は無いと思うので無しで良いと思います。

上書きではないので、既存のメッセージは残ります。しかし、テンプレートファイルにないメッセージがカタログファイルにあったら消えます。スペルミスなどで msgid は変えたいが、msgstr は変更したくない時は注意して下さい。
言語が増えてきて、これをやるとかなりの痛手です。ソースコード管理ソフトを使うのを忘れないようにしましょう。

以上で、kay の 多言語化の解説を終わります。次回は JavaScript 内にあるメッセージを多言語化する方法を解説したいと思います。