spring mvc i18n: если ключ отсутствует в файле свойств, как установить локаль по умолчанию? - PullRequest
3 голосов
/ 22 февраля 2012

предположим, что если у меня нет ключа в моем файле свойств, я получаю исключение, например:

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: не найдено сообщение под кодом 'label.cancel' для локали 'en'.

предположим, что если он недоступен в моем messages_ch_CN.properties, есть ли способ, если его нет в этом файле, следует проверить его в файле messages_en_En. или есть какая-то работа, которую кто-либо реализовал.

Ответы [ 3 ]

4 голосов
/ 12 сентября 2013

Например, у вас есть: 2 language

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.properties или messages_en_EN.properties, или в одном из этих свойств нет необходимого ключа, например: title, spring будет использовать messages.properties по умолчанию

, если <property name="fallbackToSystemLocale" value="true"/> - spring использует пользовательскую локализацию среды развертывания, но это не очень хорошо, поскольку среда развертывания пользователя может отличаться от языков, которые мы предоставили.Если локаль пользователя отличается от языков, которые мы указали, Spring использует messages.properties.

2 голосов
/ 22 февраля 2012

Одним из обходных путей может быть создание подкласса messageSource, который вы используете (т. Е. ReloadableResourceBundleMessageSource), и переопределение его resolveCode(), чтобы:

  • он искал сообщение для указанного кода илокаль (по телефону super.resolveCode(code, locale)).
  • , если он не находит его, то он ищет тот с локалью по умолчанию (вызывая super.resolveCode(code, defaultLocale)).

Затем используйте этот вновь созданный класс как messageSource.

0 голосов
/ 22 февраля 2012

Всегда предоставляйте файл по умолчанию messages (без спецификации locale), который всегда содержит все ключи, используемые в вашем приложении. Невозможно автоматически найти другой locale, чем выбранный, без подкласса одной из реализаций ResourceBundle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...