- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们需要开始将国际化添加到我们的程序中。值得庆幸的是,这还不是全部,只是一小部分,但我希望我们这样做的方式能够扩大到可能涵盖整个项目。问题是,我们的程序是基于插件的,所以并不是所有的字符串都属于同一个地方。
据我了解,Java 的ResourceBundle
是这样工作的。您创建了一个扩展 ResourceBundle
的类,名为 MyProgramStrings
,还创建了一个名为 MyProgramStrings_fr
、MyProgramStrings_es
的特定于语言的类> 等。这些类中的每一个都将键(字符串)映射到值(任何对象)。这取决于每个类从何处获取其数据,但它们的一个共同位置是属性文件。
您分两个阶段查找值:首先您获得正确的包,然后查询您想要的字符串。
Locale locale = Locale.getDefault(); // or = new Locale("en", "GB");
ResourceBundle rb = ResourceBundle.getBundle("MyProgramStrings", locale);
String wotsitName = rb.getString("wotsit.name");
然而,我们需要的是将多个语言环境的结果组合到一个资源空间中。例如,插件需要能够覆盖已定义的字符串,并在代码查找该字符串时返回新值。
我有点迷失在这一切之中。有人可以帮忙吗?
更新:David Waters 提问:
I have put my answer at the bottom but I would be interested in hearing how you solved this problem.
好吧,我们还没有走得太远——长期的 WIBNI 总是成为最新危机的牺牲品——但我们基于插件实现的接口(interface),按照资源具有相同的完全限定名称的约定作为界面。
所以接口(interface) UsersAPI
可能有各种不同的实现。默认情况下,该接口(interface)上的方法 getBundle()
返回等效于 ResourceBundle.get("...UsersAPI", locale)
。该文件可以被替换,或者如果他们需要更复杂的东西,UsersAPI 的实现可以覆盖该方法。
到目前为止,这满足了我们的需要,但我们仍在寻找基于插件的更灵活的解决方案。
最佳答案
您不必将 ResourceBundle 实现为一系列类,每个语言环境一个类(即名为 MyProgramStrings
、MyProgramStrings_fr
, MyProgramStrings_de
).如果需要,ResourceBundle 类将回退到使用属性文件:
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("MyResources");
System.out.println("got bundle: " + bundle);
String valueInBundle = bundle.getString("someKey");
System.out.println("Value in bundle is: " + valueInBundle);
}
如果我在类路径上有一个名为 MyResources.properties
的文件,那么此方法将导致:
got bundle: java.util.PropertyResourceBundle@42e816
Value in bundle is: someValue
至于设置包的层次结构,或者将它们“合并”在一起,恐怕我帮不上什么忙,除了我知道 Spring 确实有一个概念 hierchical MessageSources ( link to API ) 在 java.util.ResourceBundle 之上实现,所以也许您可以使用 Spring 的功能来实现您想要的?
顺便说一句,这里是 ResourceBundle.getBundle()
javadoc 的相关部分,解释了它的“搜索和实例化策略”:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ResourceBundle.html#getBundle(java.lang.String , java.util.Locale, java.lang.ClassLoader)
- First, it attempts to load a class using the candidate bundle name. If such a class can be found and loaded using the specified class loader, is assignment compatible with ResourceBundle, is accessible from ResourceBundle, and can be instantiated, getBundle creates a new instance of this class and uses it as the result resource bundle.
- Otherwise, getBundle attempts to locate a property resource file. It generates a path name from the candidate bundle name by replacing all "." characters with "/" and appending the string ".properties". It attempts to find a "resource" with this name using ClassLoader.getResource. (Note that a "resource" in the sense of getResource has nothing to do with the contents of a resource bundle, it is just a container of data, such as a file.) If it finds a "resource", it attempts to create a new PropertyResourceBundle instance from its contents. If successful, this instance becomes the result resource bundle.
关于java - 基于插件的程序中的语言环境和 ResourceBundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/282883/
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
我在互联网上搜索了很多小时,但没有找到满意的结果,所以 -VSTO Addin 和 COM Addin(我们作为类库项目制作并使用 Excel 对象)之间有什么区别?VSTO 项目是否有任何限制,例如
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在寻找有关如何构建可扩展 WCF 服务器(具有动态加载的服务)的建议,最好使用 System.Addins 或 MEF。 服务器应托管实现最小“插件”API(StartService/StopSe
有没有一种方法可以使用加载浏览器扩展/插件/插件的 headless 浏览器(即 PhantomJS、Selenium)来运行自动测试? 更具体地说,我想模拟广告拦截器(如 Ghostery、ad-b
我是 gradle 的新手,我使用 artifactory 作为我的 repo 服务器。我在网上查看了如何将我的项目发布到我的 repo 服务器,发现我可以使用 maven-publish 或使用 a
我想禁用某些状态的点击/事件,并仅使少数状态可点击。我通读了http://newsignature.github.io/us-map/处的文档,并且找不到与此问题相关的任何内容。 最佳答案 http:
据我了解,在Intellij中使用idea插件打开Maven构建的项目并不是最好的方法,即调用: mvn idea:idea 但是直接打开pom文件(Intellij有默认的Maven插件);同样的事
使用Artifactory plugin对于 Jenkins pipeline 来说是一种幸福,只要遵循文档就可以了。但后来我介绍了Maven Flatten plugin解析父模块和子模块 mvn
我已经安装了Elasticsearch版本1.7.1。一切正常。我也安装了 JDBC 驱动程序。检查下面我的插件文件夹 目录E:\Xampp\htdocs\my-elastic\elasticsear
在我使用 webpack common chunks 插件创建包含第三方库(如 angular、react、lodash 等)的 vendor 包之前,但后来我知道了 webpack dll
我们正在尝试使用(Jenkins、sonar、eclipse ...)安装 CI 平台。 为了让每个开发人员都可以在提交之前对他的代码进行分析,我想知道两种选择: 使用 Sonar 插件运行本地分析。
我知道这是一个比较特殊的问题。尽管如此,也许有些人知道这一点: 我想在 Eclipse 中使用 Maven 编译 Hector=> 分支:0.7.0 和标签:hector-0.7.0-29(https
我卡住了。我一直在尝试寻找或自己创建一个简单的准系统示例,说明如何为 VS 2010 Express 创建 Outlook 插件。我知道这在 VS 2010 Pro 中更简单,但是,在快速版本中真的不
我有以下排除过滤器来忽略所有 R 文件类: findbugs-exclude-filter.xml 当我将它用于 FindBugs-IDEA 插件时,它可以
我刚开始玩 CakePHP,我发现了 Wildflower CMS .我喜欢这个想法,并打算开始修补它。不过,我有一个问题。 在自述文件中,我发现了以下内容:“Wildflower 不是也不会是 Ca
虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。 本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件
本篇是 Python 系列教程第 3 篇,更多内容敬请访问我的 Python 合集 Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,V
Maven – 插件 什么是 Maven 插件? Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来: 创建 jar 文件 创建 war
我正在编写一个插件来添加带有标签 [deposit_page] 的页面;该标记应替换为一些 PHP 代码。 这就是我所拥有的,但它不起作用。有什么我遗漏或做错了什么吗? function deposi
我是一名优秀的程序员,十分优秀!