Eclipse-RCP:使用自定义ResourceBundle.Control获取Resourcebundles

时间:2014-02-14 10:15:10

标签: java internationalization eclipse-rcp e4

我们从数据库加载翻译。要检索捆绑包,我们有自定义java.util.ResourceBundle.Control

为了翻译我们的e4 RCP应用程序,我已经创建了一个TranslationService,我使用插件将其添加到根上下文中。这没问题(只是我必须复制95%的BundleTranslationProvider,因为我没有看到任何其他方式。)

现在我想使用new Message Extension(随Eclipse Luna一起)来翻译其余部分。据我所知,默认MessageFactoryServiceImpl的来源,似乎没有一种简单的方法可以在那里注入我的ResourceBundle.Control。

linked blog series中,描述了从数据库获取资源包的用例,但是使用基于类的资源包解决了这个问题。这不是选项,因为我无法为每个资源包和每个语言环境实现一个类。从数据库加载资源包的原因是能够将翻译部署到语言而无需重新部署应用程序。

通过复制99%的默认MessageFactoryServiceImpl创建我自己的IMessageFactoryService,只是为了将我们的Control传递给对ResourceBundleHelper的调用,这是实现这一目标的唯一途径吗?

2 个答案:

答案 0 :(得分:1)

AFAIK ResourceBundle.Control用于加载ResourceBundles。在新的Message Extension中,我们使用自定义ResourceBundle.Control来启用OSGi上下文中的ResourceBundle加载,并且可以通过注释进行配置。

交换ResourceBundle.Control的AFAICS将破坏新消息扩展支持的任何其他用例。

问题是,为什么使用自定义ResourceBundle.Control而不是创建基于类的ResourceBundle?我还没有尝试过,但也许有可能只创建基本ResourceBundle(没有Locale信息)并以另一种方式确定Locale而不是使用getLocale()。

但是不知道你在自定义ResourceBundle.Control中做了什么,我不知道该回答什么以及建议什么。当然我们可以为此打开API,但正如我之前所说,那么使用默认实现的每个其他插件都将失败。

也许你可以提供一些关于你正在做什么的提示,我可以告诉你一种方法以另一种方式实现你的目标。

答案 1 :(得分:1)

经过一番调查后,我找到了一种方法,可以支持你的用例,而无需修改或复制代码。

您需要交换BundleLocalization以自己的方式加载ResourceBundle。在您的情况下,使用您的自定义ResourceBundle.Control。通过执行此操作,您可以覆盖平台正在查找MANIFEST指定的ResourceBundle。

目前,您还必须实现使用BundleLocalization的自定义TranslationService。现有的BundleTranslationProvider不会将BundleLocalization从上下文中删除。而且你需要在那里复制很多代码,因为getBundle()是私有的。我将与开发人员讨论可能的修改。

您可以在此处找到示例:https://github.com/fipro78/e4classbasedtranslation

希望能帮助您解决具体要求。