文档

Java™ 教程-Java Tutorials 中文版
关于 ResourceBundle 类
Trail: Internationalization
Lesson: Isolating Locale-Specific Data

关于 ResourceBundle 类

ResourceBundle 如何与语言环境相关联

从概念上讲,每个 ResourceBundle 是一组共享相同基本名称的相关子类。下面的列表显示了一组相关的子类。ButtonLabel 是基本名称。基本名称后面的字符表示 Locale 的语言代码,国家/地区代码和变体。例如,ButtonLabel_en_GB 匹配由英语语言代码(en)和英国国家代码(GB)指定的 Locale

ButtonLabel
ButtonLabel_de
ButtonLabel_en_GB
ButtonLabel_fr_CA_UNIX

要选择适当的 ResourceBundle,请调用 ResourceBundle.getBundle 方法。以下示例为与法语,加拿大国家和 UNIX 平台匹配的 Locale 选择 ButtonLabel ResourceBundle

Locale currentLocale = new Locale("fr", "CA", "UNIX");
ResourceBundle introLabels = ResourceBundle.getBundle(
                                 "ButtonLabel", currentLocale);

如果指定的 LocaleResourceBundle 类不存在,getBundle 会尝试查找最接近的匹配项。例如,如果 ButtonLabel_fr_CA_UNIX 是所需的类,并且默认的 Localeen_US,则 getBundle 将按以下顺序查找:

ButtonLabel_fr_CA_UNIX
ButtonLabel_fr_CA
ButtonLabel_fr
ButtonLabel_en_US
ButtonLabel_en
ButtonLabel

请注意,getBundle 在选择基类(ButtonLabel) 之前,会根据默认的 Locale 查找类。如果 getBundle 无法在前面的类列表中找到匹配项,则会抛出 MissingResourceException。为避免抛出此异常,应始终提供不带后缀的基类。

ListResourceBundle 和 PropertyResourceBundle 子类

抽象类 ResourceBundle 有两个子类:PropertyResourceBundleListResourceBundle

PropertyResourceBundle 由属性文件支持。属性文件是包含可翻译文本的纯文本文件。属性文件不是 Java 源代码的一部分,它们只能包含 String 对象的值。如果需要存储其他类型的对象,请改用 ListResourceBundleBacking a ResourceBundle with Properties Files 部分向你展示了如何使用 PropertyResourceBundle

ListResourceBundle 类使用方便的列表管理资源。每个 ListResourceBundle 都由类文件支持。你可以将任何特定于语言环境的对象存储在 ListResourceBundle 中。要添加对其他 Locale 的支持,请创建另一个源文件并将其编译为类文件。Using a ListResource Bundle 部分有一个你可能会觉得有用的编码示例。

ResourceBundle 类非常灵活。如果你首先将特定于语言环境的 String 对象放在 PropertyResourceBundle 中,然后决定使用 ListResourceBundle,那么对你的代码没有任何影响。例如,以下对 getBundle 的调用将为相应的 Locale 获取 ResourceBundle,无论 ButtonLabel 是由类或属性文件支持:

ResourceBundle introLabels = ResourceBundle.getBundle(
                                 "ButtonLabel", currentLocale);

键值对

ResourceBundle 对象包含一组键值对。如果要从 ResourceBundle 中获取值,请指定键,该键必须是 String。该值是特定于语言环境的对象。以下示例中的键是 OkKeyCancelKey 字符串:

class ButtonLabel_en extends ListResourceBundle {
    // English version
    public Object[][] getContents() {
        return contents;
    }
    static final Object[][] contents = {
        {"OkKey", "OK"},
        {"CancelKey", "Cancel"},
    };
}

要从 ResourceBundle 中获取 OK String,你可以在调用 getString 时指定相应的键:

String okLabel = ButtonLabel.getString("OkKey");

属性文件包含键值对。键位于等号的左侧,值位于右侧。每对都在单独的行上。这些值只能表示 String 对象。以下示例显示名为 ButtonLabel.properties 的属性文件的内容:

OkKey = OK
CancelKey = Cancel

Previous page: Isolating Locale-Specific Data
Next page: Preparing to Use a ResourceBundle