从ResourceBundle生成一个Properties对象?

时间:2011-07-06 20:31:35

标签: java internationalization resourcebundle

我有一个基于一堆PropertyResourceBundle文件的“普通”Java .properties。在少数地方,根据正确翻译的Properties文件而不是.propertiesResourceBundle对象进行操作会更方便。是否有一种方便的方式将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和后备机制,而无需重新连接整个应用程序。 (Gratalf Gratalf引用:“从来没有太大的希望。只是傻瓜的希望。”)

3 个答案:

答案 0 :(得分:3)

没有内置的方法可以做你想要的,但正如你所说,自己动手并不困难:基本上有相同的界面,并将包中的键和值复制到属性很容易。

但是,有一点需要注意。虽然接口类似,但实现不是:资源包具有继承模型,如果foo.propertiesfoo_fr_FR.properties中未定义,则允许返回foo_fr.properties中的值。因此,复制所有条目将不会获得与从属性文件加载的属性相同的属性。它将获取属性文件的条目及其所有父项的属性。但我想你知道,因为你在谈论一堆属性文件。

你还没有说明为什么你更喜欢属于ResourceBundle的属性,所以很难给你一个更好的答案。

另一种解决方案是自己简单地加载属性:

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

这样,您只能获得特定属性文件中的条目。

答案 1 :(得分:3)

没有,并且有充分的理由:ResourceBundle旨在包含不同语言的属性,以便它可以加载 *和后退相应的文件 - 当你要求让我们说的消息时de-AT语言环境(德语,奥地利),如果能够在其他情况下找到一个或你的基本属性文件(messages.properties),它将回退到德语。

我真的不知道你的用例是什么(也许它只是以不同的方式可以实现?)但似乎唯一的方法是直接从属性文件中读取,不幸的是模仿我上面提到的机制(棘手的部分是葡萄牙巴西和繁体中文,它们不应该回归到它们的“默认”语言(分别是“pt”和“zh”)。

答案 2 :(得分: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;
 }