カテゴリ: Spring 更新日: 2026/01/09

Spring MVCで国際化を実現!LocaleResolverとMessageSourceの基本設定と使い方

Spring MVCのロケール/メッセージ:LocaleResolver と MessageSource設定
Spring MVCのロケール/メッセージ:LocaleResolver と MessageSource設定

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

生徒

「Springで多言語対応のWebアプリを作りたいんですが、どうやって言語を切り替えるんですか?」

先生

「Spring MVCではLocaleResolverMessageSourceを使えば、言語や地域(ロケール)に応じたメッセージ表示ができますよ。」

生徒

「つまり、ユーザーのブラウザ設定に応じて、英語や日本語を切り替えられるってことですか?」

先生

「その通りです!では、国際化のための設定と使い方を順番に見ていきましょう。」

1. Spring MVCでの国際化(i18n)とは

1. Spring MVCでの国際化(i18n)とは
1. Spring MVCでの国際化(i18n)とは

Spring MVCでは、アプリケーションの国際化(i18n)をサポートしており、ユーザーのロケールに応じた言語メッセージを表示することができます。この機能を使えば、英語や日本語などの言語を簡単に切り替えることができます。

ロケールの判定や切り替えはLocaleResolverで行い、実際の翻訳文はMessageSourceによって管理されます。

2. メッセージファイルの作成と配置

2. メッセージファイルの作成と配置
2. メッセージファイルの作成と配置

まずは多言語対応用のプロパティファイルを用意します。Spring Bootではsrc/main/resources以下に次のような名前でファイルを配置します。


messages.properties         (デフォルト)
messages_ja.properties      (日本語)
messages_en.properties      (英語)

たとえばmessages_ja.propertiesには以下のように記述します。


greeting=こんにちは、{0}さん!

英語版には次のように書きます。


greeting=Hello, {0}!

3. MessageSourceの設定(Spring Boot)

3. MessageSourceの設定(Spring Boot)
3. MessageSourceの設定(Spring Boot)

Spring Bootでは、プロパティファイルの読み込みはMessageSourceで行われます。以下のようにapplication.propertiesに設定します。


spring.messages.basename=messages
spring.messages.encoding=UTF-8

複数のメッセージファイルを読み込む場合はカンマ区切りで指定できます。

4. MessageSourceの設定(Spring MVC)

4. MessageSourceの設定(Spring MVC)
4. MessageSourceの設定(Spring MVC)

Spring Bootを使わずにSpring MVCを構成している場合は、Javaの設定クラスでMessageSourceのBeanを定義する必要があります。


@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

5. LocaleResolverの基本とCookie/Sessionの選択

5. LocaleResolverの基本とCookie/Sessionの選択
5. LocaleResolverの基本とCookie/Sessionの選択

LocaleResolverは、ユーザーのロケール(言語と地域)を決定する仕組みです。主に次の2種類があります。

  • SessionLocaleResolver:セッションにロケールを保持
  • CookieLocaleResolver:クッキーにロケールを保持

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver resolver = new SessionLocaleResolver();
    resolver.setDefaultLocale(Locale.JAPAN);
    return resolver;
}

もしくは、クッキーを使う設定も可能です。


@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver resolver = new CookieLocaleResolver();
    resolver.setDefaultLocale(Locale.JAPAN);
    resolver.setCookieName("lang");
    resolver.setCookieMaxAge(3600);
    return resolver;
}

6. ロケールを変更する仕組み:LocaleChangeInterceptor

6. ロケールを変更する仕組み:LocaleChangeInterceptor
6. ロケールを変更する仕組み:LocaleChangeInterceptor

Springでは、リクエストパラメータによってロケールを変更できるようにLocaleChangeInterceptorを使います。


@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
    interceptor.setParamName("lang");
    return interceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(localeChangeInterceptor());
}

この設定をすることで、URLに?lang=en?lang=jaを付けてアクセスするだけで、表示言語を切り替えられるようになります。

7. コントローラやThymeleafでのメッセージ表示

7. コントローラやThymeleafでのメッセージ表示
7. コントローラやThymeleafでのメッセージ表示

コントローラでメッセージを表示する場合は、MessageSourceをインジェクションして使います。


@Autowired
private MessageSource messageSource;

@GetMapping("/greeting")
public String greeting(Model model, Locale locale) {
    String message = messageSource.getMessage("greeting", new Object[] {"田中"}, locale);
    model.addAttribute("message", message);
    return "greeting";
}

Thymeleafでは#{キー名}でメッセージを表示できます。


<p th:text="#{greeting}"></p>

8. ブラウザのAccept-Languageに自動対応させる方法

8. ブラウザのAccept-Languageに自動対応させる方法
8. ブラウザのAccept-Languageに自動対応させる方法

ユーザーが言語を選ばずとも、ブラウザの設定でロケールを判定したい場合は、AcceptHeaderLocaleResolverを使います。


@Bean
public LocaleResolver localeResolver() {
    AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
    resolver.setDefaultLocale(Locale.JAPAN);
    return resolver;
}

この設定では、HTTPヘッダーのAccept-Languageを元に、自動で適切な言語が選ばれます。

9. よくある間違いと注意点

