Hi all, I just gave this a try by copying the whole `MessageContainer` class to my project and using it like this:
final MessageContainer c = new MessageContainer("msg", "test.msg", false); > c.add(new ExternalLink("link", Model.of("http://test.com"), new > StringResourceModel("test.link"))); > add(c); This fails with a NPE because the MessageContainer assumes, that it has to use its parent component for resolving any nested components, because the `<wicket:message/>` tag is not a container by itself: Component component = getParent().get(id); > if (component == null) { > component = ComponentResolvers.resolve(getParent(), markupStream, > currentTag, null); // Must not be a Page and it must be connected to a parent. > if (component.getParent() == null) { > component = null; > } } When used with a `<wicket:container />` or a `<div wicket:id="myId"/>` the tag component itself has to be used to resolve nested components. It is possible to fix this by replacing all calls to `getParent()` with a custom method that checks if the tag is a wicket message or some other element, but it does not feel right. I could go ahead with my local copy of MessageContainer and adjust it for my project but it contains a lot of logic that has to be duplicated like message interpolation and markup stream parsing. I'd be willing to provide a PR if someone in the development team has any suggestions on how to approach this. Best, Thomas On Thu, Jul 25, 2019 at 9:17 AM Thomas Heigl <tho...@umschalt.com> wrote: > Hi Martin, > > Sure. Currently I'm using <wicket:message> like described in the JavaDoc > of WicketMessageResolver: > > Template: > >> <wicket:message key="myKey"> >> <span wicket:id="amount">[amount]</span>. >> <a wicket:id="link"> >> <wicket:message key="linkText"/> >> </a> >> </wicket:message> > > > Java: > >> add(new Label("amount", new Model<String>("$5.00"))); >> add(new BookmarkablePageLink<Void>("link", DetailsPage.class)); > > > i18n: > >> myKey=Your balance is ${amount}. Click ${link} to view the details. >> linkText=here > > > This works, but the key "myKey" cannot be changed during runtime. I'd like > to use the private MessageContainer the same way I can use an > EnclosureContainer: > > Template: > >> <wicket:container wicket:id="msg"> >> <span wicket:id="amount">[amount]</span>. >> <a wicket:id="link"> >> <wicket:message key="linkText"/> >> </a> >> </wicket:container> > > > Java: > >> final String key = "myKey"; > > final MessageContainer msg = new MessageContainer("msg", key, true); > > msg.add(new Label("amount", new Model<String>("$5.00"))); >> msg.add(new BookmarkablePageLink<Void>("link", DetailsPage.class)); > > add(msg); > > > I hope that explains my requirement a bit better. > > Best, > > Thomas > > > On Thu, Jul 25, 2019 at 6:48 AM Martin Terra < > martin.te...@koodaripalvelut.com> wrote: > >> Hi! >> >> Can you show an example of solution now vs. solution after change, what >> are >> the benefits of such visibility change to your case? Maybe there is >> another >> way to accomplish your goal? >> >> ** >> Martin >> >> ke 24. heinäk. 2019 klo 22.25 Thomas Heigl (tho...@umschalt.com) >> kirjoitti: >> >> > Hi all, >> > >> > I'd like to create Wicket messages with child components >> programatically. >> > Currently, this is only possible by using the <wicket:message> tag and >> > nesting components inside of it. >> > >> > For most use cases this is sufficient, but I sometimes come across cases >> > where I'd like to programatically define the message key instead of >> > hard-coding it in the template. >> > >> > The class that does all the interpolation is currently >> > private: >> > org.apache.wicket.markup.resolver.WicketMessageResolver.MessageContainer >> > >> > Would it be possible to make this a public (top-level) class in Wicket >> 9? >> > If I understand correctly, this would solve my requirement without any >> > other code changes. >> > >> > Best regards, >> > >> > Thomas >> > >> >