mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 02:55:58 +01:00 
			
		
		
		
	| @@ -69,5 +69,6 @@ | |||||||
| 	"invisible": "Invisible", | 	"invisible": "Invisible", | ||||||
| 	"offline": "Offline", | 	"offline": "Offline", | ||||||
|  |  | ||||||
| 	"privacy": "Privacy" | 	"privacy": "Privacy", | ||||||
|  | 	"language": "Language" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -7,16 +7,21 @@ define(['forum/accountheader'], function(header) { | |||||||
| 		$('#submitBtn').on('click', function() { | 		$('#submitBtn').on('click', function() { | ||||||
| 			var settings = {}; | 			var settings = {}; | ||||||
|  |  | ||||||
| 			$('.account input, .account textarea').each(function(id, input) { | 			$('.account').find('input, textarea, select').each(function(id, input) { | ||||||
| 				input = $(input); | 				input = $(input); | ||||||
|  | 				var setting = input.attr('data-property'); | ||||||
|  | 				if (input.is('select')) { | ||||||
|  | 					settings[setting] = input.val(); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  |  | ||||||
| 				switch (input.attr('type')) { | 				switch (input.attr('type')) { | ||||||
| 					case 'text' : | 					case 'text' : | ||||||
| 					case 'textarea' : | 					case 'textarea' : | ||||||
| 						settings[input.attr('data-property')] = input.val(); | 						settings[setting] = input.val(); | ||||||
| 						break; | 						break; | ||||||
| 					case 'checkbox' : | 					case 'checkbox' : | ||||||
| 						settings[input.attr('data-property')] = input.is(':checked') ? 1 : 0; | 						settings[setting] = input.is(':checked') ? 1 : 0; | ||||||
| 						break; | 						break; | ||||||
| 				} | 				} | ||||||
| 			}); | 			}); | ||||||
| @@ -32,9 +37,16 @@ define(['forum/accountheader'], function(header) { | |||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		socket.emit('user.getSettings', function(err, settings) { | 		socket.emit('user.getSettings', function(err, settings) { | ||||||
| 			for (var setting in settings) { | 			var inputs = $('.account').find('input, textarea, select'); | ||||||
| 				if (settings.hasOwnProperty(setting)) { |  | ||||||
| 					var input = $('.account input[data-property="' + setting + '"]'); | 			inputs.each(function(index, input) { | ||||||
|  | 				input = $(input); | ||||||
|  | 				var setting = input.attr('data-property'); | ||||||
|  | 				if (setting) { | ||||||
|  | 					if (input.is('select')) { | ||||||
|  | 						input.val(settings[setting]); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  |  | ||||||
| 					switch (input.attr('type')) { | 					switch (input.attr('type')) { | ||||||
| 						case 'text' : | 						case 'text' : | ||||||
| @@ -46,7 +58,7 @@ define(['forum/accountheader'], function(header) { | |||||||
| 							break; | 							break; | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			}); | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,17 +4,15 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| 	var translator = {}, | 	var translator = {}, | ||||||
| 		files = { | 		languages = {}; | ||||||
| 			loaded: {}, |  | ||||||
| 			loading: {}, |  | ||||||
| 			callbacks: {} // could be combined with "loading" in future. |  | ||||||
| 		}; |  | ||||||
|  |  | ||||||
| 	module.exports = translator; | 	module.exports = translator; | ||||||
|  |  | ||||||
| 	// Use this in plugins to add your own translation files. | 	// Use this in plugins to add your own translation files. | ||||||
| 	translator.addTranslation = function(filename, translations) { | 	translator.addTranslation = function(language, filename, translations) { | ||||||
| 		files.loaded[filename] = translations; | 		languages[language] = languages[language] || {}; | ||||||
|  | 		languages[language].loaded = languages[language].loaded || {}; | ||||||
|  | 		languages[language].loaded[filename] = translations; | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	translator.getLanguage = function() { | 	translator.getLanguage = function() { | ||||||
| @@ -67,11 +65,21 @@ | |||||||
| 		} | 		} | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	translator.translate = function (data, callback) { | 	translator.translate = function (data, language, callback) { | ||||||
| 		if (!data) { | 		if (!data) { | ||||||
| 			return callback(data); | 			return callback(data); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		if (typeof language === 'function') { | ||||||
|  | 			callback = language; | ||||||
|  | 			if ('undefined' !== typeof window && config) { | ||||||
|  | 				language = config.defaultLang || 'en_GB'; | ||||||
|  | 			} else { | ||||||
|  | 				var meta = require('../../src/meta'); | ||||||
|  | 				language = meta.config.defaultLang || 'en_GB'; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		function insertLanguage(text, key, value, variables) { | 		function insertLanguage(text, key, value, variables) { | ||||||
| 			if (value) { | 			if (value) { | ||||||
| 				for (var i = 1, ii = variables.length; i < ii; i++) { | 				for (var i = 1, ii = variables.length; i < ii; i++) { | ||||||
| @@ -109,12 +117,12 @@ | |||||||
| 			var languageFile = parsedKey[0]; | 			var languageFile = parsedKey[0]; | ||||||
| 			parsedKey = ('' + parsedKey[1]).split(',')[0]; | 			parsedKey = ('' + parsedKey[1]).split(',')[0]; | ||||||
|  |  | ||||||
| 			if (files.loaded[languageFile]) { | 			if (isLanguageFileLoaded(language, languageFile)) { | ||||||
| 				data = insertLanguage(data, key, files.loaded[languageFile][parsedKey], variables); | 				data = insertLanguage(data, key, languages[language].loaded[languageFile][parsedKey], variables); | ||||||
| 			} else { | 			} else { | ||||||
| 				loading++; | 				loading++; | ||||||
| 				(function (languageKey, parsedKey, languageFile, variables) { | 				(function (languageKey, parsedKey, languageFile, variables) { | ||||||
| 					translator.load(languageFile, function (languageData) { | 					translator.load(language, languageFile, function (languageData) { | ||||||
| 						data = insertLanguage(data, languageKey, languageData[parsedKey], variables); | 						data = insertLanguage(data, languageKey, languageData[parsedKey], variables); | ||||||
| 						loading--; | 						loading--; | ||||||
| 						checkComplete(); | 						checkComplete(); | ||||||
| @@ -132,61 +140,73 @@ | |||||||
| 		} | 		} | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	translator.clearLoadedFiles = function() { | 	translator.load = function (language, filename, callback) { | ||||||
| 		files.loaded = {}; |  | ||||||
| 		files.loading = {}; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	translator.load = function (filename, callback) { | 		if (isLanguageFileLoaded(language, filename)) { | ||||||
|  |  | ||||||
| 		if (files.loaded[filename] && !files.loading[filename]) { |  | ||||||
| 			if (callback) { | 			if (callback) { | ||||||
| 				callback(files.loaded[filename]); | 				callback(languages[language].loaded[filename]); | ||||||
| 			} | 			} | ||||||
| 		} else if (files.loading[filename]) { | 		} else if (isLanguageFileLoading(language, filename)) { | ||||||
| 			if (callback) { | 			if (callback) { | ||||||
| 				files.callbacks[filename] = files.callbacks[filename] || []; | 				addLanguageFileCallback(language, filename, callback); | ||||||
| 				files.callbacks[filename].push(callback); |  | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
|  |  | ||||||
| 			files.loading[filename] = true; | 			languages[language] = languages[language] || {loading: {}, loaded: {}, callbacks: []}; | ||||||
|  |  | ||||||
| 			load(filename, function(language) { | 			languages[language].loading[filename] = true; | ||||||
| 				files.loaded[filename] = language; |  | ||||||
|  | 			load(language, filename, function(translations) { | ||||||
|  |  | ||||||
|  | 				languages[language].loaded[filename] = translations; | ||||||
|  |  | ||||||
| 				if (callback) { | 				if (callback) { | ||||||
| 					callback(language); | 					callback(translations); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				while (files.callbacks[filename] && files.callbacks[filename].length) { | 				while (languages[language].callbacks[filename] && languages[language].callbacks[filename].length) { | ||||||
| 					files.callbacks[filename].pop()(language); | 					languages[language].callbacks[filename].pop()(translations); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				files.loading[filename] = false; | 				languages[language].loading[filename] = false; | ||||||
| 			}); | 			}); | ||||||
| 		} | 		} | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	function load(filename, callback) { | 	function isLanguageFileLoaded(language, filename) { | ||||||
|  | 		var languageObj = languages[language]; | ||||||
|  | 		return languageObj && languageObj.loaded && languageObj.loaded[filename] && !languageObj.loading[filename]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function isLanguageFileLoading(language, filename) { | ||||||
|  | 		return languages[language] && languages[language].loading && languages[language].loading[filename]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function addLanguageFileCallback(language, filename, callback) { | ||||||
|  | 		languages[language].callbacks = languages[language].callbacks || {}; | ||||||
|  |  | ||||||
|  | 		languages[language].callbacks[filename] = languages[language].callbacks[filename] || []; | ||||||
|  | 		languages[language].callbacks[filename].push(callback); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	function load(language, filename, callback) { | ||||||
| 		if ('undefined' !== typeof window) { | 		if ('undefined' !== typeof window) { | ||||||
| 			loadClient(filename, callback); | 			loadClient(language, filename, callback); | ||||||
| 		} else { | 		} else { | ||||||
| 			loadServer(filename, callback); | 			loadServer(language, filename, callback); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	function loadClient(filename, callback) { | 	function loadClient(language, filename, callback) { | ||||||
| 		var timestamp = new Date().getTime(); | 		var timestamp = new Date().getTime(); | ||||||
| 		$.getJSON(config.relative_path + '/language/' + config.defaultLang + '/' + filename + '.json?v=' + timestamp, callback); | 		$.getJSON(config.relative_path + '/language/' + language + '/' + filename + '.json?v=' + timestamp, callback); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	function loadServer(filename, callback) { | 	function loadServer(language, filename, callback) { | ||||||
| 		var fs = require('fs'), | 		var fs = require('fs'), | ||||||
| 			path = require('path'), | 			path = require('path'), | ||||||
| 			winston = require('winston'), | 			winston = require('winston'), | ||||||
| 			meta = require('../../src/meta'), | 			meta = require('../../src/meta'); | ||||||
| 			language = meta.config.defaultLang || 'en_GB'; |  | ||||||
|  |  | ||||||
| 		if (!fs.existsSync(path.join(__dirname, '../language', language))) { | 		if (!fs.existsSync(path.join(__dirname, '../language', language))) { | ||||||
| 			winston.warn('[translator] Language \'' + meta.config.defaultLang + '\' not found. Defaulting to \'en_GB\''); | 			winston.warn('[translator] Language \'' + meta.config.defaultLang + '\' not found. Defaulting to \'en_GB\''); | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ var fs = require('fs'), | |||||||
| 	utils = require('./../../public/src/utils'), | 	utils = require('./../../public/src/utils'), | ||||||
| 	meta = require('./../meta'), | 	meta = require('./../meta'), | ||||||
| 	plugins = require('./../plugins'), | 	plugins = require('./../plugins'), | ||||||
|  | 	languages = require('./../languages'), | ||||||
| 	image = require('./../image'), | 	image = require('./../image'), | ||||||
| 	file = require('./../file'); | 	file = require('./../file'); | ||||||
|  |  | ||||||
| @@ -331,22 +332,29 @@ accountsController.accountSettings = function(req, res, next) { | |||||||
| 				return next(err); | 				return next(err); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			user.getUserFields(uid, ['username', 'userslug'], function(err, userData) { | 			async.parallel({ | ||||||
|  | 				user: function(next) { | ||||||
|  | 					user.getUserFields(uid, ['username', 'userslug'], next); | ||||||
|  | 				}, | ||||||
|  | 				languages: function(next) { | ||||||
|  | 					languages.list(next); | ||||||
|  | 				} | ||||||
|  | 			}, function(err, results) { | ||||||
| 				if (err) { | 				if (err) { | ||||||
| 					return next(err); | 					return next(err); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				if(!userData) { | 				if(!results.user) { | ||||||
| 					return userNotFound(); | 					return userNotFound(); | ||||||
| 				} | 				} | ||||||
| 				userData.yourid = req.user.uid; |  | ||||||
| 				userData.theirid = uid; |  | ||||||
| 				userData.settings = settings; |  | ||||||
|  |  | ||||||
| 				res.render('accountsettings', userData); | 				results.user.yourid = req.user.uid; | ||||||
|  | 				results.user.theirid = uid; | ||||||
|  | 				results.user.settings = settings; | ||||||
|  |  | ||||||
|  | 				res.render('accountsettings', results); | ||||||
| 			}); | 			}); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 	}); | 	}); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -58,6 +58,7 @@ apiController.getConfig = function(req, res, next) { | |||||||
| 		config.topicsPerPage = settings.topicsPerPage; | 		config.topicsPerPage = settings.topicsPerPage; | ||||||
| 		config.postsPerPage = settings.postsPerPage; | 		config.postsPerPage = settings.postsPerPage; | ||||||
| 		config.notificationSounds = settings.notificationSounds; | 		config.notificationSounds = settings.notificationSounds; | ||||||
|  | 		config.defaultLang = settings.language || config.defaultLang; | ||||||
|  |  | ||||||
| 		if (res.locals.isAPI) { | 		if (res.locals.isAPI) { | ||||||
| 			res.json(200, config); | 			res.json(200, config); | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								src/meta.js
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/meta.js
									
									
									
									
									
								
							| @@ -63,11 +63,6 @@ var fs = require('fs'), | |||||||
|  |  | ||||||
| 					callback(err, res); | 					callback(err, res); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				// this might be a good spot to add a hook |  | ||||||
| 				if (field === 'defaultLang') { |  | ||||||
| 					translator.clearLoadedFiles(); |  | ||||||
| 				} |  | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
| 		setOnEmpty: function (field, value, callback) { | 		setOnEmpty: function (field, value, callback) { | ||||||
| @@ -173,10 +168,8 @@ var fs = require('fs'), | |||||||
| 			isTopic: /^topic\/\d+\/?/, | 			isTopic: /^topic\/\d+\/?/, | ||||||
| 			isUserPage: /^user\/[^\/]+(\/[\w]+)?/ | 			isUserPage: /^user\/[^\/]+(\/[\w]+)?/ | ||||||
| 		}, | 		}, | ||||||
| 		build: function (urlFragment, callback) { | 		build: function (urlFragment, language, callback) { | ||||||
| 			var user = require('./user'); | 			Meta.title.parseFragment(decodeURIComponent(urlFragment), language, function(err, title) { | ||||||
|  |  | ||||||
| 			Meta.title.parseFragment(decodeURIComponent(urlFragment), function(err, title) { |  | ||||||
| 				if (err) { | 				if (err) { | ||||||
| 					title = Meta.config.browserTitle || 'NodeBB'; | 					title = Meta.config.browserTitle || 'NodeBB'; | ||||||
| 				} else { | 				} else { | ||||||
| @@ -186,14 +179,14 @@ var fs = require('fs'), | |||||||
| 				callback(null, title); | 				callback(null, title); | ||||||
| 			}); | 			}); | ||||||
| 		}, | 		}, | ||||||
| 		parseFragment: function (urlFragment, callback) { | 		parseFragment: function (urlFragment, language, callback) { | ||||||
| 			var	translated = ['', 'recent', 'unread', 'users', 'notifications']; | 			var	translated = ['', 'recent', 'unread', 'users', 'notifications']; | ||||||
| 			if (translated.indexOf(urlFragment) !== -1) { | 			if (translated.indexOf(urlFragment) !== -1) { | ||||||
| 				if (!urlFragment.length) { | 				if (!urlFragment.length) { | ||||||
| 					urlFragment = 'home'; | 					urlFragment = 'home'; | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				translator.translate('[[pages:' + urlFragment + ']]', function(translated) { | 				translator.translate('[[pages:' + urlFragment + ']]', language, function(translated) { | ||||||
| 					callback(null, translated); | 					callback(null, translated); | ||||||
| 				}); | 				}); | ||||||
| 			} else if (this.tests.isCategory.test(urlFragment)) { | 			} else if (this.tests.isCategory.test(urlFragment)) { | ||||||
| @@ -215,7 +208,7 @@ var fs = require('fs'), | |||||||
|  |  | ||||||
| 				User.getUsernameByUserslug(userslug, function(err, username) { | 				User.getUsernameByUserslug(userslug, function(err, username) { | ||||||
| 					if (subpage) { | 					if (subpage) { | ||||||
| 						translator.translate('[[pages:user.' + subpage + ', ' + username + ']]', function(translated) { | 						translator.translate('[[pages:user.' + subpage + ', ' + username + ']]', language, function(translated) { | ||||||
| 							callback(null, translated); | 							callback(null, translated); | ||||||
| 						}); | 						}); | ||||||
| 					} else { | 					} else { | ||||||
|   | |||||||
| @@ -143,30 +143,31 @@ middleware.checkAccountPermissions = function(req, res, next) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| middleware.buildHeader = function(req, res, next) { | middleware.buildHeader = function(req, res, next) { | ||||||
| 	async.parallel([ |  | ||||||
| 		function(next) { |  | ||||||
| 	res.locals.renderHeader = true; | 	res.locals.renderHeader = true; | ||||||
| 			next(); | 	async.parallel({ | ||||||
|  | 		config: function(next) { | ||||||
|  | 			controllers.api.getConfig(req, res, next); | ||||||
| 		}, | 		}, | ||||||
| 		function(next) { | 		footer: function(next) { | ||||||
| 			controllers.api.getConfig(req, res, function(err, config) { | 			app.render('footer', {}, next); | ||||||
| 				res.locals.config = config; |  | ||||||
| 				next(err); |  | ||||||
| 			}); |  | ||||||
| 		}, |  | ||||||
| 		function(next) { |  | ||||||
| 			// consider caching this, since no user specific information is loaded here |  | ||||||
| 			app.render('footer', {}, function(err, template) { |  | ||||||
| 				translator.translate(template, function(parsedTemplate) { |  | ||||||
| 					res.locals.footer = parsedTemplate; |  | ||||||
| 					next(err); |  | ||||||
| 				}); |  | ||||||
| 			}); |  | ||||||
| 		} | 		} | ||||||
| 	], next); | 	}, function(err, results) { | ||||||
|  | 		if (err) { | ||||||
|  | 			return next(err); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		res.locals.config = results.config; | ||||||
|  |  | ||||||
|  | 		translator.translate(results.footer, results.config.defaultLang, function(parsedTemplate) { | ||||||
|  | 			res.locals.footer = parsedTemplate; | ||||||
|  | 			next(); | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| middleware.renderHeader = function(req, res, callback) { | middleware.renderHeader = function(req, res, callback) { | ||||||
|  | 	var uid = req.user ? parseInt(req.user.uid, 10) : 0; | ||||||
|  |  | ||||||
| 	var custom_header = { | 	var custom_header = { | ||||||
| 		'navigation': [] | 		'navigation': [] | ||||||
| 	}; | 	}; | ||||||
| @@ -218,8 +219,6 @@ middleware.renderHeader = function(req, res, callback) { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		var uid = '0'; |  | ||||||
|  |  | ||||||
| 		templateValues.metaTags = defaultMetaTags.concat(res.locals.metaTags || []).map(function(tag) { | 		templateValues.metaTags = defaultMetaTags.concat(res.locals.metaTags || []).map(function(tag) { | ||||||
| 			if(!tag || typeof tag.content !== 'string') { | 			if(!tag || typeof tag.content !== 'string') { | ||||||
| 				winston.warn('Invalid meta tag. ', tag); | 				winston.warn('Invalid meta tag. ', tag); | ||||||
| @@ -239,9 +238,6 @@ middleware.renderHeader = function(req, res, callback) { | |||||||
| 			href: nconf.get('relative_path') + '/favicon.ico' | 			href: nconf.get('relative_path') + '/favicon.ico' | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| 		if(req.user && req.user.uid) { |  | ||||||
| 			uid = req.user.uid; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		templateValues.useCustomCSS = false; | 		templateValues.useCustomCSS = false; | ||||||
| 		if (meta.config.useCustomCSS === '1') { | 		if (meta.config.useCustomCSS === '1') { | ||||||
| @@ -249,34 +245,30 @@ middleware.renderHeader = function(req, res, callback) { | |||||||
| 			templateValues.customCSS = meta.config.customCSS; | 			templateValues.customCSS = meta.config.customCSS; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		async.parallel([ | 		async.parallel({ | ||||||
| 			function(next) { | 			title: function(next) { | ||||||
| 				translator.translate('[[pages:' + path.basename(req.url) + ']]', function(translated) { | 				if (uid) { | ||||||
| 					var	metaTitle = templateValues.metaTags.filter(function(tag) { | 					user.getSettings(uid, function(err, settings) { | ||||||
| 							return tag.name === 'title'; | 						if (err) { | ||||||
|  | 							return next(err); | ||||||
|  | 						} | ||||||
|  | 						meta.title.build(req.url.slice(1), settings.language, next); | ||||||
| 					}); | 					}); | ||||||
|  |  | ||||||
| 					if (translated) { |  | ||||||
| 						templateValues.browserTitle = translated; |  | ||||||
| 					} else if (metaTitle.length > 0 && metaTitle[0].content) { |  | ||||||
| 						templateValues.browserTitle = metaTitle[0].content; |  | ||||||
| 				} else { | 				} else { | ||||||
| 						templateValues.browserTitle = meta.config.browserTitle || 'NodeBB'; | 					meta.title.build(req.url.slice(1), meta.config.defaultLang, next); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 					next(); |  | ||||||
| 				}); |  | ||||||
| 			}, | 			}, | ||||||
| 			function(next) { | 			isAdmin: function(next) { | ||||||
| 				user.isAdministrator(uid, function(err, isAdmin) { | 				user.isAdministrator(uid, next); | ||||||
| 					templateValues.isAdmin = isAdmin || false; |  | ||||||
| 					next(); |  | ||||||
| 				}); |  | ||||||
| 			} | 			} | ||||||
| 		], function() { | 		}, function(err, results) { | ||||||
| 			app.render('header', templateValues, function(err, template) { | 			if (err) { | ||||||
| 				callback(null, template); | 				return next(err); | ||||||
| 			}); | 			} | ||||||
|  | 			templateValues.browserTitle = results.title; | ||||||
|  | 			templateValues.isAdmin = results.isAdmin || false; | ||||||
|  |  | ||||||
|  | 			app.render('header', templateValues, callback); | ||||||
| 		}); | 		}); | ||||||
| 	}); | 	}); | ||||||
| }; | }; | ||||||
| @@ -322,7 +314,7 @@ middleware.processRender = function(req, res, next) { | |||||||
| 				middleware.renderHeader(req, res, function(err, template) { | 				middleware.renderHeader(req, res, function(err, template) { | ||||||
| 					str = template + str; | 					str = template + str; | ||||||
|  |  | ||||||
| 					translator.translate(str, function(translated) { | 					translator.translate(str, res.locals.config.defaultLang, function(translated) { | ||||||
| 						fn(err, translated); | 						fn(err, translated); | ||||||
| 					}); | 					}); | ||||||
| 				}); | 				}); | ||||||
|   | |||||||
| @@ -32,7 +32,16 @@ SocketMeta.reconnected = function(socket) { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| SocketMeta.buildTitle = function(socket, text, callback) { | SocketMeta.buildTitle = function(socket, text, callback) { | ||||||
| 	meta.title.build(text, callback); | 	if (socket.uid) { | ||||||
|  | 		user.getSettings(socket.uid, function(err, settings) { | ||||||
|  | 			if (err) { | ||||||
|  | 				return callback(err); | ||||||
|  | 			} | ||||||
|  | 			meta.title.build(text, settings.language, callback); | ||||||
|  | 		}); | ||||||
|  | 	} else { | ||||||
|  | 		meta.title.build(text, meta.config.defaultLang, callback); | ||||||
|  | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
| SocketMeta.updateHeader = function(socket, data, callback) { | SocketMeta.updateHeader = function(socket, data, callback) { | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ module.exports = function(User) { | |||||||
| 				settings.topicsPerPage = settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : parseInt(meta.config.topicsPerPage, 10) || 20; | 				settings.topicsPerPage = settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : parseInt(meta.config.topicsPerPage, 10) || 20; | ||||||
| 				settings.postsPerPage = settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : parseInt(meta.config.postsPerPage, 10) || 10; | 				settings.postsPerPage = settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : parseInt(meta.config.postsPerPage, 10) || 10; | ||||||
| 				settings.notificationSounds = settings.notificationSounds ? parseInt(settings.notificationSounds, 10) === 1 : true; | 				settings.notificationSounds = settings.notificationSounds ? parseInt(settings.notificationSounds, 10) === 1 : true; | ||||||
|  | 				settings.language = settings.language || meta.config.defaultLang || 'en_GB'; | ||||||
| 				callback(null, settings); | 				callback(null, settings); | ||||||
| 			}); | 			}); | ||||||
| 		}); | 		}); | ||||||
| @@ -47,7 +48,8 @@ module.exports = function(User) { | |||||||
| 			usePagination: data.usePagination, | 			usePagination: data.usePagination, | ||||||
| 			topicsPerPage: data.topicsPerPage, | 			topicsPerPage: data.topicsPerPage, | ||||||
| 			postsPerPage: data.postsPerPage, | 			postsPerPage: data.postsPerPage, | ||||||
| 			notificationSounds: data.notificationSounds | 			notificationSounds: data.notificationSounds, | ||||||
|  | 			language: data.language || meta.config.defaultLang | ||||||
| 		}, callback); | 		}, callback); | ||||||
| 	}; | 	}; | ||||||
| }; | }; | ||||||
		Reference in New Issue
	
	Block a user