文档

Java™ 教程
隐藏目录
自定义资源包加载
指南: 国际化
课程: 隔离特定于语言环境的数据

自定义资源包加载

在本课程的前面部分,您已经学会了如何创建和访问ResourceBundle类的对象。本节将扩展您的知识,并解释如何利用ResourceBundle.Control类的功能。

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

与之前描述的ResourceBundle.getBundle方法不同,这个ResourceBundle.getBundle方法使用指定的基本名称、默认区域设置和指定的控制来定义资源包。

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

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

下面的示例程序名为RBControl.java,演示了如何为中文区域设置定义自己的搜索路径。

1. 创建properties文件。

如前所述,您可以从类或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对象列表,格式为:Locale(语言, 国家)。

然而,这个方法被重写以实现以下特定行为:

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

if (locale.equals(new Locale("zh", "HK"))) {
    return Arrays.asList(
               locale,
               Locale.TAIWAN,
               // 这里没有 Locale.CHINESE
               Locale.ROOT);
} else if (locale.equals(Locale.TAIWAN)) {
    return Arrays.asList(
               locale,
               // 这里没有 Locale.CHINESE
               Locale.ROOT);
}

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

4. 调用test

为以下四种不同的语言环境调用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: 简体中文
locale: zh_HK
        region: Hong Kong
        language: 繁体中文
locale: zh_TW
        region: Taiwan
        language: 繁体中文
locale: en_CA
        region: global
        language: 英文

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

ResourceBundle.Control类的另外两个有趣的方法在RBControl示例中没有被使用,但值得一提。 getTimeToLive方法用于确定资源包可以在缓存中存在多长时间。 如果缓存中的资源包的时间限制已经过期,将调用needsReload方法来确定是否需要重新加载资源包。


上一页: 使用ListResourceBundle
下一页: 格式化