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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 06 августа 2009

Эти маркеры фактически заменяются с помощью стандартных API-интерфейсов java.text.MessageFormat. Если вы отображаете сообщения, используя тег Grail g: message, он заполнит пробелы, если вы передадите подходящий атрибут 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"))
0 голосов
/ 04 мая 2011

Посмотрите, что 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...