自定义资源包加载

原文: https://docs.oracle.com/javase/tutorial/i18n/resbundle/control.html

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

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

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

  1. public static final ResourceBundle getBundle(
  2. String baseName,
  3. ResourceBundle.Control cont
  4. // ...

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

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

1.创建properties文件。

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

  • [RBControl.properties](examples/RBControl.properties)- 全球
  • [RBControl_zh.properties](examples/RBControl_zh.properties)- 仅限语言:简体中文
  • [RBControl_zh_cn.properties](examples/RBControl_zh_CN.properties)- 仅限地区:中国
  • [RBControl_zh_hk.properties](examples/RBControl_zh_HK.properties)- 仅限地区:香港
  • [RBControl_zh_tw.properties](examples/RBControl_zh_TW.properties)- 台湾

在此示例中,应用程序为香港地区创建新的区域设置。

2.创建ResourceBundle实例。

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

  1. private static void test(Locale locale) {
  2. ResourceBundle rb = ResourceBundle.getBundle(
  3. "RBControl",
  4. locale,
  5. new ResourceBundle.Control() {
  6. // ...
  7. }
  8. );

getBundle方法使用 RBControl 前缀搜索properties文件。但是,此方法包含Control参数,该参数驱动搜索 Chineese 语言环境的过程。

3.调用getCandidateLocales方法

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

  1. new ResourceBundle.Control() {
  2. @Override
  3. public List<Locale> getCandidateLocales(
  4. String baseName,
  5. Locale locale) {
  6. // ...
  7. }
  8. }

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

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

  1. if (baseName == null)
  2. throw new NullPointerException();
  3. if (locale.equals(new Locale("zh", "HK"))) {
  4. return Arrays.asList(
  5. locale,
  6. Locale.TAIWAN,
  7. // no Locale.CHINESE here
  8. Locale.ROOT);
  9. } else if (locale.equals(Locale.TAIWAN)) {
  10. return Arrays.asList(
  11. locale,
  12. // no Locale.CHINESE here
  13. Locale.ROOT);
  14. }

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

4.调用test

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

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

5.运行示例程序

您将看到程序输出如下:

  1. locale: zh_CN
  2. region: China
  3. language: Simplified Chinese
  4. locale: zh_HK
  5. region: Hong Kong
  6. language: Traditional Chinese
  7. locale: zh_TW
  8. region: Taiwan
  9. language: Traditional Chinese
  10. locale: en_CA
  11. region: global
  12. language: English

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

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