Spring MVC 3.1根据请求语言环境

时间:2015-05-21 11:12:22

标签: java spring spring-mvc internationalization locale

我希望根据他的 request.getLocale()。getLanguage();

向用户显示相应的语言

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

应用-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>

正如您在上面所看到的,默认情况下我选择显示中文&#34; cn&#34;。所以当我打开页面时会显示中文。 但是,在我的浏览器中,语言环境语言是&#34; en&#34;所以我想用英文显示文字,但不能用中文显示。

我已经尝试了一些没有用的东西:

如上所示, CookieLocaleResolver 会创建一个名为&#34; lang&#34;一旦选择了?lang =。所以我的想法是创建一个&#34; HandlerInterceptorAdapter &#34;并且在preHandle()中我将cookie添加到请求中,希望i18n能够得到它并显示正确的语言。另外我注意到在响应标题中有&#34; Content-Language = cn&#34;所以我甚至试图用另一种语言覆盖它:

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&#34; lang = en&#34;但内容仍然是中文。响应标头未被覆盖,它保持&#34; Content-Language = cn&#34;。

但是,如果我刷新页面,因为cookie&#34; lang = en&#34;已设置,然后显示正确的语言。

我想我可以重定向到相同的网址并根据语言添加?lang = xx,但我希望保持网址清洁。

有人会有想法让它有效吗?

1 个答案:

答案 0 :(得分: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”标头中指定的主要语言环境,以便显示的文本将适应客户端设置的语言。

相关问题