2009-08-06 6 views
5

me acaba de empezar con Groovy/Grails¿Qué función está destinada a formatear/sustituir parámetros {0} {1} en una cadena en Grails/Groovy?

Noté los mensajes de error que se obtiene al validar un vistazo formulario como el siguiente:

Property [{0}] of class [{1}] cannot be blank 

Por ejemplo el código para volcar los errores a la consola

 s.errors.allErrors.each 
     { 
      println it.defaultMessage 
     } 

Ahora, it.arguments contiene los argumentos que deben cumplimentarse aquí.

El problema es que no puedo encontrar ningún método en las Grails o documentación maravilloso que da formato a cadenas basado en parámetros posicionales como {0}, {1} y los valores sustitutos de una matriz

necesito algo así como python's%

¿Cuál es la forma correcta de formatear estas cadenas de error para que los parámetros se sustituyan correctamente?

Respuesta

8

Estos marcadores en realidad se reemplazan utilizando las API java.text.MessageFormat estándar. Si visualiza los mensajes usando g del Grial: etiqueta del mensaje, llenará los vacíos Si pasa un args adecuados = "..." atributo:

<g:message code="mymessagecode" args="${['size', 'org.example.Something']}"/> 

Bajo ciertas circunstancias (dentro de las páginas del SGP y de los controladores IIRC) que los cc llama a la etiqueta como una función:

g.message(code:'mymessagecode',args: ['size', 'org.example.Something']) 

Tenga en cuenta, que el valor de la oferta como código de mensaje es constante solamente una cadena simbólica. La traducción real (el texto del mensaje con las "brechas" en ella) será leída por el marco usando los paquetes de recursos recargables de Spring.

Si todo lo que tiene en realidad es un texto de traducción, puede llamar al mensaje formateando las API directamente. Ver por ejemplo:

import java.text.MessageFormat 

... 

args = ["english"].toArray() 
println(MessageFormat.format("Translation into {0}", args)) 

// Or - as the method is variadic: 
println(MessageFormat.format("Translation into {0}", "english")) 
+0

Gracias! Este ha sido un gran problema con Groovy/Grails: si no tienes experiencia con Java (que he evitado durante años por razones filosóficas/políticas), hay cosas que te dejan boquiabierto, al menos cuando solo ves en Grails/Groovy docs .... –

0

Mire lo que Groovy puede hacer por usted, usando un poco de meta-programación.

MessagesBundle_en_US.properties:

greetings = Hello {0}. 
    inquiry = {0}: How are you {1}? 
    farewell = Goodbye. 

ResourceBundleWithSugar.groovy:

import java.text.MessageFormat 
    class ResourceBundleUtils { 
     def propertyMissing(String name) { this.getString(name) } 
     def methodMissing(String name, args) { 
     MessageFormat.format(this.getString(name), args) 
     } 
    } 
    ResourceBundle.metaClass.mixin ResourceBundleUtils 

    def msg = ResourceBundle.getBundle("MessagesBundle", new Locale("en","US")); 
    println msg.greetings("Serge") 
    println msg.inquiry("Serge","Mary") 
    println msg.farewell // You can use also: msg.['farewell'] msg."farewell" or msg.getString("farewell") 

Salida:

Hello Serge. 
    Serge: How are you Mary? 
    Goodbye. 
+1

Gracias por este maravilloso ejemplo ... –

Cuestiones relacionadas