import java.util.Locale;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;
@Configuration
public class Config {
@Bean
public LocaleResolver localeResolver() {
final CookieLocaleResolver ret = new CookieLocaleResolver();
ret.setDefaultLocale(new Locale("en_US"));
return ret;
}
@Bean
public MessageSource messageSource() {
final ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource();
ret.setBasename("classpath:lang");
ret.setDefaultEncoding("UTF-8");
return ret;
}
@Bean
public HandlerMapping handlerMapping() {
final LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("language");
final DefaultAnnotationHandlerMapping ret = new DefaultAnnotationHandlerMapping();
ret.setInterceptors(new Object[] { interceptor });
return ret;
}
}
以上是我的注释配置。我基本上翻译了this教程的XML。
奇怪的是,当我去...?language=fr
时,它不起作用。
但是,以下方法有效(在app-servlet.xml
中)(请注意这里使用的是locale
):
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="locale" />
</bean>
</mvc:interceptors>
另一个需要注意的重要事项是,当我在上述方法中放置断点时,所有这三个方法中的每个断点都会断开,这意味着“某人”正在读取值。
那么,为什么我的基于注释的拦截器不起作用?
答案 0 :(得分:13)
按WebMvcConfigurerAdapter
扩展配置类可能有所帮助。
添加拦截器条目覆盖
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
方法。
还为LocaleChangeInterceptor
@Bean
public LocaleChangeInterceptor localeChangeInterceptor(){
LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
答案 1 :(得分:10)
除了swap所说的,你需要添加:
@Bean(name = "localeResolver")
public LocaleResolver getLocaleResolver(){
return new CookieLocaleResolver();
}
bean名称很重要。这就是spring解析正确的语言环境解析器的方式。
或者,您可以返回SessionLocaleResolver。
如果您不添加此项,则会收到以下错误:
Cannot change HTTP accept header - use a different locale resolution strategy
答案 2 :(得分:5)
发布了Spring MVC 4.1.4.RELEASE本地化的完整示例。 您也可以使用MKYong的here(但不幸的是,它的配置基于XML)来解决项目结构的问题。
{{1}}