我希望根据他的 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,但我希望保持网址清洁。
有人会有想法让它有效吗?
答案 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”标头中指定的主要语言环境,以便显示的文本将适应客户端设置的语言。