diff --git a/src/middleware.js b/src/middleware.js index f2e9f47baf..3b1b3e89e3 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -2,6 +2,7 @@ var nconf = require('nconf'); var _ = require('lodash'); var fs = require('fs'); var path = require('path'); +var User = require('./models/user').model module.exports.forceSSL = function(req, res, next){ var baseUrl = nconf.get("BASE_URL"); @@ -96,23 +97,41 @@ var getTranslatedString = function(locale, string){ return 'String not found!'; } -var getUserLanguage = function(langs){ - return _(langs).map(function(lang){ - return lang.slice(0, 2); - }).uniq().value()[0]; +var getUserLanguage = function(req, callback){ + var getFromBrowser = function(){ + return _(req.acceptedLanguages).map(function(lang){ + return lang.slice(0, 2); + }).uniq().value()[0]; + }; + + if(req.session && req.session.userId){ + User.findOne({_id: req.session.userId}, function(err, user){ + if(err) return callback(err); + return callback(null, user.preferences.language || getFromBrowser()); + }); + }else{ + return callback(null, getFromBrowser()); + } } -module.exports.locals = function(req) { - return { - NODE_ENV: nconf.get('NODE_ENV'), - BASE_URL: nconf.get('BASE_URL'), - PAYPAL_MERCHANT: nconf.get('PAYPAL_MERCHANT'), - IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent')), - STRIPE_PUB_KEY: nconf.get('STRIPE_PUB_KEY'), - getManifestFiles: getManifestFiles, - getBuildUrl: getBuildUrl, - t: function(string){ - return getTranslatedString(getUserLanguage(req.acceptedLanguages), string); +module.exports.locals = function(req, res, next) { + getUserLanguage(req, function(err, language){ + if(err) return res.json(500, {err: err}); + + res.locals.habitrpg = { + NODE_ENV: nconf.get('NODE_ENV'), + BASE_URL: nconf.get('BASE_URL'), + PAYPAL_MERCHANT: nconf.get('PAYPAL_MERCHANT'), + IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent')), + STRIPE_PUB_KEY: nconf.get('STRIPE_PUB_KEY'), + getManifestFiles: getManifestFiles, + getBuildUrl: getBuildUrl, + avalaibleLanguages: Object.keys(translations), + t: function(string){ + return getTranslatedString(language, string); + } } - } + + next(); + }); } \ No newline at end of file diff --git a/src/models/user.js b/src/models/user.js index 383b53271d..f2d90aeacb 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -172,7 +172,8 @@ var UserSchema = new Schema({ hideHeader: {type:Boolean, 'default':false}, showHelm: {type:Boolean, 'default':true}, skin: {type:String, 'default':'white'}, - timezoneOffset: Number + timezoneOffset: Number, + language: String }, profile: { blurb: String, diff --git a/src/routes/pages.js b/src/routes/pages.js index 3c69dd9f72..72e3f4fb10 100644 --- a/src/routes/pages.js +++ b/src/routes/pages.js @@ -5,30 +5,30 @@ var _ = require('lodash'); var middleware = require('../middleware') // -------- App -------- -router.get('/', function(req, res) { +router.get('/', middleware.locals, function(req, res) { if (!req.headers['x-api-user'] && !req.headers['x-api-key'] && !(req.session && req.session.userId)) return res.redirect('/static/front') return res.render('index', { title: 'HabitRPG | Your Life, The Role Playing Game', - env: middleware.locals(req) + env: res.locals.habitrpg }); }); // -------- Marketing -------- -router.get('/static/front', function(req, res) { - var env = middleware.locals(req); +router.get('/static/front', middleware.locals, function(req, res) { + var env = res.locals.habitrpg; env.isFrontPage = true; res.render('static/front', {env: env}); }); -router.get('/static/privacy', function(req, res) { - res.render('static/privacy', {env: middleware.locals(req)}); +router.get('/static/privacy', middleware.locals, function(req, res) { + res.render('static/privacy', {env: res.locals.habitrpg}); }); -router.get('/static/terms', function(req, res) { - res.render('static/terms', {env: middleware.locals(req)}); +router.get('/static/terms', middleware.locals, function(req, res) { + res.render('static/terms', {env: res.locals.habitrpg}); }); // --------- Redirects --------