gpt4 book ai didi

java - 从 ResourceBundle 生成 Properties 对象?

转载 作者:行者123 更新时间:2023-12-01 16:38:38 25 4
gpt4 key购买 nike

我有一个“普通”Java PropertyResourceBundle,它基于一堆 .properties 文件。在某些地方,基于正确翻译的 .properties 文件而不是 ResourceBundleProperties 对象进行操作会更方便。是否有一种方便的方法将 ResourceBundle“转换”为 Properties

我想要的是这样的:

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

Properties myProperties = myResources.magicallyProduceAPropertiesObject();

因此,myProperties 对象的行为就好像它是从 ResourceBundle.getBundle() 所在的同一个 .properties 文件实例化的并找到了。

有几种方法可以“手动”完成此操作;例如,迭代 ResourceBundle 的键值对集并将它们安装在新的 Properties 对象中,但我希望有更好的,或者至少更短,这样做的方法。

编辑:

回答显而易见的“但是,为什么?”问题是,情况是这样的:我们正在为 i18n 改造一个长期存在的桌面 java 程序。该程序已经从单个 .properties 文件支持的 Properties 对象中提取字符串。我们用多个文件替换单个文件,并将 Properties 对象“提升”为资源包。问题在于,获取 Properties 上的键的方法是 getProperty,而对于 ResourceBundle 来说,它是 getString getObject。在 Properties 对象在程序中传递并提取字符串之前更改它的来源非常容易。更改实际的方法调用...不太容易。当然,您几乎可以搜索和替换它,但是我们不能只更改加载属性的一个类,而是本质上必须触及每个源文件。 (是的,这里面有很多文本。)我们希望我们错过了一种使用 ResourceBundle 的多个 .properties 和后备机制的方法,而无需使用重新连接整个应用程序。 (无缘无故的甘道夫引用:“从来没有太大的希望。只是一个傻瓜的希望。”)

最佳答案

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

不过,有一个警告。尽管接口(interface)相似,但实现却不同:资源包具有继承模型,允许返回 foo.properties 中的值。如果 foo_fr_FR.properties 中未定义和foo_fr.properties 。因此,复制所有条目不会获得与从属性文件加载的属性相同的属性。它将获取属性文件的条目及其所有父级的属性。但我想您知道这一点,因为您正在谈论一堆属性文件。

您没有说明为什么您更喜欢 Properties 而不是 ResourceBundle,因此很难给您更好的答案。

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

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

这样,您将仅获取特定属性文件中的条目。

关于java - 从 ResourceBundle 生成 Properties 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com