具有i18n节点的Express.js多语言

时间:2014-06-27 07:59:31

标签: javascript node.js express

如何使用express.js路由调用控制器?

app.get('*', function(req, res, next) {
    var regExp = /^\/([a-z]{2})(\/|$)/gi,
        exec = regExp.exec(req.url);

    exec = exec != null ? exec[1] : undefined;

    if(exec == undefined) {
        // add language prefix to link
    }
    else {
        i18n.setLocale(exec);
        // add language prefix to link
    }
    next();
});

如果我打开页面/关于我需要获取这样的网址:http://example.com/en/about。我该怎么做以及如何显示呼叫'关于'控制器?

app.get('/about', function(req, res) {
    console.log('Here is about');
    res.send('Hello, World');
});

不合适:app.get('(en|de|ru)/about', ...)

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以执行类似

的操作
app.get('/:language/about', function(req, res) {
    var language = req.params.language;
    i18n.setLocale(language);
});

对于多条路线,您可以这样做

controllers.js

module.exports = {
    about: function(req, res) {
        res.send('about');
    }
}

app.js

var controllers = require('./controllers');
app.all('/:language/:controller', function(req, res) {
    i18n.setLocale(req.params.language);
    controllers[req.params.controller](req, res);
});

答案 1 :(得分:1)

以下对我很有用,因此语言代码可以是可选的:



var i18n = require('i18n');

server.use(express.static(__dirname + '/client/www'));
server.use('/en', express.static(__dirname + '/client/www'));
server.use('/zh', express.static(__dirname + '/client/www'));


function regexPath(p) {
    return new RegExp('(?:/(en|zh))?' + p, 'i');
}

server.use(i18n.init);

server.all('*', function (req, res, next) {
    var l = /^\/(en|zh)/i;
    if (l.test(req.url)) {
        var a = l.exec(req.url);
        var local = a[1];
        i18n.setLocale(local);
        res.setLocale(local);
    } else {
        i18n.setLocale('zh');
        res.setLocale('zh');
    }

    next();
});

server.get(regexPath('/signin'), function (req, res) {
    res.render('sign-in');
});