owl
owl

Reputation: 4481

Express.js multilanguage with i18n-node

How to call controller with express.js routing?

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();
});

If I open the page /about I need to get url like this: http://example.com/en/about. How I can do it and how to display call 'about' controller?

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

Not suitable: app.get('(en|de|ru)/about', ...)

Thanks in advance.

Upvotes: 2

Views: 3424

Answers (2)

Jeff Tian
Jeff Tian

Reputation: 5913

The following works for me very well, so the language code can be optional:

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');
});

Upvotes: 1

Ben Fortune
Ben Fortune

Reputation: 32127

You could do something like

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

For multiple routes you could maybe do this

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);
});

Upvotes: 3

Related Questions