Flask-Babelで複数ロケールを管理する仕組みを学ぼう!初心者向けの多言語化ガイド
生徒
「Flaskで作ったWebサイトを、日本語、英語、フランス語など、たくさんの言葉で表示できるようにしたいです。どうやって管理すればいいですか?」
先生
「それにはFlask-Babelという道具のロケール管理という仕組みを使います。これを使うと、ユーザーがどの国からアクセスしているかを自動で判断して、言葉を切り替えることができるんですよ。」
生徒
「ロケール…?聞き慣れない言葉ですが、設定は難しいのでしょうか?」
先生
「言葉は難しく聞こえますが、仕組みはシンプルです。初心者の方でも分かりやすいように、基本から順番に説明していきますね!」
1. ロケールとは何かを理解しよう
プログラミングの世界でよく出てくる「ロケール(Locale)」という言葉。これは、単なる「言語」だけを指す言葉ではありません。その国や地域における、言葉、通貨の単位、日付の書き方、時間の表し方などをひとまとめにした「地域設定」のことを言います。
例えば、日本語なら「ja」、英語なら「en」、アメリカ英語なら「en_US」といった短い記号で表されます。Webサイトが世界中の人に使われるようになると、このロケールを正しく管理することが非常に重要になります。Flask-Babelを使うことで、これらの複雑な設定を一括で管理できるようになります。まずは「ロケールは、言葉や地域の情報のセットなんだな」とイメージしてください。
2. Flask-Babelの導入と複数言語の設定
まずは、パソコンに翻訳の道具を入れるところから始めます。Python(パイソン)というプログラミング言語では、コマンドを使って新しい機能を追加します。以下の命令をパソコンの黒い画面(ターミナル)に入力してみてください。
pip install Flask-Babel
インストールができたら、自分のプログラムで複数の言語(ロケール)を扱えるように準備をします。ここでは、日本語と英語、そしてフランス語の3つを扱えるように設定してみましょう。
from flask import Flask, request
from flask_babel import Babel
app = Flask(__name__)
# 扱いたい言語のリストを作っておきます
app.config['LANGUAGES'] = ['ja', 'en', 'fr']
babel = Babel(app)
このように、最初に「このアプリではこの言葉を使いますよ」とリスト形式で教えてあげることが、複数ロケール管理の第一歩です。リストというのは、複数のデータをひとまとめにした入れ物のことです。
3. ユーザーに合わせた言語の自動選択
複数ロケールを管理する上で最も素晴らしい機能が、ユーザーが使っているブラウザの設定から、最適な言語を自動で選んでくれる「ロケールセレクター」です。これを設定することで、わざわざユーザーに言語を選ばせなくても、最初から日本語や英語で表示されるようになります。
@babel.localeselector
def get_locale():
# ブラウザが送ってくる「希望の言語リスト」を確認します
# アプリ側で用意した言語リスト(ja, en, fr)の中から一番合うものを選びます
return request.accept_languages.best_match(app.config['LANGUAGES'])
この best_match という命令がとても優秀です。例えば、ブラウザが「ドイツ語かフランス語がいいな」と言ってきた場合、自分のアプリにドイツ語はなくてもフランス語(fr)があれば、自動的にフランス語を選んでくれます。これが複数ロケール管理の核心部分です。
4. 翻訳ファイルのフォルダ構成を知る
複数の言語を管理するとき、パソコンの中のファイルがバラバラだと大変です。Flask-Babelでは、決められたフォルダの中に各言語の辞書データを保存します。一般的には「translations」という名前のフォルダを作ります。
中身は以下のような階層構造になります。 ・translations/ ・ja/LC_MESSAGES/messages.po ・en/LC_MESSAGES/messages.po ・fr/LC_MESSAGES/messages.po このように、言語ごとのフォルダを分けることで、たくさんの言葉が増えても混乱せずに管理できます。それぞれの「.po」というファイルの中に、日本語や英語の実際の文章を書き込んでいきます。これがいわゆる「翻訳の辞書」になります。
5. 言語切り替えボタンの実装方法
自動選択だけでなく、ユーザーが自分で言語を選びたいときもありますよね。画面の端にある「日本語|English」といったボタンのことです。これを作るには、選ばれた言語を「セッション」という一時的な記憶場所に保存する仕組みを作ります。
from flask import session, redirect, url_for
@app.route('/set_lang/<lang_code>')
def set_lang(lang_code):
# 選ばれた言語がリストにあるか確認して保存します
if lang_code in app.config['LANGUAGES']:
session['selected_language'] = lang_code
return redirect(url_for('index'))
# 先ほどのロケール選択機能を少し改造します
@babel.localeselector
def get_locale():
# ユーザーが自分で選んだ言葉があればそれを優先、なければ自動選択します
return session.get('selected_language') or \
request.accept_languages.best_match(app.config['LANGUAGES'])
このように、自動選択(オート)と手動選択(マニュアル)を組み合わせるのが、プロのWebサイトでの一般的な管理方法です。セッションというのは、その人がサイトを見ている間だけ覚えておいてくれるメモ帳のようなものだと考えてください。
6. メッセージの抽出と各言語への反映
プログラムの中に書いた「こんにちは」などの言葉を、すべての言語の辞書ファイルに反映させる作業を「抽出」と言います。これは手作業でコピーするのではなく、コマンドを使って一気に行います。複数ロケールを管理する場合、新しい言葉を追加するたびにこの作業を行います。
# プログラムから言葉を抜き出す
pybabel extract -F babel.cfg -o messages.pot .
# 各言語の辞書ファイルを作成・更新する
pybabel init -i messages.pot -d translations -l ja
pybabel init -i messages.pot -d translations -l en
pybabel init -i messages.pot -d translations -l fr
これで、日本語、英語、フランス語それぞれの辞書ファイルが用意されます。管理者はそれぞれのファイルを開いて、翻訳を記入するだけでOKです。言葉が増えても、この手順を繰り返すだけで全てのロケールを最新の状態に保つことができます。
7. 翻訳作業を効率化するコツ
たくさんの言葉を複数の言語に翻訳するのは大変な作業です。しかし、Flask-Babelの仕組みを理解していれば、効率よく進めることができます。コツは「一箇所にまとめて書く」ことです。
例えば、同じ「送信」という言葉が10箇所あっても、プログラム上で共通の記号(msgid)を使っていれば、翻訳作業は1回で済みます。また、翻訳ファイル(.poファイル)はテキスト形式なので、翻訳のプロに渡して作業してもらうことも可能です。パソコンに詳しくない人でも、そのファイルさえあれば翻訳作業ができるという点が、この管理方法の優れたところです。大規模な開発でも、このように役割分担をして管理されます。
8. テンプレートでの多言語表示の確認
最後に、実際の画面(HTML)でどのように表示されるかを確認しましょう。複数ロケール管理がうまくいっていれば、たった一行のコードで表示が切り替わります。HTMLという画面を作るファイルの中で、以下のように記述します。
<!-- 画面に表示する内容 -->
<h1>{{ _('ようこそ、マイアプリへ!') }}</h1>
<p>{{ _('現在は %(lang)s モードで表示されています。', lang=get_locale()) }}</p>
<!-- 言語切り替えリンク -->
<ul>
<li><a href="{{ url_for('set_lang', lang_code='ja') }}">日本語</a></li>
<li><a href="{{ url_for('set_lang', lang_code='en') }}">English</a></li>
<li><a href="{{ url_for('set_lang', lang_code='fr') }}">Français</a></li>
</ul>
これだけで、日本語で見たときは日本語、フランス語ボタンを押せばフランス語へと一瞬で切り替わります。複雑な「もし日本語ならこれを出して、フランス語ならこれを出して…」という面倒な書き方(条件分岐)は一切不要になります。これが、Flask-Babelによるスマートな複数ロケール管理の完成形です。