Internationalization Wicket中表单组件的国际化标签

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

如何正确地为表单组件创建国际化标签,以便在显示反馈消息时,在java代码中显示国际化字段名而不是字段名

我读过:

以及wicket的xhtml标记文档:


有没有可能以一种更舒适的方式来实现这一点?

我刚刚测试了以下内容:

<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">