カテゴリ: Play Framework 更新日: 2026/04/10

Play Frameworkで言語を自動判別!リクエスト言語の検出方法を徹底解説

リクエスト言語の自動検出方法
リクエスト言語の自動検出方法

先生と生徒의会話形式で理解しよう

生徒

「Play Frameworkで作ったアプリで、アクセスしてきた人が日本人なら日本語、外国人なら英語を自動で表示したいのですが、どうやって判定しているんですか?」

先生

「それは『リクエスト言語の自動検出』という機能を使っています。ブラウザがサーバーに送る情報の中に、どの言語が得意かというヒントが含まれているんですよ。」

生徒

「ブラウザが教えてくれているんですね!具体的にJavaのプログラムではどうやってその情報を読み取るんですか?」

先生

「Play Frameworkには、その複雑な処理を代行してくれる便利な仕組みがあります。まずはその仕組みの基本から学んでいきましょう!」

1. リクエスト言語の自動検出とは何か?

1. リクエスト言語の自動検出とは何か?
1. リクエスト言語の自動検出とは何か?

Webアプリケーションにアクセスするユーザーは、世界中に存在します。それぞれのユーザーが使用しているWebブラウザ(Google ChromeやSafariなど)は、サーバーに対してリクエストを送る際、「私はこの言語を優先的に表示してほしい」という情報をヘッダーの中に含めています。これを国際化(i18n)の文脈ではリクエスト言語の検出と呼びます。

Play Frameworkは、このリクエスト情報を読み取り、アプリケーション側で用意した翻訳ファイル(messagesファイル)の中から、最適な言語を自動的に選択してくれます。開発者が一人一人の国籍を判定するコードを自作する必要はなく、フレームワークが提供する標準機能を利用するだけで、高度な多言語対応サイトが実現可能です。

2. Accept-Languageヘッダーの仕組みを理解する

2. Accept-Languageヘッダーの仕組みを理解する
2. Accept-Languageヘッダーの仕組みを理解する

ブラウザが送信する情報の正体は「Accept-Language」というHTTPヘッダーです。ここには、例えば「ja, en-US;q=0.9, en;q=0.8」といった文字列が含まれています。これは「第一希望は日本語、第二希望はアメリカ英語、第三希望は英語」といった優先順位を表しています。末尾の数値は「品質値(q-value)」と呼ばれ、言語の重み付けを意味しています。

Play Frameworkはこのヘッダーの値を解析し、アプリケーションの設定ファイル(application.conf)に記述された「対応可能言語」と照らし合わせます。双方が合致する最も優先順位の高い言語が、そのリクエストにおける「現在の言語」として決定されます。このプロセスは完全に自動化されており、開発者は非常にシンプルなAPIを呼び出すだけで結果を得ることができます。

3. application.confでのサポート言語の設定

3. application.confでのサポート言語の設定
3. application.confでのサポート言語の設定

自動検出を正しく動作させるためには、アプリケーション側で「どの言語に対応しているか」を明示する必要があります。これを行うのが conf/application.conf ファイルです。ここに登録されていない言語のリクエストが来ても、Play Frameworkはそれを提供できないと判断し、デフォルトの言語を使用します。

設定は配列形式で行います。以下の設定例では、英語と日本語をサポートするように定義しています。この順番も重要で、もしユーザーの希望する言語がどれも提供できない場合、リストの最初に書かれた言語が優先されることがあります。


# conf/application.conf
# アプリケーションでサポートする言語を指定します
play.i18n.langs = [ "en", "ja" ]

4. MessagesApiを使用した言語の優先順位判定

4. MessagesApiを使用した言語の優先順位判定
4. MessagesApiを使用した言語の優先順位判定

Javaのコントローラー側で、具体的に「どの言語が選ばれたのか」を確認したり、その言語に基づいたメッセージを取得したりするには MessagesApi を利用します。このクラスには preferred という非常に強力なメソッドが存在します。

このメソッドに現在のリクエストを渡すと、前述のヘッダー情報と設定ファイルを突き合わせ、最適な Messages インスタンスを作成してくれます。初心者の方は、この一連の流れがPlay Frameworkにおける国際化処理の心臓部であると覚えておきましょう。以下にその基本的な取得パターンを示します。


import play.mvc.*;
import play.i18n.MessagesApi;
import play.i18n.Messages;
import javax.inject.Inject;

public class LangController extends Controller {
    private final MessagesApi messagesApi;

    @Inject
    public LangController(MessagesApi messagesApi) {
        this.messagesApi = messagesApi;
    }

    public Result checkLang(Http.Request request) {
        // リクエストヘッダーから最適な言語を自動検出する
        Messages messages = messagesApi.preferred(request);
        // 現在適用されている言語コードを取得
        String code = messages.lang().code();
        return ok("検出された言語は: " + code);
    }
}

このコードを実行し、日本語設定のブラウザでアクセスすると、結果は以下のようになります。


検出された言語は: ja

5. Cookieを利用した言語の固定と優先順位

5. Cookieを利用した言語の固定と優先順位
5. Cookieを利用した言語の固定と優先順位

リクエストヘッダーによる自動検出は便利ですが、ユーザーが手動で言語を切り替えたい場合もあります。Play Frameworkでは、特定の言語設定をCookie(クッキー)に保存する仕組みを提供しています。驚くべきことに、自動検出のロジックでは「Accept-Languageヘッダー」よりも「言語設定Cookie」の方が優先されます。

これにより、ブラウザの設定が英語であっても、ユーザーがサイト上のボタンで「日本語」を選んだ場合は、次回のアクセスからCookieを読み取って日本語を自動表示できるようになります。この優先順位の設計により、自動化とユーザーの自由な選択が両立されています。Cookieに言語をセットするJavaコードの例を確認しましょう。


