2011-07-06 30 views
0

我有一個基於一堆.properties文件的「普通」Java PropertyResourceBundle。在一些地方,根據正確翻譯的.properties文件而不是ResourceBundle,在Properties對象上操作會更方便。有沒有一種簡單的方法將ResourceBundle「投」到Properties從ResourceBundle生成一個Properties對象?

我想什麼了是這樣的:

Locale currentLocale = MagicLocaleFactory.getLocale(); 
ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale); 

Properties myProperties = myResources.magicallyProduceAPropertiesObject(); 

所以後記中,myProperties對象的行爲就好像它已經從同一.properties文件實例化ResourceBundle.getBundle()去發現。

有幾種方法可以「手工」做到這一點;例如,通過遍歷ResourceBundle的一組鍵值對並將它們安裝到新的Properties對象中,但我希望有更好的或者更短的方法來實現它。

編輯:

回答顯而易見的「但是,爲什麼?問題是這樣的:我們正在改造一個長期存在的用於i18n的桌面Java程序。該程序已經從一個.properties文件支持的Properties對象中提取字符串。我們用多個文件替換單個文件並將Properties對象「提升」爲資源包。問題就是,在Properties上獲得密鑰的方法是getProperty,而對於ResourceBundle則是getStringgetObject。在程序傳遞並取出字符串之前,更改Properties對象的來源非常簡單。改變實際的方法調用並不容易。當然,你幾乎可以搜索並替換它,但是不必僅僅改變一個加載屬性的類,我們必須觸及每一個源文件。 (是的,這個東西有很多文字。)我們希望我們錯過了一個方法來使用ResourceBundle的多重.properties與回退機制,而不必重新連線整個應用程序。 (Gandalous Gandalf引用:「從來沒有太多的希望,只是一個傻瓜的希望。」)

回答

3

沒有內置的方式來做你想做的事,但正如你所說,它並不是很難自己做:基本上具有相同的接口,並且將密鑰和值從包複製到屬性很容易。

雖然有一個警告。雖然接口類似,但實現不是:資源束具有繼承模型,如果未在foo_fr_FR.propertiesfoo_fr.properties中定義它,則允許返回foo.properties中的值。因此,複製所有條目將無法獲得與從屬性文件中加載的屬性相同的屬性。它將獲得屬性文件的條目以及所有父母的屬性。但我想你知道,因爲你正在談論一堆屬性文件。

您還沒有聲明爲什麼你寧願在ResourceBundle上使用屬性,所以很難給你一個更好的答案。

另一種解決方案是簡單地加載自己的屬性:

Properties props = new Properties(); 
properties.load(MyClass.class.getResourceAsStream("MyResources_" + locale + ".properties") 

這樣,你將只能得到從特定屬性文件中的條目。

3

有在沒有和好的原因:資源包應該是包含在不同的語言特性,所以它會加載*和回落適當的文件 - 當你問我們說與去AT區域設置信息(德國,奧地利),如果能夠在其他情況下找到一個或您的基本屬性文件(messages.properties),它將回退到德語。

我真的不知道你在這裏的用例是什麼(也許它可以用不同的方式實現),但似乎唯一的方法是直接從屬性文件中讀取,不幸地模仿我上面提到的機制(棘手的部分是葡萄牙語巴西和中國傳統,不應該回落到他們的「默認」語言(分別是「pt」和「zh」))。

0

另一種解決方案是迭代上的按鍵,並把所有對一個屬性對象,可以使用convertBundleToProperties

static Properties convertBundleToProperties(ResourceBundle resource) { 
    Properties properties = new Properties(); 

    Enumeration<String> keys = resource.getKeys(); 
    while (keys.hasMoreElements()) { 
     String key = keys.nextElement(); 
     properties.put(key, resource.getString(key)); 
    } 

    return properties; 
}