Извлечение некоторого значения из message.properties в Grails - PullRequest
2 голосов
/ 21 июля 2011

Хотите получить значение из файла message.properties в гралях на работе, как я могу это сделать ??

Моя работа:

def execute() {
    // execute task
    List<String> emails = NayaxUser.findAllByEmailSent(false)*.username
    emails.each {emailAddress->
        mailService.sendMail {
            //todo: FETCH FROM MESSAGE.PROPERTIES
            to emailAddress
            from FETCH FROM MESSAGE.PROPERTIES
            subject FETCH FROM MESSAGE.PROPERTIES
            html body.toString()
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 21 июля 2011

Вы можете использовать:

g.message(code: 'my.message.code')
//or
g.message(code: 'my.message.code', args: [arg1, arg2])
2 голосов
/ 21 июля 2011

Вы можете ввести messageSource, чтобы получить сообщение:

class MyJob {
    def messageSource

    def execute() {
        ...
        def message = messageSource.getMessage('message.code', ...)
        ...
    }
}

Вот документация для getMessage(); вам нужно предоставить еще пару аргументов метода, а именно args (Object[]) и Locale.

1 голос
/ 22 июля 2011

Вы можете получить ссылку на bean-компонент messageSource из любого места, используя:

import org.codehaus.groovy.grails.commons.ApplicationHolder
import org.springframework.context.MessageSource

MessageSource messageSource = ApplicationHolder.application.mainContext.getBean('messageSource')

Затем вы можете получить сами сообщения, используя методы интерфейса MessageSource .

0 голосов
/ 29 октября 2015

Так же, как дополнение к ответам выше, могут быть следующие места, где вам нужно реализовать интернационализацию или получить сообщение из пакетов сообщений.

  1. вид
  2. Контроллеры
  3. Услуга
  4. Фильтры
  5. Файлы служебных программ (например, в пакете утилит или при обработке обобщенных сообщений об исключениях)
  6. Специальные файлы, например в Сиро охранные зоны отдыха

Ниже приведены подробные сценарии использования:

  1. Просмотров: - у нас есть taglib, доступный с тегом сообщения. Используйте это для просмотров.

  2. controllers: - здесь по умолчанию доступен метод сообщения, и преобразование локали выполняется автоматически. См. введите описание ссылки здесь

  3. сервис: мы можем вызывать taglibs внутри сервисов, как показано ниже:

    def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
    

Или добавить bean-компонент источника сообщения как

def messageSource 

4.Фильтры / утилиты / Специальные файлы: - Для них вы можете создать что-то вроде ниже, а затем использовать его повсюду.

 String i18nMessage(def input,String defaultMessage) {
                String[] languageCode = RequestContextHolder.currentRequestAttributes().request.getHeader("Accept-Language").split("-")
                Locale locale = languageCode.length == 2 ? new Locale(languageCode[0], languageCode[1]) : new Locale(languageCode[0])
                String message = defaultMessage
                try {
                    message = messageSource.getMessage(input.code,input?.args?.toArray(),locale)
                }catch (NoSuchMessageException nsme ){
                    log.info("No such error message--> ${nsme.getMessage()}")
                }
                return message
            }

Также, если вы получите исключение ниже:

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

Затем вам может понадобиться добавить обработчик запросов в ваш web.xml

 <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
</listener>

Примечание: web.xml по умолчанию недоступен, его необходимо сгенерировать из шаблона.

Это наиболее распространенные места, где вам может потребоваться преобразование пакета сообщений. Решение в пункте 4 будет работать почти во всех случаях. Если вы заметили, что локаль была обработана здесь вручную, которую мы могли бы передать после выборки из requestHeader или опционально запросить параметры.

Надеюсь, это поможет.

...