grails - 带有Grails的多语言电子邮件模板

标签 grails grails-2.0 grails-plugin

我正在尝试从grails发送电子邮件,邮件模板应该是多语言的。

我发现我们可以将GSP呈现为字符串,甚至在grails邮件插件中也可以呈现GSP。

现在,在GSP中,我假设我将为每种语言进行定义,并且我的电子邮件将使用多种语言,但我会从messages.properties中读取静态消息。

现在这是我面临的问题

在模板中,语言始终设置为en_US。我正在使用以下API来获取模板的字符串。我没有直接使用邮件插件,因为我也需要将发送消息也作为字符串存储到数据库中

    def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])

我还在论坛上的其他帖子中读到了有关使用lang参数设置语言的信息,但该语言仍设置为仅en_US。

上面的方法调用是否支持指定语言?
是否可以使用速度模板来处理这种多语言邮件?

最佳答案

如果您是从请求处理线程中发送邮件(例如通过 Controller 操作),则该邮件应自动从请求中选择正确的语言环境。如果您是从后台线程发送的,那么它将不知道要使用哪种语言环境,因为没有“当前请求”上下文。

如果您有另一种方法来知道要使用的正确语言(例如,如果您将每个用户的首选语言存储在数据库中),则可以重置 LocaleContextHolder

def savedContext = LocaleContextHolder.getLocaleContext()
LocaleContextHolder.setLocale(correctLocaleForThisUser)
try {
  def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])
  // etc. etc.
} finally {
  LocaleContextHolder.setLocaleContext(savedContext)
}

确定correctLocaleForThisUser的确切方式取决于您的应用程序。您可以将每个用户的首选语言存储为数据库中User域对象的属性,或者,如果您正在使用来自 Controller 操作的 executor plugin's runAsync 之类的东西,则可以在访问请求语言环境时将其保存,然后重新在异步任务中使用它:
// SomeController.groovy
def sendEmail() {
  // get locale from the thread-local request and save it in a local variable
  // that the runAsync closure can see
  Locale localeFromRequest = LocaleContextHolder.getLocale()
  runAsync {
    def savedContext = LocaleContextHolder.getLocaleContext()
    // inject the locale extracted from the request
    LocaleContextHolder.setLocale(localeFromRequest)
    try {
      def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])
      // etc. etc.
    } finally {
      LocaleContextHolder.setLocaleContext(savedContext)
    }        
  }
}

关于grails - 带有Grails的多语言电子邮件模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18650817/

相关文章:

grails - 如何让用户一次只能登录一次?

spring - 错误: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

hibernate - quartz ->线程

svn - Grails-未安装SCM提供程序

json - Grails Web服务JSON ID字段

grails - Grails g:paginate标记和自定义URL

grails - 防止重复输入以巧妙地保存

grails JdbcSQLException 在保存一对一映射领域类

Grails 推送到 Heroku 失败 - applicationContext.xml 不存在

grails - 通过Spring Security的Grails配置插件grails-ckeditor