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 中指定的主要语言环境,因此显示的文本将适应客户端设置的语言。
我想根据他的 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 中指定的主要语言环境,因此显示的文本将适应客户端设置的语言。