proglog

主にプログラミングに関する断片的メモ

[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ファイルの先頭辺りと、該当箇所に、#, fuzzyとかそんなマークが付く。

こういうのが出たら、テンプレートを書き直し、各messages.poを書き直し、fuzzyマークを削除し、

pybabel update -i messages.pot -d translations

再抽出したほうが正確かも。この辺、よくわからない。

とにかく出来上がったら

pybabel compile -d translations

で、コンパイルする。fuzzyが全部調整されてればskipなしで成功してmessages.moというファイルが出来る。


そのまんまgaeにデプロイして、ブラウザの言語をenにしたりjaにしたりして確認。


参考