在Wicket中使用参数化UI消息的简单方法?

Jon*_*nik 11 java wicket properties internationalization

Wicket拥有灵活的国际化系统,支持以多种方式对UI消息进行参数化.例如在StringResourceModel javadocs中有例如:

WeatherStation ws = new WeatherStation();
add(new Label("weatherMessage", new StringResourceModel(
    "weather.${currentStatus}", this, new Model<String>(ws)));
Run Code Online (Sandbox Code Playgroud)

但我想要一些非常简单的东西,并且找不到一个很好的例子.

在.properties文件中考虑这种UI消息:

msg=Value is {0}
Run Code Online (Sandbox Code Playgroud)

具体来说,我不想为此目的创建一个模型对象(使用要替换的值的getter;如上例中的WeatherStation).如果我已经拥有局部变量中的值,那就太过分了,否则就不需要这样的对象了.

这是用正确的值替换{0}的一种愚蠢的"蛮力"方式:

String value = ... // contains the dynamic value to use
add(new Label("message", getString("msg").replaceAll("\\{0\\}", value)));
Run Code Online (Sandbox Code Playgroud)

是否有一个干净的,更多的Wicket-y方式来做到这一点(这不是比上面的长得多)

sve*_*ier 12

看看StringResourceModel javadoc中的示例4 - 您可以传递空模型和显式参数:

add(new Label("message",
         new StringResourceModel(
             "msg", this, null, value)));

msg=Value is {0}
Run Code Online (Sandbox Code Playgroud)


小智 5

有一种方法,虽然仍然涉及创建模型,但不需要带有getter的bean.

在属性文件中给出此消息:

msg=${} persons
Run Code Online (Sandbox Code Playgroud)

以下是如何使用值替换占位符,无论是局部变量,字段还是文字:

add(new Label("label", new StringResourceModel("msg", new Model<Serializable>(5))));
Run Code Online (Sandbox Code Playgroud)

  • $ {}只是对模型对象本身进行方法调用的简写.不知道这个名字.$ {}我相信只是做了model.toString(),但是对于像页面标题的资源键名称的约定,你可以做类似"add(new title("title",new StringResourceModel("$ { class.simpleName} .title",this,currentPageModel))" (2认同)

Hos*_*asr 5

我认为最稳定的WICKETY方式可以通过改进来完成Jonik的回答MessageFormat

。特性:

msg=Saving record {0} with value {1}
Run Code Online (Sandbox Code Playgroud)

.java:

add(new Label("label", MessageFormat.format(getString("msg"),obj1,obj2)));
//or
info(MessageFormat.format(getString("msg"),obj1,obj2));
Run Code Online (Sandbox Code Playgroud)

为什么我喜欢它:

  • 干净、简单的解决方案
  • 使用纯 Java 而没有别的
  • 您可以根据需要替换任意数量的值
  • 使用标签、info()、验证等。
  • 它不是完全 wickety 但它与 wicket 一致,因此您可以将这些属性与StringResourceModel.

笔记:

如果你想使用模型,你只需要创建一个简单的模型来覆盖模型的toString功能,如下所示:

abstract class MyModel extends AbstractReadOnlyModel{
    @Override
    public String toString()
    {
        if(getObject()==null)return "";
        return getObject().toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其作为MessageFormat参数传递。

我不知道为什么 Wicket 不支持Model反馈消息。但是如果它得到支持,就没有理由使用这些解决方案,你可以StringResourceModel在任何地方使用。