这个部分,讨论Spring3.0 MVC的国际化(I18N)和本地化(L10N)。
什么是i18n和L10n?
国际化和本地化意味着调试软件适应不同语言和地区。国际化是设计软件应用的过程,这样应用才能被适用于不同语言和地区,不需要做更改。本地化是添加地区特定的组件和翻译文本,使得国际化软件适合特定地区或语言。
i18n是Internation首字母和尾字母的组成,字母长度组成的。
目标
我们的目标是添加国际化和本地化支持到Spring MVC应用中。一旦应用完成之后,应用的运行应该如下所示:
添加两种语言的支持:英语和德语。决定于用户浏览器的本地设置,将会选择合适的语言。用户也能从应用的右上角选择语言。
消息资源文件
创建两个属性文件,包含了要显示在web中的所有消息。这些文件保存在“resources”源文件中。项目中创建一个源文件夹,右击项目名称>New>Source Folder,然后命名为resources。
文件夹中创建两个文件messages_en.properties和messages_de.properties。拷贝下面内容到文件中。
resources/messages_en.properties
<br />label.firstname=First Name<br />label.lastname=Last Name<br />label.email=Email<br />label.telephone=Telephone<br />label.addcontact=Add Contact </p><p>label.menu=Menu<br />label.title=Contact Manager </p><p>label.footer=&copy; ViralPatel.net<br />
resources/messages_de.properties
<br />label.firstname=Vorname<br />label.lastname=Familiename<br />label.email=Email<br />label.telephone=Telefon<br />label.addcontact=Addieren Kontakt </p><p>label.title=Kontakt Manager<br />label.menu=Men&#252; </p><p>label.footer=&copy; ViralPatel.net<br />
配置Spring MVC中的国际化和本地化
已经创建了应用的消息资源属性。需要在spring配置文件中声明这些文件。使用类org.springframework.context.support.ReloadableResourceBundleMessageSource,定义消息资源。
另外,提供一个功能能让用户选择应用的语言。这通过
org.springframework.web.servlet.i18n.LocaleChangeInterceptor类实现。LocaleChangeInterceptor类将会截取所有locale中的任何变化。这些变换将会保存到cookie中,以被将来请求。org.springframework.web.servlet.i18n.CookieLocaleResolver类将被用于在cookie中保存本地化信息。
添加下面代码到spring-servlet.xml文件中
WebContent/WEB-INF/spring-servlet.xml
<br /><bean id="messageSource"<br /> class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> </p><property name="basename" value="classpath:messages" /><property name="defaultEncoding" value="UTF-8"/></bean> </p><p><bean id="localeChangeInterceptor"<br /> class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> </p><property name="paramName" value="lang" /></bean> </p><p><bean id="localeResolver"<br /> class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> </p><property name="defaultLocale" value="en"/></bean> </p><p><bean id="handlerMapping"<br /> class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> </p><property name="interceptors"> <ref bean="localeChangeInterceptor" /> </property>
注意到,上面的配置中,定义了basename属性,值为classpath:messages。这样,就能使用应用中定义的消息资源。
修改视图-JSP
已经创建了两个消息资源文件,并在Spring MVC中配置,我将在JSP文件中使用这些消息。打开所有的JSP文件,更新如下代码。
WebContent/WEB-INF/jsp/head.jsp
<br /><%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> </p><h3><spring:message code="label.title"/></h3><p><span style="float: right"><br /> <a href="?lang=en">en</a><br /> |<br /> <a href="?lang=de">de</a><br /></span><br />
WebContent/WEB-INF/jsp/menu.jsp
<br /><%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> </p><p><spring:message code="label.menu"/></p><p>
WebContent/WEB-INF/jsp/menu.jsp
<br /><%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> </p><p><spring:message code="label.menu"/></p><p>
WebConteng/WEB-INF/jsp/footer.jsp
<br />?</p><p> <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%> </p><p><spring:message code="label.footer"/><br />
WebContent/WEB-INF/jsp/contact.jsp
<br /><%@taglib uri="http://www.springframework.org/tags" prefix="spring"%><br /><%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%><br /><html><br /><head> </p><p></head><br /><body> </p><form:form method="post" action="addContact.html"><table><tr><td><form:label path="firstname"><spring:message code="label.firstname"/></form:label></td><td><form:input path="firstname" /></td></tr><tr><td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td><td><form:input path="lastname" /></td></tr><tr><td><form:label path="lastname"><spring:message code="label.email"/></form:label></td><td><form:input path="email" /></td></tr><tr><td><form:label path="lastname"><spring:message code="label.telephone"/></form:label></td><td><form:input path="telephone" /></td></tr><tr><td colspan="2"><input type="submit" value="<spring:message code="label.addcontact"/>&#8220;/> </td></tr></table></form:form></body><br />
上面JSP文件中,使用了标签显示了从资源绑定中的消息。
另一件事,是在header.jsp文件中,指定了两个链接,选择语言。链接设置了请求参数“?lang=”,当用户点击这个链接时,Spring通过LocaleChangeInterceptor识别这个参数,相应地更改了本地信息。spring-servlet.xml文件中配置LocaleChangeInterceptor,指定了属性“paramName”,值为“lang”。
</p><property name="paramName" value="lang" />
因此Spring框架将会从请求中查找名称为“lang”的参数。
完成
添加了国际化和本地化支持之后,执行项目,快捷键Alt+Shift+X,R。
下一步
展示如何添加国际化i18n和本地化L10n。使用了LocaleChangeInterceptor截取本地的改变,并ReloadableResourceBundleMessageSource类添加消息资源到属性中。下一步讨论Spring MVC的主题,如何实施。