Spring MVC 本地化解析器
默认情况下,Spring MVC 会根据客户端的请求头的 Accept-Language 参数判断客户段的本地化类型,此外 Spring MVC 还提供了多种指定客户端本地化类型的方式,如通过 Cookie、Session 、请求URL参数等;
Spring MVC 本地化解析器和拦截器都定义在 org.springframework.web.servlet.i18n 包中,可以在 DispatcherServlet 上文中配置他们;
Spring 提供了以下4个本地化解析器:
- AcceptHeaderLocaleResolver:根据 HTTP 报文头的 Accept-Language 参数确定本地化类型,为默认本地化解析器;
- CookieLocaleResolver:根据指定的 Cookie 值确定本地化类型;
- SessionLocaleResolver:根据指定的 Session 值确定本地化类型;
- LocaleChangeInterceptor:从请求中获取本次请求对应的本地化类型;
以上4个解析器中,在默认没有配置本地化解析器的情况下,Spring 会自动注册一个
AcceptHeaderLocaleResolver 解析器;
CookieLocaleResolver
使用Cookie保存本地化信息,只需要在 spring-mvc 配置文件中配置一个 CookieLocaleResolver 即可,DispatcheServlet 会自动识别本地化解析器并装配它:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
p:cookieName="clientLanguage"
p:cookieMaxAge="100000"
p:cookiePath="/"
p:defaultLocale="zh_CN"/>
SessionLocaleResolver
SessionLocaleResolver 会查找 Session 中属性名为
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME 的属性,并将其转换为 Locale 对象,以此作为客户端的本地化类型;
使用该本地化解析器,只需要将 SessionLocaleResolver 的配置添加到 spring-mvc 的配置文件中即可:
<bean id="lcoaleResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
SessionLocaleResolver 和 CookieLocaleResolver 的区别在于,前者一般要求用户登陆后生产相应的用户会话才会有效,后者只要浏览器存在相应的 cooike 即可生效;
LocaleChangeInterceptor
很多国际型的网站都可以通过一个请求参数控制网站的国际化,如:”www.xxxx.com?lcoale=zh_CN“,”
www.xxxx.com?lcoale=en_US“,可以使用
LocaleChangeInterceptor 解析器来实现;
在 spring-mvc 配置文件中配置该解析器如下:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
p:cookieName="clientLanguage"
p:cookieMaxAge="100000"
p:cookiePath="/"
p:defaultLocale="zh_CN"/>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
由于 LocaleChangeInterceptor 主要是请求中获取本地化参数并设置给真正的本地化解析器,所以在配置
LocaleChangeInterceptor 之前,必须先配置一个本地化解析器,该解析器只能为 CookieLocaleResolver 或 SessionLocaleResolver (AcceptHeaderLocaleResolver 无法被动态更改本地化信息,所以不能使用);