2013-01-15 69 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