繁体   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