Wicket有一个flexible internationalisation system,它以多种方式支持对UI消息进行参数化。有例子例如在StringResourceModel javadocs中,例如:

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

但是我想要一个真正的简单的,并且找不到一个很好的例子。

在.properties文件中考虑这种UI消息:
msg=Value is {0}

具体来说,我不想为此目的而创建模型对象(用 setter/getter 代替要替换的值;如上述示例中的WeatherStation)。如果我已经在局部变量中包含值,那就太过分了,否则就不需要此类对象了。

这是一种用正确的值替换{0}的愚蠢的“蛮力”方法:
String value = ... // contains the dynamic value to use
add(new Label("message", getString("msg").replaceAll("\\{0\\}", value)));

是否有一种干净的,更为Wicket-y的方式来实现(这比上述时间长得多)

最佳答案

我认为最一致的 WICKETY 方式可以通过使用Jonik's answer改进 MessageFormat 来实现:

。特性:

msg=Saving record {0} with value {1}

.java:
add(new Label("label", MessageFormat.format(getString("msg"),obj1,obj2)));
//or
info(MessageFormat.format(getString("msg"),obj1,obj2));

我为什么喜欢它:
  • 干净,简单的解决方案
  • 使用纯Java,别无其他
  • 您可以根据需要替换任意多个值
  • 使用标签,info(),验证等。
  • 不是完全wickety,但它与wicket一致,因此您可以使用StringResourceModel重用这些属性。

  • 笔记:

    如果要使用模型,则只需要创建一个简单的模型即可覆盖该模型的toString函数,如下所示:
    abstract class MyModel extends AbstractReadOnlyModel{
        @Override
        public String toString()
        {
            if(getObject()==null)return "";
            return getObject().toString();
        }
    }
    

    并将其作为MessageFormat参数传递。

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

    09-10 08:51
    查看更多