SpringBoot国际化失败填坑"/>
SpringBoot国际化失败填坑
记录下问题…
SpringBoot通过配置 localeResolver
Bean 使用容器系统自带的环境语言, 结合拦截器, 通过拦截请求参数中 lang
的值, 设置不同会话 Session
中的语言.
@Configuration
public class LocaleLanguageConfig {/*** 默认解析器 其中locale表示默认语言*/@Beanpublic LocaleResolver localeResolver() {SessionLocaleResolver localeResolver = new SessionLocaleResolver();// 设置默认语言环境,设置默认.不指定具体语言localeResolver.setDefaultLocale(Locale.getDefault());return localeResolver;}/*** 默认拦截器*/@Beanpublic WebMvcConfigurer localeInterceptor() {return new WebMvcConfigurer() {@Overridepublic void addInterceptors(InterceptorRegistry registry) {LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();// lang表示切换语言的参数名localeInterceptor.setParamName("lang");localeInterceptor.setIgnoreInvalidLocale(false);registry.addInterceptor(localeInterceptor);}};}
}
配合 Get
请求完成多语言的配置
<a href="?lang=zh_CN"><span class="text-white">中文</span></a>
<a href="?lang=en_US"><span class="text-white">English</span></a>
本地 application.properties
配置
# 国际化消息
spring.messages.basename=i18n/messages
这里介绍一个天坑.
通过 windows 版本的 Idea 生成的国际化文件, 其文件名为小写, 即关于国家语言信息的 en_us
和 zh_cn
为小写, 但是 java.util.Locale
中,规定的国家语言信息必须为大写.
参考 java.util.Locale
类
static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");
static public final Locale TRADITIONAL_CHINESE = createConstant("zh", "TW");
static public final Locale US = createConstant("en", "US");
那么… 则导致, SpringBoot
在根据当前语言查找对应的语言资源时, 由于 Windows
文件名不区分大小写, 所以可以找到 i18n/messages_zh_cn.properties
, 而在 Linux
环境下区分大小写. 找不到消息资源,进而国际化失败.
解决…
将文件名合理命名.然后重启…
更多推荐
SpringBoot国际化失败填坑
发布评论