留意Wicket的最新房产

时间:2013-10-07 07:33:06

标签: internationalization wicket

在我目前的项目中,我们需要为短信员实施一种方法,通过上传属性文件来管理wicket消息/国际化。

另请参阅此问题:Administrating internationalized wicket applications

正如那里所建议的,我已经实现了一个自定义IStringResourceLoader并将其添加到StringResourceLoader列表的开头,以覆盖已经存在的任何属性:

getResourceSettings().getStringResourceLoaders().add(0, new CustomStringResourceLoader()); 

但这还不够,因为更新可能会发生,需要在运行时加载。 StringResources由wicket缓存,仅在触发ResourceWatcher时更新。

我发现Wicket将字符串资源添加到观察者的位置:设置中的PropertiesFactory。向观察者添加资源的方法是addToWatcher(...)。然而,这种方法受到保护,整个设置也表明这用于开发目的,而不是用于生产。

我设法通过扩展PropertiesFactory并有效创建自定义版本来添加到设置中来使用此方法:

getResourceSettings().setPropertiesFactory(new CustomPropertiesFactory(getResourceSettings()));
getResourceSettings().setResourcePollFrequency(Duration.seconds(1));

所以我的问题是:我觉得这是一个非常迂回的解决方案。还有另一种方法可以监视更改属性文件吗?

1 个答案:

答案 0 :(得分:0)

我对问题的解决方案:

getResourceSettings().getStringResourceLoaders().add(0, new CustomResourceLoader());
getResourceSettings().getResourceFinders().add(new Path("/pathToResources"));
getResourceSettings().setResourcePollFrequency(Duration.seconds(1));

这会在列表的开头插入我的CustomResourceLoader,以便首先检查所有属性。

添加的Path告诉PropertiesFactory在wicket之外的给定任意目录中查找资源。

我也需要资源文件的自定义名称,我在CustomResourceLoader

中意识到了这一点
public String loadStringResource(final Class<?> clazz, final String key, final Locale locale, final String style, final String variation) {
    final String myResourceFilename = createCustomResourceFileName(locale); 
    final IPropertiesFactory pF = Application.get().getResourceSettings().getPropertiesFactory();
    final org.apache.wicket.resource.Properties props = pF.load(clazz, myResourceFilename);
    ...
}

使用PropertiesFactory加载文件时,会自动将其添加到内部IModificationWatcher

事实证明,部分问题是资源文件采用非标准编码。这可以通过在设置中为IPropertyLoader添加特殊PropertiesFactory来解决:

((PropertiesFactory) getResourceSettings().getPropertiesFactory()).getPropertiesLoaders().add(0,
            new UtfPropertiesFilePropertiesLoader("properties", "your-favorite-encoding"));