74

我正在使用 Spring 3.1 并希望为当前用户找到活动的语言环境有没有一种方法可以直接获取语言环境而无需将其从控制器传递到服务层......等等。

spring 是否将语言环境存储在线程本地存储中,可以通过调用一些静态方法来获取它?

4

3 回答 3

165

我也在寻找如何在不Locale四处走动的情况下访问语言环境,但我对 Spring 还是很陌生,发现大多数解决方案都令人困惑。但事实证明,Spring MVC 确实将语言环境存储在线程本地存储中。它可以通过以下方式访问:

Locale locale = LocaleContextHolder.getLocale();

最后一种方法 [...] 基于本地线程,以便在架构的任何实体中提供当前语言环境。[...] 您必须知道 LocaleContextHolder 的内容默认对应于 Web 请求中指定的区域设置。

来自:使用 Spring MVC 3 配置语言环境切换。(该帖子还提供了获取语言环境的替代配置/方法,这可能对任何想要这样做的人有用)。

您还可以在此处LocaleContextHolder查看Spring 的文档。

于 2013-04-19T13:54:38.897 回答
5

这取决于您配置存储区域设置的位置,在会话中还是在 cookie 中?

在我的应用程序中,我已配置为使用下面提到的配置将用户语言环境存储在其会话中。

    <mvc:interceptors>
        <ref bean="localeChangeInterceptor"/>
    </mvc:interceptors>

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"/>
    </bean>

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="en"/>
    </bean>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
        <list>
            <value>/WEB-INF/i18n/labels</value>
            <value>/WEB-INF/i18n/messages</value>
            <value>/WEB-INF/i18n/include</value>
        </list>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

如果您已经完成了类似的操作,那么您可以轻松地从会话中检索语言环境参数。

希望这对您有所帮助。

干杯。

于 2012-05-29T05:02:02.857 回答
2

我们有同样的需求,所以想出了Locale上下文ThreadLocal。我们已经在ThreadLocal上下文中存储了一个对象(一些用户信息),所以只是附加它(看起来像一个 hack,但我们找到了最快的解决方案)。

于 2012-11-05T14:39:14.703 回答