Locale
Infra 架构的大部分都支持国际化,Infra Web MVC 框架也是如此。MockDispatcherHandler 让您可以使用客户端的区域设置自动解析消息。
这是通过 LocaleResolver 对象完成的。
当请求进来时,MockDispatcherHandler 会寻找一个区域设置解析器,如果找到,它会尝试使用它来设置区域设置。
通过使用 RequestContext.getLocale() 方法,您始终可以检索由区域设置解析器解析的区域设置。
除了自动区域设置解析之外,您还可以将拦截器附加到处理程序映射 (有关处理程序映射拦截器的更多信息,请参阅 拦截) 以在特定情况下(例如,根据请求中的参数)更改区域设置。
区域设置解析器和拦截器定义在 infra.web.i18n 包中,并以常规方式在您的应用程序上下文中配置。
Infra 中包含以下区域设置解析器选择。
时区
除了获取客户端的区域设置外,了解其时区通常很有用。LocaleContextResolver 接口提供了对 LocaleResolver
的扩展,让解析器提供更丰富的 LocaleContext,其中可能包括时区信息。
如果可用,可以使用 RequestContext.getTimeZone() 方法获取用户的 TimeZone。
任何向 Infra ConversionService 注册的日期/时间 Converter 和 Formatter 对象都会自动使用时区信息。
Header 解析器
此区域设置解析器检查客户端(例如,Web 浏览器)发送的请求中的 accept-language 头。
通常,此头字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。
Cookie 解析器
此区域设置解析器检查客户端上可能存在的 Cookie,以查看是否指定了 Locale 或 TimeZone。
如果是,它将使用指定的详细信息。通过使用此区域设置解析器的属性,您可以指定 cookie 的名称以及最大寿命。
以下示例定义了一个 CookieLocaleResolver:
<bean id="localeResolver" class="infra.web.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 的属性:
| 属性 | 默认值 | 描述 |
|---|---|---|
|
类名 + LOCALE |
cookie 的名称 |
|
Servlet 容器默认值 |
cookie 在客户端上持续存在的最大时间。如果指定了 |
|
/ |
将 cookie 的可见性限制为您网站的特定部分。当指定 |
Session 解析器
SessionLocaleResolver 允许您从可能与用户请求关联的会话中检索 Locale 和 TimeZone。
与 CookieLocaleResolver 相比,此策略将本地选择的区域设置存储在 Servlet 容器的 HttpSession 中。
因此,这些设置对于每个会话都是临时的,因此在每个会话结束时会丢失。
请注意,与外部会话管理机制(如 Infra Session 项目)没有直接关系。
此 SessionLocaleResolver 针对当前 HttpMockRequest 评估和修改相应的 HttpSession 属性。
Locale 拦截器
您可以通过将 LocaleChangeInterceptor 添加到 HandlerMapping 定义之一来启用区域设置更改。
它检测请求中的参数并相应地更改区域设置,在调度程序的应用程序上下文中的 LocaleResolver 上调用 setLocale 方法。
下一个示例显示,对包含名为 siteLanguage 参数的所有 *.view 资源的调用现在会更改区域设置。
因此,例如,对 URL www.sf.net/home.view?siteLanguage=nl 的请求会将站点语言更改为荷兰语。
以下示例显示了如何拦截区域设置:
<bean id="localeChangeInterceptor"
class="infra.web.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
class="infra.web.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
class="infra.web.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>