From 2476221b792da3ec926fdf35b24acc1c6d358709 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Thu, 20 Apr 2017 00:16:10 -0600 Subject: [PATCH] Close #3462, automatically detect user language based on browser accepts header --- src/webserver.js | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/webserver.js b/src/webserver.js index 94684d8e24..3911846b67 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -55,13 +55,16 @@ module.exports.listen = function (callback) { callback = callback || function () { }; emailer.registerApp(app); - setupExpressApp(app); - - helpers.register(); - - logger.init(app); - async.waterfall([ + function (next) { + setupExpressApp(app, next); + }, + function (next) { + helpers.register(); + + logger.init(app); + next(); + }, initializeNodeBB, function (next) { winston.info('NodeBB Ready'); @@ -110,7 +113,7 @@ function initializeNodeBB(callback) { }); } -function setupExpressApp(app) { +function setupExpressApp(app, callback) { var middleware = require('./middleware'); var relativePath = nconf.get('relative_path'); @@ -155,6 +158,8 @@ function setupExpressApp(app) { var toobusy = require('toobusy-js'); toobusy.maxLag(parseInt(meta.config.eventLoopLagThreshold, 10) || 100); toobusy.interval(parseInt(meta.config.eventLoopInterval, 10) || 500); + + setupAutoLocale(app, callback); } function setupFavicon(app) { @@ -188,6 +193,35 @@ function setupCookie() { return cookie; } +function setupAutoLocale(app, callback) { + languages.listCodes(function (err, codes) { + if (err) { + return callback(err); + } + + var defaultLang = meta.config.defaultLang || 'en-GB'; + + var langs = [defaultLang].concat(codes).filter(function (el, i, arr) { + return arr.indexOf(el) === i; + }); + + app.use(function (req, res, next) { + if (parseInt(req.uid, 10) > 0) { + return next(); + } + + var lang = req.acceptsLanguages(langs); + if (!lang) { + return next(); + } + req.query.lang = lang; + next(); + }); + + callback(); + }); +} + function listen(callback) { callback = callback || function () { }; var port = parseInt(nconf.get('port'), 10);