Так же, как дополнение к ответам выше, могут быть следующие места, где вам нужно реализовать интернационализацию или получить сообщение из пакетов сообщений.
- вид
- Контроллеры
- Услуга
- Фильтры
- Файлы служебных программ (например, в пакете утилит или при обработке обобщенных сообщений об исключениях)
- Специальные файлы, например в Сиро охранные зоны отдыха
Ниже приведены подробные сценарии использования:
Просмотров: - у нас есть taglib, доступный с тегом сообщения. Используйте это для просмотров.
controllers: - здесь по умолчанию доступен метод сообщения, и преобразование локали выполняется автоматически. См. введите описание ссылки здесь
сервис: мы можем вызывать 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 или опционально запросить параметры.
Надеюсь, это поможет.