flask-babelを使って他言語化サイトと作ったので、作り方をドキュメント化
こちらのサイトを、参考にしたが、5年ほど前に書かれていて、現状と合わなくなっているものもあるので、少し修正した。
サンプルのコードはこちらのgithubにあげている。
https://github.com/shibacow/flask_babel_sample
(実際これだけでこのブログの意図は達成できているかも)。
上のレポジトリをクローンして、FlaskとFlask-Babelを入れれば動くと思う。
インストール
flask-babelはflaskでi18nを実現するためのライブラリだ。flask-babelのサイトはこちら
インストールはpipを使って次のようにする
pip install Flask-Babel
もとにしたサイトのままで行ける。
言語の自動判別の準備
の
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['ko','zh','ja', 'ja_JP', 'en'])
で自動判別が出来る。
翻訳元のhtmlの準備
の様に、
<p>
message: {{ gettext('Hello world!') }}
</p>
のようにgettextで囲んだ文章を用意する。 message: {{ _('Hello world!') }}
の様に_()
を使用してもよい。こちらの'Hello world!'
が差し替わる文言の対象になる。
翻訳
あとは、こちらの記事にあるように、babel.cfgを用意して、
$ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
$ pybabel init -i messages.pot -d translations -l ja
で translations以下にjaフォルダが出来る。
同じような感じで、
$ pybabel init -i messages.pot -d translations -l en
$ pybabel init -i messages.pot -d translations -l zh
$ pybabel init -i messages.pot -d translations -l ko
などを作る。ko,zhなどの言語ロケール名は、ISO-639-1というコードで決まっているようだ(https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7)
そうすると、
が出来る。messages.poを開いて、msgidの下にあるmsgstrに翻訳した文言を入れる。msgidは入っているが、msgstrは入っていないので自分で翻訳した文言を埋める。
全て言語を翻訳した後、
$ pybabel compile -d translations
でコンパイルする。/messages.poの中にfuzzyという文言が含まれていると(翻訳途中だと見なされて)コンパイルされないので、messages.poからfuzzyという言葉を削除しておく。
コンパイルが終わると、messages.moが出来る。
バイナリファイルのようだ。
翻訳結果の確認
この状態で python srv.py
を実行すれば、元来Hello Worldが入っている部分が、ブラウザーの言語選択によって、
とか
の様に翻訳した言語に差し替わる。