ページ

2010年9月17日

Flask-Babelのメモ

python界のWebフレームワークと言えばDjangoばかりがもてはやされていますが、僕はFlaskが好きで使っています。いろんなものがgeventベースで動いているので、Djangoは重すぎるのです。さて、国際化についてはTracを作っているところが作っているBabelがありますが、それをFlaskから使いやすくしたものがFlask-Babelです。Flask-Babel関係のメモです。

1. インストール
$ pip install Flask-Bable
です。インストールの仕方って必要?

2. コマンドを使ってメッセージの抽出とか翻訳とか

次の設定ファイルを作ります。pythonのファイルとjinjaのhtmlテンプレートから翻訳するためのメッセージを抜き出すための設定です。

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
これをbabel.cfgとして保存します。次にこの設定ファイルをつかって、翻訳すべきメッセージをmessages.potファイルに抜き出します。
$ pybabel extract -F babel.cfg  -o messages.pot .
これはテンプレートなので、ここから各言語ごとにpoファイルをつくります。gettextの国のお話なのでその辺は割愛。最初は初期化します。
$ pybabel init -i messages.pot -d translations -l ja
これは、初期化するものなので、テンプレートを更新したら次のコマンドでpoをアップデートします。
$ pybabel update -i messages.pot -d translations
で、translations/ja/LC_MESSAGESにmessages.poがいるので、この人を翻訳してから、上の方にコメントアウトしてあるLazyの行を削除して、コンパイルします。
$ pybabel compile -d translations
これでmoができます。

3. pythonのコードの変更

話は前後しますが、pythonのコードでgettextを使えるようにしないといけません。まずはbabelをセットアップします。

from flaskext.babel import Babel, gettext
app = Flask(__name__)
app.config.from_pyfile('mybabel.cfg')
babel = Babel(app)

セットアップが終わったので、コードの中で翻訳が必要なところをgettextのメソッドを経由するようにします。

gettext(u"Hello, world!")

さて、言語設定はブラウザから言語を優先する場合は、次のコードを書いてあげます。

@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(['ja', 'ja_JP', 'en'])

これを書かないと、英語しか表示してくれませんでした。セッションの情報が使えるので、セッションからユーザが指定した言語で表示することもできます。それから、jaだけでうまくいくと思っていたのに、IEはja_JPじゃないと日本語なってくれませんでしたIEの言語設定でjaだけのものを追加してあげれば大丈夫なんだけど。

pythonのコードはおしまい

4. jinjaのhtmlテンプレートの変更

jinjaのテンプレートは翻訳が必要な場所を次のように書きます。すでにおまじないをかけているので、何も考えなくてもgettextが使えます。

{{ gettext('Hello, world from jijna html template.') }}

全部、おしまい。


0 コメント: