Как лучше организовать мультиязычность в express?

Что имеется:
- мидлвар в express, который при каждом запросе определяет язык и записывает его в переменную req._lang, после чего req передается дальше по цепочке
- класс Translate с методом #setLocale(lang) (устанавливает язык перевода по умолчанию на lang) и методом #_(lang, phrase, args) (переводит строку phrase с аргументами args, на язык lang (если null - на дефолтный))
- шаблонизатор

Очевидный вариант
var t = new Translate({..});
var app = express();

app.get('/url', function(req, res){
    var nick, name;
    ...
    t.setLocale(req._lang);
    res.render('template.html', {
        title: t._('Hello, %s', nick),
        description: t._('This is a long description, my dear %s, ...', name)
    });
});

// template.html
<h1><%= title %></h1>
<div><%= description %></div>


выглядит крайне некошерно, хочется иметь нечто вроде

app.get('/url', function(req, res){
    var nick, name;
    ...
    res.render('template.html', {
        nick: nick,
        name: name
    });
});

// template.html
<h1><% _('Hello, %s', nick) %></h1>
<div><% _('This is a long description, my dear %s, ...', name) %></div>


т.е. шаблону отдаем только сырые данные, а он сам выбирает перевод и форматирует.

примерный вариант, того как я себе это представляю
var t = new Translate({..});
var app = express();

// мидлвар
app.use(function(req, res, next){
     req._ = function(phrase, args){
          return t._(req._lang, phrase, args);
     }
});


т.е. у нас появляется метод req#_(), полный аналог нативного #_(), за исключением того, что автоматически подставляет язык и не меняет глобальный скоп объекта t (через #setLocale())

только как им воспользоваться внутри шаблона при рендере теперь? как вообще вы у себя это реализовываете? есть более удачные реализации?

спасибо.
  • Вопрос задан
  • 2774 просмотра
Решения вопроса 1
ghaiklor
@ghaiklor
NodeJS TechLead
Посмотрите на Sails, у них как раз такая штуковина реализована.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы