java ResourceBundle介绍「建议收藏」

java ResourceBundle介绍「建议收藏」publicabstractclassResourceBundleextendsObject下列类的父类:ListResourceBundle,PropertyResourceBundle资源束包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时,如String,程序可以从适合当前用户语言环境的资源束中装入它。以这种方式,可以写大部分独立于用户语言环境的程序

大家好,又见面了,我是你们的朋友全栈君。

public abstract class 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()

返回键的枚举。 注意:子类必须覆盖。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158108.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号