Flask-Babelとは?
Flask-Babelとは、PythonのFlaskで多言語対応(i18n, l10n)をするためのライブラリ。
多言語化対応にコンパイルが必要という、ちょっと使い勝手が特殊で理解に時間がかかったためメモを残す。
インストール
$ pip install Flask-Babel
HTTPリクエストのAccept-Languageヘッダで言語判別する設定
下記のコードのrequest.accept_languages.best_match
には対応する言語をISO 631-1に従って指定する
※ 日本語対応にはjaのみで基本的には問題ないが、IEではja_JPが無ければ動かないという報告がある
from flask import Flask, request
from flask_babel import Babel
app = Flask(__name__)
babel = Babel(app)
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(['ja', 'ja_JP', 'en'])
翻訳キーワードをPythonファイル、またはHTMLファイルに埋め込む
翻訳キーワードを埋め込むためには、gettext関数を用いて、引数には翻訳キーワードを記述する
Babelは翻訳箇所を自動検出して翻訳ファイル(.po)を作成するため、翻訳ファイルの作成より先に翻訳箇所を記述する必要がある
HTMLファイル
テンプレートエンジンがjanja2の場合は下記のように書ける
<p>message: {{ gettext('Hello world!') }}</p>
Pythonファイル
from flask_babel import gettext
print(gettext('Hello world!'))
Pythonファイル、HTMLファイルの翻訳対象の箇所を翻訳ファイルに反映する
下記のようなbabel.cfgを作成する
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
下記のコマンドで、Pythonファイル(.py)とHTML(.html)に記述されたgettext
を検出して翻訳ファイルを整理する
$ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
すると、翻訳ファイルのテンプレート(messages.pot)が作成される
各言語の翻訳ファイルを生成する
翻訳ファイルのテンプレート(messages.pot)を元に、各言語の翻訳ファイルを作成する
$ pybabel init -i messages.pot -d translations -l ja
$ pybabel init -i messages.pot -d translations -l en
翻訳テンプレート(messages.pot)を各言語の翻訳ファイルに反映する
pybabel extract
コマンドを使ってmessages.potを更新した場合は、各言語の翻訳ファイルも更新する
$ pybabel update -i message.pot -d translations
翻訳する文言の記述
下記のように、各翻訳ファイルに翻訳する文言を記述する
msgid "翻訳キーワード"
msgstr "翻訳後の文言"
言語ファイルのコンパイル
翻訳する文言を記述した翻訳ファイル(.po)をコンパイルして、バイナリファイル(.mo)を生成する
翻訳は生成した.moファイルを読み込んで行われる
$ pybabel compile -d translations
まとめ
翻訳ファイルの更新手順は以下である
- Pythonファイル、またはHTMLに
gettext
を定義する -
gettext
で記述された翻訳キーワードで、翻訳テンプレートを作る($ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
) - 各言語の翻訳ファイルに翻訳テンプレートの内容を反映(
$ pybabel update -i message.pot -d translations
) - 各言語の翻訳ファイルに翻訳する文言を記述する
- 翻訳ファイルをコンパイルしてバイナリファイルを作る(
$ pybabel compile -d translations
)
上手くいかない場合の確認項目
- 翻訳が行われず、msgidで指定したキーワードがそのまま表示される
translationsフォルダの階層を確認する。
translationsフォルダは翻訳対象のファイルと同階層になければならない。