public Result changeToEnglish(Http.Request request) {
    // 言語を英語(en)に固定するCookieをセットしてリダイレクト
    return redirect("/")
            .withLang(play.i18n.Lang.forCode("en"), messagesApi);
}

6. テンプレートでの自動言語切り替えの実装

6. テンプレートでの自動言語切り替えの実装
6. テンプレートでの自動言語切り替えの実装

コントローラーで検出された言語情報は、通常そのままScalaテンプレートに引き継がれます。テンプレートの引数に implicit Messages messages を含めておけば、テンプレート内の各メッセージ出力メソッドが、自動検出された言語の翻訳文を勝手に選んで表示してくれます。

開発者は「今の言語が何か」をif文で判定して文字を出し分ける必要はありません。ただメッセージキーを書くだけで、ブラウザの設定に合わせた文字が表示されるのです。これがPlay Frameworkが提供する「親切な設計」の真髄です。テンプレートでの記述例は非常にシンプルになります。


@* 自動検出された言語が適用されるテンプレート *@
@(implicit messages: play.i18n.Messages)

<div class="card">
    <div class="card-body">
        @* ブラウザが日本語なら日本語、英語なら英語が自動で入る *@
        <h5 class="card-title">@messages.at("welcome.title")</h5>
        <p>@messages.at("welcome.body")</p>
    </div>
</div>

7. デフォルト言語(フォールバック)の挙動

7. デフォルト言語(フォールバック)の挙動
7. デフォルト言語(フォールバック)の挙動

もし、ユーザーのブラウザが「フランス語」を要求しており、かつアプリケーションがフランス語に対応していない(messages.frが存在しない)場合はどうなるでしょうか?この場合、Play Frameworkは「フォールバック(代替処理)」を行います。

基本的には、拡張子のない messages ファイルの内容が使用されます。この挙動を理解しておくことで、「対応していない言語のユーザーに何を表示するか」をコントロールできるようになります。一般的には、デフォルトのファイルには英語などの広く通用する言語を記述しておくのがプログラミングの定石です。初心者の方は、対応言語外のユーザーへの配慮も忘れないようにしましょう。

8. 言語検出のデバッグと動作確認方法

8. 言語検出のデバッグと動作確認方法
8. 言語検出のデバッグと動作確認方法

開発中に正しく言語が検出されているか確認するには、ブラウザの設定を変更するのが一番確実です。Chromeの場合、設定の「言語」から優先順位を入れ替えることができます。また、開発者ツールの「Network」タブで、送信されているリクエストヘッダーの「Accept-Language」を直接確認することも有効です。

もし思った通りの言語が表示されない場合は、application.conf の設定ミスか、messagesファイルのファイル名間違いが原因であることがほとんどです。特に messages.ja のようにドットで区切る形式を間違えないように注意しましょう。小さな打ち間違いが自動検出を妨げる原因になります。一つずつ丁寧に確認することが、スキルアップへの近道です。

9. 国際化対応における高度な自動判別の応用

9. 国際化対応における高度な自動判別の応用
9. 国際化対応における高度な自動判別の応用

さらに高度な対応として、IPアドレスからユーザーの地域を推定して言語を切り替えたり、ログインユーザーのプロフィール情報から言語を固定したりすることも可能です。Play Frameworkの柔軟なアーキテクチャなら、標準の自動検出機能を拡張して、独自の「言語選択ロジック」を組み込むこともできます。

しかし、まずは標準のヘッダーベースの検出機能を使いこなすことが重要です。これだけでも十分に実用的な多言語サイトが構築できます。Javaでの開発に慣れてきたら、Cookieやセッションと組み合わせた、よりユーザーに寄り添った言語選択機能の実装に挑戦してみてください。国際化の技術を磨けば、あなたのアプリは世界中の人々に届けられるようになります。

カテゴリの一覧へ
新着記事
New1
Play Framework
Play Frameworkで日付・数値のローカライズ!i18n対応の決定版ガイド
New2
Jakarta EE
Jakarta EEの主要機能一覧と全体像を完全ガイド!初心者向けにやさしく解説
New3
Jakarta EE
Jakarta サーブレットのdoGetとdoPostの違いと使い分けを徹底解説!初心者でもわかるHTTPリクエスト処理
New4
Jakarta EE
Jakarta EEの暗号化とパスワード管理を初心者向けに解説 セキュリティ対策の基本を理解しよう
人気記事
No.1
Java&Spring記事人気No1
Jakarta EE
Jakarta EEとSpringの比較|どちらを選ぶべきか?初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
Jakarta EE
Jakarta サーブレットのHttpServletRequestを徹底解説!初心者でもわかる基本操作と使い方
No.3
Java&Spring記事人気No3
Jakarta EE
Jakarta EEとJava EEアプリの互換性を完全解説!移行で困らないための基礎知識
No.4
Java&Spring記事人気No4
Jakarta EE
Jakarta EEとは?Java EEからの移行の歴史をやさしく解説
No.5
Java&Spring記事人気No5
Jakarta EE
Jakarta EEのリリースサイクルとバージョンの進化をやさしく解説!
No.6
Java&Spring記事人気No6
Jakarta EE
Jakarta サーブレットのHttpServletResponseを徹底解説!初心者でもわかる基本操作と使い方
No.7
Java&Spring記事人気No7
Jakarta EE
MavenでJakarta EEプロジェクトを作る基本手順を完全ガイド!初心者でもわかる構成と設定
No.8
Java&Spring記事人気No8
Jakarta EE
JakartaEE JSPとは?サーブレットとの違いと役割を初心者向けに解説