Search code examples
javainternationalizationwicketresourcebundle

StringResourceModel only works for label


I was trying to create a link with the username on it (i.e. dynamic data), and couldn't manage to get the StringResourceModel to work with a Link.
My code looked something like:

Properties:

some.key=User name is: {0}

Java:

StringResourceModel model = 
    new StringResourceModel("some.key", this, null, new Object[] { getUserName() }); 
add(new Link("someid", model) {
    @Override
    public void onClick() {
        // do something ...
    }
});

HTML:

<a wicket:id="someid">some text to replace</a>

However, that didn't work, i.e. the text was never replaced.

I tried a different direction, which did work, and looks something like this:

Java:

StringResourceModel model = 
    new StringResourceModel("some.key", this, null, new Object[] { getUserName() }); 
Link link;
add(link = new Link("someid") {
    @Override
    public void onClick() {
        // do something ...
    }
});

link.add(new LabeL("anotherid", model));

HTML:

<a wicket:id="someid"><span wicket:id="anotherid">some text to replace</span></a>

(the properties file is the same).

My question is, am I right to assume that the StringResourceModel doesn't work with Links (I call this an assumption since I didn't see anything about this in the JavaDOC) ?
If not, how can the StringResourceModel be used directly with the Link, without the mediator Label ?


Solution

  • The model parameter in the Link constructor isn't meant to be used as a display value. To set the text of the link you need to explicitly add a Label to it:

    Link<Void> link = new Link<Void>("link");
    link.add(new Label("label", model);
    add(link);
    

    and in HTML:

    <a wicket:id="link"><span wicket:id="label"></span></a>
    

    The model in the constructor is meant to be used in the onclick method (or similar). For example (from the JavaDoc):

    IModel<MyObject> model = ...;
    Link<MyObject> link = new Link<MyObject>("link", model) {
        public void onClick() {
            MyObject obj = getModelObject();
            setResponsePage(new MyPage(obj));
        }
    };
    add(link);