默认情况下,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可使其直接访问路径 -->
<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资源国际化