PythonのFlaskで言語を自動判別!ユーザーに合わせた表示切り替えの仕組みを徹底解説
生徒
「先生、Webサイトを多言語化したとき、ユーザーがわざわざボタンを押さなくても自動で日本語か英語か選んでくれるようにしたいです!」
先生
「それは『自動言語判別』という機能ですね。Flask-Babelを使えば、ブラウザから送られてくる情報を読み取って、一瞬で切り替えることができますよ。」
生徒
「ブラウザから情報が送られてくるんですか?パソコン初心者なので、その仕組みから詳しく知りたいです。」
先生
「もちろんです!ブラウザが持っている『名刺』のようなものを読み取るイメージです。具体的な設定方法を一緒に見ていきましょう!」
1. 言語の自動判別とは?ブラウザが送る情報の秘密
私たちが普段インターネットを見るときに使っているブラウザ(Google ChromeやSafariなど)は、実はWebサイトにアクセスするたびに、ある重要な情報を届けています。それは「私はこの言語が得意です」という優先順位のリストです。
専門用語ではこれを「Accept-Language(アクセプト・ランゲージ)」ヘッダーと呼びます。例えば、日本のパソコンを使っている人のブラウザは「一番は日本語、二番は英語がいいな」といった情報を常に発信しています。
Flaskでこの情報を利用すると、ユーザーが何も操作しなくても、日本からのアクセスには日本語を、アメリカからのアクセスには英語を自動的に表示できるようになります。これは「おもてなし」の第一歩と言える非常に便利な機能です。
2. Flask-Babelで自動判別を実現する全体の流れ
自動判別を実装するには、大きく分けて三つのステップがあります。まずは全体の地図を把握しましょう。パソコンを触ったことがない方でも、手順通りに進めれば大丈夫です。
一つ目は、Flask-Babelという道具を使えるように準備すること。二つ目は、ブラウザから届いた「言語リスト」の中から、自分のサイトが対応している言語を探し出すルールを作ること。そして三つ目は、そのルールに基づいて画面を書き換えることです。
この仕組みを作っておけば、将来的に中国語やフランス語を追加したくなったときも、ルールを少し書き足すだけで簡単に拡張できるようになります。
3. ブラウザの優先順位を読み取るコードの基本
それでは、実際にプログラムを書いてみましょう。Flaskには「request(リクエスト)」という、ブラウザからの要望をまとめたオブジェクトがあります。この中から一番適した言語を選び出す「best_match」という命令を使います。
from flask import Flask, request
from flask_babel import Babel
app = Flask(__name__)
# 自分のサイトが対応している言語のリストです
LANGUAGES = ['ja', 'en', 'es']
def get_locale():
# ブラウザが求める言語と、サイトが対応している言語を照らし合わせます
# 一番相性が良いものを自動で選んでくれます
return request.accept_languages.best_match(LANGUAGES)
# Babelに「言語を選ぶときはこの関数を使ってね」と教えます
babel = Babel(app, locale_selector=get_locale)
このコードでは、もしブラウザが「スペイン語(es)がいいな」と言ってきたら、リストの中に「es」があるかを確認し、あれば自動的にスペイン語モードに切り替えてくれます。
4. 言語が見つからなかったときの初期設定
もし、ブラウザが「ドイツ語がいい!」と言ってきたのに、自分のサイトに日本語と英語しか用意がなかったらどうなるでしょうか。そのままだとプログラムは困ってしまいます。
そこで、対応する言語が見つからなかった場合に表示する「デフォルト言語」を決めておくことが重要です。多くの場合は、世界共通語である英語や、サイトの拠点である日本語をデフォルトに設定します。
# デフォルト言語の設定例
app.config['BABEL_DEFAULT_LOCALE'] = 'ja'
def get_locale():
# 言語を判定し、もし不明なら上記のデフォルト設定が使われます
return request.accept_languages.best_match(app.config['LANGUAGES'])
このように「もしもの時の決まり」を作っておくことで、世界中の誰がアクセスしてきてもエラーにならず、安全にサイトを表示させることができます。
5. HTMLファイルで自動切り替えの結果を確認する
プログラム側で言語が決まったら、次はHTMLファイル(Webページの見た目を作るファイル)で、実際に文字が切り替わるか確認してみましょう。
翻訳用の関数「_()」を使っている場所が、自動的に選ばれた言語に置き換わります。
<div class="container mt-5">
<h1 class="display-4">
<i class="bi bi-translate"></i>
{{ _('Welcome to our Service') }}
</h1>
<p class="lead">
{{ _('We automatically detect your language settings.') }}
</p>
</div>
例えば、日本語の翻訳ファイルに「ようこそ」と登録してあれば、ブラウザが日本語設定の人には「ようこそ」と表示されます。設定を変えるだけで中身が動的に変わる、プログラミングの醍醐味です。
6. URLから言語を判断させる応用テクニック
ブラウザの設定による自動判別は強力ですが、時には「日本のパソコンを使っているけれど、英語の勉強のために英語表示にしたい」という人もいます。そのために、URLの形(アドレス)から言語を判断する仕組みも組み合わせてみましょう。
「http://example.com/en/」のように、URLの先頭を見て言語を決める方法は、SEO(検索エンジン最適化)の面でも非常に有利です。Googleなどの検索エンジンが「このページは英語用だ」と正しく認識してくれるからです。
# URLの中に言語コードが含まれているかチェックする例
@app.route('/<lang_code>/index')
def index(lang_code):
if lang_code in LANGUAGES:
# ここで選ばれた言語を一時的に記憶する処理などを行います
pass
return render_template('index.html')
7. クッキー(Cookie)にユーザーの好みを保存する
自動判別で見つかった言語や、ユーザーが手動で選んだ言語を、次回のアクセス時にも覚えておいてほしいことがあります。そんな時に役立つのが「クッキー(Cookie)」という仕組みです。
クッキーとは、ユーザーのブラウザに小さなメモを残しておくようなものです。次回サイトを訪れたとき、プログラムはそのメモを読んで「前回はこの人は英語を選んでいたな」と思い出すことができます。
「自動判別」→「手動での変更」→「その選択を記憶」という流れを作ることで、ユーザーにとって最高に使いやすいWebサイトが完成します。
8. 翻訳が反映されない時のトラブルシューティング
自動判別のコードを書いたのに、どうしても英語のまま変わらない……という時は、いくつかのポイントをチェックしてみましょう。
- 翻訳ファイルの「.moファイル」は作成されていますか?
- 言語コードが「ja」ではなく「jp」になっていませんか?(正解はjaです)
- フォルダの名前は「translations」になっていますか?
特に、翻訳を書き込んだ「.poファイル」を、コンピュータが読める「.moファイル」に変換(コンパイル)し忘れるのは、プロでもよくあるミスです。もう一度コマンドを確認してみましょう。
9. 言語切り替えボタンとの組み合わせがベスト
最後に、自動判別だけに頼るのではなく、画面の隅に小さな「言語切り替えボタン」を置いておくことを強くおすすめします。
自動判別はあくまで「予測」です。ユーザーが旅行先で現地のパソコンを使っている場合など、予測が外れることもあります。自動で判別しつつも、最終的な決定権はユーザーに持たせてあげる。これがプロの作る優しいWebサイトの設計です。
Bootstrapのドロップダウンメニューなどを使って、「日本語」「English」といった選択肢を作ってみましょう。自動判別のコードと組み合わせれば、利便性は百点満点です!