texturas - ¿Los paquetes de recursos en Java admiten la sustitución de cadenas en tiempo de ejecución?
pack de texturas realistas (8)
Hay varias formas, dependiendo de la tecnología de visualización que estés usando. Si está utilizando Java "simple vainilla" (por ejemplo, Swing), utilice la API MessageFormat
tal como se respondió anteriormente. Si está utilizando un marco de aplicación web (que es cierto, si juzgo aquí correctamente su historial de preguntas), entonces el camino depende de la tecnología de visualización y / o del marco MVC que esté utilizando. Si es, por ejemplo, JSP "simple", entonces puede usar el fmt:message
JSTL fmt:message
para esto.
<fmt:message key="example.dynamicresource">
<fmt:param value="${bean.accountCount}">
</fmt:message>
Si es, por ejemplo, JSF, puede usar 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 contarlo aquí para que podamos dar respuestas más adecuadas y más detalladas).
¿Puedes 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".
Los struts tienen una buena MessageResources
llamada MessageResources
que hace exactamente lo que pides ...
p.ej
MessageResources resources = getResources(request, "my_resource_bundle"); // Call your bundle exactly like ResourceBundle.getBundle() method
resources.getMessage("example.dynamicresource",accountCount,param2,...);
Limitación Solo permite un máximo de 3 parámetros (es decir, atributo de recurso, param1, ..., param3).
Sugiero usar MessageFormat (si desea usar más de 3 valores de parámetros) como lo sugiere David Sykes.
PD: el método getResources
solo está disponible en la clase de Action
Struts.
No creo que ResourceBundle pueda hacerlo por sí mismo, pero String puede:
String.format(bundle.getString("example.dynamicresource"), accountCount);
No creo que pueda hacer que esto funcione para el archivo de propiedades no inglesas.
Mi archivo message.properties tiene la siguiente línea:
info.fomat.log.message.start = Comenzando a analizar el mensaje de registro en formato {0}.
Y mi archivo message_fr_FR.properties tiene la siguiente línea:
info.fomat.log.message.start = A partir del analizador, el formato del conector del mensaje {0}.
Este código funciona solo para el inglés
String.format ((String) messages .getString (GlobalConstants.MESSAGE_FORMAT_START), GlobalConstants.STR_JSON));
NO reemplaza el marcador de posición con el valor cuando mi idioma / configuración regional es francés :-(
Incluso MessageFormat.fomat () no es bueno
No sin usar la clase MessageFormat , como por ejemplo:
String pattern = bundle.getString("example.dynamicresource");
String message = MessageFormat.format(pattern, accountCount);
Por su propia cuenta, ResourceBundle
no admite marcadores de posición de propiedad. La idea habitual es tomar el String que obtienes del paquete y pegarlo en un MessageFormat
, y luego usarlo para obtener tu mensaje parametrizado.
Si está utilizando JSP / JSTL , puede combinar <fmt:message>
y <fmt:param>
para hacer esto, que usa ResourceBundle
y MessageFormat
debajo de las carátulas.
Si está utilizando Spring , tiene ResourceBundleMessageSource
que hace algo similar y puede usarse en cualquier parte de su programa. Esta abstracción de MessageSource
(combinada con MessageSourceAccessor
) es mucho más fácil de usar que ResourceBundle
.
Recuerde que al usar MessageFormat.format()
necesita usar una comilla doble ( ''''
) en su paquete de recursos si desea expresar comillas simples ( ''
).
MessageFormoat#format funcionará para el caso como:
greetingTo=Have Param, saying hello {0}
Puede declarar dos métodos como este 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 + "]";
}
}