java ResourceBundle介绍
extends Object
下列类的父类:
ListResourceBundle, PropertyResourceBundle
资源束包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时,如 String ,程序可以从适合当前用户语言环境的资源束中装入它。以这种方式,可以写大部分独立于用户语言环境的程序代码,它与大部分资源束中的特定于语言环境的信息相隔离。
这使得编程可以:
容易本地化或翻译成不同的语言
一次处理多种语言环境
以后容易更改以支持更多的语言环境
一个资源束从概念上讲是相关的类集合,这些类是从 ResourceBundle 继承而来的。 ResourceBundle 的每个相关的子类有同一基名并加上标识它的语言环境的附加成分。例如,假设您的资源束命名为 MyResources。您写的第一个类可能是缺省的资源束,它与它的家族有同一个名字--MyResources 。也可按需要提供许多特定于语言环境的类:例如,可能为它提供一个德文的名字 MyResources_de。
ResourceBundle 的每个相关的子类包含同样的项目,但是项目已经为那个 ResourceBundle 子类描述的语言环境所翻译。例如,MyResources 和 MyResources_de 可能都有一个用在确认操作按钮上的 String 。在 MyResources 中,String 可能包含 OK ,在 MyResources_de 中,它可能包含 Gut。
如果对不同的国家有不同的资源,可做出规定:例如, MyResources_de_CH 是 Switzerland 的资源。如果仅想更改规定中的一些资源,可以这样做。
当您的程序需要特定于语言环境的对象时,它使用 getBundle 方法装入 ResourceBundle 类:
ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);
第一个参数指定包含有疑问对象的资源束的家族名。第二个参数指定了期望的语言环境。getBundle 使用这两个参数来构造 ResourceBundle 子类的名字,它应按下面的方法装入。
资源束用不同的后缀查找类,根据(1) 期望的语言环境和 (2) 缺省的语言环境(基类), 以下面从更低级别(指定较多的)到父类级别(指定较少的)的顺序来查找:
baseclass + "_" + language1 + "_" + country1 + "_" + variant1
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1
baseclass
baseclass + "_" + language2 + "_" + country2 + "_" + variant2
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2
查找的结果是一个类,但是那个类可能由磁盘上的特性文件支持。如果查找失败,getBundle() 抛出 MissingResourceException 异常。
基类必须 完全合格(例如,myPackage.MyResources, 而不仅仅是 MyResources)。 它必须是您的代码可执行的;它不能是对调用 ResourceBundle.getBundle 的包私有的类。
注意:ResourceBundle 被内部用于访问 NumberFormats、Collation 等。查找策略是相同的。
资源束包含键/值对。键用于唯一地识别资源束中特定于语言环境的对象。下面是一个包含键/值对的 ListResourceBundle 的例子:
class MyResource extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { // LOCALIZE THIS {"OkKey", "OK"}, {"CancelKey", "Cancel"}, // END OF MATERIAL TO LOCALIZE }; }
键总是 String。 在这个例子中,键是 OkKey 和 CancelKey。 在上面的例子中,值也是 String--OK 和 Cancel--但是它们不是一定如此。值可以是任何类型的对象。
使用适当的获取方法从资源束中获取一个对象。因为 OkKey 和 CancelKey 都是字符串,可用 getString 方法检索它们:
button1 = new Button(myResourceBundle.getString("OkKey")); button2 = new Button(myResourceBundle.getString("CancelKey"));
获取方法都要求把键作为一个参数,并且如果找到的话就返回这个对象。如果对象未找到,获取方法抛出 MissingResourceException 异常。
除了 getString,资源束支持获取不同类型对象的其它方法,例如 getStringArray。如果没有任何对象匹配这些方法,可以使用 getObject,并把结果映射成适当的类型。例如:
int[] myIntegers = (int[]) myResources.getObject("intList");
注意:应该一直提供没有后缀的基类。 如果要求的语言环境不存在,这将是类的 "最后选择"。例如,下面一个类 MyResources。它碰巧包含 US 字符串,所以我们不必用显式的 MyResource_en 或 MyResource_en_US。
JDK 提供了 ResourceBundle 的两个子类: ListResourceBundle 和 PropertyResourceBundle , 它们提供了非常简单的创建资源的方法。 (一旦序列化完全被集成,将提供另一个方法。) 如在先前的例子中所见到的,ListResourceBundle 把它的资源作为键/值对管理。 PropertyResourceBundle 使用特性文件管理它的资源。
如果 ListResourceBundle 或 PropertyResourceBundle 不符合您的需求,您可写自己的 ResourceBundle 子类。您写的子类必须覆盖两个方法:handleGetObject 和 getKeys()。
下面是 ResourceBundle 子类管理少数资源的例子(对于更大的资源,应使用 Hashtable)。注意,如果未找到键,handleGetObject 必须返回 null。注意,如果一个“父类级别的”ResourceBundle 处理有同一值( 见下面的 uk ) 的同一键,您不必提供任何值。
例子:
abstract class MyResources extends ResourceBundle { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Ok"; if (key.equals("cancelKey")) return "Cancel"; return null; } } abstract class MyResources_de extends MyResources { public Object handleGetObject(String key) { if (key.equals("okKey")) return "Gut"; if (key.equals("cancelKey")) return "Vernichten"; return null; } } abstract class MyResources_uk extends MyResources { public Object handleGetObject(String key) { // don't need okKey, since parent level handles it. if (key.equals("cancelKey")) return "Dispose"; return null; } }
不必限制自己使用单个系列的 ResourceBundle。例如,可以有一个用于出错信息的束集合,ExceptionResources (ExceptionResources_fr, ExceptionResources_de, ...) , 以及一个用于小工具的束集合, WidgetResource (WidgetResources_fr, WidgetResources_de, ...); 按您的需要断开资源。
参见:
ListResourceBundle, PropertyResourceBundle, MissingResourceException
变量索引
parent
当父类束不包含特定资源时,可通过 getObject 查阅它。
构造子索引
ResourceBundle()
方法索引
getBundle(String)
获取恰当的资源束子类。
getBundle(String, Locale)
获取恰当的资源束子类。
getKeys()
返回键的枚举。
getObject(String)
从资源束获取一个对象。
getString(String)
从资源束获取一个对象。
getStringArray(String)
从资源束获取一个对象。
handleGetObject(String)
从资源束获取一个对象。
setParent(ResourceBundle)
设置该束的父类束。
变量
parent
protected ResourceBundle parent
当父类束不包含特定的资源时,可通过 getObject 查阅它。
构造子
ResourceBundle
public ResourceBundle()
方法
getString
public final String getString(String key) throws MissingResourceException
从资源束获取一个对象。
保存映射的便捷方法。
参数:
key - 参见类描述。
getStringArray
public final String[] getStringArray(String key) throws MissingResourceException
从资源束获取一个对象。
保存映射的便捷方法。
参数:
key - 参见类描述。
getObject
public final Object getObject(String key) throws MissingResourceException
从资源束获取一个对象。
参数:
key - 参见类描述。
getBundle
public static final ResourceBundle getBundle(String baseName) throws MissingResourceException
获取适当的资源束子类。
参数:
baseName - 参见类描述。
getBundle
public static final ResourceBundle getBundle(String baseName, Locale locale)
获取适当的资源束子类。
参数:
baseName - 参见类描述。
locale - 参见类描述。
setParent
protected void setParent(ResourceBundle parent)
设置该束的父类束。当父类束不包含特定的资源时,可通过 getObject 搜索它。
参数:
parent - 该束的父类束。
handleGetObject
protected abstract Object handleGetObject(String key) throws MissingResourceException
从资源束获取一个对象。 注意:子类必须覆盖。
参数:
key - 参见类描述。
getKeys
public abstract Enumeration getKeys()
返回键的枚举。 注意:子类必须覆盖。