|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
区域设置
Spring架构的大部分支持国际化,就像Spring Web MVC框架一样。DispatcherServlet允许你通过使用客户端的区域设置自动解析消息。这是通过LocaleResolver对象完成的。
当一个请求到来时,DispatcherServlet 会查找一个区域设置解析器,并且如果找到的话,它会尝试使用它来设置区域设置。通过使用 RequestContext.getLocale() 方法,你可以始终检索由区域设置解析器解析的区域设置。
除了自动本地化解析外,你还可以将拦截器附加到处理器映射(有关处理器映射拦截器的更多信息,请参见拦截)以在特定情况下更改本地化(例如,基于请求中的参数)。
Locale resolvers 和 interceptors 在
org.springframework.web.servlet.i18n 包中定义,并以正常方式在您的应用程序上下文中配置。以下是一些包含在 Spring 中的 locale resolver 选择。
时区
除了获取客户端的区域设置,通常还希望知道其时区。LocaleContextResolver接口提供了一个扩展到LocaleResolver的方法,允许解析器提供更丰富的LocaleContext,其中可能包含时区信息。
当可用时,可以通过使用RequestContext.getTimeZone()方法获取用户的TimeZone。时区信息会自动用于任何已注册到Spring的ConversionService中的Date/TimeConverter和Formatter对象。
Cookie 解析器
此本地化解析器检查客户端上可能存在的Cookie,以查看是否指定了Locale或TimeZone。如果指定了,则使用指定的详细信息。通过使用此本地化解析器的属性,您可以指定cookie的名称以及最大年龄。以下示例定义了一个CookieLocaleResolver:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000"/>
</bean>
以下表格描述了属性CookieLocaleResolver:
| 属性 | 默认 | 描述 |
|---|---|---|
|
classname + LOCALE |
cookie的名称 |
|
Servlet 容器默认 |
Cookie 在客户端的最大持久时间。如果指定 |
|
/ |
限制cookie在您站点特定部分的可见性。当指定 |
会话解析器
The SessionLocaleResolver 让你从可能与用户请求相关的会话中检索 Locale 和 TimeZone。与 CookieLocaleResolver 不同,这种策略将本地化设置存储在 Servlet 容器的 HttpSession 中。因此,这些设置对每个会话都是临时的,并且在每个会话结束时丢失。
请注意,这里没有与外部会话管理机制的直接关系,
例如Spring Session项目。这个SessionLocaleResolver评估并
修改与当前HttpServletRequest对应的HttpSession属性。
本地化拦截器
您可以通过在其中一个HandlerMapping定义中添加LocaleChangeInterceptor来启用更改区域设置。它检测请求中的参数并相应地更改区域设置,调用dispatcher的应用上下文中的LocaleResolver的setLocale方法。下一个示例显示,所有包含名为siteLanguage参数的*.view资源的调用现在都会更改区域设置。因此,例如,对URL的请求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>