2014-12-04 50 views
1

Wicket支持包含HTML元素(如链接等)的复杂可翻译消息,如https://cwiki.apache.org/confluence/display/WICKET/Everything+about+Wicket+internationalization中所述,使用wicket:message。例如: -Apache Wicket:带有嵌入式HTML的消息的动态密钥

<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中动态确定。对于常规消息(带有字符串参数),我可以用LabelStringResourceModel这样做,将密钥作为参数。但是,对于包含Wicket组件作为参数的消息,我该如何做同样的事情呢?我猜这个标记看起来像这样:

<span wicket:id="messageId"> 
    <a wicket:id="link"><wicket:message key="linkLabel"></wicket:message></a> 
<span> 

但是Java会是什么? Label不能照看孩子。 :(

=== UPDATE ===

有一个检票类org.apache.wicket.markup.resolver.WicketMessageResolver.MessageContainer看起来有趣。因为它是私有静态,我不能直接使用它,但如果我复制的代码粘贴到一个公共类及修改相关组件层次夫妇的事情,我越来越接近解决办法,而这是相当哈克是否有一个清晰的解决方案

回答

-1

我结束了复制/修改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是否是真的还是假的渲染HTML将看起来像:

<a href="/profile">totof3110</a> logged in. 

<a href="/profile">totof3110</a> logged out. 
0
<wicket:message key="messageKey"> 
    <a wicket:id="link">...</a> 
</wicket:message> 

看起来不正确的它应该是:。?。

<a wicket:id="link"><wicket:message key="messageKey"/></a> 

因为我想你想要标签是可点击的。标签是一个文本(即HTML文本节点),所以它不能有子元素的HTML元素。

同样适用于Java方面 - 链接应该是标签的父项。

HTH

+0

对不起我的例子可能会造成混乱。我想要做的是有一个可翻译的资源,参数是Wicket组件(可加入书签的链接,ajax链接等),并有一个动态的消息密钥。 wicket:message标签的功能非常好,因为我可以在其中嵌入各种Wicket组件,但是必须在HTML中输入消息密钥,所以我不能动态选择它。 – 2014-12-04 23:23:57

+0

您可以构建自己的使用Localizer类获取i18n值的组件。获取本地化器:application.getResourceSettings()。getLocalizer()。然后根据您的需要使用它的getString()方法。我很难理解你的问题。请提供一个示例输出并标记哪部分是i18n,哪部分是另一部分。 – 2014-12-05 07:17:11

+0

我已经添加了我目前使用的答案。让我知道你是否能想出更好的解决方案!谢谢。 – 2014-12-09 07:19:28

0

可以使用setBody()方法的任何链接使用任何模型作为链接文字。

例如:

Link l = new AjaxLink("linkid"); 
l.setBody(new StringResourceModel(...)); 

随着HTML:

<a wicket:id="linkid">this text will be replaced by the model</a>