Flaskで翻訳作業を自動化!gettextやPoeditを使いこなす多言語化ガイド
生徒
「Flaskで作ったアプリを英語や日本語に対応させたいのですが、メッセージを一つずつ手作業で翻訳ファイルに書き写すのは大変そうです。何か自動化する方法はありませんか?」
先生
「確かに、手作業ではミスも増えますし時間もかかりますね。そこで役立つのが、gettext(ゲットテキスト)という仕組みと、Poedit(ポエディット)という便利なソフトです。」
生徒
「それらを使うと、どのように作業が楽になるのでしょうか?」
先生
「プログラムの中から翻訳が必要な場所を自動で見つけ出し、専用の画面で効率よく翻訳できるようになります。まずはその全体像を見ていきましょう!」
1. 翻訳作業を劇的に楽にするツールの正体
Webアプリを世界中で使ってもらうためには、表示される言葉を相手の言語に切り替える「多言語化」が必要です。しかし、プログラムのあちこちにある「こんにちは」や「保存」という言葉を、手作業でリストアップするのは現実的ではありません。そこで登場するのが、翻訳作業を助けてくれるツールたちです。
「gettext」とは、プログラムの中の言葉を抜き出したり、翻訳された言葉をコンピュータが読める形式に変換したりするための世界標準の仕組みです。そして「Poedit」は、その gettext で作られた翻訳ファイルを、まるで翻訳専用のメモ帳のように使いやすく編集できる無料のソフトウェアです。これらを活用することで、プログラミング初心者の方でも、間違いなくスムーズに翻訳作業を進めることができるようになります。
2. 翻訳したい言葉に「印」をつける基本コード
ツールを使う前に、プログラムの中で「ここを翻訳してほしい!」という場所に印をつける必要があります。Flaskでは _() という短い記号を使います。これを使うことで、gettext というツールが「あ、ここは翻訳が必要な場所だな」と自動で見つけてくれるようになります。
from flask import Flask, render_template
from flask_babel import Babel, _
app = Flask(__name__)
babel = Babel(app)
@app.route('/')
def index():
# 翻訳したい言葉を _() で囲みます
greeting = _('ようこそ、私たちのサイトへ!')
return render_template('index.html', message=greeting)
このように書くだけで準備は完了です。プログラミング未経験の方は、この _() を「翻訳してねという目印」だと覚えてください。これだけで、後で紹介するツールが自動的にこの言葉を拾い上げてくれます。手書きのリストを作る必要はもうありません。
3. ツールを使って翻訳対象を自動で抜き出す
印をつけた言葉をファイルにまとめる作業を「抽出」と言います。これはコマンドという命令を使って一瞬で終わらせることができます。パソコンの黒い画面(ターミナルやコマンドプロンプト)に、魔法の言葉を打ち込みましょう。
pybabel extract -F babel.cfg -o messages.pot .
この命令を実行すると、プログラム全体をスキャンして _() で囲まれた言葉をすべて見つけ出し、「messages.pot」という一つの型紙ファイルにまとめてくれます。自分ですべてのファイルを開いて言葉を探し回る必要がないので、大幅な時間の短縮になります。この「型紙」ができることで、いよいよ実際の翻訳作業に入ることができます。
4. 翻訳専用ソフトPoeditをインストールしよう
型紙ファイルができたら、次は実際に英語やフランス語などの訳文を入力する作業です。ここで活躍するのが「Poedit」です。Poeditは、翻訳ファイル(.poファイル)を編集するための専用ソフトで、公式サイトから無料でダウンロードできます。
なぜこのソフトを使うかというと、単なるメモ帳で編集するよりも「どこが未翻訳か」がひと目で分かり、さらには「過去に似たような翻訳をしたことがあるよ」と教えてくれる機能までついているからです。パソコンの操作に自信がない方でも、エクセルの表を埋めるような感覚で翻訳を進められるのが大きな魅力です。まずは公式サイトからインストールして、準備を整えましょう。
5. Poeditで実際に翻訳を書き込む手順
Poeditを開いたら、先ほど作った「型紙(.pot)」を使って、新しく日本語や英語のファイルを作成します。画面には、左側に「プログラム内の元の言葉」、右側に「翻訳後の言葉を入れる欄」が表示されます。ここに一つずつ訳文を打ち込んでいくだけです。
<!-- HTMLテンプレート内でも同じように印をつけます -->
<div>
<p>{{ _('ログインしてください') }}</p>
<button>{{ _('送信') }}</button>
</div>
このようにHTMLの中に書いた言葉も、Poeditを使えば一覧として表示されます。すべての欄を埋めたら「保存」ボタンを押すだけです。すると、Poeditが自動的に「.po」という人間用のファイルと、「.mo」というコンピュータ用のファイルの二つを保存してくれます。このコンピュータ用のファイルが、実際にFlaskアプリで言葉を切り替えるために使われます。
6. 既存の翻訳に新しい言葉を追加する更新作業
アプリを作っている途中で、新しい機能が増えたり言葉が変わったりすることはよくあります。そのたびに最初から翻訳し直すのは大変ですよね。でも安心してください。gettextとPoeditを使えば「更新作業」も自動化できます。
# 後から新しいメッセージを追加した場合
def new_feature():
status = _('処理が完了しました')
return status
新しい言葉をプログラムに書いた後、再び抽出のコマンドを実行します。その後、Poeditで既存の翻訳ファイルを開き、「POTファイルから更新」というボタンを押すだけで、新しく追加された「処理が完了しました」という言葉だけがリストに追加されます。これまでの翻訳はそのまま残るので、追加された部分だけをサッと翻訳すれば完了です。この継続的な管理のしやすさが、自動化ツールの最大の利点です。
7. 文字化けを防ぐ設定と保存のルール
多言語対応で初心者が一番困るのが、せっかく翻訳した言葉が「???」や変な記号になってしまう「文字化け」です。これを防ぐために絶対に守らなければならないルールが一つあります。それは「文字コードをUTF-8(ユーティーエフ・エイト)にする」ということです。
幸いなことに、PoeditというソフトはこのUTF-8を標準で使ってくれるので、このソフトを使って保存している限り、文字化けのリスクは非常に低くなります。もしメモ帳などで直接ファイルを編集してしまうと、知らず知らずのうちに別の形式で保存され、文字化けの原因になってしまいます。翻訳作業は必ずPoeditのような専用ツールで行うことが、トラブルを避けるための一番の近道です。
8. 翻訳が反映されないときのチェックポイント
「翻訳を書き込んだのに、画面が英語のまま変わらない!」という状況になったとき、確認すべきポイントは決まっています。まず、Poeditで保存したときに「.mo」という名前のファイルができているか確認してください。実はFlaskは、人間が読める「.po」ファイルではなく、コンピュータ用に変換された「.mo」ファイルの方しか見ていません。
次に、フォルダの場所が正しいかを確認しましょう。通常、Flaskは「translations」という名前のフォルダの中にある言葉を探しに行きます。このフォルダの名前が一文字でも間違っていると、どんなに完璧な翻訳をしてもアプリには届きません。こうした「コンピュータ特有の几帳面さ」を理解して設定を確認すれば、初心者の方でも必ず多言語化を成功させることができます。