我正在构建我的第一个Wicket项目,并且发现代码库中的属性文件数量正在迅速增长。理想情况下,我想将所有国际化包含在每种语言/地区的单个文件中。这样我就可以轻松找到东西。
我发现我的应用程序属性文件可能是理想的选择。我的应用程序属性文件称为ApiAdminApplication.properties
。现在,我正在尝试将可翻译内容添加到此文件中,而不会造成任何混乱。
根据ComponentStringResourceLoader
的javadoc,这应该是可能的。显然,查找顺序如下:
page1.properties => form1.input1.Required
page1.properties => Required
form1.properties => input1.Required
form1.properties => Required
input1.properties => Required
myApplication.properties => page1.form1.input1.Required
myApplication.properties => Required
倒数第二行包含我正在寻找的行为,但无法正常工作。
我有一个名为CustomerEditPage
的页面,该页面又包含ID为customerForm
的表单
这就是我要添加到ApiAdminApplication.properties
中的内容,并且我认为应该根据上面的代码片段进行操作:
CustomerEditPage.customerForm.name=Customer name
遗憾的是,这不起作用。但是,我可以通过省略页面名称并以customerForm
开头来使其工作,但这不是我想要的。我希望每个页面的国际化都包含在一个文件中。
有人可以给我一些指导吗?谢谢。
答案 0 :(得分:2)
我认为ComponentStringResourceLoader的javadoc错了,应该修复。
要完成所需的操作,您需要扩展ClassStringResourceLoader
并覆盖getResourcePath()。在您的隐含中,您将必须在结果前添加拥有作为参数传递的Component的页面的名称。
然后,您需要使用ApiAdminApplication#init()
方法通过以下方式注册您的加载器:
getResourceSettings().getStringResourceLoaders().add(new MyClassStringResourceLoader(ApiAdminApplication.class))
请参见defaults。
请在https://issues.apache.org/jira/projects/WICKET/issues提交一个错误报告,以便解决javadoc问题(或者其他比我更了解如何做到这一点的人可以向我们解释)。
答案 1 :(得分:0)
报告该错误后,我最终按照martin-g的建议进行了操作,并扩展了ClassStringResourceLoader
。为方便起见,这是我所做的:
public class PrefixedStringResourceLoader extends ClassStringResourceLoader {
public PrefixedStringResourceLoader(Class<?> clazz) {
super(clazz);
}
protected String getResourcePath(final Component component) {
final Class<? extends Page> parentClass = component.getPage().getClass();
final String resPath = super.getResourcePath(component);
if (!resPath.isEmpty())
return String.format("%s.%s", parentClass.getSimpleName(), resPath);
return parentClass.getSimpleName();
}
}
有一个小陷阱。它始终需要您使用完整的资源路径。这可能有点棘手,下面的代码段存在一些问题:
<input type="submit" wicket:id="save" wicket:message="value:save" />
计算结果为CustomerEditPage.customerForm.save.save
,我希望它变成:CustomerEditPage.customerForm.save
。并非如此,因为wicket:message实际上成为保存表单输入的子代。
我最终去了:
<input type="submit" wicket:id="save" wicket:message="value:caption" />
哪个计算为CustomerEditPage.customerForm.save.caption
,我觉得它更具可读性。当然,您可以滚动自己的更高级的资源加载器,但这对我来说已经足够了。