Что имеется:
- мидлвар в 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())
только как им воспользоваться внутри шаблона при рендере теперь? как вообще вы у себя это реализовываете? есть более удачные реализации?
спасибо.