5
4

More than 3 years have passed since last update.

Flask-Babelで多言語化をやってみる

Last updated at Posted at 2020-03-10

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を作成する

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

翻訳する文言の記述

下記のように、各翻訳ファイルに翻訳する文言を記述する

messages.po
msgid "翻訳キーワード"
msgstr "翻訳後の文言"

言語ファイルのコンパイル

翻訳する文言を記述した翻訳ファイル(.po)をコンパイルして、バイナリファイル(.mo)を生成する

翻訳は生成した.moファイルを読み込んで行われる

$ pybabel compile -d translations

まとめ

翻訳ファイルの更新手順は以下である
1. Pythonファイル、またはHTMLにgettextを定義する
2. gettextで記述された翻訳キーワードで、翻訳テンプレートを作る($ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .)
3. 各言語の翻訳ファイルに翻訳テンプレートの内容を反映($ pybabel update -i message.pot -d translations)
4. 各言語の翻訳ファイルに翻訳する文言を記述する
5. 翻訳ファイルをコンパイルしてバイナリファイルを作る($ pybabel compile -d translations)

上手くいかない場合の確認項目

  • 翻訳が行われず、msgidで指定したキーワードがそのまま表示される
    translationsフォルダの階層を確認する。
    translationsフォルダは翻訳対象のファイルと同階層になければならない。
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4