mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
* fix: #7038, autoLocale logic not playing nicely with no-refresh auths - on login, req.query.lang is deleted (since it seems to be left over) - on logout, the middleware.autoLocale is executed, which resets req.query.lang - middleware.autoLocale is new, just refactored existing logic in webserver.js into new middleware method. * style: tests, use lodash * fix: timeago strings not switching languages on login or out
This commit is contained in:
@@ -140,7 +140,7 @@ app.cacheBuster = null;
|
|||||||
Notifications.prepareDOM();
|
Notifications.prepareDOM();
|
||||||
Chat.prepareDOM();
|
Chat.prepareDOM();
|
||||||
app.reskin(data.config.bootswatchSkin);
|
app.reskin(data.config.bootswatchSkin);
|
||||||
callback();
|
translator.switchTimeagoLanguage(callback);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -596,6 +596,15 @@
|
|||||||
toggle();
|
toggle();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
switchTimeagoLanguage: function switchTimeagoLanguage(callback) {
|
||||||
|
// Delete the cached shorthand strings if present
|
||||||
|
delete adaptor.timeagoShort;
|
||||||
|
|
||||||
|
var languageCode = utils.userLangToTimeagoCode(config.userLang);
|
||||||
|
jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').done(callback);
|
||||||
|
},
|
||||||
|
|
||||||
prepareDOM: function prepareDOM() {
|
prepareDOM: function prepareDOM() {
|
||||||
// Add directional code if necessary
|
// Add directional code if necessary
|
||||||
adaptor.translate('[[language:dir]]', function (value) {
|
adaptor.translate('[[language:dir]]', function (value) {
|
||||||
|
|||||||
@@ -284,6 +284,8 @@ function continueLogin(req, res, next) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
delete req.query.lang;
|
||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
doLogin: async.apply(authenticationController.doLogin, req, userData.uid),
|
doLogin: async.apply(authenticationController.doLogin, req, userData.uid),
|
||||||
header: async.apply(middleware.generateHeader, req, res, {}),
|
header: async.apply(middleware.generateHeader, req, res, {}),
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
var os = require('os');
|
var os = require('os');
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
|
var _ = require('lodash');
|
||||||
|
|
||||||
var meta = require('../meta');
|
var meta = require('../meta');
|
||||||
|
var languages = require('../languages');
|
||||||
|
|
||||||
module.exports = function (middleware) {
|
module.exports = function (middleware) {
|
||||||
middleware.addHeaders = function (req, res, next) {
|
middleware.addHeaders = function (req, res, next) {
|
||||||
@@ -60,4 +62,30 @@ module.exports = function (middleware) {
|
|||||||
|
|
||||||
next();
|
next();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let langs = [];
|
||||||
|
middleware.autoLocale = function (req, res, next) {
|
||||||
|
if (parseInt(req.uid, 10) > 0 || !meta.config.autoDetectLang) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
var lang = req.acceptsLanguages(langs);
|
||||||
|
if (!lang) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
req.query.lang = lang;
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
|
||||||
|
languages.listCodes(function (err, codes) {
|
||||||
|
if (err) {
|
||||||
|
winston.error('[middleware/autoLocale] Could not retrieve languages codes list!');
|
||||||
|
codes = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
winston.verbose('[middleware/autoLocale] Retrieves languages list for middleware');
|
||||||
|
var defaultLang = meta.config.defaultLang || 'en-GB';
|
||||||
|
|
||||||
|
langs = _.uniq([defaultLang, ...codes]);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ var db = require('./database');
|
|||||||
var file = require('./file');
|
var file = require('./file');
|
||||||
var emailer = require('./emailer');
|
var emailer = require('./emailer');
|
||||||
var meta = require('./meta');
|
var meta = require('./meta');
|
||||||
var languages = require('./languages');
|
|
||||||
var logger = require('./logger');
|
var logger = require('./logger');
|
||||||
var plugins = require('./plugins');
|
var plugins = require('./plugins');
|
||||||
var flags = require('./flags');
|
var flags = require('./flags');
|
||||||
@@ -194,12 +193,13 @@ function setupExpressApp(app, callback) {
|
|||||||
app.use(middleware.addHeaders);
|
app.use(middleware.addHeaders);
|
||||||
app.use(middleware.processRender);
|
app.use(middleware.processRender);
|
||||||
auth.initialize(app, middleware);
|
auth.initialize(app, middleware);
|
||||||
|
app.use(middleware.autoLocale); // must be added after auth middlewares are added
|
||||||
|
|
||||||
var toobusy = require('toobusy-js');
|
var toobusy = require('toobusy-js');
|
||||||
toobusy.maxLag(meta.config.eventLoopLagThreshold);
|
toobusy.maxLag(meta.config.eventLoopLagThreshold);
|
||||||
toobusy.interval(meta.config.eventLoopInterval);
|
toobusy.interval(meta.config.eventLoopInterval);
|
||||||
|
|
||||||
setupAutoLocale(app, callback);
|
callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupFavicon(app) {
|
function setupFavicon(app) {
|
||||||
@@ -233,35 +233,6 @@ function setupCookie() {
|
|||||||
return cookie;
|
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 || !meta.config.autoDetectLang) {
|
|
||||||
return next();
|
|
||||||
}
|
|
||||||
|
|
||||||
var lang = req.acceptsLanguages(langs);
|
|
||||||
if (!lang) {
|
|
||||||
return next();
|
|
||||||
}
|
|
||||||
req.query.lang = lang;
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function listen(callback) {
|
function listen(callback) {
|
||||||
callback = callback || function () { };
|
callback = callback || function () { };
|
||||||
var port = nconf.get('port');
|
var port = nconf.get('port');
|
||||||
|
|||||||
@@ -9,19 +9,22 @@ var meta = require('../src/meta');
|
|||||||
|
|
||||||
describe('Language detection', function () {
|
describe('Language detection', function () {
|
||||||
it('should detect the language for a guest', function (done) {
|
it('should detect the language for a guest', function (done) {
|
||||||
meta.config.autoDetectLang = 1;
|
meta.configs.set('autoDetectLang', 1, function (err) {
|
||||||
|
assert.ifError(err);
|
||||||
request(nconf.get('url') + '/api/config', {
|
request(nconf.get('url') + '/api/config', {
|
||||||
headers: {
|
headers: {
|
||||||
'Accept-Language': 'de-DE,de;q=0.5',
|
'Accept-Language': 'de-DE,de;q=0.5',
|
||||||
},
|
},
|
||||||
|
json: true,
|
||||||
}, function (err, res, body) {
|
}, function (err, res, body) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.ok(body);
|
assert.ok(body);
|
||||||
|
|
||||||
assert.strictEqual(JSON.parse(body).userLang, 'de');
|
assert.strictEqual(body.userLang, 'de');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should do nothing when disabled', function (done) {
|
it('should do nothing when disabled', function (done) {
|
||||||
meta.configs.set('autoDetectLang', 0, function (err) {
|
meta.configs.set('autoDetectLang', 0, function (err) {
|
||||||
@@ -30,11 +33,12 @@ describe('Language detection', function () {
|
|||||||
headers: {
|
headers: {
|
||||||
'Accept-Language': 'de-DE,de;q=0.5',
|
'Accept-Language': 'de-DE,de;q=0.5',
|
||||||
},
|
},
|
||||||
|
json: true,
|
||||||
}, function (err, res, body) {
|
}, function (err, res, body) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.ok(body);
|
assert.ok(body);
|
||||||
|
|
||||||
assert.strictEqual(JSON.parse(body).userLang, 'en-GB');
|
assert.strictEqual(body.userLang, 'en-GB');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user