默认情况下,SpringMVC根据Accept-Language请求头参数判断客户端的本地区域类型。当接受到请求时,SpringMVC会在请求上下文中查找一个本地化解析器(LocalResolver) ,找到后使用它获取请求所对应的本地化类型信息。
SpringMVC还允许装配一个动态更改本地化类型的拦截器LocaleChangeInterceptor,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
Spring架构的大多数部分都支持国际化,就像Spring MVC框架一样。DispatcherServlet允许您使用客户端的区域设置自动解析消息。这是通过LocaleResolver对象完成的。
当请求传入时,DispatcherServlet会查找区域设置解析程序,如果找到了,它会尝试使用它来设置区域设置。通过使用RequestContext.getLocale()方法,可以检索由区域设置解析程序解析的区域设置。
【1】基础介绍
① 什么是国际化
- 在页面上能够根据浏览器语言设置的情况对文本(不是内容), 时间, 数值进行本地化处理
- 可以在 bean 中获取国际化资源文件 Locale 对应的消息
- 可以通过超链接切换 Locale, 而不再依赖于浏览器的语言设置情况
如何实现?
- 使用 JSTL 的 fmt 标签
- 在 bean 中注入
ResourceBundleMessageSource
的示例, 使用其对应的getMessage
方法即可 - 配置
LocalResolver
和LocaleChangeInterceptor
② fmt标签
页面使用标签如下所示(记得引入fmt标签):
/*设置依赖的资源化文件baseName--i18n*/ <fmt:bundle basename="i18n"> <fmt:message key="date"></fmt:message>: <fmt:formatDate value="${date }"/>, <fmt:message key="salary"></fmt:message>: <fmt:formatNumber value="${salary }"></fmt:formatNumber> </fmt:bundle> ...
③ 注入bean
springMVC.xml配置ResourceBundleMessageSource
<!-- 配置国际化资源文件 解析i18n.properties--> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean>
配置 LocalResolver 和 LocaleChangeInterceptor
<!-- 配置 SessionLocalResolver 作用于切换请求连接时,显示不同的语言风格 ; 可使i18n属性其作为对象存储在session--> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors>
其工作原理如下图所示:
通过将LocaleChangeInterceptor添加到某个HandlerMapping实例中,可以启用区域设置更改。它检测请求中的一个参数并相应地更改区域设置(在dispatcher的应用程序上下文中调用LocaleResolver上的setLocale方法)。下一个示例显示,对包含名为siteLanguage的参数的所有*.view资源的调用现在会更改区域设置。例如,请求URL为https://www.sf.net/home.view?siteLanguage=nl,将站点语言更改为荷兰语。以下示例显示了如何拦截区域设置:
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="siteLanguage"/> </bean> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="localeChangeInterceptor"/> </list> </property> <property name="mappings"> <value>/**/*.view=someController</value> </property> </bean>
配置
<!-- mvc:view-controller可使其直接访问路径 --> <mvc:view-controller path="/i18n" view-name="i18n"/> <mvc:view-controller path="/i18n2" view-name="i18n2"/>
④ 测试实例
页面测试代码
三个i18n.properties,不再说明
<fmt:message key="i18n.user"></fmt:message> <a href="i18n2">I18N2 PAGE</a> <!--通过url,切换Local--> <a href="i18n?locale=zh_CH">中文</a> <a href="i18n?locale=en_US">英文</a>
后台测试代码
@Autowired private ResourceBundleMessageSource messageSource; @RequestMapping("/i18n") public String testI18n(Locale locale){ //使用messageSource 获取资源国际化文件中key在locale下的值 String val = messageSource.getMessage("i18n.user", null, locale); System.out.println(val); return "i18n"; }
【2】资源国际化实例
① 实现类配置
SpringMVC进行资源国际化主要是通过ResourceBundleMessageSource
实现的,xml如下配置:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean>
② 国际化资源文件
资源文件i18n.properties
i18n.username=Username i18n.password=Password
i18n_zh_CN.properties:
i18n.username=\u7528\u6237\u540D(用户名) i18n.password=\u5BC6\u7801(密码)
i18n_en_US.properties:
i18n.username=Username i18n.password=Password
③ 测试示例
测试页面
<!-- 加载的为i18n_zh_CN.properties 与语言无关 --> <fmt:bundle basename="i18n_zh_CN" prefix="i18n."> <fmt:message key="username"></fmt:message> </fmt:bundle> <!-- 资源国际化 --> <br><br> <fmt:message key="i18n.username"></fmt:message> <br><br> <fmt:message key="i18n.password" ></fmt:message> <br><br>
result:当语言为en时,将为英文;当语言为zh时,将为中文。
注意:以下无论语言为何,均显示用户名-加载的为i18n_zh_CN.properties 与语言无关
<fmt:bundle basename="i18n_zh_CN" prefix="i18n."> <fmt:message key="username"></fmt:message> </fmt:bundle>
点击查看Java资源国际化处理:Java资源国际化