自定义资源包加载

在本类的前面,您学习了如何创建和访问ResourceBundle类的对象。本节将扩展您的知识,并说明如何利用ResourceBundle.Control类功能。

创建ResourceBundle.Control是为了指定如何定位和实例化资源束。它定义了一组回调方法,这些方法在 Binding 包加载过程中由ResourceBundle.getBundle工厂方法调用。

与前面介绍的ResourceBundle.getBundle方法不同,此ResourceBundle.getBundle方法使用指定的基本名称,默认语言环境和指定的控件定义资源束。

public static final ResourceBundle getBundle(
    String baseName,
    ResourceBundle.Control cont
    // ...

指定的控件为资源包加载过程提供信息。

以下名为RBControl.java的示例程序说明了如何为中文语言环境定义自己的搜索路径。

1.创建属性文件。

如前所述,您可以从类或properties文件中加载资源。这些文件包含以下语言环境的描述:

  • RBControl.properties –Global

  • RBControl_zh.properties –仅语言:简体中文

  • RBControl_zh_cn.properties –仅地区:中国

  • RBControl_zh_hk.properties –仅限地区:香港

  • RBControl_zh_tw.properties –台湾

在此示例中,应用程序为香港地区创建了一个新的语言环境。

2.创建一个 ResourceBundle 实例。

如上一节中的示例所示,此应用程序通过调用getBundle方法来创建ResourceBundle实例:

private static void test(Locale locale) {
    ResourceBundle rb = ResourceBundle.getBundle(
                            "RBControl",
                            locale,
                            new ResourceBundle.Control() {
                                    // ...
                            }
                        );

getBundle方法搜索带有 RBControl 前缀的properties文件。但是,此方法包含一个Control参数,该参数驱动搜索中文区域设置的过程。

3.调用 getCandidateLocales 方法

getCandidateLocales方法返回Locales对象的列表,作为基本名称和语言环境的候选语言环境。

new ResourceBundle.Control() {
    @Override
    public List<Locale> getCandidateLocales(
                            String baseName,
                            Locale locale) {
                // ...                                        
    }
}

默认实现返回Locale对象的列表,如下所示:语言环境(语言,国家/地区)。

但是,将重写此方法以实现以下特定行为:

if (baseName == null)
    throw new NullPointerException();

if (locale.equals(new Locale("zh", "HK"))) {
    return Arrays.asList(
               locale,
               Locale.TAIWAN,
               // no Locale.CHINESE here
               Locale.ROOT);
} else if (locale.equals(Locale.TAIWAN)) {
    return Arrays.asList(
               locale,
               // no Locale.CHINESE here
               Locale.ROOT);
}

请注意,候选语言环境序列的最后一个元素必须是根语言环境。

4.致电测试班

为以下四个不同的语言环境调用test类:

public static void main(String[] args) {
    test(Locale.CHINA);
    test(new Locale("zh", "HK"));
    test(Locale.TAIWAN);
    test(Locale.CANADA);
}

5.运行示例程序

您将看到程序输出,如下所示:

locale: zh_CN
        region: China
        language: Simplified Chinese
locale: zh_HK
        region: Hong Kong
        language: Traditional Chinese
locale: zh_TW
        region: Taiwan
        language: Traditional Chinese
locale: en_CA
        region: global
        language: English

请注意,新创建的文件已分配给香港地区,因为它是在适当的properties文件中指定的。繁体中文被指定为台湾地区的语言。

RBControl示例中未使用ResourceBundle.Control类的其他两个有趣的方法,但值得一提。 getTimeToLive方法用于确定资源束在缓存中可以存在多 Long 时间。如果针对高速缓存中资源束的时间限制已到期,则调用needsReload方法以确定是否需要重新加载资源束。