spring mvc i18n:如果key不在属性文件中,如何设置默认语言环境?

时间:2012-02-22 13:13:10

标签: spring model-view-controller spring-mvc internationalization

假设我的属性文件中没有密钥,我会得到一个例外情况:

javax.servlet.ServletException:javax.servlet.jsp.JspTagException:在代码'label.cancel'下找不到用于locale'en'的消息。

假设我的messages_ch_CN.properties中没有它,那么如果该文件中没有它,则应检查messages_en_En文件。 或者是否有任何工作已经实施。

3 个答案:

答案 0 :(得分:4)

例如,您有:2种语言

messages_ch_CN.properties  /*in the property file lang=Chinese*/
messages_en_EN.properties  /*in the property file lang=English*/
messages.properties  /*in the property file lang=English default*/

messages.properties这是默认属性,它始终包含整个应用程序中使用的每个键。

NAME-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.2.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <context:component-scan base-package="com.example.controller"/>

    <mvc:annotation-driven/>
    <mvc:resources mapping="/resources/**" location="/resources/"/>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:com/example/i18n/messages"/>
        <property name="fallbackToSystemLocale" value="false"/>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

    <mvc:interceptors>
        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
            <property name="paramName" value="lang"/>
        </bean>
    </mvc:interceptors>

    <bean id="localeResolver"
          class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
        <property name="defaultLocale" value="en"/>
    </bean>

</beans>

<property name="fallbackToSystemLocale" value="false"/> - 说,如果您没有财产messages_ch_CN.propertiesmessages_en_EN.properties或其中一个属性,则没有必要的密钥,例如:title,spring将使用messages.properties默认

如果<property name="fallbackToSystemLocale" value="true"/> - spring使用部署环境的用户区域设置,但由于用户的部署环境不合适,可能与我们提供的语言不同。如果用户的语言环境与我们提供的语言不同,则spring使用messages.properties

答案 1 :(得分:2)

一种解决方法是将您正在使用的messageSource子类化(即ReloadableResourceBundleMessageSource)并覆盖它的resolveCode(),以便:

  • 它查找指定代码和区域设置的消息(通过调用super.resolveCode(code, locale))。
  • 如果找不到,则查找默认语言环境(通过调用super.resolveCode(code, defaultLocale))。

然后将新创建的类用作messageSource

答案 2 :(得分:0)

始终提供默认的messages文件(不含locale规范),该文件始终包含整个应用程序中使用的所有密钥。如果没有对locale实现之一进行子类化,则无法自动查找另一个ResourceBundle而不是所选的{。}}。