Hat Ressourcenbündel in Java-Unterstützung Runtime String-Ersetzung?
-
20-09-2019 - |
Frage
Können Sie Folgendes tun mit einem Java Resource?
In der Eigenschaftendatei ...
example.dynamicresource=You currently have {0} accounts.
Zur Laufzeit ...
int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);
ein Ergebnis geben
"Sie haben zur Zeit 3-Konten."
Lösung
Nicht ohne die Verwendung von Message Klasse , wie zum Beispiel:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
Andere Tipps
Auf ihrem eigenen, nicht ResourceBundle
nicht Eigenschaft Platzhalter unterstützen. Die übliche Idee ist, den String Sie aus dem Bündel bekommen zu nehmen und es in eine MessageFormat
kleben, und dann verwenden Sie Ihre parametrisierte Nachricht zu erhalten.
Wenn Sie mit JSP / JSTL , dann können Sie <fmt:message>
und <fmt:param>
verbinden, dies zu tun, was ResourceBundle
und MessageFormat
unter der Decke verwendet.
Wenn Sie geschehen, werden mit Frühling , dann hat es die ResourceBundleMessageSource
, die a href <= "http://static.springsource.org/spring/docs/3.0.x/reference/html /beans.html#context-functionality-messagesource“rel =‚nofollow noreferrer‘> macht etwas ähnliches und kann überall in Ihrem Programm verwendet werden. Diese MessageSource
Abstraktion (mit MessageSourceAccessor
kombiniert) ist viel schöner zu benutzen als ResourceBundle
.
Es gibt verschiedene Möglichkeiten, je nach Ansicht Technologie Sie verwenden. Wenn Sie "Plain Vanilla" Java (zB Swing) verwenden, dann verwenden MessageFormat
API als beantwortet vor. Wenn Sie eine Webapplikation Framework verwenden (was wahr ist, wenn ich Ihre Frage Geschichte hier richtig beurteilen), dann hängt die Art und Weise auf der View-Technologie und / oder MVC-Framework Sie verwenden. Wenn es zum Beispiel "Plain Vanilla" JSP ist, dann können Sie JSTL fmt:message
für diese.
<fmt:message key="example.dynamicresource">
<fmt:param value="${bean.accountCount}">
</fmt:message>
Wenn es zum Beispiel JSF ist, können Sie h:outputFormat
für diese.
<h:outputFormat value="#{bundle['example.dynamicresource']}">
<f:param value="#{bean.accountCount}">
</h:outputFormat>
Der beste Ort ist, um nur die Dokumentation der Technologie / framework konsultieren Sie verwenden (oder es hier zu sagen, so dass wir besser und detailliertere Antworten geben kann).
Struts haben eine schöne util genannt MessageResources
welche tut genau das, was man sich wünschen ....
z.
MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);
Begrenzung Es ermöglicht nur maximal 3 Parameter (d.h. Ressourcenattribut, param1, ..., param3).
Ich schlage vor, mit Message (wenn Sie möchten mehr als 3 Parameterwerte verwenden), wie von David Sykes vorgeschlagen.
PS die getResources
Methode ist nur in der Struts Action
Klasse.
Ich glaube nicht, dass Sie diese Arbeit für Nicht-Englisch-Properties-Datei machen.
Meine message.properties Datei hat die folgende Zeile:
info.fomat.log.message.start = Start zu Parsingprotokoll Nachricht in {0} Format.
Und meine message_fr_FR.properties Datei hat die folgende Zeile:
info.fomat.log.message.start = A partir d'Analysator le message connecter {0} Format.
Dieser Code funktioniert nur für die englische
String.format ((String) Nachrichten .getString (GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));
Es tut nicht ersetzen Sie den Platzhalter mit dem Wert, wenn meine Sprache / Locale Französisch ist: - (
Auch MessageFormat.fomat () ist nicht gut
Ich glaube nicht, Resource tun kann, dass selbst, sondern String kann:
String.format(bundle.getString("example.dynamicresource"), accountCount);
Beachten Sie, dass, wenn MessageFormat.format()
verwenden Sie doppelte Anführungszeichen (''
) in Ihrem Ressourcenpaket verwenden müssen, wenn Sie Apostroph ('
) zum Ausdruck bringen wollen.
MessageFormoat # Format wird wie für den Fall arbeiten:
greetingTo=Have Param, saying hello {0}
Sie können erklären zwei Methoden wie diese, wo RB eine Instanz von Resource ist:
/**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 + "]";
}
}