我已设置nodemailer以使用email-templates模块,使用ejs
作为渲染引擎。
到目前为止它按预期工作,但是,与我的应用程序的其他部分一样,我还想使用i18n模块将我的邮件文本翻译成与应用程序的渲染视图相同的方式。< / p>
不幸的是,它不起作用。这就是我尝试做的事情:
示例html.ejs:
<h1><%= __('Hi') %>, <%= user.name %>!</h1>
路线中的节点代码:
// requires at the top
var i18n = require('i18n');
// (.....)
// use template based sender to send a message
sendMailTemplate({
to: user.email,
// EmailTemplate renders html and text but no subject so we need to
// set it manually either here or in the defaults section of templateSender()
subject: i18n.__('translatable subject')
}, {
user: user,
__: i18n.__
}, function(err, info){
if(err){
console.log('Error');
console.log(err);
}else{
console.log('email sent');
req.flash('info', i18n.__('mail sent to %s', user.email));
done(err, 'done');
}
});
// other stuff...
只是一些事情:
i18n
的{{1}}函数传递到渲染引擎的对象应该足以让它__
可用并按预期执行,但我'我不确定。对此有何想法?ejs
,因此在i18n.setLocale
(这是我在收到的电子邮件中看到的语言)时,它应该默认为英语。这可能是它没有按预期翻译的原因吗? 欢迎任何想法!
答案 0 :(得分:0)
好吧,事实证明我是对的。 i18n
确实默认为英语。我想我应该在将它传递给模板引擎之前设置语言环境,然后才能工作。
我使用express.js的req.accceptsLanguages()方法获得了首选语言。这不是故障保护,因为没有办法确保这确实是用户的母语(尽管在大多数情况下应该是这样)。
此外,由于我在全球范围内使用i18n
,这就是为什么它是默认为英语的原因。因此,我将它传递给模板引擎,然后按照here:
__({phrase: 'Hello', locale: 'fr'}); // Salut
所以,最后一点是这样的:
// requires at the top
var i18n = require('i18n');
// (.....)
// THIS IS NEW - it's from express.js
// returns a shorthand for the user's preferred locale: en, es, de, fr, pt, ...
var userLocale = req.acceptsLanguages()[1];
// use template based sender to send a message
sendMailTemplate({
to: user.email,
// EmailTemplate renders html and text but no subject so we need to
// set it manually either here or in the defaults section of templateSender()
subject: i18n.__({phrase: 'translatable subject', locale: userLocale}) // note the syntax here
}, {
user: user,
__: i18n.__,
locale: userLocale // THIS IS ALSO NEW
}, function(err, info){
if(err){
console.log('Error');
console.log(err);
}else{
console.log('email sent');
// also note the syntax here:
req.flash('info', i18n.__({phrase: 'mail sent to %s', locale: userLocale}, user.email));
done(err, 'done');
}
});
// other stuff...