7 Stimmen

Welche Funktion ist gemeint, um {0} {1} Parameter in einem String in Grails/Groovy zu formatieren/substituieren?

Ich fange gerade erst mit Groovy/Grails an

Mir ist aufgefallen, dass die Fehlermeldungen, die Sie erhalten, wenn Sie ein Formular validieren, so aussehen:

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

Zum Beispiel dieser Code, um die Fehler auf der Konsole auszugeben

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

Jetzt enthält it.arguments die Argumente, die hier eingetragen werden müssen.

Das Problem ist, ich kann keine Methode in der Grails- oder Groovy-Dokumentation finden, die Strings basierend auf Positionsparametern wie {0}, {1} formatiert und Werte aus einem Array ersetzt

Ich brauche etwas wie Python's %

Wie lassen sich diese Fehlerzeichenfolgen richtig formatieren, damit die Parameter richtig ersetzt werden?

8voto

Dirk Punkte 29952

Diese Markierungen werden durch die standardmäßigen java.text.MessageFormat-APIs ersetzt. Wenn Sie die Nachrichten mit dem g:message-Tag von Grail anzeigen, füllt es die Lücken aus, wenn Sie ein passendes args="..."-Attribut übergeben:

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

Unter bestimmten Umständen (innerhalb von GSP-Seiten und von Controllern IIRC) können Sie das Tag wie eine Funktion aufrufen:

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

Beachten Sie, dass der Wert, der als Meldungscode anzugeben ist, nur eine symbolische String-Konstante ist. Die eigentliche Übersetzung (der Nachrichtentext mit den "Lücken" darin) wird vom Framework mithilfe der nachladbaren Ressourcenbündel von Spring gelesen.

Wenn Sie tatsächlich nur einen Übersetzungstext haben, können Sie die APIs zur Nachrichtenformatierung direkt aufrufen. Siehe zum Beispiel:

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"))

0voto

Serge Rehem Punkte 1

Sehen Sie sich an, was Groovy mit ein wenig Meta-Programmierung für Sie tun kann.

MessagesBundle_de_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")

Ausgabe:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X