跳到主要内容
版本:6.2.3

地区

ChatGPT-4o-mini 中英对照 Locale

Spring 架构的大部分部分都支持国际化,Spring web MVC 框架也是如此。 DispatcherServlet 允许您通过使用客户端的区域设置自动解析消息。这是通过 LocaleResolver 对象完成的。

当请求到达时,DispatcherServlet 会查找一个区域解析器,如果找到一个,它会尝试使用它来设置区域。通过使用 RequestContext.getLocale() 方法,您可以始终获取由区域解析器解析的区域。

除了自动区域设置解析,您还可以将拦截器附加到处理程序映射(有关处理程序映射拦截器的更多信息,请参见 Interception)以在特定情况下更改区域设置(例如,基于请求中的参数)。

区域解析器和拦截器在 org.springframework.web.servlet.i18n 包中定义,并以正常方式在您的应用程序上下文中配置。以下是 Spring 中包含的一些区域解析器的选择。

时区​

除了获取客户端的区域设置,了解其时区通常也很有用。LocaleContextResolver 接口为 LocaleResolver 提供了一个扩展,允许解析器提供更丰富的 LocaleContext,其中可能包括时区信息。

当可用时,用户的 TimeZone 可以通过使用 RequestContext.getTimeZone() 方法获取。时区信息会被自动用于任何与 Spring 的 ConversionService 注册的日期/时间 Converter 和 Formatter 对象。

Header Resolver​

此区域解析器检查客户端发送的请求中的 accept-language 头(例如,网页浏览器)。通常,此头字段包含客户端操作系统的区域设置。请注意,此解析器不支持时区信息。

这个区域解析器检查客户端上可能存在的 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 的属性:

表 1. CookieLocaleResolver 属性

属性默认值描述
cookieName类名 + LOCALEcookie 的名称
cookieMaxAgeServlet 容器默认值cookie 在客户端的最大存活时间。如果指定 -1,则 cookie 不会被持久化。它仅在客户端关闭浏览器之前可用。
cookiePath/限制 cookie 在您网站某个部分的可见性。当指定 cookiePath 时,cookie 仅对该路径及其以下路径可见。

Session Resolver​

SessionLocaleResolver 允许您从可能与用户请求相关联的会话中检索 Locale 和 TimeZone。与 CookieLocaleResolver 相比,这种策略将本地选择的区域设置存储在 Servlet 容器的 HttpSession 中。因此,这些设置对每个会话都是临时的,因此在每个会话结束时会丢失。

请注意,它与外部会话管理机制(例如 Spring Session 项目)没有直接关系。这个 SessionLocaleResolver 会根据当前的 HttpServletRequest 评估和修改相应的 HttpSession 属性。

Locale Interceptor​

您可以通过将 LocaleChangeInterceptor 添加到其中一个 HandlerMapping 定义中来启用更改区域设置。它会检测请求中的参数并相应地更改区域设置,在调度程序的应用程序上下文中调用 LocaleResolver 的 setLocale 方法。下一个示例显示,所有包含名为 siteLanguage 的参数的 *.view 资源的调用现在会更改区域设置。因此,例如,对 URL [www.sf.net/home.view?siteLanguage=nl](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>