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));
我为什么喜欢它:
StringResourceModel
重用这些属性。 笔记:
如果要使用模型,则只需要创建一个简单的模型即可覆盖该模型的
toString
函数,如下所示:abstract class MyModel extends AbstractReadOnlyModel{
@Override
public String toString()
{
if(getObject()==null)return "";
return getObject().toString();
}
}
并将其作为
MessageFormat
参数传递。我不知道为什么Wicket在反馈消息中不支持
Model
。但是如果得到支持,则没有理由使用这些解决方案,您可以在任何地方使用StringResourceModel
。