eclipse RCP中的plugin.properties机制

Mar*_*erg 7 java rcp plugins fragment

我的项目包括多个插件,每个插件都包含plugin.properties文件,有近20个翻译.MANIFEST.MF文件定义存储外部插件字符串的属性文件的名称.

Bundle-Localization: plugin
Run Code Online (Sandbox Code Playgroud)

我定义的插件的名称

%plugin.name
Run Code Online (Sandbox Code Playgroud)

Eclipse将在运行时搜索plugin.properties文件中的"%plugin.name".

哪个类读出了MANIFEST.MF Bundle-Localization条目,并且在"plugin.properties"文件中搜索了带有起始'%'后缀的字符串?

我想以这种方式找到并修补这些类,我可以先查看一些其他目录/文件中的"%plugin.name"标识符.使用这些新机制,我可以在我的产品中添加片段并覆盖"plugin.properties"文件中的单行,而无需更改原始插件.通过这些机制,我可以通过添加不同的片段为多个客户创建构建过程.片段包括他们想要更改的客户名称和特殊字符串.

我想这样做,因为片段机制只将文件添加到原始插件.当插件中存在"plugin.properties"文件时,将忽略片段"plugin.properties"文件.

更新1:

方法

class ManifestLocalization{
...
protected ResourceBundle getResourceBundle(String localeString) {
}
...
}
Run Code Online (Sandbox Code Playgroud)

返回给定语言环境字符串的属性文件的ResourceBundle.当有人知道我现在如何首先查看片段以获取资源路径时请发布它.

更新2:

类ManifestLocalization中的方法

    private URL findInResolved(String filePath, AbstractBundle bundleHost) {

        URL result = findInBundle(filePath, bundleHost);
        if (result != null)
            return result;
        return findInFragments(filePath, bundleHost);
    }
Run Code Online (Sandbox Code Playgroud)

搜索属性文件并对其进行缓存.翻译可以从缓存文件中获取.问题是,完整文件是缓存的而不是单个翻译.

解决方案是首先读取片段文件,而不是读取包文件.当两个文件都存在时,将它们合并到一个文件中,并将新属性文件写入磁盘.返回新属性文件的URL,以便可以缓存新的propetries文件.

Mar*_*ler 3

虽然我得到的信息是错误的......我也遇到了完全相同的问题。该插件未激活两次,我无法获取片段捆绑本地化密钥。

我希望在plugin.properties 中包含我所有的语言翻译(我知道这是不受欢迎的,但管理单个文件要容易得多)。

我(一半)通过使用解决了这个问题

public void populate(Bundle bundle) {
    String localisation = (String) bundle.getHeaders().get("Bundle-Localization");
    Locale locale = Locale.getDefault();

    populate(bundle.getEntry(getFileName(localisation)));
    populate(bundle.getEntry(getFileName(localisation, locale.getLanguage())));
    populate(bundle.getEntry(getFileName(localisation, locale.getLanguage(), locale.getCountry())));
    populate(bundle.getResource(getFileName("fragment")));
    populate(bundle.getResource(getFileName("fragment", locale.getLanguage())));
    populate(bundle.getResource(getFileName("fragment", locale.getLanguage(), locale.getCountry())));
}
Run Code Online (Sandbox Code Playgroud)

并简单地将我的片段本地化文件名命名为“fragment.properties”。

这不是特别优雅,但很有效。

顺便说一句,要从片段中获取文件,您需要 getResource,片段文件似乎位于类路径上,或者仅在使用 getResource 时搜索。

如果有人有更好的方法,请指正。

一切顺利,

标记。