Internationalization Wicket中表单组件的国际化标签
如何正确地为表单组件创建国际化标签,以便在显示反馈消息时,在java代码中显示国际化字段名而不是字段名 我读过: 以及wicket的xhtml标记文档:Internationalization Wicket中表单组件的国际化标签,internationalization,wicket,Internationalization,Wicket,如何正确地为表单组件创建国际化标签,以便在显示反馈消息时,在java代码中显示国际化字段名而不是字段名 我读过: 以及wicket的xhtml标记文档: 有没有可能以一种更舒适的方式来实现这一点?我刚刚测试了以下内容: <form wicket:id="form"> <label for="input"><wicket:message key="input">some input</wicket:message></lab
有没有可能以一种更舒适的方式来实现这一点?我刚刚测试了以下内容:
<form wicket:id="form">
<label for="input"><wicket:message key="input">some input</wicket:message></label>
<input wicket:id="input" type="text" name="input">
<input type="submit" value="submit">
</form>
这导致出现以下屏幕(如果我将必填字段留空并按submit)
这就是你想要的吗?这里有一种替代方法,对我来说一直很有效(我不知道
)
发生验证错误时,FormComponent
显示的文本可以通过指定。显示的文本将是IModel
的getObject()
的结果
请注意,这与
无关。FormComponentLabel
是一个可用于建模
标记的组件
您甚至可以将FormComponentLabel子类化,以提供基于FormComponent.getLabel()
的标签文本,并在需要该字段时输出一个额外的标记:
public class MyLabel extends SimpleFormComponentLabel{
private boolean required;
public MyLabel (String id, LabeledWebMarkupContainer labelProvider) {
super(id, labelProvider);
if (labelProvider instanceof FormComponent){
required = ((FormComponent)labelProvider).isRequired();
}
}
protected void onComponentTagBody(final MarkupStream markupStream,
final ComponentTag openTag) {
String mark = "";
if (required){
// could be for instance "*"
mark = getString("formResources.requiredField");
}
String text = getModelObjectAsString() + mark;
replaceComponentTagBody(markupStream, openTag, text);
}
}
{
TextField component = new TextField("component");
component.setRequired(true);
component.setOutputMarkupId(true);
IModel labelModel = new StringResourceModel("formResources.component.label",
this, null);
component.setLabel(labelModel);
add(component);
add(new MyLabel("componentLabel", component);
}
<label wicket:id="componentLabel"/>
<input type="text" wicket:id="component"/>
公共类MyLabel扩展了SimpleFormComponentLabel{
需要私有布尔值;
公共MyLabel(字符串id,LabeledWebMarkupContainer labelProvider){
super(id,labelProvider);
if(FormComponent的labelProvider实例){
必需=((FormComponent)labelProvider).isRequired();
}
}
组件主体上的受保护空隙(最终标记上游标记上游,
最终组件标签(openTag){
字符串标记=”;
如果(需要){
//可以是例如“*”
mark=getString(“formResources.requiredField”);
}
字符串文本=getModelObjectAsString()+标记;
replaceComponentTagBody(标记上游、openTag、文本);
}
}
{
TextField component=新的TextField(“component”);
组件。setRequired(true);
setOutputMarkupId(true);
IModel labelModel=新的StringResourceModel(“formResources.component.label”,
此值为空);
组件.setLabel(labelModel);
添加(组件);
添加(新的MyLabel(“组件标签”,组件);
}
这样你就有了干净的生活方式
表单组件的文本设置为国际化资源字符串
标记透明地重用完全相同的资源字符串,甚至基于FormComponent
的属性向其添加自定义标记另一种选择是使用
的键属性,如下所示:
<label wicket:for="name">
<wicket:label key="label.name">Placeholder label</wicket:label>
</label>
<input wicket:id="name" type="text"/>
占位符标签
不幸的是,在描述wicket的xhtml标记的wiki页面上没有记录此属性。所有支持的属性都是在处理标记的类中使用JavaDoc记录的(org.apache.wicket.markup.html.form.AutoLabelTextResolver
)
此选项的优点是不需要额外的编码。Wicket抛出一个异常,告诉您您的
标记将被删除,因为
标记的主体已被替换。问题是您无法将
标记嵌套在
标记内(并且不需要)
这两个选项之一(选项1):
区别在于,如果通过Java代码为组件设置标签,如下所示:
component.setLabel(new Model("value set in code"));
然后,使用选项1将导致标签设置为“代码中的值集”,而使用选项2仍将导致标签设置为“名称”。此外,如果标签是通过Java代码设置的,并且属性文件中缺少密钥,则选项2将引发异常,而选项1将仅使用代码中设置的值。我更喜欢这样:
<label wicket:for="name"><wicket:label />:</label>
<input type="text" wicket:id="name"></input>
这将被呈现为(荷兰语):
Naam:
Ah所以诀窍是将标签命名为与字段完全相同的名称,而不是像我所做的那样“label.name”将不起作用“name”将对字符串资源起作用。thx:)我已经知道setLabel()了方法,它确实工作得很好。我正在寻找上面的更简单的方法,它在java中不那么冗长。但是,一旦我的应用程序变得更复杂,我很确定我会回来检查您的方法。谢谢!有趣的解决方案。我会记在心里,以供进一步参考。
input=SomeInputField
TextField comp = new TextField("comp");
// Use internationalized text from XML resource file
comp.setLabel(new StringResourceModel("formResources.comp.label", this, null));
public class MyLabel extends SimpleFormComponentLabel{
private boolean required;
public MyLabel (String id, LabeledWebMarkupContainer labelProvider) {
super(id, labelProvider);
if (labelProvider instanceof FormComponent){
required = ((FormComponent)labelProvider).isRequired();
}
}
protected void onComponentTagBody(final MarkupStream markupStream,
final ComponentTag openTag) {
String mark = "";
if (required){
// could be for instance "*"
mark = getString("formResources.requiredField");
}
String text = getModelObjectAsString() + mark;
replaceComponentTagBody(markupStream, openTag, text);
}
}
{
TextField component = new TextField("component");
component.setRequired(true);
component.setOutputMarkupId(true);
IModel labelModel = new StringResourceModel("formResources.component.label",
this, null);
component.setLabel(labelModel);
add(component);
add(new MyLabel("componentLabel", component);
}
<label wicket:id="componentLabel"/>
<input type="text" wicket:id="component"/>
<label wicket:for="name">
<wicket:label key="label.name">Placeholder label</wicket:label>
</label>
<input wicket:id="name" type="text"/>
<label wicket:for="name">
<wicket:label key="label.name"/>
</label>
<input wicket:id="name" type="text />
<label wicket:for="name">
<wicket:message key="label.name"/>
</label>
<input wicket:id="name" type="text />
<label for="someMarkupId">
Name
</label>
<input id="someMarkupId" type="text" />
component.setLabel(new Model("value set in code"));
<label wicket:for="name"><wicket:label />:</label>
<input type="text" wicket:id="name"></input>
add(new TextField("name", nameModel).setLabel(Model.of("i18n.name")));
<label id="name63-w-lbl" for="name63">Naam:</label>
<input type="text" value="" name="name" id="name63">