如果您从请求处理线程(例如,从控制器操作)中发送邮件,那么它应该自动从请求中获取正确的语言环境。如果您从后台线程发送,那么它将不知道要使用什么语言环境,因为没有“当前请求”上下文。
如果您有另一种方法可以知道要使用的正确语言(例如,如果您将每个用户的首选语言存储在数据库中),那么您可以重置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)
}
}
}