[spring mvc]MessageSourceを使ったページの国際化


ブラウザの言語にあわせてメッセージや表示内容を日本語や英語に切り替える機構を組み込みます



springのMessageSourceを使うと、ロケールにあわせてメッセージリソース(propertiesファイル)を切り替えられます
propertiesファイルを言語毎に用意(messages_ja.properties / messages_en.propertiesなど)することにより、
ロケールに応じてspringが読み込むpropertiesファイルを自動で決定してくれます

設定

spring設定ファイルにMessageSourceを利用する為の設定を追記します

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 :   :
 :   :
  <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basename" value="/WEB-INF/messages/messages" />
    <beans:property name="cacheSeconds" value="0" />
  </beans:bean>
 :   :
 :   :
</beans:beans>

propertiesファイルの用意

ロケール毎のファイルを設定ファイルに定義した位置(/WEB-INF/messages/)に作成します
ここでは日本語用と英語用の2種類を用意します
ファイル名は設定ファイルで定義した「messages」で始まるファイル
・messages_ja.properties
・messages_en.properties
となります
※「messages」で始まっていれば良いので、例えば「 messages-label_ja.properties」とかでも問題ないです

/WEB-INF/messages/messages_ja.properties

# title
H1.TITLE=\u3053\u3093\u306b\u3061\u306f\u4e16\u754c

※propertiesファイルなのでnative2asciiした内容となっています。実際の値は「H1.TITLE=こんにちは世界」です

/WEB-INF/messages/messages_en.properties

# title
H1.TITLE=Hello, world!

コントローラ・JSPの用意

MessageSourceを使う為の準備はできましたので、コントローラとJSPで実際に値を取得してみます

コントローラ(抜粋)

メッセージソースから値を取得するところに関連するコードです

Public class XXXXX {
  @Autowired
  private MessageSource messageSource;

  @RequestMapping(value = {"/test1/"}, method = RequestMethod.GET)
  public String home(Locale locale, Model model, HttpServletRequest request) {
    String message = messageSource.getMessage("H1.TITLE", null, locale);
    model.addAttribute("title", message);
    return "Hello";
  }
}

JSP

hello.jspの内容です

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" trimDirectiveWhitespaces="true" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ page session="false" %>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Home</title>
</head>
<body>
<h1 class="title">Hello, world!</h1>
<h1 class="title"><fmt:message key="H1.TITLE"/></h1>  <!-- JSTLの場合 -->
<h1 class="title"><spring:message code="H1.TITLE"/></h1>  <!-- spring tag -->
<h1 class="title">${title}</h1>  <!-- Java側(Controller)にて取得 -->

</body>
</html>

実行すると、日本語ロケール(ja)の場合「こんにちは世界」と表示され、英語ロケール(enの)場合「Hello, world!」と表示されます。

JSTLを使った場合と spring tagを使った例を記述していますが、どちらも結果は同じです
お好きな方をどうぞ