Spring MVCで国際化を実現!LocaleResolverとMessageSourceの基本設定と使い方
生徒
「Springで多言語対応のWebアプリを作りたいんですが、どうやって言語を切り替えるんですか?」
先生
「Spring MVCではLocaleResolverとMessageSourceを使えば、言語や地域(ロケール)に応じたメッセージ表示ができますよ。」
生徒
「つまり、ユーザーのブラウザ設定に応じて、英語や日本語を切り替えられるってことですか?」
先生
「その通りです!では、国際化のための設定と使い方を順番に見ていきましょう。」
1. Spring MVCでの国際化(i18n)とは
Spring MVCでは、アプリケーションの国際化(i18n)をサポートしており、ユーザーのロケールに応じた言語メッセージを表示することができます。この機能を使えば、英語や日本語などの言語を簡単に切り替えることができます。
ロケールの判定や切り替えはLocaleResolverで行い、実際の翻訳文はMessageSourceによって管理されます。
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)
Spring Bootでは、プロパティファイルの読み込みはMessageSourceで行われます。以下のようにapplication.propertiesに設定します。
spring.messages.basename=messages
spring.messages.encoding=UTF-8
複数のメッセージファイルを読み込む場合はカンマ区切りで指定できます。
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の選択
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
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でのメッセージ表示
コントローラでメッセージを表示する場合は、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に自動対応させる方法
ユーザーが言語を選ばずとも、ブラウザの設定でロケールを判定したい場合は、AcceptHeaderLocaleResolverを使います。
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
resolver.setDefaultLocale(Locale.JAPAN);
return resolver;
}
この設定では、HTTPヘッダーのAccept-Languageを元に、自動で適切な言語が選ばれます。
9. よくある間違いと注意点
- メッセージファイルのエンコーディングがUTF-8になっていない
- プロパティファイルの拡張子が間違っている(
.properties) - メッセージキーが一致していない
- LocaleResolverが正しく登録されていない
これらを防ぐために、開発初期の段階で一度画面に表示できるか試しておくのがおすすめです。
まとめ
Spring MVCにおける国際化対応の全体像を振り返る
この記事では、Spring MVCを使ったWebアプリケーションで国際化を実現するための基本的な仕組みとして、
LocaleResolverとMessageSourceの役割や設定方法について学んできました。
国際化対応、いわゆる多言語対応は、国内向けのシステムだけでなく、
将来的に海外ユーザーを想定する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で画面を作るときは、 最初から国際化を意識して設計してみようと思います。」