2017-02-01 10 views
0

Eclipse 4 RCPアプリケーションに奇妙な問題があります.のためにメニュー項目を翻訳しないことがあります。私は現在、複数のローカライズされたプラグインで構成されていEclipseの4 RCPアプリケーションに取り組んでいますfragment.e4xmiによって寄贈されたMenuItemsは翻訳されていません、contributorURIがありません

状況

これらのプラグインの1つはcom.mobatime.nms.masterclock.common.uiです。そのfragment.e4xmiは、他のプラグインのApplication.e4xmicom.mobatime.nms.app)によって "制御"されているローカライズされたMenuItemsをメインメニューバーに提供します。ローカライズされているとは、MenuItemのラベルが、OSGI-INF/l10n/bundle.propertiesファイルで定義されているOSGI変数(たとえば%commands.somecommand)であることを意味します。 OSGI変数の名前はMenuItemのラベルとして使用されるように

しかし、自分のアプリケーションのすべての開始の約50%に、masterclockプラグインによって寄与MenuItemsは、翻訳されていません。

物事私はすでにインターネット上でいくつかの研究の後

  • を発見し、私は明らかに私の比較的類似の問題を説明しthis threadを見つけました。しかし、このスレッドはすでに5才であり、発見されたバグは古いバージョンの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ファイルでは、寄与URIが影響を受けるMenuItemsに保存されていません。
  • -clearPersistedStateを使用する場合、問題は発生しません。

これはどのように修正できますか?

+1

モデルが保存された状態から再ロードされるように、あなたは永続状態を使用していたり​​しますが、これを防ぐために、 '-clearPersistedState'を使用しています(そうモデルはそのたびにフラグメントから構築されます)。 –

+0

私は 'clearPersistedState'を使用していませんが、それを私のデバッグ設定に追加すると、問題はもう発生しません。 Eclipseの永続性ロジックのバグでしょうか? – appnic

+1

'org.eclipse.e4.workbench'メタデータの' workbench.xmi'ファイルで永続状態を見て、contributorURIが保存されているかどうかを調べることができます。 –

答えて

0

は、私はいくつかのさらなる研究を行なったし、私の場合には、問題は、アプリケーションが起動し、application.e4xmiがロードされたときに関連している、ということが分かりました。

影響を受けるMenuItemの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"); 
     } 
    } 
} 
関連する問題