[devel][python][gae] flask-babelで国際化のメモ
pythonで、gettextメッセージカタログによる国際化のためのパッケージBabelをflaskから簡易に利用するためのライブラリflask-babel。
これを使って、既存のサイトをi18nした時の手順メモ。
- リファレンス Flask-Babel ― Flask Babel 1.0 documentation
- flask-babel 0.8
- flask、jinja2、werkzeugなどはそれぞれ最新版でないと動かない
- プロジェクトルートにbabel、pytz、flaskextとspeaklater.py
- flaskextには__init__.pyの空ファイルも入れておく
- プロジェクトルートにmysettings.cfgの空ファイル
wsgiオブジェクトを作る各モジュールに、
from flaskext.babel import Babel app = Flask(__name__) app.config.from_pyfile('mysettings.cfg') babel = Babel(app) @babel.localeselector def get_locale(): return request.accept_languages.best_match(['ja', 'ja_JP', 'en'])
babel.cfgはこんな感じ
[jinja2: **/templates/**.html] encoding = utf-8 extensions=jinja2.ext.autoescape,jinja2.ext.with_
jinjaのテンプレートしか国際化しないので。
これをプロジェクトルートに。
これまでのjinjaテンプレートに変換用のIDを{{ _("ID") }}を使って書き足していく。
<p> {{ _("Welcome to My Site.") }}ようこそ私のサイトへ </p>
基本的には、表示したい英文そのものIDとして使っちゃえばいい感じ。
だけど、ID部分に>とか<、つまりタグやらが入ってるとうまくいかない。
ダブルクォート"も無いほうが、面倒が少ないかもしれない。
ワード構成文字とピリオド、カンマ辺りくらいが無難?
そして、あんまり長すぎてもよくないみたい。
その場合はキーワードに絞っていかにもIDっぽいものに。
次にそれを抽出
pybabel extract -F babel.cfg -o messages.pot .
これを元に、各言語用のメッセージカタログを作成
以下のコマンドで、プロジェクトルートのtranslations以下に、messages.poという名前で作成される。
pybabel init -i messages.pot -d translations -l ja pybabel init -i messages.pot -d translations -l en
ここでは日本語と英語。
出来上がったmessages.poの該当箇所に、翻訳文を書いていく。
msgidが先のID、msgstrが翻訳文。
上述したテンプレートの書き方だと、カットアンドペーストの作業となる。
文章が長すぎてキーワードに絞ったところも、enのmessages.poに本文を翻訳文として書いておく。
それ以外はそのままでいい。
抽出したけどIDが良くないというケースがある。
その場合、poファイルの先頭辺りと、該当箇所に、
こういうのが出たら、テンプレートを書き直し、各messages.poを書き直し、fuzzyマークを削除し、
pybabel update -i messages.pot -d translations
再抽出したほうが正確かも。この辺、よくわからない。
とにかく出来上がったら
pybabel compile -d translations
で、コンパイルする。fuzzyが全部調整されてればskipなしで成功してmessages.moというファイルが出来る。
そのまんまgaeにデプロイして、ブラウザの言語をenにしたりjaにしたりして確認。
参考