我们需要开始为我们的程序添加国际化。谢天谢地,还不是全部,只是一点点,但我希望我们这样做的方式可以扩大到可能覆盖整个程序。问题是,我们的程序是基于插件的,所以并不是所有的字符串都属于同一个地方。
据我了解,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");
但是,我们需要将多个语言环境的结果组合到一个资源空间中。例如,插件需要能够覆盖已定义的字符串,并在代码查找该字符串时返回该新值。
我有点迷失在这一切中。有人可以帮忙吗?
更新:大卫沃特斯问:
我已经把我的答案放在了底部,但我很想听听你是如何解决这个问题的。
好吧,我们还没有走多远——长期的 WIBNI 总是成为最新危机的受害者——但我们基于插件实现的接口,约定资源与接口具有相同的完全限定名称.
所以一个接口UsersAPI
可能有各种不同的实现。默认情况下,该接口上的方法getBundle()
返回等效于 ResourceBundle.get("...UsersAPI", locale)
. 可以替换该文件,或者如果用户需要更复杂的内容,UsersAPI 的实现可以覆盖该方法。
到目前为止,这可以满足我们的需要,但我们仍在寻找基于插件的更灵活的解决方案。