0

У меня есть настройка nodemailer для работы с модулем email-templates, используя ejs в качестве механизма рендеринга.Модуль i18n с шаблонами электронной почты

До сих пор это работало по назначению, но, как и в других разделах моего приложения, я также хотел бы использовать модуль i18n, чтобы перевести мой почтовый текст так же, как визуализированные представления моего приложения.

К сожалению, это не работает. Это то, что я пытался делать:

пример 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... 

Просто пару вещей:

  • На выходе моей почты ничего не происходит - стрин g просто не переводится.
  • Я считаю, что просто пройти функции в объекте, идущем на движок рендеринга, должно быть достаточно, чтобы оно было доступно для ejs и выполнялось по назначению, но я не уверен. Любые мысли по этому поводу?
  • У меня нет i18n.setLocale, и поэтому он якобы по умолчанию стоит по-английски, когда req. (что, кстати, язык, который я вижу в полученном мной электронном письме). Может ли это быть причиной того, что он не переводится так, как предполагалось?

Любые мысли приветствуются!

ответ

0

Ну, оказывается, я был прав. i18n действительно дефолтно по-английски. Я решил, что должен установить локаль, прежде чем передавать ее в шаблонный движок, и это сработало.

Я получил предпочтительный принятый язык, используя метод express.js req.accceptsLanguages(). Это не является отказоустойчивым, поскольку невозможно гарантировать, что это действительно родной язык пользователя (хотя в большинстве случаев он должен быть).

Кроме того, поскольку я использовал i18n в своем глобальном масштабе, именно по этой причине он по умолчанию не пользовался английским. Таким образом, я передать его в Aswell шаблонный двигателя, а затем использовать его, как указано 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... 
+0

Funilly, не знаю, почему , даже до использования этого синтаксиса в шаблоне электронной почты ejs, он уже обрабатывался с правильной локалью. Я думаю, что это должно быть связано с тем, что он использовал его в строке 'subject', прежде чем передать его в шаблон. – Joum