Play Frameworkで言語切り替えを実装!ユーザーが選択できる多言語対応ガイド
生徒
「Play Frameworkで作ったサイトで、ユーザーが自分の好きな言語をボタン一つで選べるようにしたいのですが、どうすればいいですか?」
先生
「それは『ユーザー選択による言語切り替え』ですね。Play Frameworkには、選択された言語をCookieに保存して、次回アクセス時もその言語を維持する便利な仕組みがあるんですよ。」
生徒
「Cookieを使うんですね!Javaのプログラム側ではどのような処理を書けばいいのでしょうか?」
先生
「コントローラーで言語コードを受け取り、特定のメソッドを呼び出すだけです。具体的な実装手順をステップバイステップで見ていきましょう!」
1. ユーザーによる言語切り替えの仕組み
Play Frameworkの国際化(i18n)機能では、通常ブラウザの「Accept-Language」ヘッダーを読み取って自動的に言語を判別します。しかし、ユーザーが意図的に「英語で読みたい」「日本語に戻したい」という要望を持つことは非常に多いです。このような場合に、ユーザーがリンクやボタンをクリックして言語を明示的に指定できるようにするのが今回の目的です。
この仕組みのポイントは、指定された言語情報をブラウザのCookie(クッキー)に保存することにあります。一度Cookieに保存されると、Play Frameworkはブラウザの標準設定よりもCookieの情報を優先して読み取るため、サイトを移動しても選択した言語が保持されるようになります。プログラミングの初心者の方でも、この「Cookieへの保存」という流れを意識すれば、実装の全体像が掴みやすくなります。
2. application.confでの対応言語の登録
言語切り替え機能を実装する前に、必ずアプリケーション側で「どの言語を許可するか」を設定しておく必要があります。これを行わないと、プログラム側で言語を指定しても正しく認識されません。設定ファイルである conf/application.conf を開き、サポートする言語リストを記述しましょう。
以下の例では、英語と日本語の二つを有効にしています。ここに書かれた言語コード(jaやen)が、実際のメッセージファイル(messages.jaやmessages.en)と紐付くことになります。開発を始める際の第一歩として、この設定を忘れないように注意してください。
# conf/application.conf
# アプリケーションが対応する言語を定義します
play.i18n.langs = [ "en", "ja" ]
3. 言語を切り替えるコントローラーの実装
ユーザーが言語を選択した際に呼び出されるアクションをコントローラーに作成します。Javaでの実装では、withLang メソッドを使用するのが最も一般的で確実な方法です。このメソッドは、指定された言語情報をレスポンスに含め、ブラウザにCookieとして保存させる指示を出してくれます。
引数として言語コード(String型)を受け取り、それを Lang オブジェクトに変換してから処理を行います。処理が終わった後は、元のページやトップページにリダイレクトさせるのがユーザーフレンドリーな設計と言えます。具体的なJavaコードの例を確認してみましょう。
package controllers;
import play.mvc.*;
import play.i18n.Lang;
import play.i18n.MessagesApi;
import javax.inject.Inject;
public class LanguageController extends Controller {
private final MessagesApi messagesApi;
@Inject
public LanguageController(MessagesApi messagesApi) {
this.messagesApi = messagesApi;
}
public Result change(String code) {
// 受け取ったコード("ja"や"en")でLangオブジェクトを作成
Lang lang = Lang.forCode(code);
// 言語設定をCookieに保存して、トップページへリダイレクト
// withLangメソッドがCookieのセットを自動で行います
return redirect("/")
.withLang(lang, messagesApi);
}
}
4. ルーティングファイルへの定義追加
作成したコントローラーのアクションを、URLと紐付けるために conf/routes ファイルを編集します。ユーザーが「/lang/ja」にアクセスしたら日本語に、「/lang/en」にアクセスしたら英語に切り替わるように設定します。パラメータとして言語コードを渡せるように記述するのがコツです。
このように設定することで、HTML側から簡単なリンク形式で言語切り替え機能を呼び出せるようになります。Play Frameworkのルーティングは非常にシンプルなので、未経験の方でも直感的に理解できるはずです。以下の通りに一行追加してみましょう。
# conf/routes
# 言語切り替え用のアクションを定義
GET /lang/:code controllers.LanguageController.change(code: String)
5. Scalaテンプレートでの切り替えボタン作成
次に、ユーザーがクリックするためのリンク(またはボタン)をHTML画面上に作成します。Scalaテンプレート内で先ほど定義したルートを呼び出し、引数に「ja」や「en」を渡します。Bootstrapのボタンクラスなどを使って見栄えを整えると、より使い勝手の良いサイトになります。
現在適用されている言語に応じて、ボタンの見た目を変えるなどの工夫も可能です。まずは基本となる、リンクによる切り替えボタンの実装例を紹介します。テンプレート内の好きな場所に配置してみてください。
@* 言語切り替えボタンの例 *@
<div class="btn-group" role="group">
<a href="@routes.LanguageController.change("ja")" class="btn btn-outline-primary">
<i class="bi bi-translate"></i> 日本語
</a>
<a href="@routes.LanguageController.change("en")" class="btn btn-outline-secondary">
<i class="bi bi-globe"></i> English
</a>
</div>
6. メッセージファイルによる表示の確認
言語を切り替えた後に、実際に文字が変わっているかを確認するための準備をします。conf/messages.ja と conf/messages.en に、同じキーを使って異なる言語の文章を書き込みましょう。これが正しく表示されれば、実装は成功です。
もし切り替えがうまくいかない場合は、キー名が一致しているか、またはファイルの拡張子が正しいかを確認してください。特に日本語ファイルでの全角スペースの混入などはエラーの原因になりやすいため、注意深く記述しましょう。以下にテスト用の定義例を示します。
# conf/messages.ja
welcome.message = ようこそ、Play Frameworkの世界へ!
# conf/messages.en
welcome.message = Welcome to the Play Framework World!
テンプレート側で @messages.at("welcome.message") と記述しておけば、切り替えボタンを押すたびに文字が変化します。実行結果は以下のようになります。
(日本語選択時)ようこそ、Play Frameworkの世界へ!
(英語選択時)Welcome to the Play Framework World!
7. 言語設定Cookieの有効期限と削除方法
withLang メソッドでセットされるCookieには、デフォルトで有効期限が設定されています。ユーザーが一度言語を選べば、ブラウザを閉じても次回の訪問時にその設定が残っているのはこのためです。しかし、状況によっては設定をリセット(Cookieを削除)したい場合もあります。
そのような時は、clearingLang メソッドを使用します。これを使えば保存された言語設定Cookieを削除し、再びブラウザの標準設定(Accept-Language)に従う状態に戻すことができます。ユーザーに「設定の初期化」という選択肢を提供したい場合に非常に役立つ機能です。Javaでの記述も withLang と同様に非常にシンプルです。
public Result resetLanguage() {
// 言語設定のCookieを削除してリセット
return redirect("/")
.clearingLang(messagesApi);
}
8. 実装時のトラブルシューティングと注意点
初心者の方がよく遭遇する問題として、ブラウザのキャッシュによって古い表示が残ってしまうことがあります。コードを修正したのに反映されない場合は、一度ブラウザの履歴やCookieを完全に削除して試してみるのが有効な手段です。また、application.conf で指定したリスト以外の言語コード(例えば "fr" など)を Lang.forCode に渡しても、正しく処理されないことがあります。
さらに、リダイレクト先のURLが正しいかどうかも重要です。言語を切り替えた瞬間にページが真っ白になったりエラー画面が出たりする場合は、ルーティングの設定を見直しましょう。一つ一つのステップをデバッグしながら進めることで、着実に理解を深めることができます。Play Frameworkはエラーメッセージも親切なので、よく読んで原因を特定しましょう。
9. さらに使いやすいサイトにするための応用
基本の実装ができたら、次はUX(ユーザーエクスペリエンス)を高める工夫をしてみましょう。例えば、現在選択されている言語のボタンだけを強調表示(アクティブ状態に)したり、国旗のアイコンを表示したりすることで、視覚的にわかりやすいメニューになります。テンプレート内で messages.lang().code() を使えば、今の言語が何かを簡単に判定できます。
また、大規模なサイトでは「どのページにいてもその場で言語を切り替えて同じページに戻る」という仕組みが求められます。リダイレクト先を固定のトップページではなく、リクエストの「Referer」ヘッダーから取得した元のURLに設定することで、ユーザーにとってよりストレスのない言語切り替えが可能になります。これらの応用テクニックを駆使して、世界中で愛されるアプリケーションを目指しましょう。