2017-02-01 28 views
0

我的Eclipse 4 RCP應用程序有一個奇怪的問題,有時由於缺少contributorURI而不能翻譯某些菜單項。由fragment.e4xmi貢獻的MenuItems沒有被翻譯,contributorURI丟失

形勢

我目前正在其上由多個局部插件的一個Eclipse RCP 4應用程序。其中一個插件是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%,該MenuItems貢獻的masterclock插件沒有被翻譯,使OSGI變量的名稱作爲標籤的MenuItem

事情我已經找到了

  • 在互聯網上經過一番研究,我發現this thread這顯然說明比較類似我這樣的問題。然而,該線程已經有五年了,他們發現的描述錯誤在舊版本的Eclipse SDK中得到修復。

  • 我將ModelSpy插件導入到我的應用程序中,因爲它幫助我找到上述線程中的錯誤。在檢查MenuItems後,我發現每個項目的contributorURI沒有設置,當翻譯缺失時。

  • 翻譯完成後,contributerURI的捐款MenuItem包含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時,不會發生該問題。

有沒有人有一個想法如何解決這個問題?

+1

您使用的持久性狀態,使模型從保存的狀態重新加載或正在使用'-clearPersistedState'防止這種情況(這樣該模型是從每個片段構建的)? –

+0

我沒有使用'clearPersistedState',但是當我將它添加到我的調試配置時,問題不再發生。可能是Eclipse持久化邏輯中的一個錯誤? – appnic

+1

您可以查看'org.eclipse.e4.workbench'元數據中'workbench.xmi'文件中的持久狀態,以查看是否正在保存contributorURI。 –

回答

0

我做了一些進一步的研究,發現在我的情況下,問題與應用程序何時啓動以及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"); 
     } 
    } 
}