我试图发送来自grails的电子邮件,邮件模板应该是多语言的。
我发现我们可以将GSP呈现为字符串,甚至可以在grails邮件插件中呈现GSP。
在GSP中,我现在阅读来自messages.properties的静态消息,假设我将为每种语言定义,我的电子邮件将变成多语言。
现在我要面对的问题是
在模板中,语言始终设置为en_US。我使用下面的API来获取模板的字符串。我没有直接使用邮件插件,因为我还需要将发送消息作为字符串存储到数据库中
def contents = groovyPageRenderer.render(template:"/layouts/emailparse", model:[mailObj: mailObj])我也在论坛上读到其他关于使用lang参数设置语言的帖子,但仍然只将语言设置为en_US。
上面的方法调用是否支持指定语言?
发布于 2013-09-06 19:43:27
如果你是在一个请求处理线程中发送邮件(例如,从一个控制器操作),那么它应该自动从请求中提取正确的语言环境。如果你是从后台线程发送的,那么它将不知道要使用什么语言环境,因为没有“当前请求”上下文。
如果您有另一种方法可以知道要使用的正确语言(例如,如果您将每个用户的首选语言存储在数据库中),那么您可以重置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 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)
}
}
}发布于 2013-09-06 19:27:13
你能通过创建一个包含正确翻译的列表的模型来解决这个问题吗?
例如:
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>https://stackoverflow.com/questions/18650817
复制相似问题