【问题标题】:Spring MVC 3.1 change language i18n based on the request locale languageSpring MVC 3.1 根据请求语言环境更改语言 i18n
【发布时间】:2015-08-03 00:31:13
【问题描述】:

我想根据用户的 request.getLocale().getLanguage() 向用户显示适当的语言;

这就是我已经拥有的并且已经可以正常工作的东西了。这意味着当我在 URL 末尾键入 ?lang=en 或 ?lang=cn 时,它会显示相应的语言。

Application-context.xml

<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">  
    <property name="basename" value="classpath:messages"></property>  
    <property name="defaultEncoding" value="UTF-8"></property>  
</bean>  

<bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver" id="localeResolver">
    <property name="defaultLocale" value="cn"></property>
    <property name="cookieName" value="lang"></property>
    <property name="cookieMaxAge" value="3600"></property>
</bean>

<mvc:interceptors>
    <bean
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang" />
    </bean>
</mvc:interceptors>

如你所见,默认情况下我选择显示中文“cn”。所以当我打开页面时它显示中文。 但是,在我的浏览器中,区域设置语言是“en”,所以我想用英文而不是中文显示文本。

我已经尝试了一些不起作用的方法:

正如您在上面看到的,一旦选择了 ?lang=,CookieLocaleResolver 将创建一个名为“lang”的 cookie。所以我的想法是创建一个“HandlerInterceptorAdapter”,并在 preHandle() 中将 cookie 添加到请求中,希望 i18n 能够获取它并显示正确的语言。我还注意到响应头中有“Content-Language=cn”,所以我什至尝试用另一种语言覆盖它:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    Cookie[] cookies = request.getCookies();
    Boolean gotLang = false;
    if (cookies != null) {
        for (Cookie ck : cookies) {
            if(ck.getName().toString().equals("lang")){
                System.out.println("lang is : " + ck.getValue());
                gotLang = true;
            }
        }// end for each cookie

    }// End if cookie

    //if the cookie Lang does not exist
    //then we set a lang based on the browser lang :D
    if(!gotLang){
        Locale locale = request.getLocale();
        String language = locale.getLanguage();

        if(language.equalsIgnoreCase("en")){
            response.addCookie(new Cookie("lang", "en"));
            response.setHeader("Content-Language","en");
        }else if(language.equalsIgnoreCase("cn")){
            response.addCookie(new Cookie("lang", "cn"));
            response.setHeader("Content-Language","cn");
        }else if(language.equalsIgnoreCase("in")){
            response.addCookie(new Cookie("lang", "in"));
            response.setHeader("Content-Language","in");
        }
    }

    return true;
}

没有用。 在响应头中我可以看到 Cookie "lang=en" 但内容仍然是中文的。响应标头未被覆盖,它保持“Content-Language=cn”。

但是,如果我刷新页面,由于已经设置了 cookie“lang=en”,那么它会显示正确的语言。

我想我可以重定向到同一个 URL 并根据语言添加 ?lang=xx,但我想保持 URL 干净。

有没有人想办法让它发挥作用?

【问题讨论】:

  • 你真的阅读过文档吗?使用AcceptHeaderLocaleResolver 而不是拼凑自己的解决方案。
  • @M.Deinum。在我的情况下我应该如何使用AcceptHeaderLocaleResolver?感谢您的宝贵帮助。
  • 您想使用接受标头,然后使用适当的LocaleResolver。当前您使用的是基于 cookie 的,切换到 AcceptHeaderLocaleResolver 以始终在请求中使用该 cookie。你想要达到什么目的?而不是默认使用标题中的默认值(并且仍然允许更改)或不允许更改并始终使用标题?您的用例或您想要实现的目标尚不清楚。

标签: java spring spring-mvc internationalization locale


【解决方案1】:

感谢 M. Deinum。这是解决方案: 解决方案是将AcceptHeaderLocaleResolver 用作LocaleResolver。我应该更好地阅读文档。

applicationContext.xml

<!-- Internationalization i18n and l10n -->
<!-- to activate message.properties  -->
<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">  
    <property name="basename" value="classpath:messages"></property>  
    <property name="defaultEncoding" value="UTF-8"></property>  
</bean>  

<bean class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" id="localeResolver">
</bean>

这将使用 HTTP 请求的“accept-language”标头中指定的主要语言环境,因此显示的文本将适应客户端设置的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2014-04-18
    • 1970-01-01
    • 2011-07-25
    • 2019-01-13
    • 2014-09-15
    • 2016-01-07
    相关资源
    最近更新 更多