如何从Express路由中的URL获取可选语言参数?

gia*_*ial 2 routing localization routes node.js express

我遇到了一个愚蠢的问题:如何使用可选的 locale参数?

那就是我的意思:

例如,我有首页联系人,这里是路线:

app.get('/', frontpage.get);
app.get('/contacts', contacts.get);
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试将本地化添加到我的网站

app.all('/:lang?*', language.all); -> detect and set locale
app.get('/:lang?', frontpage.get);
app.get('/:lang?/contacts', contacts.get);
Run Code Online (Sandbox Code Playgroud)

唯一的问题是当我不在URL中使用lang-parameter时:

mysite.com/contacts
Run Code Online (Sandbox Code Playgroud)

因为Express使用"联系人"作为语言参数.(+我不喜欢这种复制粘贴:lang?)

我想,我只是采取了错误的方式.

如何在Express中使用URL中的locale参数?

PS:我不想使用子域名de.mysite.com或查询字符串mysite.com?lang=de.我想要这个变种mysite.com/de

log*_*yth 10

大多数模块使用,Accept-Language所以我找不到任何使用你可能使用的路径.因此,您需要定义自己的中间件,在其他所有内容之前进行初始化.Express's Router对你的用例没有多大帮助.

app.use(function(req, res, next){
    var match = req.url.match(/^\/([A-Z]{2})([\/\?].*)?$/i);
    if (match){
        req.lang = match[1];
        req.url = match[2] || '/';
    }
    next();
});
Run Code Online (Sandbox Code Playgroud)

现在您可以req.lang在路由或其他中间件中使用来配置您的翻译逻辑,因为我们已经重写了URL,后来的逻辑将不会知道有一个语言参数.