Play Frameworkのi18n完全ガイド!静的・動的テキストの翻訳管理と多言語化設定
生徒
「Play Frameworkで作ったアプリを、日本語だけでなく英語でも表示したいのですが、どうすればいいですか?」
先生
「それは国際化(i18n)という機能を使います。メッセージファイルという場所に翻訳テキストを準備するだけで、簡単に多言語対応ができますよ。」
生徒
「固定の文章だけじゃなくて、ユーザーの名前とかを入れた動的な文章も翻訳できるんですか?」
先生
「もちろんです。静的なテキストと動的なテキスト、それぞれの管理方法について詳しく見ていきましょう!」
1. Play Frameworkの国際化(i18n)とは何か?
Webアプリを世界中で使ってもらうためには、利用者の言語に合わせて表示を切り替える必要があります。この仕組みを国際化(Internationalization)と呼び、頭文字の「i」と末尾の「n」の間に18文字あることから、エンジニアの間ではi18nという略称で親しまれています。Play Frameworkには、このi18nを非常にシンプルに実装できる強力なツールが最初から備わっています。
具体的には、プログラムの中に直接「こんにちは」や「Hello」と書くのではなく、「あいさつの言葉」というラベル(キー)だけを書いておきます。そして、そのラベルに対応する日本語や英語の文章を、別の専用ファイルにまとめて管理します。こうすることで、プログラム本体を修正することなく、翻訳ファイルを追加するだけで新しい言語に対応できるようになります。
2. メッセージファイルの作成と配置場所
Play Frameworkで翻訳を管理するには、confフォルダの中にmessagesという名前のファイルを作成します。これが翻訳データのデータベースのような役割を果たします。日本語用のファイルはmessages.ja、英語用のファイルはmessages.enというように、ファイル名の末尾に言語コードを付けるのがルールです。パソコン初心者の方でも、メモ帳などのテキストエディタで簡単に編集できる形式になっています。
ファイルの中身は、「キー = 翻訳したい文章」というシンプルな形式で記述します。例えば、ログインボタンのテキストであれば btn.login = ログイン のように書きます。この「キー」をプログラム側から呼び出すことで、Play Frameworkが実行時に適切な言語を選択して表示してくれます。配置場所を間違えると翻訳が反映されないため、必ずconfディレクトリ直下に置くように注意しましょう。
3. 設定ファイルapplication.confの編集方法
メッセージファイルを作っただけでは、アプリはどの言語をサポートしているのか判断できません。そこで、アプリ全体の設定を司るapplication.confに、使用可能な言語を登録する必要があります。これを忘れると、せっかく書いた翻訳データが読み込まれません。
具体的には play.i18n.langs という項目を見つけ、そこに ["en", "ja"] のように、サポートしたい言語コードをリスト形式で追加します。言語コードは世界共通の規格に基づいています。日本語なら「ja」、英語なら「en」、フランス語なら「fr」といった具合です。設定を保存したら、アプリを再起動することで多言語対応の準備が整います。設定ファイルの記述ミスは起動エラーの原因になるため、カッコや引用符を正確に書くことが大切です。
4. 静的テキストをビューで表示する基本的な書き方
準備ができたら、実際にHTMLテンプレート(Scalaテンプレート)の中で翻訳テキストを表示させてみましょう。静的テキストとは、画面を表示するたびに内容が変わらない固定の文章のことです。テンプレート内では @Messages("キー名") という非常に短いコードで呼び出すことができます。Javaの開発者であれば、コントローラーから渡された暗黙のメッセージ指示に従って、システムが自動的に適切な翻訳を選んでくれます。
例えば、タイトルを表示したい場所に @Messages("home.title") と書けば、日本語環境では「ホーム画面」、英語環境では「Home Page」と表示されます。HTMLファイルに直接日本語を書き込んでしまうと、他の言語に対応する際に全てのファイルを書き換えなければなりませんが、この方法なら翻訳ファイルを編集するだけで一気に変更が可能です。
@* conf/messages.ja の内容 *@
@* home.welcome = ようこそ、Play Frameworkへ! *@
@* app/views/index.scala.html の内容 *@
@main("Home") {
<h1>@Messages("home.welcome")</h1>
<p>このテキストは設定された言語に合わせて自動的に切り替わります。</p>
}
5. 動的テキストとパラメータの渡し方
「〇〇さん、こんにちは!」のように、文章の一部にユーザーの名前や数値を含めたい場合があります。これを動的テキストと呼びます。メッセージファイル側では、変化する部分を {0}, {1} といった番号付きのプレースホルダーで予約しておきます。この数字は、何番目の引数を入れるかを指定するものです。
呼び出し側では、@Messages("user.greet", userName) のように、キーの後ろに具体的なデータを渡します。Play Frameworkはこの引数を自動的にプレースホルダーに流し込んで、完成した文章を作成してくれます。この仕組みを使えば、単語の順番が言語によって異なる場合(英語なら「Hello, Alice」、日本語なら「アリスさん、こんにちは」)でも、メッセージファイルの書き方を変えるだけで柔軟に対応できます。
// conf/messages.ja
// user.welcome = {0}さん、現在のポイントは{1}ポイントです。
// app/controllers/HomeController.java
public Result welcome(Http.Request request) {
String name = "アリス";
int points = 1500;
// メッセージの取得例
String message = messagesApi.get(request.lang(), "user.welcome", name, points);
return ok(views.html.index.render(message));
}
6. Javaコントローラー内でのメッセージAPIの利用
画面(ビュー)だけでなく、Javaのプログラム(コントローラー)の中でも翻訳テキストを使いたい場面があります。例えば、入力エラーのメッセージを返したり、ログを記録したりする場合です。このときは、Play Frameworkが提供する MessagesApi というクラスをインジェクション(注入)して利用します。これは、プログラムの中で「翻訳辞書」を自由に引けるようにする便利な道具です。
使い方は簡単で、messagesApi.get(lang, "キー") というメソッドを呼び出します。ここで重要なのは、現在のユーザーがどの言語を使っているかという情報(lang)を一緒に渡すことです。Play Frameworkはリクエストヘッダーを解析して、自動的に「この人は日本語を使いたいんだな」と判断してくれます。これにより、常にユーザーに最適な言語で情報を届けることができるのです。
import play.i18n.MessagesApi;
import play.mvc.Controller;
import javax.inject.Inject;
public class MyController extends Controller {
private final MessagesApi messagesApi;
@Inject
public MyController(MessagesApi messagesApi) {
this.messagesApi = messagesApi;
}
public void logStatus(play.i18n.Lang lang) {
// プログラム内で翻訳文字列を取得
String status = messagesApi.get(lang, "app.status.ok");
System.out.println("Status: " + status);
}
}
7. 言語の優先順位とフォールバックの仕組み
もし、ユーザーのブラウザが「ドイツ語」を要求しているのに、アプリ側に messages.de がなかったらどうなるでしょうか?Play Frameworkにはフォールバック(代替)という賢い仕組みがあります。指定された言語が見つからない場合は、デフォルトのファイルである messages (言語コードなし)の内容を表示しようと試みます。さらにそれも見つからない場合は、キー名そのものが画面に表示されます。
この仕組みがあるおかげで、一部の言語で翻訳が間に合っていない場合でも、アプリがクラッシュすることはありません。まずは共通言語として英語を messages ファイルに書いておき、日本語などの追加言語を messages.ja に分けて書くのが、プロのエンジニアがよく使うテクニックです。これにより、世界中の誰がアクセスしても、最低限何らかのテキストは表示される安全な設計になります。
8. メッセージファイルの書き方のコツと注意点
メッセージファイルを管理する上で、いくつか気をつけるべきポイントがあります。まず、ファイルの中にコメントを残したい場合は行の先頭に # を付けます。次に、文章の中でシングルクォート(')を表示したい場合は、'' と二つ並べて書く必要があります。これはメッセージフォーマットの仕様によるもので、初心者が最もつまずきやすいポイントの一つです。
また、キーの名前は admin.user.list.title のように、ドットを使って階層構造にするのがおすすめです。こうすることで、どの画面のどのパーツで使っている言葉なのかが整理され、後から修正するのが非常に楽になります。文字数が増えてくるとファイルが乱雑になりがちですが、最初から整理整頓を心がけることで、メンテナンス性の高い素晴らしいWebアプリへと成長していきます。キー名は、後から見ても意味がわかる英単語を使いましょう。
# conf/messages.ja の整理例
# 共通パーツ
common.save = 保存
common.cancel = キャンセル
# ユーザー画面用
user.login.title = ログインしてください
user.login.error = IDまたはパスワードが正しくありません
9. 多言語化対応をテストする方法
作成した翻訳が正しく機能しているか確認するには、ブラウザの設定を変更して言語の優先順位を変えてみるのが一番確実な方法です。Google Chromeなどのブラウザ設定にある「言語」メニューから、英語を一番上に移動させてみてください。ページを更新したときに、ボタンやメッセージが英語に切り替わっていれば成功です。
もし切り替わらない場合は、application.conf の設定漏れや、ファイル名のスペルミス、あるいはキー名の打ち間違いを疑いましょう。プログラミングにおいて、最初から全て完璧に動くことは稀です。一つ一つの設定を丁寧に見直すことで、着実にスキルが身についていきます。自分の作ったアプリが言語を超えて変化する様子を見るのは、開発の醍醐味を感じられる瞬間ですので、ぜひ何度も試してみてください。