diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index 466f6c27e4..3e5d51c4aa 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -103,7 +103,7 @@ "topics_per_page": "Topics per Page", "posts_per_page": "Posts per Page", "max_items_per_page": "Maximum %1", - + "acp_language": "Admin Page Language", "notification_sounds" : "Play a sound when you receive a notification", "notifications_and_sounds": "Notifications & Sounds", "incoming-message-sound": "Incoming message sound", diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index cadb7c12f8..39828c5350 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -1,6 +1,7 @@ 'use strict'; var async = require('async'); +var _ = require('lodash'); var user = require('../../user'); var languages = require('../../languages'); @@ -40,6 +41,9 @@ settingsController.get = function (req, res, callback) { function (results, next) { userData.settings = results.settings; userData.languages = results.languages; + if (userData.isAdmin && userData.isSelf) { + userData.acpLanguages = _.cloneDeep(results.languages); + } var types = [ 'notification', @@ -135,6 +139,12 @@ settingsController.get = function (req, res, callback) { language.selected = language.code === userData.settings.userLang; }); + if (userData.isAdmin && userData.isSelf) { + userData.acpLanguages.forEach(function (language) { + language.selected = language.code === userData.settings.acpLang; + }); + } + var notifFreqOptions = [ 'all', 'everyTen', diff --git a/src/controllers/api.js b/src/controllers/api.js index 4f9430826a..7321694107 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -86,6 +86,7 @@ apiController.loadConfig = function (req, callback) { config.topicsPerPage = settings.topicsPerPage; config.postsPerPage = settings.postsPerPage; config.userLang = (req.query.lang ? validator.escape(String(req.query.lang)) : null) || settings.userLang || config.defaultLang; + config.acpLang = (req.query.lang ? validator.escape(String(req.query.lang)) : null) || settings.acpLang; config.openOutgoingLinksInNewTab = settings.openOutgoingLinksInNewTab; config.topicPostSort = settings.topicPostSort || config.topicPostSort; config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort; diff --git a/src/languages.js b/src/languages.js index cdf56bf81d..65d5c2113d 100644 --- a/src/languages.js +++ b/src/languages.js @@ -71,12 +71,13 @@ Languages.list = function (callback) { if (err) { return next(err); } + var lang; try { - var lang = JSON.parse(file); - next(null, lang); + lang = JSON.parse(file); } catch (e) { - next(e); + return next(e); } + next(null, lang); }); }, function (err, languages) { if (err) { diff --git a/src/middleware/admin.js b/src/middleware/admin.js index 2d0968d50f..3086f045cc 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -38,7 +38,7 @@ module.exports = function (middleware) { plugins: [], authentication: [], }; - + res.locals.config = res.locals.config || {}; async.waterfall([ function (next) { async.parallel({ @@ -51,9 +51,6 @@ module.exports = function (middleware) { custom_header: function (next) { plugins.fireHook('filter:admin.header.build', custom_header, next); }, - config: function (next) { - controllers.api.getConfig(req, res, next); - }, configs: function (next) { meta.configs.list(next); }, @@ -64,8 +61,6 @@ module.exports = function (middleware) { userData.uid = req.uid; userData['email:confirmed'] = parseInt(userData['email:confirmed'], 10) === 1; - res.locals.config = results.config; - var acpPath = req.path.slice(1).split('/'); acpPath.forEach(function (path, i) { acpPath[i] = path.charAt(0).toUpperCase() + path.slice(1); @@ -73,9 +68,9 @@ module.exports = function (middleware) { acpPath = acpPath.join(' > '); var templateValues = { - config: results.config, - configJSON: jsesc(JSON.stringify(results.config), { isScriptContext: true }), - relative_path: results.config.relative_path, + config: res.locals.config, + configJSON: jsesc(JSON.stringify(res.locals.config), { isScriptContext: true }), + relative_path: res.locals.config.relative_path, adminConfigJSON: encodeURIComponent(JSON.stringify(results.configs)), user: userData, userJSON: jsesc(JSON.stringify(userData), { isScriptContext: true }), diff --git a/src/middleware/render.js b/src/middleware/render.js index a4571b6879..1da50e8a74 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -120,6 +120,9 @@ module.exports = function (middleware) { function translate(str, req, res, next) { var language = (res.locals.config && res.locals.config.userLang) || 'en-GB'; + if (res.locals.renderAdminHeader) { + language = (res.locals.config && res.locals.config.acpLang) || 'en-GB'; + } language = req.query.lang ? validator.escape(String(req.query.lang)) : language; translator.translate(str, language, function (translated) { next(null, translator.unescape(translated)); diff --git a/src/user/settings.js b/src/user/settings.js index df5ed93d71..cac4430fbc 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -70,6 +70,7 @@ module.exports = function (User) { settings.topicsPerPage = Math.min(settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : defaultTopicsPerPage, defaultTopicsPerPage); settings.postsPerPage = Math.min(settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : defaultPostsPerPage, defaultPostsPerPage); settings.userLang = settings.userLang || meta.config.defaultLang || 'en-GB'; + settings.acpLang = settings.acpLang || settings.userLang; settings.topicPostSort = getSetting(settings, 'topicPostSort', 'oldest_to_newest'); settings.categoryTopicSort = getSetting(settings, 'categoryTopicSort', 'newest_to_oldest'); settings.followTopicsOnCreate = parseInt(getSetting(settings, 'followTopicsOnCreate', 1), 10) === 1; @@ -118,6 +119,7 @@ module.exports = function (User) { topicsPerPage: Math.min(data.topicsPerPage, parseInt(maxTopicsPerPage, 10) || 20), postsPerPage: Math.min(data.postsPerPage, parseInt(maxPostsPerPage, 10) || 20), userLang: data.userLang || meta.config.defaultLang, + acpLang: data.acpLang || meta.config.defaultLang, followTopicsOnCreate: data.followTopicsOnCreate, followTopicsOnReply: data.followTopicsOnReply, restrictChat: data.restrictChat,