Spring の MessageSource
を使って、メッセージをプロパティファイルから取得する方法を書いていきます。
バージョン
- SpringBoot 2.7.5
目次
- プロパティファイルの作成
- Java コードの作成
- 動作確認
- 国際化・多言語対応
- 複数のプロパティファイルに対応
1. プロパティファイルの作成
プロジェクトのリソースフォルダに、messages.properties
を UTF-8 で作成します。
src/main/resources/messages.properties
hello=こんにちは、{0}さん。
{0}
はプレースホルダで、動的に設定する値を、数字の 0
から順番に指定できます。
2. Java コードの作成
メッセージを取得したいクラスに、MessageSource
のフィールドを定義して、@Autowired
で DI します。
@RestController public class MsgController { @Autowired MessageSource messages; @GetMapping("/msg") public Map<String, String> msg(@RequestParam String name) { String msg = messages.getMessage( "hello", new String[]{name}, Locale.JAPAN ); return Collections.singletonMap("msg", msg); } }
それから、MessageSource#getMessage
に以下の引数を渡して、メッセージを取得します。
- メッセージのキー
- 動的に設定する値
- ロケール
動的に設定する値がない場合は、第2引数に null
を指定します。
3. 動作確認
アプリを起動して以下の URL にアクセスすると、
http://localhost:8080/msg?name=トム
下の JSON が返ってきます。
{"msg":"こんにちは、トムさん。"}
4. 国際化・多言語対応
複数の言語に対応したメッセージを取得する方法を書いていきます。
4.1. プロパティファイルの作成
言語に応じたプロパティファイルを作成します。
例えば、日本語用のファイルと、
src/main/resources/messages_ja.properties
hello=こんにちは、{0}さん。
英語用のファイルを用意します。
src/main/resources/messages_en.properties
hello=Hello, {0}.
ファイル名の _ja
, _en
で区別されます。
4.1. Java コードの作成
コントローラーの場合は、メソッドの引数に Locale
を定義すると、Spring Boot が要求元のロケールを渡してくれます。
@RestController public class MsgController { @Autowired MessageSource messages; @GetMapping("/msg") public Map<String, String> msg( @RequestParam String name, Locale locale ) { String msg = messages.getMessage( "hello", new String[]{name}, locale ); return Collections.singletonMap("msg", msg); } }
これで、クライアントの言語(ブラウザ設定の言語)に対応するメッセージが取得できます。
5. 複数のプロパティファイルに対応
複数のプロパティファイルからメッセージを取得したい場合は、以下の設定ファイルで指定します。
src/main/resources/application.properties
spring.messages.basename=messages1, messages2
カンマ区切りで、ファイルのベース名を設定します。