我已经找到了一种从i18n消息属性(控制器外)获取消息的方法
def messageSource = Holders.grailsApplication.mainContext.getBean 'messageSource'
....
errorMessages << [field: "transactionDate", message: messageSource.getMessage("transactionDate.require.message", null ,null)]
但是在回顾我的同事时,我发现他们使用了不同的方式......
def g = new ApplicationTagLib()
errorMessages.add([field: "exchangeRate", message: g.message(code: "exchangeRate.max.message")])
显然,这是一个更简单的版本,但我想知道哪种方式是首选(最佳做法),以及这种方式的区别是什么。
答案 0 :(得分:1)
控制器内 loadBuilds: ->
@sendRequest()
# First set interval
setInterval =>
@sendRequest()
, 1000 * 60 * 5
sendRequest:->
request @jconf.url,(error,response,body)=>
if !error && response.statusCode == 200
@element.innerHTML = ''
title = document.createElement 'h4'
title.textContent = 'Super item'
subTitle = document.createElement 'p'
# Second set interval
date = new Date();
subTitle.textContent = 'Last check : ' + moment(date).fromNow()
setInterval ->
moment(date).fromNow()
subTitle.textContent = 'Last check : ' + moment(date).fromNow()
,1000*60
@element.appendChild title
@element.appendChild subTitle
@parseContent body
和message
可直接从g.message
获取。您的同事正在将ValidationTagLib
的对象分配给变量ApplicationTagLib
。我怀疑g
是一个自定义类,不是由grails api提供的,至少在2.3.x中没有。
如果您需要除应用程序中的控制器之外的任何地方的i18消息,那么您必须首先获得ApplicationTagLib
bean,或者您可以创建messageSource
的新实例,然后调用ValidationTagLib
那个例子。
答案 1 :(得分:1)
作为上述答案的补充,可能有以下地方需要实现国际化或从消息包中获取消息。
以下是详细的使用方案:
观点: - 我们有taglib可用的消息标记。在视图上使用它。
控制器: - 此处默认使用消息方法,并自动处理区域设置转换。 See this.
服务:我们可以在服务中调用taglibs,如下所示:
def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
或者将messageSource bean注入
def messageSource
过滤器/实用程序/特殊文件: - 对于这些文件,您可以创建类似下面的内容,然后在整个过程中使用它。
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点的解决方案几乎适用于所有情况。如果你发现这里已经手动处理了locale,我们可以在从requestHeader获取或者可选地请求params之后传递。
希望它有所帮助。