我正在尝试从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/