fragment.e4xmi 提供的 MenuItems 未被翻译,contributorURI 丢失
MenuItems contributed by fragment.e4xmi are not being translated, contributorURI is missing
我的 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
没有设置 时缺少翻译。
如果翻译正确,贡献的 MenuItem
的 contributerURI
包含 platform:/plugin/com.mobatime.nms.masterclock.common.ui
.
附加信息
- 我们使用最新版本的 Eclipse 库(SDK、RCP 等)。
- 这些库的旧版本也会出现此问题(我们之前使用的是 4.4.2 版)。
- 在 Eclipse 中常规构建和调试会话之间没有区别IDE,错误无处不在。
- 在其他项目上,
contributorURI
填写正确。
- 在
org.eclipse.e4.workbench
元数据的 workbench.xmi
文件中,贡献者 URI 未保存在受影响的 MenuItems
。
- 使用
-clearPersistedState
时,问题未出现。
有人知道如何解决这个问题吗?
我做了一些进一步的研究,发现在我的情况下,问题与应用程序启动和加载 application.e4xmi 的时间有关。
受影响的 MenuItems 的 contributorUri 被正确保存到该文件中(与我在初始 post 中所写的内容相矛盾),但是当从文件加载应用程序模型时,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");
}
}
}
我不知道这个问题是否仍然相关,但我遇到了类似的问题并在不需要变通方法的情况下解决了它:在我的例子中,它有助于设置 apply-属性 plugin-xml 始终或默认。在设置为 notexists
之前
<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>
我的 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
没有设置 时缺少翻译。如果翻译正确,贡献的
MenuItem
的contributerURI
包含platform:/plugin/com.mobatime.nms.masterclock.common.ui
.
附加信息
- 我们使用最新版本的 Eclipse 库(SDK、RCP 等)。
- 这些库的旧版本也会出现此问题(我们之前使用的是 4.4.2 版)。
- 在 Eclipse 中常规构建和调试会话之间没有区别IDE,错误无处不在。
- 在其他项目上,
contributorURI
填写正确。 - 在
org.eclipse.e4.workbench
元数据的workbench.xmi
文件中,贡献者 URI 未保存在受影响的MenuItems
。 - 使用
-clearPersistedState
时,问题未出现。
有人知道如何解决这个问题吗?
我做了一些进一步的研究,发现在我的情况下,问题与应用程序启动和加载 application.e4xmi 的时间有关。
受影响的 MenuItems 的 contributorUri 被正确保存到该文件中(与我在初始 post 中所写的内容相矛盾),但是当从文件加载应用程序模型时,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");
}
}
}
我不知道这个问题是否仍然相关,但我遇到了类似的问题并在不需要变通方法的情况下解决了它:在我的例子中,它有助于设置 apply-属性 plugin-xml 始终或默认。在设置为 notexists
之前<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>