スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC メッセージの国際化に対応する

今回は、バリデーションのエラーメッセージと画面項目を日本語と英語に切り替えできるよう実装してみる。

あわせてメッセージに関する過去の関連記事を紹介しておく。

■メッセージに関する過去の記事
Spring MVC メッセージリソースを使ってバリデーションエラーを定義

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.8.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.mvc-config.xml(関連箇所のみ掲載)


<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:i18n/messages"/>
</bean>

<!-- パターン1 -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptors>

<!-- パターン2(コメントアウトにより無効) -->
<!--
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptor>
</mvc:interceptors>
-->

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="ja"/>
</bean>

日本語/英語用のメッセージを用意するにあたり、「i18n」フォルダ配下に格納するようにしている。
また、日本語/英語を切り替えるためには、「org.springframework.web.servlet.i18n.LocaleChangeInterceptor」と「org.springframework.web.servlet.i18n.SessionLocaleResolver」の2つのBean定義が必要となる。それぞれのプロパティであるが、「paramName」の「lang」に渡される値については、この後の「4.footer.java」にでてくる。「defaultLocale」については「ja」を設定して、日本語をデフォルトにしている。「en」にすれば、英語がデフォルトとなる。
なお、「org.springframework.web.servlet.i18n.LocaleChangeInterceptor」のBean定義については2パターン掲載している。どちらの書き方でも動作することを確認している。

2.messages_en.properties


NotEmpty={0} is required input.
bookId=Book Id
bookName=Title
price=Price
welcome=Welcome!

英語メッセージのプロパティファイル名に「_en」を付与する。

3.messages_ja.properties


NotEmpty={0} は必須入力です
bookId=ID
bookName=タイトル
price=価格
welcome=ようこそ!!

日本語メッセージのプロパティファイル名には「_ja」を付与する。

4.footer.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<link href="<c:url value="/css/bootstrap.min.css" />" rel="stylesheet">
<link href="<c:url value="/css/bootstrap-theme.min.css" />" rel="stylesheet">
<script src="<c:url value="/js/bootstrap.min.js" />"></script>
<title>footer</title>
</head>
<body>
<spring:url value="/book" var="varHomeUrl"/>

<div class="container-fluid">
<div class="col-sm-3 text-left">
<a href="${varHomeUrl}?lang=en"><u>English</u></a>
<a href="${varHomeUrl}?lang=ja"><u>Japanese</u></a>
</div>
<div align="center">@Copyright bookmount8</div>
</div>
</body>
</html>

「spring:url」タグで「http://localhost:8080/SpringWebSample/book」までのURLを変数「varHomeUrl」に代入して、English/Japaneseの「a」タグに使用している。「1.mvc-config.xml(関連箇所のみ掲載)」に登場した「property name="paramName" value="lang"」の「lang」はここの「lang=en」「lang=ja」と紐づく。

5.newBook.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<link href="<c:url value="/css/bootstrap.min.css" />" rel="stylesheet">
<link href="<c:url value="/css/bootstrap-theme.min.css" />" rel="stylesheet">
<script src="<c:url value="/js/bootstrap.min.js" />"></script>
<title>newBook</title>
</head>
<body>
<spring:message code="bookName" var="varBookName"/>
<spring:message code="price" var="varPrice"/>

<div class="container-fluid">
<form:form
action="${pageContext.request.contextPath}/book/create"
method="post" modelAttribute="bookForm" class="well">
<div class="form-group">
<form:label path="bookName" class="control-label">${varBookName}</form:label>
<form:input path="bookName" class="form-control"/>
<p class="help-block"><font color="red"><form:errors path="bookName" /></font></p>
</div>
<div class="form-group">
<form:label path="price" class="control-label">${varPrice}</form:label>
<form:input path="price" class="form-control"/>
<p class="help-block"><font color="red"><form:errors path="price" /></font></p>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary"/>
</div>
</form:form>
</div>
</body>
</html>

「spring:message」タグを使い、「code」にプロパティファイルのキーを設定し、変数に代入している。今まで、「Book Name」「Price」と直書きしていた箇所を ${varBookName}、${varPrice} に置換して、プロパティファイルのキーに対する値を設定するように変更している。

6.動作確認
①日本語(デフォルト)

国際化_日本語

「1.mvc-config.xml(関連箇所のみ記載)」の「property name="defaultLocale" value="ja"」で設定した通り、日本語がデフォルトで表示される。

②日本語(バリデーションエラー)

国際化_日本語3

感心したのがこちら。日本語のエラーメッセージは「{0} は必須入力です」と{0}に値をバインドするようになっている。通常であれば、「5.newBook.java」を見ていただくと分かるのだが、タイトルに該当するフィールド名は「bookName」であり、「bookNameは必須入力です」と表示されるはずである。しかし、今回国際化対応でプロパティファイルに「bookName=タイトル」と定義している。そのため、生成されるエラーメッセージが「タイトルは必須入力です」と表示される。英語の場合も「bookName is required input.」ではなく「Title is required input.」と表示される。なので、項目の場合はフィールド名と同じにしておくと、メッセージの組み立てがしやすくなるメリットが生じる。

③英語(「English」リンクを押下)

国際化_英語

④日本語(「Japanese」リンクを押下)
国際化_日本語2

③④についてはURLのクエリ文字列に「?lang=en」「?lang=ja」が付与されていることが分かる。

今回の国際化対応で、プロパティファイルのキー設定の重要性を認識することができた。


■過去のSpring関連記事
Spring関連記事 Index

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。