網上很多的spring boot國際化的文章都是正常情況下的使用方法
如果你像我一樣用了Spring Security 那么在多語言的時候可能就會遇到一個深淵
Spring Security里面的異常本身已經是做了多語言的,但是只支持通過Accept-Language來切換錯誤信息的語言
而我們需要自定義異常信息,以及用url參數lang=en_US或者lang=cn_ZH來控制語言的話網上的這種方法是不行的
@Configuration
public class I18nConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver slr = new CookieLocaleResolver();
slr.setCookieName("locale");
// 默認使用的語言
slr.setDefaultLocale(Locale.US);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
// 參數名 用於區別使用語言類型
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
重點來了
原因是Spring Security早於DispatcherServlet,Spring Security異常退出的時候都還沒有執行上面代碼加入的東西,所以是沒有成功的修改locale.
而我自己在結果過程中手動設置locale也遇到了一個坑
我在打印日志的Filter中加入了LocaleContextHolder.setLocale(StringUtils.parseLocale(newLocale));
然后在打印的時候語言還是不對。
這個問題是因為我的filter的ordered太早了,所以后面被RequestContextFilter給設置回去了。
所以
解決辦法是在RequestContextFilter后面設置locale才對。
String newLocale = request.getParameter("lang");
if (StringUtils.isNotBlank(newLocale)) {
LocaleContextHolder.setLocale(StringUtils.parseLocale(newLocale));
}
這個代碼要再RequestContextFilter之后執行。
下面是文檔上的截圖
如果對您有幫助請評論,點贊讓我知道,謝謝!