модуль i18n с шаблонами писем

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

Пока он работает так, как задумано, но, как и в других разделах моего приложения, я также хотел бы использовать 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...

Всего пара вещей:

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

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


person Joum    schedule 19.04.2016    source источник


Ответы (1)


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

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

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

__({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...
person Joum    schedule 20.04.2016
comment
Как ни странно, не знаю, почему, даже до использования этого синтаксиса в шаблоне электронной почты ejs, он уже отображался с правильной локалью. Я думаю, это должно быть связано с тем, что я использовал его в строке subject до того, как я передал его в шаблон. - person Joum; 20.04.2016