9. よくある間違いと注意点
9. よくある間違いと注意点
  • メッセージファイルのエンコーディングがUTF-8になっていない
  • プロパティファイルの拡張子が間違っている(.properties
  • メッセージキーが一致していない
  • LocaleResolverが正しく登録されていない

これらを防ぐために、開発初期の段階で一度画面に表示できるか試しておくのがおすすめです。

まとめ

まとめ
まとめ

Spring MVCにおける国際化対応の全体像を振り返る

この記事では、Spring MVCを使ったWebアプリケーションで国際化を実現するための基本的な仕組みとして、 LocaleResolverMessageSourceの役割や設定方法について学んできました。 国際化対応、いわゆる多言語対応は、国内向けのシステムだけでなく、 将来的に海外ユーザーを想定するWebサービスにおいて非常に重要な要素です。 表示する言語を切り替えられるようにしておくことで、ユーザーの利便性が大きく向上します。

Spring MVCでは、ロケールの判定と切り替えをLocaleResolverが担当し、 実際に表示する文言の管理をMessageSourceが受け持つという役割分担が明確になっています。 この構成を理解することで、「どこで言語が決まり、どこでメッセージが選ばれているのか」を 体系的に把握できるようになります。

MessageSourceによるメッセージ管理の重要性

メッセージファイルをプロパティファイルとして分離して管理することで、 Javaのソースコードを変更せずに文言の修正や翻訳が可能になります。 これは保守性の面でも非常に大きなメリットです。 日本語用、英語用といった形でファイルを分けておけば、 言語ごとの表現の違いにも柔軟に対応できます。

また、{0}のようなプレースホルダを使うことで、 動的な値を埋め込んだメッセージを簡単に作成できます。 挨拶文やエラーメッセージ、案内文など、 多くの場面で再利用できる仕組みであり、 Spring MVCの国際化対応を支える重要な要素と言えるでしょう。

LocaleResolverとInterceptorによる言語切り替え

言語をどのように判定するかは、アプリケーションの仕様によって異なります。 セッションで管理する方法、クッキーで保持する方法、 あるいはブラウザのAccept-Languageヘッダーを使う方法など、 Spring MVCでは複数の選択肢が用意されています。 それぞれの特徴を理解したうえで、用途に合ったLocaleResolverを選択することが重要です。

さらに、LocaleChangeInterceptorを使えば、 URLパラメータによって簡単に言語を切り替えられるようになります。 画面上に言語切り替えリンクを用意する場合にも非常に相性が良く、 実務でもよく使われる構成です。

まとめとしてのサンプルプログラム

ここで、国際化対応の基本構成を振り返るために、 MessageSourceとLocaleResolverを組み合わせたシンプルな設定例を確認してみましょう。 この記事内で使用してきたクラスや記述形式と同じ構成になっています。


@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource =
            new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver resolver = new SessionLocaleResolver();
    resolver.setDefaultLocale(Locale.JAPAN);
    return resolver;
}

このような設定を行っておくことで、 Spring MVCアプリケーションは自然な形で多言語対応が可能になります。 あとはメッセージファイルを追加し、画面やコントローラから呼び出すだけで、 ロケールに応じた表示を実現できます。

先生と生徒の振り返り会話

生徒

「最初は国際化って難しそうだと思っていましたが、 Spring MVCでは役割が分かれていて意外と整理しやすいですね。」

先生

「そうですね。LocaleResolverで言語を決めて、 MessageSourceでメッセージを管理するという流れを理解できれば、 国際化対応はそれほど難しくありません。」

生徒

「URLパラメータで言語を切り替えられるのも便利だと思いました。 実際のWebサイトでもよく見かけます。」

先生

「その通りです。実務ではクッキーやセッションと組み合わせて、 ユーザーにとって自然な言語切り替えを提供することが大切ですね。」

生徒

「これからSpring MVCで画面を作るときは、 最初から国際化を意識して設計してみようと思います。」

カテゴリの一覧へ
新着記事
New1
Thymeleaf
Thymeleafのth:selected属性の使い方を完全解説!初心者でもわかるセレクトボックス選択状態の指定方法
更新記事
New2
Java
JavaのBigIntegerクラスとmodメソッドを完全解説!余り計算を初心者向けにやさしく理解しよう
更新記事
New3
Java
JavaのStringクラスとstartsWithメソッドを徹底解説!初心者でもわかる文字列の判定方法
更新記事
New4
Java
JavaのLocalDateTime.compareToメソッドを完全解説!初心者でもわかる日時比較の基本
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.3
Java&Spring記事人気No3
Java
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.4
Java&Spring記事人気No4
Spring
Spring BootのMultipartFile入門:ファイルアップロード・ダウンロードの実装方法と制限設定
No.5
Java&Spring記事人気No5
Spring
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.6
Java&Spring記事人気No6
Spring
Javaの@PreAuthorizeアノテーションを完全ガイド!初心者でもわかるメソッドセキュリティ設定
No.7
Java&Spring記事人気No7
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.8
Java&Spring記事人気No8
Thymeleaf
Thymeleafのth:classappend属性の使い方を完全ガイド!初心者でもわかる動的クラス追加