2

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

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

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

现在这是我面临的问题

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

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

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

上述方法调用是否支持指定语言?是否可以选择使用速度模板来发送这种多语言邮件?

4

2 回答 2

1

如果您从请求处理线程(例如,从控制器操作)中发送邮件,那么它应该自动从请求中获取正确的语言环境。如果您从后台线程发送,那么它将不知道要使用什么语言环境,因为没有“当前请求”上下文。

如果您有另一种方法可以知道要使用的正确语言(例如,如果您将每个用户的首选语言存储在数据库中),那么您可以重置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域对象的属性存储在数据库中,或者如果您正在使用控制器操作中的executor插件之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)
    }        
  }
}
于 2013-09-06T11:43:27.307 回答
0

你能通过创建一个包含正确翻译列表的模型来解决这个问题吗?

例如:

def messages = [:]
messages['hello.world'] = messageSource.getMessage(
        "hello.world",
        null,
        new Locale("nb")
)
def template = groovyPageRenderer.render(
        template: '/mail/email',
        model:[messages:messages]
)

然后在视图中您只需编写:

<html>
    <head>
       <title>${messages['hello.world']}</title>
    </head>
    <body>
    </body>
</html>
于 2013-09-06T11:27:13.080 回答