springMVC的国际化:
1 如何定义资源化文件:基名+语言名
2 使用拦截器处理国际化的流程
使用拦截器拦截设置语言的请求
LocaleChangeInterceptor只对Action执行之前做拦截
也就是执行LocaleChangeInterceptor的preHandle()
在这个方法中收集locale的参数值(参数名一定要是locale,不能改变)
找到localeResolver标识的对象,将locale这个参数的参数值
设置到用户对应的session上
交给请求处理器处理 - 后端处理器 - handleRequest()
核心代码实现:
请求:
<a href="chinese.do?locale=zh_CN">简体中文</a>
<a href="us.do?locale=en_US">美式英文</a>
Spmvc-context.servlet文件:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/chinese.do"/>
<mvc:mapping path="/us.do"/>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/> </mvc:interceptor>
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
applicationContext.xml文件:
<!-- 定义国际化消息 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
3 Spring的国际化标签<spring:message code=""/>标签使用的流程:
举例:<spring:message code="loginSuccess"/>
找到用户的session
到session找SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME属性,默认这个属性是没有属性值的,因为没有对它进行人为设置。
处理方式是使用浏览器语言信息(一般是zh_CN),将浏览器的语言信息设置到SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME属性上。
再从session取出刚刚设置的语言信息,即SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME的属性值。
到Bean工厂中找出messageSource标识的对象。
取出这个对象的basename属性的属性值message
根据基名和语言信息定位到国际化资源文件
找到spring标签中code="loginSuccess"的值,最后输出。
注意三个标识不能变:
1. 不能改变语言请求的参数
<a href="chinese.do?locale=zh_CN">简体中文</a>
<a href="us.do?locale=en_US">美式英文</a>
2 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>,其中的 id="localeResolver"不能改变。
注意:源码SessionLocaleResolver类中有LOCALE_SESSION_ATTRIBUTE_NAME属性;
LocaleResolver是一个接口。
localeResolver.setLocale(request, response, (Locale) localeEditor.getValue());设置到session中
3 application-context.xml中
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
id="messageSource" 不能改变