spring mvc国际化f当找不到当前语言的资源文件时,默认是messages_zh_CN.properties,而不是系统默认的如messages.properties文件
百度有很多spring mvc国际化方式,简单贴一下我的国际化代码
<!-- 存储区域设置信息 SessionLocaleResolver类通过一个预定义会话名将区域化信息存储在会话中 从session判断用户语言defaultLocale
:默认语言 -->
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="en_US" />
</bean>
<!-- 国际化资源文件 messageSource配置的是国际化资源文件的路径, classpath:messages指的是classpath路径下的
messages_zh_CN.properties文件和messages_en_US.properties文件 设置“useCodeAsDefaultMessage”,默认为false,这样当Spring在ResourceBundle中找不到messageKey的话,就抛出NoSuchMessageException,
把它设置为True,则找不到不会抛出异常,而是使用messageKey作为返回值。 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8" />
<property name="useCodeAsDefaultMessage" value="true" />
<property name="basenames">
<list>
<!--<value>classpath:resource/message</value>-->
<value>classpath:messages</value>
</list>
</property>
</bean>
<!--该拦截器通过名为”lang”的参数来拦截HTTP请求,使其重新设置页面的区域化信息 -->
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
当我的请求url不带"?lang=en_US",例如localhost:8080/manage,此时会根据
<property name="defaultLocale" value="en_US" />这行代码,走messages_en_US.properties配置文件
后来我发现,如果我输入的是配置文件没有的语言资源时,例如http://localhost:8080/manage?lang=ko_KR,当前的配置文件中是没有messages_ko_KR.properties配置文件的,但是显示的却是中文的资源,即在当找不到当前语言的资源文件时,找的是messages_en_US.properties配置文件。
百思不得其解,开始漫漫百度之旅!!!!!!!!!!!!!!!!
终于,在这篇博客中发现
https://www.twblogs.net/a/5bafd4ec2b7177781a0f5fb1/zh-cn
messageSource有个属性fallbackToSystemLocale,当找不到语言的资源文件时,默认值是true,则会找当前系统的语言对应的资源文件,当前的系统语言应该是中文,即zh_CN,所以找的是messages_en_US.properties。因此要解决这个问题,需要将这个属性的默认值改为false,因此
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8" />
<property name="useCodeAsDefaultMessage" value="true" />
<property name="fallbackToSystemLocale" value="false" />
<property name="basenames">
<list>
<!--<value>classpath:resource/message</value>-->
<value>classpath:messages</value>
</list>
</property>
</bean>
经过测试后,得到解决!!!!!!!!!