2

我想以所有语言都由文件夹分隔的方式使用 Spring 的 i18n 实用程序。我计划使用这种文件夹结构来使事情比将所有内容都放在一个文件夹中更有条理:

  • i18n

    • zh
      • 消息属性
      • 应用程序属性
    • FR

      • 消息属性
      • 应用程序属性

这可能吗?

4

1 回答 1

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 实例化 bundles 的策略,给定一个 bundle 名称,bundle 列表中的第一个名称将解析该 bundle(例如,寻找messages_fr.properties策略将寻找i18n/en/messages_fr.properties,然后在未找到i18n/en/messages.properties时将其解析为默认值)。messages_fr.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
于 2013-01-15T13:22:06.560 回答