2010-03-15 17 views

Respuesta

52

No sin utilizar la clase MessageFormat, tales como:

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

Aunque esto funciona, no es necesariamente "Sí" que ResourceBundle puede hacer esto. ResourceBundle no tiene un mecanismo. –

8

Por su cuenta, ResourceBundle no soporta 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, entonces 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 se tiene la ResourceBundleMessageSource cuales does something similar, y se puede utilizar en cualquier parte del programa. Esta abstracción MessageSource (combinada con MessageSourceAccessor) es mucho más fácil de usar que ResourceBundle.

0

no creo ResourceBundle puede hacer eso en sí, sino cadena puede:

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

Hay diversas maneras, dependiendo de la tecnología de vista que está utilizando. Si está utilizando Java "plain vanilla" (por ejemplo, Swing), entonces use MessageFormat API como se contestó 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 se trata, por ejemplo, de JSP "plain vanilla", entonces puede usar 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).

3

puntales tienen un buen util llamados 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, atributos de recursos, param1, ..., param3).

Sugiero usar MessageFormat (si desea utilizar más de 3 valores de parámetros) como lo sugiere David Sykes.

PS el método getResources está disponible solo en la clase Struts Action.

+0

** Como una nota/actualización **: El framework web Struts 1.x ha alcanzado su [fin de vida] (http://struts.apache.org/struts1eol-press.html) y ya no es oficialmente compatible desde Mayo de 2013. – informatik01

+0

** Como complemento **: Struts 2 proporciona una mejor alternativa en forma de métodos * getText() *. Esos métodos se definen en la interfaz [* TextProvider *] (http://struts.apache.org/maven/xwork-core/apidocs/index.html?com/opensymphony/xwork2/TextProvider.html), que * ActionSupport * implementos de clase. Hay dos métodos * getText() * que admiten la sustitución de parámetros de mensaje: uno que toma un conjunto y otro que toma una lista, y ninguno tiene limitaciones (razonables) en el número de parámetros. – informatik01

+0

@ informatik01 aunque su respuesta es válida en este momento, esta respuesta se publicó en marzo de 2010, cuando Struts 1.x * todavía * era compatible. –

1

No creo que pueda hacer esto funcionar para el archivo de propiedades no inglesas.

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

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

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

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

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

String.Format ((cadena) 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 :-(francesa

Incluso MessageFormat.fomat() no es bueno

+0

Al utilizar String.format (..) puede utilizar especificadores de formato de formato C clásicos como '% d', '% s'. –

+1

MRay: Parece que la única cita en su texto en francés puede ser el problema según la respuesta de @tleveque. Qué sucede cuando cambia su cadena a info.fomat.log.message.start = A partir de 'analizador le mensaje conector formato {0}. –

0

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

0

MessageFormoat#format trabajará para el caso como:.

greetingTo=Have Param, saying hello {0} 

Se puede declarar dos métodos como éste, donde Rb es un ejemplo 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 + "]"; 
    } 
} 
Cuestiones relacionadas