Spring MVC 3.1 根据请求的区域设置语言更改语言 i18n

Spring MVC 3.1 change language i18n based on the request locale language

我想根据他的 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 能够获取它并显示正确的语言。我还注意到在响应 header 中有 "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;
}

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

但是,如果我刷新页面,因为 cookie "lang=en" 已经设置,它会显示正确的语言。

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

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

感谢 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" header 中指定的主要语言环境,因此显示的文本将适应客户端设置的语言。