簡體   English   中英

從 ResourceBundle 生成屬性 object?

[英]Generate a Properties object from a ResourceBundle?

我有一個基於.properties文件堆棧的“正常” Java PropertyResourceBundle 在某些地方,基於正確翻譯的.properties文件而不是ResourceBundleProperties object 進行操作會更方便。 有沒有一種方便的方法可以將ResourceBundle轉換為Properties

我想要的是這樣的:

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

Properties myProperties = myResources.magicallyProduceAPropertiesObject();

所以后記, myProperties object 的行為就好像它是從ResourceBundle.getBundle()找到的同一個.properties文件中實例化的。

有幾種方法可以“手動”執行此操作; 例如,迭代ResourceBundle的一組鍵值對並將它們安裝在新的Properties object 中,但我希望有更好的,或者至少更短的方法來做到這一點。

編輯:

回答顯而易見的“但是,為什么?” 問題,情況是這樣的:我們正在為 i18n 改造一個長期存在的桌面 java 程序。 該程序已經從由單個.properties文件支持的Properties object 中提取字符串。 我們正在用多個文件替換單個文件,並將Properties object “提升”為資源包。 問題在於,獲取Properties鍵的方法是getProperty ,而對於ResourceBundle它是getStringgetObject 更改Properties object 在程序中傳遞並拉出字符串之前的來源非常容易。 更改實際的方法調用...不太容易。 當然,您幾乎可以搜索和替換它,但是我們不能只更改加載屬性的一個 class,而是必須觸及每個源文件。 (是的,這個東西有很多文字。)我們希望我們錯過了一種方法來使用ResourceBundle的多個.properties和回退機制,而不必重新連接整個應用程序。 (無償的甘道夫引用:“從來沒有太多希望。只是一個傻瓜的希望。”)

沒有內置的方法可以做你想做的事,但正如你所說,自己做並不難:基本上具有相同的界面,並且將鍵和值從包復制到屬性很容易。

不過,有一個警告。 盡管接口相似,但實現卻不同:資源包有一個 inheritance foo.properties如果它沒有在foo_fr_FR.propertiesfoo_fr.properties中定義,它允許返回 foo.properties 中的值。 因此,復制所有條目不會獲得與從屬性文件加載的相同屬性。 它將獲取屬性文件的條目及其所有父項的屬性。 但我猜你知道,因為你在談論一堆屬性文件。

您還沒有說明為什么您更喜歡 Properties 而不是 ResourceBundle,因此很難給您更好的答案。

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

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

這樣,您將僅從特定屬性文件中獲取條目。

沒有,而且有充分的理由:ResourceBundle 旨在包含不同語言的屬性,因此它會加載* 並回退適當的文件 - 當您要求讓我們說帶有 de-AT 語言環境(德語,奧地利)的消息時,如果它能夠找到一個或在其他情況下找到您的基本屬性文件(messages.properties),它將回退到德語。

我真的不知道你在這里的用例是什么(也許它可以通過不同的方式實現?)但似乎唯一的方法是直接從屬性文件中讀取,不幸的是模仿了我上面提到的機制(棘手的部分是巴西葡萄牙語和繁體中文,它們不應回退到它們的“默認”語言(分別為“pt”和“zh”))。

另一種解決方案是迭代鍵並將所有對放入屬性 object,您可以使用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;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM