Faites des faisceaux de ressources en remplacement de chaîne d'exécution prise en charge Java?
-
20-09-2019 - |
Question
Pouvez-vous faire ce qui suit avec un ResourceBundle Java?
Dans le fichier de propriétés ...
example.dynamicresource=You currently have {0} accounts.
Lors de l'exécution ...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
Pour donner un résultat de
"Vous avez actuellement 3 comptes."
La solution
Non sans utiliser le MessageFormat classe tels que:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
Autres conseils
Sur leur propre, ResourceBundle
ne supporte pas les espaces réservés à la propriété. L'idée habituelle est de prendre la chaîne que vous obtenez du faisceau, et le coller dans un MessageFormat
, et ensuite utiliser que pour faire passer votre message paramétrées.
Si vous utilisez JSP / JSTL , vous pouvez combiner <fmt:message>
et <fmt:param>
pour ce faire, qui utilise ResourceBundle
et MessageFormat
sous les couvertures.
Si vous arrive d'utiliser Spring , il a le Il existe différentes façons, selon la technologie d'affichage que vous utilisez. Si vous utilisez Java "de plain vanilla" (par exemple, Swing), puis utilisez API de S'il est par exemple JSF, vous pouvez utiliser Le meilleur endroit est de consulter simplement la documentation de la technologie / cadre que vous utilisez (ou de dire ici afin que nous puissions apporter des réponses mieux adaptées et plus détaillées). ResourceBundleMessageSource
qui
MessageFormat
comme répondirent. Si vous utilisez un cadre webApplication (ce qui est vrai, si je juge l'histoire de votre question ici correctement), alors la voie dépend de la vue de la technologie et / ou framework MVC que vous utilisez. S'il est par exemple "plain vanilla" JSP, vous pouvez utiliser JSTL fmt:message
pour cela. <fmt:message key="example.dynamicresource">
<fmt:param value="${bean.accountCount}">
</fmt:message>
h:outputFormat
pour cela. <h:outputFormat value="#{bundle['example.dynamicresource']}">
<f:param value="#{bean.accountCount}">
</h:outputFormat>
Struts ont une belle util appelé MessageResources
qui fait exactement ce que vous demandez ....
par exemple.
MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);
Limitation Il permet seulement un maximum de 3 paramètres (par exemple attribut de ressource, param1, ..., param3).
Je suggère d'utiliser MessageFormat (si vous voulez utiliser plus de 3 valeurs de paramètres) comme suggéré par David Sykes.
PS la méthode getResources
est disponible uniquement dans la classe Action
Struts.
Je ne pense pas que vous pouvez faire ce travail pour les propriétés non-anglais fichier.
Mon fichier message.properties a la ligne suivante:
info.fomat.log.message.start = A partir d'analyser le journal des messages au format {0}.
Et mon fichier message_fr_FR.properties a la ligne suivante:
info.fomat.log.message.start = A partir d'analyseur le message de {0} connecteur format.
Ce code ne fonctionne que pour la version anglaise
String.Format ((messages String) .getString (GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));
Finalité pas remplacer l'espace réservé à la valeur lorsque ma langue / locale est le français: - (
Même MessageFormat.fomat () est pas bon
Je ne crois pas ResourceBundle peut le faire lui-même, mais chaîne peut:
String.format(bundle.getString("example.dynamicresource"), accountCount);
Rappelez-vous que lorsque vous utilisez MessageFormat.format()
vous devez utiliser un guillemet (''
) dans votre paquet de ressources si vous voulez exprimer citation unique ('
).
MessageFormoat # format fonctionnera pour le cas comme:
greetingTo=Have Param, saying hello {0}
Vous pouvez déclarer deux méthodes comme celle-ci où RB est une instance de ResourceBundle:
/**This is a method that takes the param to substitute the placeholder**/
public String getString(String key, Object... params ) {
try {
return MessageFormat.format(this.RB.getString(key), params);
} catch (MissingResourceException e) {
return "[" + key + "]";
}
}
/**Without a param, this will derectly delegate to ResourceBundle#getString**/
public String getString(String key) {
try {
return this.RB.getString(key);
} catch (MissingResourceException e) {
return "[" + key + "]";
}
}