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

spring mvc国际化f当找不到当前语言的资源文件时,默认是messages_zh_CN.properties,而不是系统默认的如messages.properties文件

 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>

经过测试后,得到解决!!!!!!!!!

spring mvc国际化f当找不到当前语言的资源文件时,默认是messages_zh_CN.properties,而不是系统默认的如messages.properties文件