Grails:从i18n消息属性获取消息的最佳方式

时间:2016-01-06 06:31:57

标签: grails internationalization

我已经找到了一种从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")])

显然,这是一个更简单的版本,但我想知道哪种方式是首选(最佳做法),以及这种方式的区别是什么。

2 个答案:

答案 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)

作为上述答案的补充,可能有以下地方需要实现国际化或从消息包中获取消息。

  1. 视图
  2. 控制器
  3. 服务
  4. 过滤器
  5. 实用程序文件(例如,在util包或广义异常消息处理中)
  6. 特殊文件,例如在Shiro安全休息领域
  7. 以下是详细的使用方案:

    1. 观点: - 我们有taglib可用的消息标记。在视图上使用它。

    2. 控制器: - 此处默认使用消息方法,并自动处理区域设置转换。 See this.

    3. 服务:我们可以在服务中调用taglibs,如下所示:

      def myCustomTaglib = grailsApplication.mainContext.getBean('com.custom.MyCustomTagLib');
      
    4. 或者将messageSource bean注入

      def messageSource 
      
      1. 过滤器/实用程序/特殊文件: - 对于这些文件,您可以创建类似下面的内容,然后在整个过程中使用它。

        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
         }
        
      2. 另外,如果你在下面得到例外:

        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之后传递。

        希望它有所帮助。