アプリケーションを国際化する

アプリケーションを国際化するためには、以下のことをしなければなりません:

  1. テキスト文字列を _() 関数を使ってマークする
  2. 正しいディレクトリ構造でメッセージカタログを作成する
  3. すべてのデータや文字列が 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_filterTrue にセットすると、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_diri18n.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 を使って上書きをすることができます。デフォルトの関数は以下のような順番でロケールを見つけます:

  1. セッションの値を探す。これはデフォルトで locale であるが、設定ファイルで i18n.sessionKey をセットすれば変更できる。
  2. HTTP Accept-Languageヘッダを探す。
  3. デフォルトロケールを探す。これは設定ファイルの 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を使うのがよいでしょう。