最近应国际部邀请,对Portal进行国际化,因泰国、马来西亚等好几个国家之某部对Portal产生了浓厚的兴趣。今天呢,我将这几天所学、所做总结一下。
Portal主要使用的是SpringMVC+MyBatis,其他的不做说明。主要说国际化部分。
一、国际化背景说明
面向全球化时代,需要在不同语言的国家和地区部署应用系统,这就是国际化的前提。
i18n:是国际化的缩写,那具有什么意义呢,因为internationalization太长了,编程不方便,不美观也不好记,所以以首字母i和结尾子母n,以及中间有18个子母缩写成了i18n。
l10n:是本地化的缩写,全拼为localization,原理同国际化。
二、SpringMVC国际化
1、SpringMVC国际化首先需要需要形成一个属性文件。然后选择和读取特定于用户语言区域的属性即可,而选择和读取就要依托于java.util.ResourceBundle类了。
ResourceBundle是一个抽象类。为了让ResourceBundle正确地选择属性文件,这个文件名必须有一定格式,即必须包含一个基准名,后面再接下划线、语言码,还可以再加一条下划线和国家码。如:Resources_en_US.properties
注意:前面的基准名是任意的,就是说可以自己取,比如说messages,但后面的就不能那么随意了,因为ResourceBundle会根据后面的内容去寻找属性文件。
2、SpringMVC中不直接使用BesourceBundle,而是在messageSource这个bean中定义了ReloadableResourceBundleMessageSource类作为实现类来实现的。配置如下:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8" />
<property name="useCodeAsDefaultMessage" value="true" />
<property name="basenames">
<list>
<value>i18n/messages</value>
</list>
</property>
</bean>
当然,这是我写的配置,你还可以在这其中配置其他属性。
这里有必要指出来的是,另外一个实现类和这里的ReloadableResourceBundleMessageSource具有相同的作用,叫ResourceBundleMessageSource。但是它俩又有所不同,不同之处在于:ReloadableResourceBundleMessageSource是在应用程序目录下搜索属性文件。而使用ResourceBundleMessageSource时,属性文件则必须放在类路径下,即WEB-INF/class目录下。
3、在配置过程中,你还需要告诉SpringMVC使用哪个语言区域,如下是我的配置:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
这里我是用的是SessionLocaleResolver。当然还有AcceptHeaderLocaleResolver和CookieLocaleResolver。其中AcceptHeaderLocaleResolver为最基础的一个,表示
通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,
因为它无法修改用户操作系统的区域设置。
而SessionLocaleResolver和CookieLocaleResolver都会先去Session或者Cookie中寻找,若不存在,则根据浏览器选择语言来显示。
4、SpringMVC标签的使用
经常使用的是message和code、以及var标签,不过使用之前,要在JSP页面前面声明下面的taglib指令。
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
所有标签列举如下:(此图片来自于Spring MVC学习指南)
三、建议
在开发过程中,若有中文属性文件,则先不要将中文转换为Unicode,方便之后开发中重复使用,在开发完成发版本时,再转换为Unicode即可。