Internationalization 如何在Swig自定义标记/过滤器中从局部变量读取变量?

Internationalization 如何在Swig自定义标记/过滤器中从局部变量读取变量?,internationalization,swig-template,Internationalization,Swig Template,我正在尝试为我的应用程序构建i18n模块。因为我使用的是swig,所以我更喜欢为它创建自定义标记“trans”,以便可以缓存翻译结果 我正在使用Express.js 4作为我的应用程序的基础 如何从自定义标记或筛选器内的请求读取变量?我不知道如何读取它们(尤其是在过滤器内部)。我甚至无法访问传递给模板的变量。例如: swig template index.swig ------------------------------- {% trans %}this is sparta{% endtra

我正在尝试为我的应用程序构建i18n模块。因为我使用的是swig,所以我更喜欢为它创建自定义标记“trans”,以便可以缓存翻译结果

我正在使用Express.js 4作为我的应用程序的基础

如何从自定义标记或筛选器内的请求读取变量?我不知道如何读取它们(尤其是在过滤器内部)。我甚至无法访问传递给模板的变量。例如:

swig template index.swig
-------------------------------
{% trans %}this is sparta{% endtrans %}
{% trans "fr" %}this is sparta{% endtrans %}
-------------------------------
我可以让第二行工作。我为“trans”传递locale,并在代码中替换用户从法语翻译传递的文本

但我不想将locale传递给每个trans标记。我想这样做:

function (req, res, next) {
    res.locals.locale = req.session.user.getLocale();
}
// now view should have locale variable
// and trans should use it to pick right translation from the table
{% trans %}this is sparta{% endtrans %}

有人能提供一个指导或解释吗?swig该部分的文件不存在。问题是每个用户都可以使用不同的语言,因此每个请求都会选择lang代码,我应该可以访问swig自定义标记中的lang代码。

模板会自动从
app.local
res.local
读取本地语言。因此,如前所述,您可以添加中间件来设置响应的局部变量,如下所示:

app.use(function (req,res,next) { 
    res.locals.locale = req.session.user.getLocale();
    next();
});
这将把
locale
作为全局视图公开