Wicket支持复杂的可翻译消息,其中包含HTML元素(如链接等),如https://cwiki.apache.org/confluence/display/WICKET/Everything+about+Wicket+internationalization中所述,使用wicket:message。例如:
<wicket:message key="messageKey">
<a wicket:id="link"><wicket:message key="linkLabel"></wicket:message></a>
</wicket:message>
和属性:
messageKey=Click on ${link}
和在Java中
add(new BookmarkablePage<Void>("link", SomePage.class);
这很好用,但是消息键是硬编码在HTML中的。
就我而言,我希望在Java中动态确定消息密钥。对于常规消息(带有字符串参数),我可以使用aLabel
和aStringResourceModel
将键作为参数。但是,对于包含Wicket组件作为参数的消息,我该怎么做?我猜标记看起来像这样:
<span wicket:id="messageId">
<a wicket:id="link"><wicket:message key="linkLabel"></wicket:message></a>
<span>
但是Java是什么呢?Label
不能有孩子。:(
===更新===
有一个org.apache.wicket.markup.resolver.WicketMessageResolver.MessageContainer
看起来很有趣的Wicket类。由于它是私有静态的,因此我不能直接使用它,但是如果我将代码复制粘贴到公共类中并调整与组件层次结构有关的几件事,那么我将接近解决方案。但是,这很hacky。有没有更清洁的解决方案?
我最终复制/修改了Wicket的私有类MessageContainer(嵌套在org.apache.wicket.markup.resolver.WicketMessageResolver中),如下所示:
https://gist.github.com/totof3110/cf5f05731816a58d8597
然后,我可以像这样编写Java代码:
final String messageKey;
if (userLoggedIn) {
messageKey = "logged.in";
} else {
messageKey = "logged.out";
}
MessageContainer message = new MessageContainer("message", messageKey);
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>("link", UserProfilePage.class);
link.add(new Label("username", user.getUsername());
message.add(link);
add(message);
HTML看起来像:
<span wicket:id="message">
<a wicket:id="link"><span wicket:id="username"></span></a>
</span>
属性文件如下所示:
logged.in = ${link} logged in.
logged.out = ${link} logged out.
根据userLoggedIn是true还是false,呈现的HTML将如下所示:
<a href="/profile">totof3110</a> logged in.
或者
<a href="/profile">totof3110</a> logged out.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句