由fragment.e4xmi提供的MenuItems未被翻译,缺少contributorURI

时间:2017-02-01 10:06:44

标签: java eclipse osgi eclipse-rcp

我的Eclipse 4 RCP应用程序存在一个奇怪的问题,由于缺少contributorURI,有时无法翻译某些菜单项。

情况

我目前正在开发一个Eclipse 4 RCP应用程序,它由多个本地化插件组成。

其中一个插件是com.mobatime.nms.masterclock.common.ui。其fragment.e4xmi为主菜单栏提供了一些本地化的MenuItems,该菜单栏由另一个插件Application.e4xmicom.mobatime.nms.app”控制。对于本地化,我的意思是MenuItem的标签是在OSGI文件中定义的%commands.somecommand变量(例如OSGI-INF/l10n/bundle.properties)。

但是,在我的应用程序的所有启动的大约50%上,MenuItems插件所贡献的masterclock未被翻译,因此{的名称{1}}变量用作OSGI的标签。

我已经找到的东西

  • 经过对互联网的一些研究,我发现this thread显然描述了一个与我相似的问题。但是,该线程已有五年的历史了,他们发现的描述错误已在旧版Eclipse SDK中得到修复。

  • 我将ModelSpy插件导入到我的应用程序中,因为它有助于在我上面提到的线程中找到错误。在检查MenuItem 后,我发现在缺少翻译时,每个项目的MenuItems都未设置

  • 翻译完成后,提供的contributorURI的{​​{1}}包含contributerURI

其他信息

  • 我们使用最新版本的Eclipse库(SDK,RCP等)。
  • 这些库的旧版本也出现了问题(我们之前使用的是4.4.2版本)。
  • Eclipse IDE中的常规构建和调试会话没有区别,错误无处不在。
  • 在其他项目上,MenuItem正在正确填写。
  • platform:/plugin/com.mobatime.nms.masterclock.common.ui元数据的contributorURI文件中,contributorURI未保存在受影响的workbench.xmi上。
  • 使用org.eclipse.e4.workbench时,问题不会发生。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我做了一些进一步的研究,发现在我的情况下,问题与应用程序何时启动并且加载了application.e4xmi有关。

受影响的MenuItems的contributorUri正在被正确保存到该文件中(与我在初始帖子中写的相反),但是当从文件加载应用程序模型时,Uri无法从文件中正确读取或未设置为MenuItem。

我目前的解决方法是在应用程序启动时手动为受影响的MenuItem设置contributorUri。这很可能不是最好的解决方案,但它现在有效:

MTrimmedWindow trim = (MTrimmedWindow) modelService.find("your-window-id", application);
MMenu menu = (MMenu)modelService.find("your-menu-id", trim.getMainMenu());
if(menu != null) {
    for(MMenuElement item : menu.getChildren()) {
        if(item instanceof MHandledMenuItem && item.getElementId().contains("some-common-string-in-the-menuitem-id")) {
                item.setContributorURI("platform:/plugin/com.example.yourcontributingplugin");
        }
    }
}

答案 1 :(得分:0)

我不知道这个问题是否仍然具有相关性,但我遇到了类似的问题并在不需要解决方法的情况下解决了它:在我的情况下,它有助于将 plugin-xml 中的 apply-property 设置为 always或默认。之前设置为不存在

<extension
     id=*yourextensionid*
     point="org.eclipse.e4.workbench.model">
  <fragment
        uri="fragment.e4xmi">
  </fragment>

<extension
     id=*yourextensionid*
     point="org.eclipse.e4.workbench.model">
  <fragment
        apply="always"
        uri="fragment.e4xmi">
  </fragment>