【发布时间】:2017-01-08 10:24:12
【问题描述】:
我想为 wicket 7 应用程序实现 i18n 支持。
要求:
- 翻译必须易于管理员用户编辑
- 翻译必须在不重新部署的情况下进行
我的实际方法是将翻译保存在数据库中。所有翻译都将被缓存。如果前端任务更改了翻译,则缓存和数据库将被更新。 到目前为止一切顺利。
实际上,我一直在替换页面内的翻译。 一个可行的解决方案是在实施期间加载每个翻译。这些翻译将设置在许多检票口元素中。 我不喜欢这种方法,因为它会严重混淆代码(html + java)。
我将尝试在我的实际方法中实现替换机制。页面渲染完成后,该机制贯穿整个页面并在做这些工作:
- 搜索所有占位符
- 加载占位符键的翻译(缓存)
- 用翻译替换占位符
这应该适用于正文和标题(网站的标题)
这是一个检票模板的例子
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${landingpage.site.title}</title>
</head>
<body>
<header wicket:id="headerPanel">header</header>
${welcome.message}
<footer wicket:id="footerPanel">footer</footer>
</body>
</html>
在这种情况下,${landingpage.site.title} 和 ${welcome.message} 应该被识别和替换。如您所见,它是在模板中直接定义的,而不是在 java 代码中。这就是我想要实现的目标。
我希望我的要求足够明确。如果没有,请不要介意评论。我会更新问题以使其更清楚。
我的方法是实现一个BasePage(扩展页面)并覆盖onAfterRender-Method
@Override
protected void onAfterRender() {
super.onAfterRender();
Response originalResponse = RequestCycle.get().getResponse();
String updatedResponse = replaceWithTranslations(originalResponse);
originalResponse.reset();
originalResponse.write(updatedResponse);
}
replaceWithTranslations 方法尚未实现,实际上返回一个简单的字符串。此方法应将 originalRepsonse 的输出流转换为字符串,搜索占位符并将其替换为 db 的值。
这种方法似乎有2个困难:
- 我没有收到字符串形式的响应
- 我收到 WicketRuntimeException(Page.java:666 中的 Page.checkRendering)
任何建议都会很棒!
【问题讨论】:
-
为什么不使用 Wicket 的 i18n 方法?与
<wicket:message>等? (见:ci.apache.org/projects/wicket/guide/7.x/guide/i18n.html) -
第一次阅读这篇文章让我感到很生气。所有模板都与
混淆。并且只描述了本地化属性文件的使用。在其他网站上我读到:wicket 无法处理其他输入。现在我知道这些信息是垃圾。感谢您的建议!你能看看下面的解决方案,如果这是这样做的方法吗?
标签: java database internationalization wicket