2013-01-15 68 views
2

我想以所有语言按文件夹分隔的方式使用Spring的i18n实用程序。我打算使用这种文件夹结构,以保持事情不是让所有在一个文件夹更有条理:Spring 3按文件夹国际化

  • 国际化

    • 连接
      • messages.properties
      • application.properties
    • fr

      • messages.properties
      • application.properties

这可能吗?

回答

1

这可能吗?

是的。

一个简单的解决方案,我最初以为是设置与basenames属性的消息源,是这样的:

<bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="useCodeAsDefaultMessage" value="true" /> 
    <property name="basenames"> 
     <list> 
      <value>i18n.en.messages</value> 
      <value>i18n.en.application</value> 
      <value>i18n.fr.messages</value> 
      <value>i18n.fr.application</value> 
     </list> 
    </property> 
</bean> 

虽然给它一个第二个想法,我意识到以上将无法正常工作 。根据ResourceBundles strategy to instantiate bundles,给定捆绑软件的名称,捆绑软件列表中的第一个名称将解析捆绑软件(例如,查找messages_fr.properties策略将查找i18n/en/messages_fr.properties,然后在messages_fr.properties未找到时作为默认设置解析为i18n/en/messages.properties)。

您将需要一些基于自定义文件夹配置来发现您的捆绑包。 你将不得不编写自己的MessageSource实现并在你的应用程序中使用它,而不是Spring提供的默认设置。基本实现看起来是这样的:

package pack.age; 
import java.util.Locale; 
import java.util.ResourceBundle; 

import org.springframework.context.support.ResourceBundleMessageSource; 

public class ByFolderResourceBundleMessageSource extends ResourceBundleMessageSource { 
    private String rootFolder; 

    @Override 
    protected ResourceBundle getResourceBundle(String basename, Locale locale) { 
     String langCode = locale.getLanguage().toLowerCase(); 
     String fullBaseName = this.rootFolder + "." + langCode + "." + basename; 

     ResourceBundle bundle = super.getResourceBundle(fullBaseName, locale); 
     if (bundle == null) { 
      String defaultBaseName = this.rootFolder + ".Default." + basename; 
      bundle = super.getResourceBundle(defaultBaseName, locale); 
     } 
     return bundle; 
    } 

    public void setRootFolder(String rootFolder) { 
     this.rootFolder = rootFolder; 
    } 
} 

配置,如:

<bean id="messageSource" 
     class="pack.age.ByFolderResourceBundleMessageSource"> 
    <property name="useCodeAsDefaultMessage" value="true" /> 
    <property name="rootFolder" value="i18n" /> 
    <property name="basenames"> 
     <list> 
      <value>messages</value> 
      <value>application</value> 
     </list> 
    </property> 
</bean> 

而且具有文件夹设置,如:

i18n 
    ├───Default 
    │  ├─── application.properties 
    │  └─── messages.properties 
    │ 
    ├─── en 
    │  ├─── application.properties 
    │  └─── messages.properties 
    │ 
    └─── fr 
     ├─── application.properties 
     └─── messages.properties