ResourceBundle需要一個特定於語言環境的資源。
基本介紹
- 中文名:ResourceBundle
- 外文名:ResourceBundle
- 包含:特定於語言環境的對象
- 需要:一個特定於語言環境的資源
繼承關係,作用,
繼承關係
java.util 類 ResourceBundle
∟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