首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含grails的MultiLingual电子邮件模板

包含grails的MultiLingual电子邮件模板
EN

Stack Overflow用户
提问于 2013-09-06 13:52:54
回答 2查看 868关注 0票数 2

我试图发送来自grails的电子邮件,邮件模板应该是多语言的。

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

在GSP中,我现在阅读来自messages.properties的静态消息,假设我将为每种语言定义,我的电子邮件将变成多语言。

现在我要面对的问题是

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

代码语言:javascript
复制
    def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])

我也在论坛上读到其他关于使用lang参数设置语言的帖子,但仍然只将语言设置为en_US。

上面的方法调用是否支持指定语言?

EN

回答 2

Stack Overflow用户

发布于 2013-09-06 19:43:27

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

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

代码语言:javascript
复制
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 plugin's runAsync之类的内容,那么您可以在有权访问请求区域设置时保存它,然后在异步任务中重用它:

代码语言:javascript
复制
// 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)
    }        
  }
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-06 19:27:13

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

例如:

代码语言:javascript
复制
def messages = [:]
messages['hello.world'] = messageSource.getMessage(
        "hello.world",
        null,
        new Locale("nb")
)
def template = groovyPageRenderer.render(
        template: '/mail/email',
        model:[messages:messages]
)

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

代码语言:javascript
复制
<html>
    <head>
       <title>${messages['hello.world']}</title>
    </head>
    <body>
    </body>
</html>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18650817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档