【发布时间】: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