【问题标题】:Apache Wicket: dynamic key for message with embedded HTMLApache Wicket:嵌入 HTML 消息的动态密钥
【发布时间】:2023-03-29 01:23:01
【问题描述】:

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

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

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

=== 更新 ===

有一个 Wicket 类 org.apache.wicket.markup.resolver.WicketMessageResolver.MessageContainer 看起来很有趣。由于它是私有静态的,我不能直接使用它,但是如果我将代码复制粘贴到公共类中并调整与组件层次结构相关的一些事情,我就接近解决方案了。但这很hacky。有更清洁的解决方案吗?

【问题讨论】:

    标签: java internationalization wicket


    【解决方案1】:
    <wicket:message key="messageKey">
       <a wicket:id="link">...</a>
    </wicket:message>
    

    看起来不正确。应该是:

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

    因为我猜你希望标签是可点击的。标签是文本(即 HTML 文本节点),因此它不能有子 HTML 元素。

    同样适用于 Java 端 - 链接应该是标签的父级。

    HTH

    【讨论】:

    • 对不起,我的例子可能令人困惑。我想要做的是有一个可翻译的资源,其参数是 Wicket 组件(书签链接、ajax 链接等)并且有一个动态消息键。 wicket:message 标签效果很好,因为我可以在其中嵌套各种 Wicket 组件,但是消息键必须在 HTML 中输入,所以我不能动态选择它。
    • 您可以构建自己的组件,该组件使用 Localizer 类来获取 i18n 值。获取定位器:application.getResourceSettings().getLocalizer()。然后在您认为合适的时候使用它的 getString() 方法。我很难理解你的问题。请提供一个示例输出,并标记其中的哪一部分是 i18n,哪一部分是另一个组件。
    • 我已经添加了我目前正在使用的答案。如果您能想到更好的解决方案,请告诉我!谢谢。
    【解决方案2】:

    您可以对任何链接使用setBody() 方法以将任何模型用作链接文本。

    例如:

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

    使用 HTML:

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

    【讨论】:

      【解决方案3】:

      我最终复制/修改了 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 2014-01-06
        • 2022-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        相关资源
        最近更新 更多