12
votes

Manière simple d'utiliser des messages d'interface utilisateur paramétré dans le guichet?

wicket a un système d'internationalisation flexible qui prend en charge les messages d'interface utilisateur des paramètres dans de nombreux façons. Il y a des exemples par exemple dans stringresourCemodel Javadocs, tels que ceci:

String value = ... // contains the dynamic value to use
add(new Label("message", getString("msg").replaceAll("\\{0\\}", value)));


0 commentaires

6 Réponses :


5
votes

Il y a un moyen, ce qui implique toujours de créer un modèle, ne nécessite pas de haricot avec un getter.

donné ce message dans un fichier de propriétés: xxx > Voici comment remplacer l'espace réservé avec une valeur, qu'il s'agisse d'une variable locale, d'un champ ou d'un littéral: xxx


2 commentaires

Merci! BTW, connaissez-vous de n'importe quel nom pour cette $ {} notation, et est-ce documenté quelque part? Serait-il possible de remplacer plus d'un espace réservé (quelque chose comme $ {0} et $ {1} ?) Dans un message en utilisant cette approche?


$ {} est simplement sténographique pour des appels de méthode contre l'objet modèle lui-même. Je ne connais pas le nom. $ {} Je crois juste faire du modèle.Tostring (), mais pour des choses telles que la convention-configuration des noms de clé de ressources pour les titres de page, vous pouvez faire quelque chose comme "Ajouter (nouvelle étiquette (" Titre ", nouvelle StringResourCemodel (" $ { Class.Simplename} .title ", ceci, courantePagemodel)"



0
votes

Créer un modèle pour votre étiquette est vraiment le Wicket Way fort>. Cela dit, vous pouvez vous faciliter la fonction utilitaire occasionnelle. Voici celui que j'utilise:

Properties key:
temperature=The current temperature is ${0}.

Page.java code:
// Simpler version of method where wicket:id and resourceKey are the same
add( staticResourceLabel( "temperature", new Temperature(5, CELSIUS) ) );

Page.html:
<span wicket:id='temperature'>The current temperature is 5 degrees Celsius.</span>


0 commentaires

2
votes

En face de quelque chose comme décrit dans la question, j'utiliserais maintenant:

.properties: xxx

java: xxx < / Pré>

Pourquoi j'aime bien:


2 commentaires

Un avantage supplémentaire: vous pouvez utiliser exactement la même approche pour les messages de retour d'information (méthodes telles que INFO (), erreur () dans le composant et la session), la cohérence de prêt à votre code. Par exemple: info (string.format (getstring ("événements.created"), événements.Size ()));


Vous pouvez avoir une commande différente avec% s solution: msg =% 2 $ S% 1 $ S



12
votes

Jetez un coup d'œil à l'exemple 4 dans la javadoc StringResourCemodel - Vous pouvez transmettre un modèle NULL et des paramètres explicites:

add(new Label("message",
         new StringResourceModel(
             "msg", this, null, value)));

msg=Value is {0}


1 commentaires

Stringresourcemodel n'a pas de constructeur avec plus de 3 arguments dans la version actuelle 8.5. *. Le moyen le plus simple maintenant: MessageFormat.Format (New StringResourCemodel (My_Key) .Getstring (), Arg1, Arg2, Arg3);



5
votes

Je pense que la méthode la plus cohérente sinuale forte> pourrait être accomplie en améliorant La réponse de Jonik avec MessageFormat code> :

.properties: p> xxx pré>

.java: p>

abstract class MyModel extends AbstractReadOnlyModel{
    @Override
    public String toString()
    {
        if(getObject()==null)return "";
        return getObject().toString();
    }
}
  • Solution propre et simple li>
  • utilise un java ordinaire et rien d'autre li>
  • Vous pouvez remplacer autant de valeurs que vous voulez li>
  • Travailler avec des étiquettes, info (), validation, etc. li>
  • Ce n'est pas complètement envers, mais il est cohérent avec le guichet afin que vous puissiez réutiliser ces propriétés avec stringresourcemodel code>. li>. ul>

    Notes: p>

    Si vous souhaitez utiliser des modèles, il vous suffit de créer un modèle simple qui remplace Tostring code> fonction du modèle comme celui-ci: p > xxx pré>

    et transmettez-le comme MessageFormat code> argument. p>

    Je ne sais pas pourquoi Wicket ne prend pas en charge modèle code > dans le message de retour. Mais s'il était soutenu, il n'y avait aucune raison d'utiliser ces solutions et que vous pourriez utiliser stringresourCemodel code> partout. p> p>


1 commentaires

Oui, en effet, il s'agit fondamentalement d'une version améliorée de string.format () que j'ai suggéré , avec la différence clé que MessageFormat prend en charge vraiment de nombreuses langues, car l'ordre des paramètres remplacés est explicitement spécifié.



0
votes

Si vous avez un modèle dans votre composant qui contient un objet avec des valeurs que vous souhaitez accéder à partir de vos espaces réservés en tant que substitutions, vous pouvez écrire: xxx

Imaginons getmodel ( ) Le type de retour de code est imodel et utilisateur contient des champs tels que prénom et lastname . Dans ce cas, vous pouvez facilement accéder à prénom et lastname dans votre chaîne de propriétés: xxx

plus d'informations que vous pouvez trouver ici: https://ci.apache.org/projects/wicket/wicket/apidocs/8.x/org/apache/wicket/model/stringresourcemodel.htm#stringresourcodel-java .lang.string-org.apache.wicket.model.imodel-


0 commentaires