Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
在本课程的前面部分,你已学习如何创建和访问 ResourceBundle
类的对象。本节将扩展你的知识并解释如何利用 ResourceBundle.Control
类功能。
创建了 ResourceBundle.Control
以指定如何查找和实例化资源包。它定义了一组回调方法,这些方法在打包加载过程中由 ResourceBundle.getBundle
工厂方法调用。
与前面描述的 ResourceBundle.getBundle
方法不同,此 ResourceBundle.getBundle
方法使用指定的基本名称,默认语言环境和指定的控制。
public static final ResourceBundle getBundle( String baseName, ResourceBundle.Control cont // ...
指定的控制提供资源包加载过程的信息。
以下示例程序 RBControl.java
说明了如何为中文语言环境定义自己的搜索路径。
properties
文件。如前所述,你可以从类或 properties
文件加载资源。这些文件包含以下语言环境的说明:
RBControl.properties
全局 RBControl_zh.properties
仅限语言:简体中文 RBControl_zh_cn.properties
仅限地区:中国 RBControl_zh_hk.properties
仅限地区:香港 RBControl_zh_tw.properties
台湾在此示例中,应用程序为香港地区创建新的语言环境。
ResourceBundle
实例。与上一节中的示例一样,此应用程序通过调用 getBundle
方法创建 ResourceBundle
实例:
private static void test(Locale locale) { ResourceBundle rb = ResourceBundle.getBundle( "RBControl", locale, new ResourceBundle.Control() { // ... } );
getBundle
方法使用 RBControl 前缀搜索 properties
文件。但是,此方法包含 Control
参数,该参数驱动搜索 Chineese 语言环境的过程。
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, // no Locale.CHINESE here Locale.ROOT); } else if (locale.equals(Locale.TAIWAN)) { return Arrays.asList( locale, // no Locale.CHINESE here Locale.ROOT); }
请注意,候选语言环境序列的最后一个元素必须是根语言环境。
test
类为以下四种不同的语言环境调用 test
类:
public static void main(String[] args) { test(Locale.CHINA); test(new Locale("zh", "HK")); test(Locale.TAIWAN); test(Locale.CANADA); }
你将看到程序输出如下:
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
方法用于确定资源包在缓存中可以存在多长时间。如果缓存中资源束的时间限制已过期,则调用 needsReload
方法以确定是否需要重新加载资源束。