3

предположим, если я не имею ключа в моем один из файла свойств я получаю исключение, как:spring mvc i18n: Если ключ не в файле свойств, как установить стандартную локаль?

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Не найдено под ярлыком код». cancel 'для locale' en '.

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

ответ

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

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

+0

Большое спасибо ... Он отлично работает – Dineshkumar

2

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

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

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

+0

спасибо, попробуем –

+0

См. Http://stackoverflow.com/a/18156149/470749 для фактического примера того, как это сделать. – Ryan

0

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