PythonのFlaskで翻訳用のメッセージファイルを作成する手順を完全ガイド!
生徒
「PythonのFlaskを使ってWebサイトを作っているのですが、日本語だけでなく英語でも表示できるようにしたいです。どうすればいいですか?」
先生
「それは多言語化という作業ですね!Flaskには『Flask-Babel』という便利な道具があり、それを使って『翻訳用メッセージファイル』を作成することで実現できますよ。」
生徒
「翻訳用メッセージファイル……なんだか難しそうですね。プログラミングが初めての私でも作れますか?」
先生
「大丈夫ですよ。仕組みは『辞書』を作るのと似ています。一つずつ手順を追っていけば、必ず作れるようになります。まずは基本的な流れから見ていきましょう!」
1. 翻訳用メッセージファイルとは何かを知ろう
Webサイトを多言語に対応させるとき、一番大変なのは「日本語のページ」と「英語のページ」を別々に作ることです。これでは修正があるたびに両方のファイルを直さなければなりません。そこで登場するのが「翻訳用メッセージファイル」です。
これは、プログラムの中に直接「こんにちは」と書くのではなく、「挨拶の言葉」というラベルを貼っておき、そのラベルに対応する訳語を別ファイルにまとめておく仕組みです。日本語の設定なら「こんにちは」、英語の設定なら「Hello」と、システムが自動で入れ替えてくれます。
この翻訳データが詰まったファイルの代表が「.poファイル」や「.moファイル」と呼ばれるものです。これらは、世界中のプログラムで使われている共通の形式なので、一度覚えれば他のプログラミング言語でも役に立つ知識になります。
2. 翻訳の準備!Flask-Babelのインストールと設定
まずは、翻訳作業を助けてくれる「Flask-Babel(フラスク・バベル)」という拡張機能をパソコンに入れましょう。パソコンに新しい機能を追加することを「インストール」と呼びます。
コマンドプロンプトやターミナルという、文字を入力する画面を開いて、以下の魔法の言葉を入力してください。
# Flask-Babelをインストールするコマンドです
pip install Flask-Babel
次に、Pythonのプログラム(app.pyなど)で、この道具を使うための初期設定を書きます。ここでは「ブラウザの設定を見て、何語を表示するか決める」というルールを作ります。
from flask import Flask, request
from flask_babel import Babel
app = Flask(__name__)
# どの言語を使うか判定する関数です
def get_locale():
# ユーザーが使っているブラウザの言語設定を確認します
return request.accept_languages.best_match(['ja', 'en'])
# Babelの設定をアプリに適用します
babel = Babel(app, locale_selector=get_locale)
3. 翻訳したい文字に目印をつける
翻訳ファイルを作る前に、Webサイトのどこを翻訳したいのかをプログラムに教える必要があります。これを「マークアップ」と言ったりしますが、簡単に言えば「ここを翻訳してね!」という目印をつける作業です。
Pythonのコード内では「gettext()」という関数を使います。また、HTMLファイルの中では「_()」という短い記号で囲むのが一般的です。例えば、サイトのタイトルを翻訳対象にする場合は、以下のように記述します。
<h1>{{ _('Welcome to My Store') }}</h1>
<p>{{ _('Please enjoy shopping.') }}</p>
このように「_('...')」で囲んだ文字が、後で自動的に抜き出されて翻訳リストになります。囲み忘れると翻訳されないので、慎重に作業しましょう。
4. 抽出設定ファイルbabel.cfgを作成する
次に、パソコンに対して「どのファイルから翻訳用の文字を探せばいいの?」という指示書を作成します。ファイル名は必ず「babel.cfg」にしてください。
このファイルは、メモ帳などのテキストエディタで作れば大丈夫です。中身には、探しに行く場所を書いておきます。
# pythonファイルの中から探し出す設定
[python: **.py]
# HTMLファイル(Jinja2というテンプレートエンジン)の中から探し出す設定
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
この設定ファイルがあることで、後で実行するコマンドが「あ、このファイルを読めばいいんだな」と理解してくれるようになります。
5. 翻訳の種(POTファイル)を抜き出そう
いよいよ、翻訳用メッセージファイルの元となる「POT(ピーオーティー)ファイル」を作成します。POTは「Portable Object Template」の略で、翻訳の「型紙」のようなものです。
コマンド画面で以下の命令を実行します。ドット(.)を最後に付けるのを忘れないでください。
pybabel extract -F babel.cfg -o messages.pot .
成功すると、プロジェクトのフォルダの中に「messages.pot」というファイルができあがります。この中には、先ほど「_()」で囲んだ「Welcome to My Store」などの文字がリストアップされています。
6. 言語ごとの翻訳ファイル(POファイル)を初期化する
型紙(POTファイル)ができたら、次は具体的な言語用のファイルを作ります。これを「初期化(しょきか)」と呼びます。今回は日本語用の設定を作ってみましょう。
pybabel init -i messages.pot -d translations -l ja
このコマンドの意味を簡単に解説します。
- -i messages.pot:型紙ファイルを指定しています。
- -d translations:翻訳ファイルを保存するフォルダの名前です。
- -l ja:言語コードを指定しています。「ja」は日本語、「en」は英語を指します。
実行すると、「translations/ja/LC_MESSAGES/」という深い階層に「messages.po」というファイルが生成されます。
7. メッセージファイルに翻訳を書き込む
作成された「messages.po」ファイルをテキストエディタで開いてみましょう。中を見ると、「msgid(元の言葉)」と「msgstr(翻訳後の言葉)」というペアが並んでいます。
最初は「msgstr」の中身は空っぽ("")になっています。ここに、あなたが考えた素晴らしい日本語の訳を書き込んでいきます。
# 翻訳前の状態
msgid "Welcome to My Store"
msgstr ""
# 翻訳を書き込んだ状態
msgid "Welcome to My Store"
msgstr "私の店へようこそ"
msgid "Please enjoy shopping."
msgstr "お買い物をお楽しみください。"
注意点として、ダブルクォーテーション(")を消さないように気をつけてください。文字を入力する場所を間違えると、エラーになってしまいます。
8. 翻訳ファイルを保存してコンパイルする
翻訳を書き込んだだけでは、まだWebサイトには反映されません。最後の手順として、コンピュータが高速に読み取れる形式に変換する「コンパイル」という作業が必要です。
コンパイルされると、人間が読める「.poファイル」から、コンピュータ専用の「.moファイル」が作成されます。以下のコマンドを実行してください。
pybabel compile -d translations
これで完了です!Webアプリを起動して、ブラウザで確認してみましょう。ブラウザが日本語設定であれば、先ほど入力した日本語が表示されるはずです。
9. 翻訳を更新したいときはどうする?
Webサイトを作っている途中で、新しく翻訳したい文字が増えることはよくあります。その場合は、最初からやり直す必要はありません。「アップデート(更新)」という操作を行います。
まず、新しい文字を「extract」コマンドで抽出し、その後に以下の「update」コマンドを実行します。
pybabel update -i messages.pot -d translations
これを使えば、今まで苦労して入力した翻訳済みのデータはそのままに、新しく追加された部分だけをリストに付け加えてくれます。とっても親切な機能ですね。
10. よくあるミスと解決方法
初めての作業では、どこかでつまずくこともあるかもしれません。よくある原因は「フォルダの名前間違い」や「コマンドを打つ場所(ディレクトリ)の間違い」です。
もし、翻訳が反映されないときは、以下のポイントをチェックしてみてください。
- 「.moファイル」が正しく生成されているか?
- フォルダ構成が「translations/ja/LC_MESSAGES/」になっているか?
- Pythonのコードで「get_locale」が正しく言語を判定できているか?
一つずつ確認していけば、必ず解決策が見つかります。多言語対応ができるようになると、あなたの作ったアプリを世界中の人に届ける準備が整います。この調子で、プログラミングの学習をどんどん進めていきましょう!