【问题标题】:MenuItems contributed by fragment.e4xmi are not being translated, contributorURI is missing由 fragment.e4xmi 贡献的 MenuItems 没有被翻译,contributorURI 丢失
【发布时间】:2017-06-18 00:45:41
【问题描述】:

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

情况

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

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

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

我已经发现的事情

  • 在网上查了一些资料,发现this thread 明显描述了一个和我比较相似的问题。然而,该线程已经有五年的历史了,他们发现的描述的错误已在旧版本的 Eclipse SDK 中修复。

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

  • 当翻译正确完成时,贡献的MenuItemcontributerURI 包含platform:/plugin/com.mobatime.nms.masterclock.common.ui

其他信息

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

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

【问题讨论】:

  • 您是使用持久化状态以便从保存状态重新加载模型,还是使用-clearPersistedState 来防止这种情况(因此模型每次都是从片段构建的)?
  • 我没有使用clearPersistedState,但是当我将它添加到我的调试配置中时,问题不再出现。可能是 Eclipse 的持久性逻辑中的一个错误?
  • 您可以查看org.eclipse.e4.workbench 元数据中workbench.xmi 文件中的持久化状态,以查看contributorURI 是否正在保存。
  • 工作台文件没有保存受影响MenuItems的contributorURI...我在原帖中添加了新信息。

标签: java eclipse osgi eclipse-rcp


【解决方案1】:

我做了一些进一步的研究,发现就我而言,问题与应用程序启动和 application.e4xmi 加载的时间有关。

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

我目前的解决方法是在应用程序启动时手动为受影响的 MenuItems 设置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");
        }
    }
}

【讨论】:

    【解决方案2】:

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

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      相关资源
      最近更新 更多