Faites des faisceaux de ressources en remplacement de chaîne d'exécution prise en charge Java?

StackOverflow https://stackoverflow.com/questions/2451049

  •  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."

Était-ce utile?

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 ResourceBundleMessageSource qui

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

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

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 + "]";
    }
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top