Domanda

Si può eseguire le seguenti operazioni con un ResourceBundle Java?

Nel file delle proprietà ...

example.dynamicresource=You currently have {0} accounts.

In fase di esecuzione ...

int accountAcount = 3;
bundle.get("example.dynamicresource",accountCount,param2,...);

Per dare un risultato di

"Attualmente hai 3 account".

È stato utile?

Soluzione

Non senza utilizzare il MessageFormat classe , come ad esempio:

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

Altri suggerimenti

Da soli, ResourceBundle non supporta segnaposto di proprietà. L'idea comune è quella di prendere la stringa che si ottiene dal fascio, e incollarla in un MessageFormat, e quindi utilizzare tale per ottenere il vostro messaggio con parametri.

Se stai usando JSP / JSTL , quindi è possibile combinare <fmt:message> e <fmt:param> per fare questo, che utilizza ResourceBundle e MessageFormat sotto le coperte.

Se vi capita di essere utilizzando Primavera , quindi ha il ResourceBundleMessageSource che fa qualcosa di simile , e può essere utilizzato in qualsiasi punto del programma. Questa astrazione MessageSource (combinata con MessageSourceAccessor) è molto più bello da usare rispetto ResourceBundle.

Ci sono vari modi, a seconda della tecnologia di visualizzazione che si sta utilizzando. Se stai usando "plain vanilla" Java (per esempio Swing), quindi utilizzare MessageFormat API come risposta prima. Se stai usando un quadro webapplication (il che è vero, se giudico la vostra storia di domanda qui correttamente), quindi il modo dipende dalla tecnologia visualizzazione e / o framework MVC che si sta utilizzando. Se è per esempio "plain vanilla" JSP, quindi è possibile utilizzare JSTL fmt:message per questo.

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

Se è per esempio JSF, è possibile utilizzare h:outputFormat per questo.

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

Il posto migliore è quello di consultare solo la documentazione della tecnologia / quadro si sta utilizzando (o per dire che qui in modo da poter dare risposte più adeguate e più dettagliate).

i supporti hanno una bella util chiamato MessageResources che fa esattamente quello che chiedi ....

per es.

MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);

Limitazione Esso consente solo massimo di 3 parametri (cioè attributo risorsa, param1, ..., param3).

Suggerisco utilizzando MessageFormat (se si desidera utilizzare più di 3 valori di parametro) come suggerito da David Sykes.

PS il metodo getResources è disponibile solo nella classe Action Struts.

Non credo che si può fare questo lavoro per file di proprietà non inglese.

Il mio file message.properties ha la seguente riga:

info.fomat.log.message.start = partire per analizzare il messaggio in {0} formato log.

E il mio file message_fr_FR.properties ha la seguente riga:

info.fomat.log.message.start = A partir d'analizzatore le message connettore {0} formato.

Questo codice funziona solo per quella inglese

String.Format ((String) messaggi .getString (GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));

Lo fa non sostituire il segnaposto con il valore quando la mia lingua / locale è francese: - (

Anche MessageFormat.fomat () è non va bene

Non credo ResourceBundle può farlo se stessa, ma stringa può:

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

Quando si usa la MessageFormat.format() è necessario utilizzare una doppia citazione ('') nel bundle di risorse se si vuole esprimere apostrofo (').

MessageFormoat formato nofollow # lavorerà per il caso come:

greetingTo=Have Param, saying hello {0}

È possibile dichiarare due metodi come questo, dove RB è un'istanza di 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 + "]";
    }
} 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top