参考Wicket i18n属性文件中的特定页面

时间:2018-11-02 13:26:27

标签: internationalization wicket

我正在构建我的第一个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开头来使其工作,但这不是我想要的。我希望每个页面的国际化都包含在一个文件中。

有人可以给我一些指导吗?谢谢。

2 个答案:

答案 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,我觉得它更具可读性。当然,您可以滚动自己的更高级的资源加载器,但这对我来说已经足够了。