2014-02-14 20 views
0

我們從我們的數據庫中加載我們的翻譯。要檢索捆綁我們有一個自定義java.util.ResourceBundle.ControlEclipse-RCP:使用自定義ResourceBundle.Control獲取ResourceBundles

把我們E4 RCP應用程序,我已經創建了一個TranslationService,我添加到使用的插件根上下文。這是沒有問題的(只有我不得不復制BundleTranslationProvider的95%,因爲我沒有看到任何其他方式)。

現在我想用new Message Extension(與Eclipse月神推出)的休息翻譯。據我可以看到從默認MessageFactoryServiceImpl來源,似乎並沒有一個簡單的方法注入我的ResourceBundle.Control那裏。

linked blog series,從數據庫中獲取該資源束的使用情況進行了說明,但解決了通過使用基於類資源包。這是沒有選擇的,因爲我無法爲每個資源包和每個區域設置實現一個類。從數據庫加載資源包的原因是能夠在不重新部署應用程序的情況下將翻譯部署到新的語言中。

通過複製99%的默認MessageFactoryServiceImpl來創建我自己的IMessageFactoryService來實現這一點,只是爲了將我們的控制權傳遞給對ResourceBundleHelper的調用?

回答

1

在對此進行了一些調查之後,我發現了一種可以在不修改或複製代碼的情況下支持您的用例的方法。

您需要交換BundleLocalization來以您的方式加載ResourceBundle。在你的情況下使用你的自定義ResourceBundle.Control。通過這樣做,您可以重寫該平臺正在查找由MANIFEST指定的ResourceBundle。

此刻,您還必須實現使用您的BundleLocalization的自定義TranslationService。現有的BundleTranslationProvider不會將BundleLocalization置於上下文之外。你需要在那裏複製很多代碼,因爲getBundle()是私有的。我會與開發人員討論可能的修改。

您可以在這裏找到一個例子:https://github.com/fipro78/e4classbasedtranslation

希望幫助您解決您的具體要求。

+0

啊,我不知道BundleTranslationProvider是導出的。我以爲是因爲它是在一個內部的包中,它是私人的。延長該課程是否存在?但太糟糕了,getBundle方法是私有的,所以我仍然需要複製它。 –

+0

似乎在ResourceBundleHelper和BundleTranslationProvider中有一些重複的代碼用於從contributionUri中檢索Bundle。 –

+0

工程就像一個魅力。非常感謝你。雖然我沒有使用LifecycleManager,但使用插件將我的BundleLocalisation和TranslationService設置爲IEclipseContext。你看到這個問題嗎? https://gist.github.com/tschulte/9003397 –

1

AFAIK ResourceBundle.Control用於加載ResourceBundles。在新的Message Extension中,我們使用一個自定義的ResourceBundle.Control來啓用OSGi上下文中的ResourceBundles的加載,並且可以通過批註進行配置。

交換ResourceBundle.Control的AFAICS將打破新消息擴展支持的任何其他用例。

是,你爲什麼要使用自定義的ResourceBundle.Control,而不是創建一個基於資源包一類的問題?我還沒有嘗試過,但也許可以創建只有基本ResourceBundle(沒有區域設置信息),並以另一種方式確定區域設置比使用getLocale()。

但不知道你在自定義的ResourceBundle.Control在做什麼,我不知道怎麼回答,什麼建議。當然,我們可以爲此打開API,但正如我之前所說的,那麼使用默認實現的其他所有插件都將失敗。

也許你可以給你在做什麼確切一些提示,我可以告訴你的方式來實現以另一種方式你的目標。

+0

我們的控件確實從服務器加載資源包。另外它支持UTF-8資源捆綁。如果可以在基於類的資源包中使用我們的Control,並且如果足以創建基本資源包類並以另一種方式確定區域設置,那麼我可以忍受這一點。我已經計劃從資源包生成消息類,並且可以添加包類的生成。所以它不會增加任何額外的開發時間開銷。我會試試這個。 –

+0

據我所知,使用基於類的rb不適用於應用程序模型。 –

+1

您不能簡單地爲應用程序模型使用基於類的資源包。因爲默認TranslationService是BundleTranslationProvider,它只能使用基於屬性文件的資源包,可以通過MANIFEST.MF進行配置。但是您可以創建一個新的翻譯服務,它在基於類的資源包上進行操作並註冊該翻譯服務。 –

相關問題