2010-03-15 5 views

Répondre

52

Non sans utiliser la classe MessageFormat, tels que:

String pattern = bundle.getString("example.dynamicresource"); 
String message = MessageFormat.format(pattern, accountCount); 
+6

Bien que cela fonctionne, il est pas nécessairement « oui » que ResourceBundle peut le faire. ResourceBundle n'a pas de mécanisme. –

8

À eux seuls, 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 de l'ensemble, et le coller dans un MessageFormat, puis l'utiliser pour obtenir votre message paramétré.

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 ResourceBundleMessageSource qui does something similar, et peut être utilisé partout dans votre programme. Cette abstraction MessageSource (combinée avec MessageSourceAccessor) est beaucoup plus agréable à utiliser que ResourceBundle.

0

Je ne crois pas ResourceBundle peut le faire lui-même, mais chaîne peut:

String.format(bundle.getString("example.dynamicresource"), accountCount); 
6

Il existe différentes façons, selon la technologie d'affichage que vous utilisez. Si vous utilisez Java "plain vanilla" (par exemple Swing), utilisez l'API MessageFormat comme indiqué précédemment. Si vous utilisez un framework d'application Web (ce qui est vrai, si je juge correctement l'historique de vos questions), la façon de procéder dépend de la technologie d'affichage et/ou du framework MVC que vous utilisez. Si c'est par exemple "plain vanilla" JSP, alors vous pouvez utiliser JSTL fmt:message pour cela.

<fmt:message key="example.dynamicresource"> 
    <fmt:param value="${bean.accountCount}"> 
</fmt:message> 

S'il est par exemple JSF, vous pouvez utiliser h:outputFormat pour cela.

<h:outputFormat value="#{bundle['example.dynamicresource']}"> 
    <f:param value="#{bean.accountCount}"> 
</h:outputFormat> 

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).

3

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 (à savoir d'attributs de ressources, 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 Struts Action.

+0

** En note/mise à jour **: Le framework web Struts 1.x a atteint sa [fin de vie] (http://struts.apache.org/struts1eol-press.html) et n'est plus officiellement supporté depuis Mai 2013. – informatik01

+0

** En complément **: Struts 2 fournit une meilleure alternative sous la forme de méthodes * getText() *. Ces méthodes sont définies dans l'interface [* TextProvider *] (http://struts.apache.org/maven/xwork-core/apidocs/index.html?com/opensymphony/xwork2/TextProvider.html), qui * ActionSupport * outils de classe. Il existe deux méthodes * getText() * qui prennent en charge la substitution de paramètres de message: une qui prend un tableau et une qui prend une liste, et les deux n'ont aucune limitation (raisonnable) sur le nombre de paramètres. – informatik01

+0

@ informatik01 Bien que votre réponse soit valide pour le moment, cette réponse a été publiée en mars 2010, lorsque Struts 1.x était * encore * pris en charge. –

1

Je ne pense pas que vous pouvez faire ce travail pour les fichiers de propriétés non-anglais.

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: Format

info.fomat.log.message.start = A partir d'analyseur le message {0} connecteur.

Ce code ne fonctionne que pour la version anglaise

String.format ((messages String) .getString (GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));

Il ne PAS Remplacez l'espace réservé à la valeur quand ma langue/locale est :-(français

Même MessageFormat.fomat() est pas bon

+0

Lorsque vous utilisez String.format (..), vous pouvez utiliser des spécificateurs de format de format C classiques tels que '% d', '% s'. –

+1

MRay: Il semble que la citation unique dans votre texte français puisse être le problème selon la réponse de @tleveque. Que se passe-t-il lorsque vous changez votre chaîne en info.fomat.log.message.start = Format d'analyseur le message connecteur {0}. –

0

Rappelez-vous que lorsque vous utilisez MessageFormat.format() vous avez besoin d'utiliser un guillemet ('') dans votre paquet de ressources si vous voulez exprimer guillemet simple (')

0

MessageFormoat#format travaillera 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 + "]"; 
    } 
} 
Questions connexes