アプリケーションを国際化する
アプリケーションを国際化するためには、以下のことをしなければなりません:
- テキスト文字列を _() 関数を使ってマークする
- 正しいディレクトリ構造でメッセージカタログを作成する
- すべてのデータや文字列が turbogears.i18n フォーマット関数を使ってフォーマットされていることを確認する
1. テキスト文字列を _() を使ってマークする
翻訳したいすべてのテキスト文字列は _() 関数に含まれている必要があります。これはTurboGearsに組み込まれていますので、 import turbogears をしている限りは特にインポートする必要はありません。
例えば:
import turbogears
from turbogears import controllers
class Controller(controllers.Root):
@turbogears.expose(html="myapp.templates.welcome")
def index(self):
return dict(message=_("Welcome"))
_() を呼ぶ際に、明示的にロケールを渡したいときには以下のようにすることができます:
print _("Welcome", "de")
Kidテンプレートでテキスト文字列を処理するのはもう少し簡単です。CherryPyの設定において i18n.run_template_filter を True にセットすると、Kidテンプレート内のすべてのテキストは自動的に _() を通して渡されます。またテンプレート内で lang 属性を使えばユーザのロケール(後述します)を上書きできます。例えば:
<div> <p>Welcome</p> <p lang="de">Welcome</p> </div>
最初の "Welcome" はユーザのロケールに従って翻訳されますが、2番目の "Welcome" はドイツのロケールを使って翻訳されるでしょう。ユーザロケールが英語であれば以下のようになるでしょう:
<div> <p>Welcome</p> <p lang="de">Willkommen</p> </div>
ただし属性の値は翻訳されませんので、 _() を呼んで明示的に処理してやります:
<img py:attrs="src=_('flag_icon_gb.bmp')" />
ウィジェットテンプレート内のテキストなどは翻訳されることを覚えておいてください。
2. メッセージカタログを作成する
TurboGears?にはメッセージカタログを生成し、メンテナンスをするためのツールセットが同梱されています。一つは Toolbox の "admi18n" であり、他にも tg-admin i18n コマンドの一部がそれにあたります。
デフォルトでは、 _() は "locales" というサブディレクトリとドメイン "messages" をプロジェクトのディレクトリの中から探します。これらはそれぞれ、設定ファイルの中で i18n.locale_dir や i18n.domain をセットすることで設定を上書きすることができます。
言語ファイル(.mo)が見つからなかった場合には _() はプレーンテキスト文字列を返すでしょう。
3. 日付や数字をローカライズする
turbogears.i18n には日付や場所、数字のフォーマットを処理する便利な関数がたくさんあります。これらのフォーマットのデータは turbogears/i18n/data の中にあるPythonモジュールに含まれており、例えばデンマークのモジュールは turbogears/i18n/data/da.py にあります。この関数は以下を含んでいます:
- format_date
- ローカライズされた日付文字列を返す
- get_countries
- 国際国別コードとローカライズ名(例えば("AU", "Australia"))のタプルを返す
- format_currency
- フォーマットされた通貨価値を返す(例えばドイツでは56.89 > 56,89)
これらはすべてパラメータがdocstringsで説明されており、洗練されたフォーマットの制御を提供してくれます。
ユーザのロケールを見つける
デフォルトのロケール関数である _get_locale は、設定ファイルで i18n.get_locale を使って上書きをすることができます。デフォルトの関数は以下のような順番でロケールを見つけます:
- セッションの値を探す。これはデフォルトで locale であるが、設定ファイルで i18n.sessionKey をセットすれば変更できる。
- HTTP Accept-Languageヘッダを探す。
- デフォルトロケールを探す。これは設定ファイルの i18n.default_locale であり、デフォルトは "en" 。
エンコード
_() とすべてのフォーマット関数はunicode文字列を返します。
UTF-8のフォームデータを処理する
TurboGears?は自動的にContent-Type HTTPヘッダに正しい文字コードをセットします。そしてそれはふつううまくいきます。
また以下のHTML(kid)テンプレートを加えることでこれを強制することができます:
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
ブラウザがリクエストにおいて(例えばテキストエリアなどから)unicodeデータを送ると、CherryPyはその文字列をそのまま渡します。
デフォルトでTurboGearsはやってきたリクエストパラメータをunicodeにデコードするためにCherryPyのフィルタを使います。たいていの場合はあなたはそれをそのまま保持するでしょう。
Kidに仕事をさせるために、 kid.encoding (デフォルトではutf8)をいじりたいと思うかもしれませんが、utf-8を使うのがよいでしょう。

