Spring MVC 国際化対応

を、以下のサイトを参考に行う。・・・も、若干手こずったので手順をメモしておく。

プロパティファイルを作成し、WEB-INF/i18n フォルダに置く

message_[言語].properties ファイルを作成

  • messages_en.properties
  • messages_ja.properties

英語用 WEB-INF/i18n/messages_en.properties

label.firstname=First Name

日本語用 WEB-INF/i18n/messages_ja.properties

日本語などASCII文字以外を含む場合、native2ascii でユニコードに変換する

label.firstname=\u540d\u524d

Spring 設定ファイルの作成

国際化対応用の設定ファイルを作成 i18n.xml

Spring MVC 3.05 で確認していたのだが、上記サイトなどを参考にして試行錯誤の後に動くようになった設定。

  • DefaultAnnotationHandlerMapping と mvc:annotation-dricen にコンフリクトの問題があるようだ
  • mvc:annotation-driven の記述が必要
  • locationChangeInterceptor の paramName で言語切り替えのパラメータを指定(デフォルトは locale) ?lang=ja 等を付加して切り替え
  • messageSource の basename でメッセージプロパティファイルのパターンを指定
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd    
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <mvc:annotation-driven/> 
    <mvc:interceptors> 
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang" />
        </bean>
    </mvc:interceptors>    
    
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="WEB-INF/i18n/messages"/>
        <property name="defaultEncoding" value="UTF-8" />        
    </bean>
    
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
        <property name="cookieName" value="locale" />
    </bean>
</beans>

国際化対応用設定をインポートする root-context.xml

上記の設定を、root-context.xml(web.xml にて、DispatcherServlet の contextConfigLocation に指定されている設定ファイル) からインポートする。

<import resource="i18n.xml"/>

タグライブラリが見つからないエラーとなる場合

実行すると、タグライブラリが見つからない旨のエラーとなった(本来はクラスパスの TLDを自動で認識してくれるはずなのかな?) が、以下の手順で明示的に見つかる場所においてあげることで回避。(クラスローダが異なるのが問題っぽい)

org.springframework.web.servlet を含むJARを展開すると、 /META-INF/spring.tld  が存在するので、/WEB-INF へコピーしておき、web.xml に以下の記述を追加する。

jsp-config の記述を忘れないように。

<web-app>
     :
    <jsp-config>
        <taglib>
            <taglib-uri>http://www.springframework.org/tags</taglib-uri>
            <taglib-location>/WEB-INF/spring.tld</taglib-location>
        </taglib>
    </jsp-config>

JSPからの利用方法

タグライブラリの宣言をファイル先頭で行う

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

JSPで出力する

<spring:message code="label.firstname"/>

JSPで変数に設定(JSTL の c:set  EL式や、JSTLから利用できるように)

<spring:message code="label.firstname" var="firstname" scope="page"/>

とすると

${firstname}

で利用できる。

ブラウザの言語を変更する

ちなみに、IEの言語を設定するには、インターネットオプションから、言語を選択する

spring_i18n01

この本は、非常にわかりやすくて良かったけど、国際化対応の記述は

なかったなー

 

SpringによるWebアプリケーションスーパーサンプル 第2版

英語だけど、Spring Security 周りの記述がわかりやすい。しかも電子書籍が無料でダウンロードできる権利付きでお得。

Spring in Action

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です