私のプロジェクトには複数のプラグインが含まれており、すべてのプラグインには20近くの翻訳を含むplugin.propertiesファイルが含まれています。MANIFEST.MFファイルは、外部プラグイン文字列が保存されているプロパティファイルの名前を定義します。
Bundle-Localization: plugin
私が定義するプラグインの名前
%plugin.name
Eclipseは、実行時にplugin.propertiesファイルの「%plugin.name」を検索します。
どのクラスがMANIFEST.MFBundle-Localizationエントリを読み取り、どの時点で「plugin.properties」ファイルで「%」という接尾辞が付いた文字列が検索されますか?
この方法でこれらのクラスを見つけてパッチを適用したいので、最初に他のディレクトリ/ファイルで「%plugin.name」識別子を調べます。これらの新しいメカニズムを使用すると、元のプラグインを変更せずに、製品にフラグメントを追加し、「plugin.properties」ファイルの1行を上書きできます。これらのメカニズムを使用すると、さまざまなフラグメントを追加するだけで、複数の顧客向けのビルドプロセスを作成できます。顧客名と変更したい特別な文字列を含むフラグメント。
フラグメントメカニズムは元のプラグインにファイルを追加するだけなので、そのようにしたいです。「plugin.properties」ファイルがプラグインに存在する場合、フラグメント「plugin.properties」ファイルは無視されます。
更新1:
方法
class ManifestLocalization{
...
protected ResourceBundle getResourceBundle(String localeString) {
}
...
}
指定されたロケール文字列のプロパティファイルのResourceBundleを返します。誰かがリソースパスを取得するために最初にフラグメントを調べる方法を知ったら、それを投稿してください。
更新2:
クラスManifestLocalizationのメソッド
private URL findInResolved(String filePath, AbstractBundle bundleHost) {
URL result = findInBundle(filePath, bundleHost);
if (result != null)
return result;
return findInFragments(filePath, bundleHost);
}
プロパティファイルを検索してキャッシュします。翻訳は、キャッシュされたファイルから取得できます。問題は、単一の翻訳ではなく、ファイル全体がキャッシュされることです。
解決策は、バンドルファイルを読み取るのではなく、最初にフラグメントファイルを読み取ることです。両方のファイルが存在する場合は、それらを1つのファイルにマージし、新しいプロパティファイルをディスクに書き込みます。新しいプロパティファイルのURLが返されるため、新しいプロパティファイルをキャッシュできます。