Какая функция предназначена для форматирования/замены параметров {0} {1} в строке в Grails/Groovy?

Я только начинаю работать с Groovy/Grails.

Я заметил, что сообщения об ошибках, которые вы получаете при проверке формы, выглядят так:

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

Например, этот код для вывода ошибок на консоль

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

Теперь it.arguments содержит аргументы, которые необходимо заполнить здесь.

Проблема в том, что я не могу найти ни одного метода в документации Grails или Groovy, который форматирует строки на основе позиционных параметров, таких как {0}, {1}, и подставляет значения из массива.

Мне нужно что-то вроде % Python

Как правильно отформатировать эти строки ошибок, чтобы параметры были заменены правильно?


person Community    schedule 06.08.2009    source источник


Ответы (2)


Эти маркеры фактически заменяются стандартными API-интерфейсами java.text.MessageFormat. Если вы отображаете сообщения с помощью тега g:message Grail, он заполнит пробелы, если вы передадите подходящий атрибут args="...":

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

При определенных обстоятельствах (на страницах GSP и с контроллеров IIRC) вы не можете вызывать тег как функцию:

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

Обратите внимание, что значение, предоставляемое в качестве кода сообщения, представляет собой только символьную строковую константу. Фактический перевод (текст сообщения с «пробелами» в нем) будет прочитан фреймворком с использованием перезагружаемых пакетов ресурсов Spring.

Если на самом деле у вас есть только текст перевода, вы можете напрямую вызывать API форматирования сообщений. См., например:

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"))
person Dirk    schedule 06.08.2009
comment
Спасибо! Это была большая проблема с Groovy/Grails: если у вас нет опыта работы с Java (которого я избегал в течение многих лет по философским/политическим причинам), есть вещи, которые ставят вас в тупик, по крайней мере, если вы смотрите только на Grails/Groovy. документы.... - person ; 06.08.2009

Посмотрите, что Groovy может сделать для вас, используя немного метапрограммирования.

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

Вывод:

    Hello Serge.
    Serge: How are you Mary?
    Goodbye.
person Serge Rehem    schedule 04.05.2011