Hacer paquetes de recursos en Java soporte de ejecución de sustitución de cadenas?

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

  •  20-09-2019
  •  | 
  •  

Pregunta

Se puede hacer lo siguiente con un ResourceBundle de Java?

En el archivo de propiedades ...

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

En tiempo de ejecución ...

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

Para dar un resultado de

"Actualmente tienes 3 cuentas."

¿Fue útil?

Solución

No sin utilizar el MessageFormat clase , tales como:

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

Otros consejos

Por su cuenta, ResourceBundle no es compatible con marcadores de posición de propiedad. La idea habitual es tomar la cuerda se obtiene desde el haz, y pegarlo en un MessageFormat, y luego utilizar eso para conseguir su mensaje con parámetros.

Si está utilizando JSP / JSTL , a continuación, se puede combinar <fmt:message> y <fmt:param> de hacer esto, que utiliza ResourceBundle y MessageFormat bajo las sábanas.

Si sucede utilizar Primavera , entonces tiene la ResourceBundleMessageSource que hace algo similares, y se puede utilizar en cualquier parte del programa. Esta abstracción MessageSource (combinado con MessageSourceAccessor) es mucho más agradable de usar que ResourceBundle.

Hay varias maneras, dependiendo de la tecnología de vista que está utilizando. Si está utilizando "plain vanilla" Java (por ejemplo Swing), a continuación, utilizar API MessageFormat que respondieron delante. Si está utilizando un marco de aplicación web (lo cual es cierto, si juzgo su historial pregunta aquí correctamente), entonces la forma depende de la tecnología de visión y / o framework MVC que está utilizando. Si se trata, por ejemplo, "plain vanilla" JSP, entonces usted puede utilizar JSTL fmt:message para esto.

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

Si se trata, por ejemplo, JSF, puede utilizar h:outputFormat para esto.

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

El mejor lugar es simplemente consultar la documentación de la tecnología / marco que está utilizando (o contarla aquí, así que podemos dar respuestas más adecuadas y más detalladas).

Los puntales tienen un buen util llamada MessageResources que hace exactamente lo que pides ....

por ejemplo.

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

Limitación Sólo permite máximo de 3 parámetros (es decir atributo de recurso, param1, ..., param3).

sugiero utilizar MessageFormat (si desea utilizar más de 3 valores de los parámetros) según lo sugerido por David Sykes.

PS el método getResources está disponible sólo en la clase Action puntales.

No creo que se pueda hacer este trabajo para archivo que no sea Inglés propiedades.

Mi archivo message.properties tiene la siguiente línea:

info.fomat.log.message.start = A partir de analizar el mensaje en {0} formato de registro.

Y mi archivo message_fr_FR.properties tiene la línea siguiente:

info.fomat.log.message.start = A partir d'analizador le mensaje conector {0} formato.

Este código sólo funciona para el Inglés

String.Format ((String) mensajes .GetString (GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));

Lo hace no reemplazar el marcador de posición con el valor cuando mi lengua / locale es el francés: - (

A pesar de MessageFormat.fomat () no es bueno

No creo ResourceBundle puede hacer eso en sí, sino de cuerda puede:

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

Recuerde que cuando se utiliza MessageFormat.format() es necesario utilizar una cita doble ('') en su paquete de recursos si se quiere expresar comilla simple (').

# MessageFormoat formato nofollow trabajará para el caso como:

greetingTo=Have Param, saying hello {0}

Se puede declarar dos métodos como éste, donde RB es una instancia 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 + "]";
    }
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top