请输入您要查询的百科知识:

 

词条 ResourceBundle
释义

继承关系

java.util 类 ResourceBundle

java.lang.Object

∟util.ResourceBundle

直接已知子类:

ListResourceBundle, PropertyResourceBundle

public abstract class ResourceBundle extends Object

资源束包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时,如 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 子类的名字,它应按下面的方法装入。

语言查找顺序

ResourceBundle按照以下顺序查找资源,但是注意,默认语言一般都是指系统语言:

<baseclass>+<specific language>+<specific country>+<specific variant>

<baseclass>+<specific language>+<specific country>

<baseclass>+<specific language>

<baseclass>+<default language>+<default country>+<default variant>

<baseclass>+<default language>+<default country>

<baseclass>+<default language>

<baseclass>

如果均未找到,则抛出 MissingResourceException异常。

查找的结果是一个类,但是那个类可能由磁盘上的特性文件支持。如果查找失败,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, ...); 按您的需要断开资源。

作用

ResourceBundle最大的好处是可以使你的程序国际化,在bundle文件名后加上国家、语言关键字,那系统就会自动载入相应的bundle文件。

比如:

bundle.properties 缺省

bundle_zh.properties 中文

bundle_ja.properties 日文

ResourceBundle bundle= ResourceBundle.getBundle( "bundle ");

如果你的系统是中文的,那就会自动加载bundle_zh.properties

需要注意的是,多字节编码的bundle需要用native2ascii转成unicode编码。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/1 21:56:57