De façon Simple, à l'utilisation de l'INTERFACE utilisateur de paramétrer des messages dans Wicket?
Guichet a une flexible de l'internationalisation du système qui prend en charge le paramétrage de l'INTERFACE utilisateur des messages à de nombreux égards. Il y a des exemples par exemple, dans StringResourceModel javadoc, comme ceci:
WeatherStation ws = new WeatherStation();
add(new Label("weatherMessage", new StringResourceModel(
"weather.${currentStatus}", this, new Model<String>(ws)));
Mais je veux quelque chose de vraiment simple, et ne pouvait pas trouver un bon exemple de cela.
Envisager ce type de l'INTERFACE utilisateur, le message dans une .fichier de propriétés:
msg=Value is {0}
Plus précisément, je ne voudrais pas créer un objet de modèle (avec des getters pour les valeurs à être remplacé; comme WeatherStation dans l'exemple ci-dessus) uniquement pour ce but. C'est juste trop si j'ai déjà les valeurs dans des variables locales, et il n'est par ailleurs pas nécessaire pour un tel objet.
Voici un stupide "force brute" de remplacer le {0} par la valeur de droite:
String value = ... //contains the dynamic value to use
add(new Label("message", getString("msg").replaceAll("\\{0\\}", value)));
Est-il propre, plus de Guichet-y façon de le faire (qui n'est pas terriblement beaucoup plus que ci-dessus)?
OriginalL'auteur Jonik | 2010-10-20
Vous devez vous connecter pour publier un commentaire.
Je pense que le plus cohérent WICKETY manière qui pourrait être accompli par l'amélioration de Jonik réponse avec
MessageFormat
:.propriétés:
.java:
Pourquoi je l'aime:
StringResourceModel
.Notes:
si vous voulez des Modèles d'utilisation il vous suffit de créer un modèle simple qui remplacent
toString
fonction du modèle, comme ceci:et de le passer comme
MessageFormat
argument.Je ne sais pas pourquoi Wicket ne prend pas en charge
Model
dans le message de commentaire. mais si il a été pris en charge il n'y a pas de raison d'utiliser ces solutions, et vous pouvez utiliserStringResourceModel
partout.String.format()
qui j'ai suggéré, avec la différence essentielle queMessageFormat
vraiment prend en charge de nombreuses langues depuis l'ordonnance de remplacer les paramètres est explicitement spécifié.oui, vous avez raison:)
OriginalL'auteur Hossein Nasr
Prendre un coup d'oeil à l'Exemple 4 dans le StringResourceModel javadoc - vous pouvez passer d'un modèle nul et explicite des paramètres:
OriginalL'auteur svenmeier
Il y a un moyen, qui, bien que toujours implique la création d'un modèle, n'exige pas un haricot avec un getter.
donné ce message dans un fichier de propriétés:
Voici comment remplacer l'espace réservé avec une valeur, une variable locale, un champ ou un littéral:
${}
notation, et est-il documenté quelque part? Serait-il possible de remplacer plus d'un espace réservé (quelque chose comme${0}
et${1}
?) dans un message à l'aide de cette approche?${} n'est qu'un raccourci pour les appels de méthode, par rapport au modèle de l'objet lui-même. Ne sais pas le nom. ${} je crois tout simplement le modèle.toString(), mais pour des choses comme la convention sur la configuration de la clé de ressource noms pour les titres de page, vous pouvez faire quelque chose comme "add( new Label( "titre", la nouvelle StringResourceModel( "${classe.simpleName}.titre", ce qui, currentPageModel ) )"
OriginalL'auteur Jawher
Lorsqu'ils sont confrontés à quelque chose comme décrit dans la question, je voudrais maintenant utiliser:
.propriétés:
Java:
Pourquoi je l'aime:
${}
truc). Modifier: eh bien, si vous avez réellement besoin de soutien de nombreuses langues où l'remplacé les valeurs peuvent être dans un ordre différent,String.format()
n'est pas bon. Au lieu de cela, à l'aide de MessageFormat est une approche similaire qui prend en charge correctement.Avertissement: c'est "trop évident", mais c'est plus simple que les autres solutions (et certainement plus agréable que l'original de mes
replaceAll()
hack). J'ai d'abord cherché un "Guichet-y", alors que ce genre de contourne Guichet puis de nouveau, qui s'en soucie? 🙂info(String.format(getString("events.created"), events.size()));
Vous POUVEZ avoir un ordre différent avec %s solution: msg=%2$s %1$s
OriginalL'auteur Jonik
La création d'un Modèle pour votre Étiquette est vraiment Le Guichet Façon. Cela dit, vous pouvez le rendre facile sur vous-même avec le temps la fonction d'utilité. Voici celui que j'utilise:
Détails je suis dissimuler les voici:
ConvertingModel
qui va automatiquement convertir les objets à leur représentation sous forme de Chaîne basée sur le IConverters disponibles pour le composant donnéCustomLabel
qui s'applique personnalisé le texte de l'étiquette de post-traitement (tel que détaillé dans cette réponse)Avec une coutume IConverter pour, disons, une Température de l'objet, vous pourriez avoir quelque chose comme:
L'inconvénient de cette approche est que vous n'avez plus d'accès direct à l'Étiquette de la classe, vous ne pouvez pas sous-classe pour remplacer
isVisible()
ou des choses comme ça. Mais pour ma part il fonctionne à 99% du temps.OriginalL'auteur Brian Laframboise