From d3ad21f81f0f93658b6f905367188ceb7c88a087 Mon Sep 17 00:00:00 2001 From: Ole R Date: Fri, 5 Feb 2016 10:12:07 +0100 Subject: [PATCH 001/319] Fix settings trim cleaning arrays --- src/settings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/settings.js b/src/settings.js index 3d90dcfa84..6f3e1a0b36 100644 --- a/src/settings.js +++ b/src/settings.js @@ -20,6 +20,7 @@ function expandObjBy(obj1, obj2) { } function trim(obj1, obj2) { + if (obj1 instanceof Array) { return; } var key, val1; for (key in obj1) { if (obj1.hasOwnProperty(key)) { @@ -29,7 +30,7 @@ function trim(obj1, obj2) { } else if (typeof val1 === 'object') { trim(val1, obj2[key]); } - } + } } } From 7484389a4119ba80373c4ba3fbc8f489727e7bd4 Mon Sep 17 00:00:00 2001 From: Ole R Date: Wed, 10 Feb 2016 15:04:55 +0100 Subject: [PATCH 002/319] Update array-check to Array.isArray --- src/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings.js b/src/settings.js index 6f3e1a0b36..71e0ea1374 100644 --- a/src/settings.js +++ b/src/settings.js @@ -20,7 +20,7 @@ function expandObjBy(obj1, obj2) { } function trim(obj1, obj2) { - if (obj1 instanceof Array) { return; } + if (Array.isArray(obj1)) { return; } var key, val1; for (key in obj1) { if (obj1.hasOwnProperty(key)) { From f537dfee1622b2040f2ab88219fd82328c822b0b Mon Sep 17 00:00:00 2001 From: Ole R Date: Thu, 25 Feb 2016 11:01:46 +0100 Subject: [PATCH 003/319] Update array-check for settings trim and expand --- src/settings.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/settings.js b/src/settings.js index 71e0ea1374..6f6cad2854 100644 --- a/src/settings.js +++ b/src/settings.js @@ -3,16 +3,19 @@ var meta = require('./meta'); function expandObjBy(obj1, obj2) { - var key, val1, val2, changed = false; + var key, val1, val2, xorValIsArray, changed = false; for (key in obj2) { if (obj2.hasOwnProperty(key)) { val2 = obj2[key]; val1 = obj1[key]; - if (!obj1.hasOwnProperty(key) || typeof val2 !== typeof val1) { + xorValIsArray = Array.isArray(val1) ^ Array.isArray(val2); + if (xorValIsArray || !obj1.hasOwnProperty(key) || typeof val2 !== typeof val1) { obj1[key] = val2; changed = true; - } else if (typeof val2 === 'object' && expandObjBy(val1, val2)) { - changed = true; + } else if (typeof val2 === 'object' && !Array.isArray(val2)) { + if (expandObjBy(val1, val2)) { + changed = true; + } } } } @@ -20,14 +23,13 @@ function expandObjBy(obj1, obj2) { } function trim(obj1, obj2) { - if (Array.isArray(obj1)) { return; } var key, val1; for (key in obj1) { if (obj1.hasOwnProperty(key)) { val1 = obj1[key]; if (!obj2.hasOwnProperty(key)) { delete obj1[key]; - } else if (typeof val1 === 'object') { + } else if (typeof val1 === 'object' && !Array.isArray(val1)) { trim(val1, obj2[key]); } } From 5556c49f7442563ae46a6bbc50debda5a7daf139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Feb 2016 20:44:58 +0200 Subject: [PATCH 004/319] removed extra next --- src/controllers/admin/uploads.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 5f582bc117..aea79e3934 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -160,7 +160,6 @@ function uploadImage(filename, folder, uploadedFile, req, res, next) { } res.json([{name: uploadedFile.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url}]); - next(); } if (plugins.hasListeners('filter:uploadImage')) { From 13623a620b677a453612aa6b8f92a4e80fa1c3dc Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 26 Feb 2016 14:27:03 -0500 Subject: [PATCH 005/319] fixed #4277 --- public/src/client/account/edit.js | 29 ++++++++++++++++++++--------- src/socket.io/user/picture.js | 18 ++++++++++-------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index cd97196ad0..a436b2c6dd 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -78,10 +78,15 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], if (err) { return app.alertError(err.message); } + + // boolean to signify whether an uploaded picture is present in the pictures list + var uploaded = pictures.reduce(function(memo, cur) { + return memo || cur.type === 'uploaded' + }, false); templates.parse('partials/modals/change_picture_modal', { pictures: pictures, - uploaded: !!ajaxify.data.uploadedpicture, + uploaded: uploaded, allowProfileImageUploads: ajaxify.data.allowProfileImageUploads }, function(html) { translator.translate(html, function(html) { @@ -189,15 +194,21 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], function onUploadComplete(urlOnServer) { urlOnServer = urlOnServer + '?' + new Date().getTime(); - $('#user-current-picture, img.avatar').attr('src', urlOnServer); updateHeader(urlOnServer); - uploadedPicture = urlOnServer; + + if (ajaxify.data.picture.length) { + $('#user-current-picture, img.avatar').attr('src', urlOnServer); + uploadedPicture = urlOnServer; + } else { + ajaxify.refresh(); + } } - function onRemoveComplete(urlOnServer) { - $('#user-current-picture').attr('src', urlOnServer); - updateHeader(urlOnServer); - uploadedPicture = ''; + function onRemoveComplete() { + if (ajaxify.data.uploadedpicture === ajaxify.data.picture) { + ajaxify.refresh(); + updateHeader(); + } } modal.find('[data-action="upload"]').on('click', function() { @@ -239,12 +250,12 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], }); modal.find('[data-action="remove-uploaded"]').on('click', function() { - socket.emit('user.removeUploadedPicture', {uid: ajaxify.data.theirid}, function(err, imageUrlOnServer) { + socket.emit('user.removeUploadedPicture', {uid: ajaxify.data.theirid}, function(err) { modal.modal('hide'); if (err) { return app.alertError(err.message); } - onRemoveComplete(imageUrlOnServer); + onRemoveComplete(); }); }); } diff --git a/src/socket.io/user/picture.js b/src/socket.io/user/picture.js index 6149eff50d..55caa37857 100644 --- a/src/socket.io/user/picture.js +++ b/src/socket.io/user/picture.js @@ -2,6 +2,7 @@ var async = require('async'); var winston = require('winston'); +var path = require('path'); var user = require('../../user'); var plugins = require('../../plugins'); @@ -73,20 +74,21 @@ module.exports = function(SocketUser) { user.isAdminOrSelf(socket.uid, data.uid, next); }, function (next) { - user.getUserField(data.uid, 'uploadedpicture', next); + user.getUserFields(data.uid, ['uploadedpicture', 'picture'], next); }, - function(uploadedPicture, next) { - if (!uploadedPicture.startsWith('http')) { - require('fs').unlink(uploadedPicture, function(err) { + function(userData, next) { + if (!userData.uploadedpicture.startsWith('http')) { + require('fs').unlink(path.join(__dirname, '../../../public', userData.uploadedpicture), function(err) { if (err) { winston.error(err); } }); } - user.setUserField(data.uid, 'uploadedpicture', '', next); - }, - function(next) { - user.getUserField(data.uid, 'picture', next); + + user.setUserFields(data.uid, { + uploadedpicture: '', + picture: userData.uploadedpicture === userData.picture ? '' : userData.picture // if current picture is uploaded picture, reset to user icon + }, next); } ], callback); }; From 3e46ef8c3534855e10ecfe139f5fd149cfcadcec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Feb 2016 21:34:57 +0200 Subject: [PATCH 006/319] closes #4276 --- public/src/modules/notifications.js | 36 +++++++++++++++++++---------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index 7b57651867..35f1e677dd 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -1,10 +1,12 @@ 'use strict'; -/* globals define, socket, utils, config, app, ajaxify, templates, Tinycon*/ +/* globals define, socket, app, ajaxify, templates, Tinycon*/ define('notifications', ['sounds', 'translator', 'components'], function(sound, translator, components) { var Notifications = {}; + var unreadNotifs = {}; + Notifications.prepareDOM = function() { var notifContainer = components.get('notifications'), notifTrigger = notifContainer.children('a'), @@ -29,34 +31,40 @@ define('notifications', ['sounds', 'translator', 'components'], function(sound, notifList.on('click', '[data-nid]', function() { var unread = $(this).hasClass('unread'); + var nid = $(this).attr('data-nid'); if (!unread) { return; } - socket.emit('notifications.markRead', $(this).attr('data-nid'), function(err) { + socket.emit('notifications.markRead', nid, function(err) { if (err) { return app.alertError(err.message); } incrementNotifCount(-1); + if (unreadNotifs[nid]) { + delete unreadNotifs[nid]; + } }); }); notifContainer.on('click', '.mark-all-read', Notifications.markAllRead); - notifList.on('click', '.mark-read', function(e) { - var liEl = $(this).parent(), - unread = liEl.hasClass('unread'); - - e.preventDefault(); - e.stopPropagation(); + notifList.on('click', '.mark-read', function() { + var liEl = $(this).parent(); + var unread = liEl.hasClass('unread'); + var nid = liEl.attr('data-nid'); - socket.emit('notifications.mark' + (unread ? 'Read' : 'Unread'), liEl.attr('data-nid'), function(err) { + socket.emit('notifications.mark' + (unread ? 'Read' : 'Unread'), nid, function(err) { if (err) { return app.alertError(err.message); } liEl.toggleClass('unread'); incrementNotifCount(unread ? -1 : 1); + if (unread && unreadNotifs[nid]) { + delete unreadNotifs[nid]; + } }); + return false; }); function incrementNotifCount(delta) { @@ -96,10 +104,13 @@ define('notifications', ['sounds', 'translator', 'components'], function(sound, if (ajaxify.currentPage === 'notifications') { ajaxify.refresh(); } + + if (!unreadNotifs[notifData.nid]) { + incrementNotifCount(1); - incrementNotifCount(1); - - sound.play('notification'); + sound.play('notification'); + unreadNotifs[notifData.nid] = true; + } }); socket.on('event:notifications.updateCount', function(count) { @@ -158,6 +169,7 @@ define('notifications', ['sounds', 'translator', 'components'], function(sound, app.alertError(err.message); } Notifications.updateNotifCount(0); + unreadNotifs = {}; }); }; From 99e95081316f528ffac2d678708796db7e3581f0 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 26 Feb 2016 14:47:30 -0500 Subject: [PATCH 007/319] fixed #4270 --- public/src/client/topic/move.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/public/src/client/topic/move.js b/public/src/client/topic/move.js index d013e1c09d..d16eb9bc41 100644 --- a/public/src/client/topic/move.js +++ b/public/src/client/topic/move.js @@ -6,8 +6,7 @@ define('forum/topic/move', function() { var Move = {}, modal, - targetCid, - targetCategoryLabel; + selectedEl; Move.init = function(tids, currentCid, onComplete) { Move.tids = tids; @@ -70,6 +69,8 @@ define('forum/topic/move', function() { } categoryEl.toggleClass('disabled', !!category.disabled); categoryEl.attr('data-cid', category.cid); + categoryEl.attr('data-icon', category.icon); + categoryEl.attr('data-name', category.name); categoryEl.html(' ' + category.name); parentEl.append(level); @@ -88,15 +89,14 @@ define('forum/topic/move', function() { modal.find('#confirm-category-name').html(category.html()); modal.find('#move-confirm').removeClass('hide'); - targetCid = category.attr('data-cid'); - targetCategoryLabel = category.html(); + selectedEl = category; modal.find('#move_thread_commit').prop('disabled', false); } function onCommitClicked() { var commitEl = modal.find('#move_thread_commit'); - if (!commitEl.prop('disabled') && targetCid) { + if (!commitEl.prop('disabled') && selectedEl.attr('data-cid')) { commitEl.prop('disabled', true); moveTopics(); @@ -106,7 +106,7 @@ define('forum/topic/move', function() { function moveTopics() { socket.emit(Move.moveAll ? 'topics.moveAll' : 'topics.move', { tids: Move.tids, - cid: targetCid, + cid: selectedEl.attr('data-cid'), currentCid: Move.currentCid }, function(err) { modal.modal('hide'); @@ -115,7 +115,7 @@ define('forum/topic/move', function() { return app.alertError(err.message); } - app.alertSuccess('[[topic:topic_move_success, ' + targetCategoryLabel + ']]'); + app.alertSuccess('[[topic:topic_move_success, ' + selectedEl.attr('data-name') + ']] '); if (typeof Move.onComplete === 'function') { Move.onComplete(); } From 4c5ebe49852b64eb7466c7ff9ee622940a0f3bcf Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 26 Feb 2016 15:26:24 -0500 Subject: [PATCH 008/319] fixed #4020 --- public/vendor/autosize.js | 293 +++++++++++++++++++++++++------------- 1 file changed, 196 insertions(+), 97 deletions(-) diff --git a/public/vendor/autosize.js b/public/vendor/autosize.js index b6a5c39af8..aa51c70572 100644 --- a/public/vendor/autosize.js +++ b/public/vendor/autosize.js @@ -1,155 +1,254 @@ /*! - Autosize 2.0.0 + Autosize 3.0.15 license: MIT http://www.jacklmoore.com/autosize */ -'use strict'; -/*globals define*/ -(function (root, factory) { +(function (global, factory) { if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define('autosize', factory); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); + define('autosize', ['exports', 'module'], factory); + } else if (typeof exports !== 'undefined' && typeof module !== 'undefined') { + factory(exports, module); } else { - // Browser globals (root is window) - root.autosize = factory(); - } -}(this, function () { - function main(ta) { - if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || ta.hasAttribute('data-autosize-on')) { return; } + var mod = { + exports: {} + }; + factory(mod.exports, mod); + global.autosize = mod.exports; + } +})(this, function (exports, module) { + 'use strict'; + + var set = typeof Set === 'function' ? new Set() : (function () { + var list = []; + + return { + has: function has(key) { + return Boolean(list.indexOf(key) > -1); + }, + add: function add(key) { + list.push(key); + }, + 'delete': function _delete(key) { + list.splice(list.indexOf(key), 1); + } }; + })(); + + var createEvent = function createEvent(name) { + return new Event(name); + }; + try { + new Event('test'); + } catch (e) { + // IE does not support `new Event()` + createEvent = function (name) { + var evt = document.createEvent('Event'); + evt.initEvent(name, true, false); + return evt; + }; + } - var maxHeight; - var heightOffset; - var amountOfCR; + function assign(ta) { + var _ref = arguments[1] === undefined ? {} : arguments[1]; + + var _ref$setOverflowX = _ref.setOverflowX; + var setOverflowX = _ref$setOverflowX === undefined ? true : _ref$setOverflowX; + var _ref$setOverflowY = _ref.setOverflowY; + var setOverflowY = _ref$setOverflowY === undefined ? true : _ref$setOverflowY; + + if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || set.has(ta)) return; + + var heightOffset = null; + var overflowY = null; + var clientWidth = ta.clientWidth; function init() { var style = window.getComputedStyle(ta, null); + overflowY = style.overflowY; + if (style.resize === 'vertical') { ta.style.resize = 'none'; } else if (style.resize === 'both') { ta.style.resize = 'horizontal'; } - // horizontal overflow is hidden, so break-word is necessary for handling words longer than the textarea width - ta.style.wordWrap = 'break-word'; - - // Chrome/Safari-specific fix: - // When the textarea y-overflow is hidden, Chrome/Safari doesn't reflow the text to account for the space - // made available by removing the scrollbar. This workaround will cause the text to reflow. - var width = ta.style.width; - ta.style.width = '0px'; - // Force reflow: - /* jshint ignore:start */ - ta.offsetWidth; - /* jshint ignore:end */ - ta.style.width = width; - - maxHeight = style.maxHeight !== 'none' ? parseFloat(style.maxHeight) : false; - if (style.boxSizing === 'content-box') { - heightOffset = -(parseFloat(style.paddingTop)+parseFloat(style.paddingBottom)); + heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); } else { - heightOffset = parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth); + heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); + } + // Fix when a textarea is not on document body and heightOffset is Not a Number + if (isNaN(heightOffset)) { + heightOffset = 0; } - amountOfCR = (ta.value.match(/\n/g) || []).length; - adjust(); + update(); } - function adjust() { - var startHeight = ta.style.height; - var htmlTop = document.documentElement.scrollTop; - var bodyTop = document.body.scrollTop; + function changeOverflow(value) { + { + // Chrome/Safari-specific fix: + // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space + // made available by removing the scrollbar. The following forces the necessary text reflow. + var width = ta.style.width; + ta.style.width = '0px'; + // Force reflow: + /* jshint ignore:start */ + ta.offsetWidth; + /* jshint ignore:end */ + ta.style.width = width; + } - var newAmountOfCR = (ta.value.match(/\n/g) || []).length; - if (newAmountOfCR === amountOfCR) { - return; + overflowY = value; + + if (setOverflowY) { + ta.style.overflowY = value; } - amountOfCR = newAmountOfCR; - + resize(); + } + + function resize() { + var htmlTop = window.pageYOffset; + var bodyTop = document.body.scrollTop; + var originalHeight = ta.style.height; + ta.style.height = 'auto'; - var endHeight = ta.scrollHeight+heightOffset; + var endHeight = ta.scrollHeight + heightOffset; - if (maxHeight !== false && maxHeight < endHeight) { - endHeight = maxHeight; - if (ta.style.overflowY !== 'scroll') { - ta.style.overflowY = 'scroll'; - } - } else if (ta.style.overflowY !== 'hidden') { - ta.style.overflowY = 'hidden'; + if (ta.scrollHeight === 0) { + // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. + ta.style.height = originalHeight; + return; } - ta.style.height = endHeight+'px'; + ta.style.height = endHeight + 'px'; + + // used to check if an update is actually necessary on window.resize + clientWidth = ta.clientWidth; // prevents scroll-position jumping document.documentElement.scrollTop = htmlTop; document.body.scrollTop = bodyTop; + } + + function update() { + var startHeight = ta.style.height; + + resize(); + + var style = window.getComputedStyle(ta, null); + + if (style.height !== ta.style.height) { + if (overflowY !== 'visible') { + changeOverflow('visible'); + } + } else { + if (overflowY !== 'hidden') { + changeOverflow('hidden'); + } + } if (startHeight !== ta.style.height) { - var evt = document.createEvent('Event'); - evt.initEvent('autosize.resized', true, false); + var evt = createEvent('autosize:resized'); ta.dispatchEvent(evt); } } + var pageResize = function pageResize() { + if (ta.clientWidth !== clientWidth) { + update(); + } + }; + + var destroy = (function (style) { + window.removeEventListener('resize', pageResize, false); + ta.removeEventListener('input', update, false); + ta.removeEventListener('keyup', update, false); + ta.removeEventListener('autosize:destroy', destroy, false); + ta.removeEventListener('autosize:update', update, false); + set['delete'](ta); + + Object.keys(style).forEach(function (key) { + ta.style[key] = style[key]; + }); + }).bind(ta, { + height: ta.style.height, + resize: ta.style.resize, + overflowY: ta.style.overflowY, + overflowX: ta.style.overflowX, + wordWrap: ta.style.wordWrap }); + + ta.addEventListener('autosize:destroy', destroy, false); + // IE9 does not fire onpropertychange or oninput for deletions, // so binding to onkeyup to catch most of those events. // There is no way that I know of to detect something like 'cut' in IE9. if ('onpropertychange' in ta && 'oninput' in ta) { - ta.addEventListener('keyup', adjust); + ta.addEventListener('keyup', update, false); } - window.addEventListener('resize', adjust); - ta.addEventListener('input', adjust); - - ta.addEventListener('autosize.update', adjust); + window.addEventListener('resize', pageResize, false); + ta.addEventListener('input', update, false); + ta.addEventListener('autosize:update', update, false); + set.add(ta); - ta.addEventListener('autosize.destroy', function(style){ - window.removeEventListener('resize', adjust); - ta.removeEventListener('input', adjust); - ta.removeEventListener('keyup', adjust); - ta.removeEventListener('autosize.destroy'); - - Object.keys(style).forEach(function(key){ - ta.style[key] = style[key]; - }); + if (setOverflowX) { + ta.style.overflowX = 'hidden'; + ta.style.wordWrap = 'break-word'; + } - ta.removeAttribute('data-autosize-on'); - }.bind(ta, { - height: ta.style.height, - overflow: ta.style.overflow, - overflowY: ta.style.overflowY, - wordWrap: ta.style.wordWrap, - resize: ta.style.resize - })); + init(); + } - ta.setAttribute('data-autosize-on', true); - ta.style.overflow = 'hidden'; - ta.style.overflowY = 'hidden'; + function destroy(ta) { + if (!(ta && ta.nodeName && ta.nodeName === 'TEXTAREA')) return; + var evt = createEvent('autosize:destroy'); + ta.dispatchEvent(evt); + } - init(); + function update(ta) { + if (!(ta && ta.nodeName && ta.nodeName === 'TEXTAREA')) return; + var evt = createEvent('autosize:update'); + ta.dispatchEvent(evt); } - // Do nothing in IE8 or lower - if (typeof window.getComputedStyle !== 'function') { - return function(elements) { - return elements; + var autosize = null; + + // Do nothing in Node.js environment and IE8 (or lower) + if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { + autosize = function (el) { + return el; + }; + autosize.destroy = function (el) { + return el; + }; + autosize.update = function (el) { + return el; }; } else { - return function(elements) { - if (elements && elements.length) { - Array.prototype.forEach.call(elements, main); - } else if (elements && elements.nodeName) { - main(elements); + autosize = function (el, options) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], function (x) { + return assign(x, options); + }); + } + return el; + }; + autosize.destroy = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], destroy); } - return elements; + return el; + }; + autosize.update = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], update); + } + return el; }; } -})); \ No newline at end of file + + module.exports = autosize; +}); \ No newline at end of file From 5f3473142e017918c32286466187e73ceefe0d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Feb 2016 22:40:22 +0200 Subject: [PATCH 009/319] fix reply as topic quoting --- public/src/client/topic/postTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index d59cd38371..803955c092 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -117,7 +117,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator }); $('.topic').on('click', '[component="topic/reply-as-topic"]', function() { - translator.translate('[[topic:link_back, ' + ajaxify.data.title + ', ' + config.relative_path + '/topic/' + ajaxify.data.slug + ']]', function(body) { + translator.translate('[[topic:link_back, ' + ajaxify.data.titleRaw + ', ' + config.relative_path + '/topic/' + ajaxify.data.slug + ']]', function(body) { $(window).trigger('action:composer.topic.new', { cid: ajaxify.data.cid, body: body From 571f364922ed8871ad996e9110d63111b7022246 Mon Sep 17 00:00:00 2001 From: pichalite Date: Fri, 26 Feb 2016 21:50:44 +0000 Subject: [PATCH 010/319] fix for post menu display on newPost --- public/src/client/topic/posts.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 3059728e3b..8f8bf4ca7d 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -24,8 +24,9 @@ define('forum/topic/posts', [ data.loggedIn = app.user.uid ? true : false; data.posts.forEach(function(post) { post.selfPost = !!app.user.uid && parseInt(post.uid, 10) === parseInt(app.user.uid, 10); - post.display_moderator_tools = post.selfPost || ajaxify.data.isAdminOrMod; - post.display_move_tools = ajaxify.data.isAdminOrMod; + post.display_moderator_tools = post.selfPost || ajaxify.data.privileges.isAdminOrMod; + post.display_move_tools = ajaxify.data.privileges.isAdminOrMod; + post.display_post_menu = post.selfPost || ajaxify.data.privileges.isAdminOrMod; }); updatePostCounts(data.posts); From 441232e71d8e596a5e33fc49c7ab243c14e6d976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 28 Feb 2016 22:45:06 +0200 Subject: [PATCH 011/319] fix missing callback --- src/socket.io/topics/unread.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/socket.io/topics/unread.js b/src/socket.io/topics/unread.js index 57eeb7958d..056b80b041 100644 --- a/src/socket.io/topics/unread.js +++ b/src/socket.io/topics/unread.js @@ -22,6 +22,7 @@ module.exports = function(SocketTopics) { for (var i=0; i Date: Mon, 29 Feb 2016 10:36:20 +0200 Subject: [PATCH 012/319] closes #4275 --- src/messaging.js | 35 ++++++++++++++++------------------- src/socket.io/modules.js | 4 ++-- tests/messaging.js | 18 +++++++++--------- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/messaging.js b/src/messaging.js index e39e9f0d3b..1974313c81 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -314,7 +314,7 @@ var async = require('async'), Messaging.canMessageUser = function(uid, toUid, callback) { if (parseInt(meta.config.disableChat) === 1 || !uid || uid === toUid) { - return callback(null, false); + return callback(new Error('[[error:chat-disabled]]')); } async.waterfall([ @@ -323,43 +323,40 @@ var async = require('async'), }, function (exists, next) { if (!exists) { - return callback(null, false); + return callback(new Error('[[error:no-user]]')); } user.getUserFields(uid, ['banned', 'email:confirmed'], next); }, function (userData, next) { if (parseInt(userData.banned, 10) === 1) { - return callback(null, false); + return callback(new Error('[[error:user-banned]]')); } if (parseInt(meta.config.requireEmailConfirmation, 10) === 1 && parseInt(userData['email:confirmed'], 10) !== 1) { - return callback(null, false); + return callback(new Error('[[error:email-not-confirmed-chat]]')); } - user.getSettings(toUid, next); + async.parallel({ + settings: async.apply(user.getSettings, toUid), + isAdmin: async.apply(user.isAdministrator, uid), + isFollowing: async.apply(user.isFollowing, toUid, uid) + }, next); }, - function(settings, next) { - if (!settings.restrictChat) { - return callback(null, true); + function(results, next) { + if (!results.settings.restrictChat || results.isAdmin || results.isFollowing) { + return next(); } - user.isAdministrator(uid, next); - }, - function(isAdmin, next) { - if (isAdmin) { - return callback(null, true); - } - user.isFollowing(toUid, uid, next); + next(new Error('[[error:chat-restricted]]')); } ], callback); - }; Messaging.canMessageRoom = function(uid, roomId, callback) { if (parseInt(meta.config.disableChat) === 1 || !uid) { return callback(new Error('[[error:chat-disabled]]')); } - + async.waterfall([ function (next) { Messaging.isUserInRoom(uid, roomId, next); @@ -368,14 +365,14 @@ var async = require('async'), if (!inRoom) { return next(new Error('[[error:not-in-room]]')); } - + Messaging.getUserCountInRoom(roomId, next); }, function(count, next) { if (count < 2) { return next(new Error('[[error:no-users-in-room]]')); } - + user.getUserFields(uid, ['banned', 'email:confirmed'], next); }, function (userData, next) { diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 26426b9f9f..bcf8309a40 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -62,8 +62,8 @@ SocketModules.chats.newRoom = function(socket, data, callback) { } Messaging.canMessageUser(socket.uid, data.touid, function(err, allowed) { - if (err || !allowed) { - return callback(err || new Error('[[error:chat-restricted]]')); + if (err) { + return callback(err); } Messaging.newRoom(socket.uid, [data.touid], callback); diff --git a/tests/messaging.js b/tests/messaging.js index ae1db0952a..4758fde40b 100644 --- a/tests/messaging.js +++ b/tests/messaging.js @@ -27,39 +27,39 @@ describe('Messaging Library', function() { describe('.canMessage()', function() { it('should not error out', function(done) { - Messaging.canMessageUser(testUids[1], testUids[2], function(err, allowed) { + Messaging.canMessageUser(testUids[1], testUids[2], function(err) { assert.ifError(err); done(); }); }); it('should allow messages to be sent to an unrestricted user', function(done) { - Messaging.canMessageUser(testUids[1], testUids[2], function(err, allowed) { - assert.strictEqual(allowed, true, 'should be true, received ' + allowed); + Messaging.canMessageUser(testUids[1], testUids[2], function(err) { + assert.ifError(err); done(); }); }); it('should NOT allow messages to be sent to a restricted user', function(done) { User.setSetting(testUids[1], 'restrictChat', '1', function() { - Messaging.canMessageUser(testUids[2], testUids[1], function(err, allowed) { - assert.strictEqual(allowed, false, 'should be false, received ' + allowed); + Messaging.canMessageUser(testUids[2], testUids[1], function(err) { + assert.strictEqual(err.message, '[[error:chat-restricted]]'); done(); }); }); }); it('should always allow admins through', function(done) { - Messaging.canMessageUser(testUids[0], testUids[1], function(err, allowed) { - assert.strictEqual(allowed, true, 'should be true, received ' + allowed); + Messaging.canMessageUser(testUids[0], testUids[1], function(err) { + assert.ifError(err); done(); }); }); it('should allow messages to be sent to a restricted user if restricted user follows sender', function(done) { User.follow(testUids[1], testUids[2], function() { - Messaging.canMessageUser(testUids[2], testUids[1], function(err, allowed) { - assert.strictEqual(allowed, true, 'should be true, received ' + allowed); + Messaging.canMessageUser(testUids[2], testUids[1], function(err) { + assert.ifError(err); done(); }); }); From df9558f1fa29942b402aea71840286d2f60dd9e6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 29 Feb 2016 14:23:12 +0200 Subject: [PATCH 013/319] closes #4268 --- public/language/en_GB/global.json | 5 ++++- public/language/en_GB/groups.json | 3 ++- public/language/en_GB/user.json | 2 +- public/src/admin/manage/category.js | 14 +++++++----- public/src/admin/settings.js | 6 +++-- public/src/client/account/edit.js | 33 ++++++++++++++++------------ public/src/client/account/header.js | 7 +++++- public/src/client/groups/details.js | 6 ++++- public/src/modules/uploader.js | 10 ++++++--- src/views/admin/footer.tpl | 34 ----------------------------- src/views/admin/general/sounds.tpl | 2 +- 11 files changed, 58 insertions(+), 64 deletions(-) diff --git a/public/language/en_GB/global.json b/public/language/en_GB/global.json index 1b2cea5bd4..a7959aa349 100644 --- a/public/language/en_GB/global.json +++ b/public/language/en_GB/global.json @@ -111,5 +111,8 @@ "map": "Map", "sessions": "Login Sessions", "ip_address": "IP Address", - "enter_page_number": "Enter page number" + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } diff --git a/public/language/en_GB/groups.json b/public/language/en_GB/groups.json index 08982e8d29..5bade84eea 100644 --- a/public/language/en_GB/groups.json +++ b/public/language/en_GB/groups.json @@ -57,5 +57,6 @@ "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/en_GB/user.json b/public/language/en_GB/user.json index 3351e8aa23..2de2819dad 100644 --- a/public/language/en_GB/user.json +++ b/public/language/en_GB/user.json @@ -63,7 +63,7 @@ "upload_picture": "Upload picture", "upload_a_picture": "Upload a picture", "remove_uploaded_picture" : "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Settings", "show_email": "Show My Email", diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index a845b59790..c6da11cd88 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -1,5 +1,5 @@ "use strict"; -/*global define, app, socket, ajaxify, RELATIVE_PATH, bootbox, templates, Chart */ +/*global config, define, app, socket, ajaxify, bootbox, templates, Chart, utils */ define('admin/manage/category', [ 'uploader', @@ -75,7 +75,7 @@ define('admin/manage/category', [ } }); - $('[data-name="imageClass"]').on('change', function(ev) { + $('[data-name="imageClass"]').on('change', function() { $('.category-preview').css('background-size', $(this).val()); }); @@ -103,7 +103,11 @@ define('admin/manage/category', [ var inputEl = $(this), cid = inputEl.attr('data-cid'); - uploader.open(RELATIVE_PATH + '/api/admin/category/uploadpicture', { cid: cid }, 0, function(imageUrlOnServer) { + uploader.show({ + title: 'Upload category image', + route: config.relative_path + '/api/admin/category/uploadpicture', + params: {cid: cid} + }, function(imageUrlOnServer) { inputEl.val(imageUrlOnServer); var previewBox = inputEl.parent().parent().siblings('.category-preview'); previewBox.css('background', 'url(' + imageUrlOnServer + '?' + new Date().getTime() + ')'); @@ -123,7 +127,7 @@ define('admin/manage/category', [ $(this).parent().addClass('hide').hide(); }); - $('.category-preview').on('click', function(ev) { + $('.category-preview').on('click', function() { iconSelect.init($(this).find('i'), modified); }); @@ -145,7 +149,7 @@ define('admin/manage/category', [ }); Category.setupPrivilegeTable(); - + if (window.location.hash === '#analytics') { Category.setupGraphs(); } else { diff --git a/public/src/admin/settings.js b/public/src/admin/settings.js index 273b7be0a3..c4b880f761 100644 --- a/public/src/admin/settings.js +++ b/public/src/admin/settings.js @@ -111,10 +111,12 @@ define('admin/settings', ['uploader', 'sounds'], function(uploader, sounds) { var uploadBtn = $(this); uploadBtn.on('click', function() { uploader.show({ + title: uploadBtn.attr('data-title'), + description: uploadBtn.attr('data-description'), route: uploadBtn.attr('data-route'), params: {}, - fileSize: 0, - showHelp: uploadBtn.attr('data-help') ? uploadBtn.attr('data-help') === 1 : undefined + showHelp: uploadBtn.attr('data-help') ? uploadBtn.attr('data-help') === 1 : undefined, + accept: uploadBtn.attr('data-accept') }, function(image) { // need to move these into template, ex data-callback if (ajaxify.currentPage === 'admin/general/sounds') { diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index a436b2c6dd..0c22e33d56 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -4,8 +4,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], function(header, uploader, translator) { var AccountEdit = {}, - uploadedPicture = '', - selectedImageType = ''; + uploadedPicture = ''; AccountEdit.init = function() { uploadedPicture = ajaxify.data.uploadedpicture; @@ -81,9 +80,9 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], // boolean to signify whether an uploaded picture is present in the pictures list var uploaded = pictures.reduce(function(memo, cur) { - return memo || cur.type === 'uploaded' + return memo || cur.type === 'uploaded'; }, false); - + templates.parse('partials/modals/change_picture_modal', { pictures: pictures, uploaded: uploaded, @@ -109,12 +108,15 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], }); modal.on('shown.bs.modal', updateImages); - modal.on('click', '.list-group-item', selectImageType); + modal.on('click', '.list-group-item', function selectImageType() { + modal.find('.list-group-item').removeClass('active'); + $(this).addClass('active'); + }); + handleImageUpload(modal); function updateImages() { - var currentPicture = $('#user-current-picture').attr('src'), - userIcon = modal.find('.user-icon'); + var userIcon = modal.find('.user-icon'); userIcon .css('background-color', ajaxify.data['icon:bgColor']) @@ -128,15 +130,10 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], if (this.getAttribute('src') === ajaxify.data.picture) { $(this).parents('.list-group-item').addClass('active'); } - }) + }); } } - function selectImageType() { - modal.find('.list-group-item').removeClass('active'); - $(this).addClass('active'); - } - function saveSelection() { var type = modal.find('.list-group-item.active').attr('data-type'), src = modal.find('.list-group-item.active img').attr('src'); @@ -213,7 +210,15 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], modal.find('[data-action="upload"]').on('click', function() { modal.modal('hide'); - uploader.open(config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadpicture', {}, ajaxify.data.maximumProfileImageSize, function(imageUrlOnServer) { + + uploader.show({ + route: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadpicture', + params: {}, + fileSize: ajaxify.data.maximumProfileImageSize, + title: '[[user:upload_picture]]', + description: '[[user:upload_a_picture]]', + accept: '.png,.jpg,.bmp' + }, function(imageUrlOnServer) { onUploadComplete(imageUrlOnServer); }); diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index 6449ac839f..520224d9ef 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -74,7 +74,12 @@ define('forum/account/header', [ }, callback); }, function() { - uploader.open(config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadcover', { uid: yourid }, 0, function(imageUrlOnServer) { + uploader.show({ + title: '[[user:upload_cover_picture]]', + route: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadcover', + params: {uid: yourid }, + accept: '.png,.jpg,.bmp' + }, function(imageUrlOnServer) { components.get('account/cover').css('background-image', 'url(' + imageUrlOnServer + '?v=' + Date.now() + ')'); }); }, diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index de2fccd842..05375476dd 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -30,7 +30,11 @@ define('forum/groups/details', [ }, callback); }, function() { - uploader.open(RELATIVE_PATH + '/api/groups/uploadpicture', { groupName: groupName }, 0, function(imageUrlOnServer) { + uploader.show({ + title: '[[groups:upload-group-cover]]', + route: config.relative_path + '/api/groups/uploadpicture', + params: {groupname: groupName} + }, function(imageUrlOnServer) { components.get('groups/cover').css('background-image', 'url(' + imageUrlOnServer + ')'); }); }, diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index ce66d37c17..130db479c2 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -18,7 +18,11 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { module.show = function(data, callback) { parseModal({ showHelp: data.hasOwnProperty('showHelp') && data.showHelp !== undefined ? data.showHelp : true, - fileSize: data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false + fileSize: data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false, + title: data.title || '[[global:upload_file]]', + description: data.description || '', + button: data.button || '[[global:upload]]', + accept: data.accept ? data.accept.replace(/,/g, ',') : '' }, function(uploadModal) { uploadModal = $(uploadModal); @@ -31,7 +35,7 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { uploadForm.attr('action', data.route); uploadForm.find('#params').val(JSON.stringify(data.params)); - uploadModal.find('#pictureUploadSubmitBtn').off('click').on('click', function() { + uploadModal.find('#fileUploadSubmitBtn').off('click').on('click', function() { uploadForm.submit(); }); @@ -47,7 +51,7 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { uploadModal.find('#upload-progress-bar').css('width', '0%'); uploadModal.find('#upload-progress-box').show().removeClass('hide'); - if (!uploadModal.find('#userPhotoInput').val()) { + if (!uploadModal.find('#fileInput').val()) { showAlert('error', '[[uploads:select-file-to-upload]]'); return false; } diff --git a/src/views/admin/footer.tpl b/src/views/admin/footer.tpl index 02f80c73f0..de228ce0d7 100644 --- a/src/views/admin/footer.tpl +++ b/src/views/admin/footer.tpl @@ -2,40 +2,6 @@ -
diff --git a/src/views/admin/general/sounds.tpl b/src/views/admin/general/sounds.tpl index 72036f72cc..dfdbae512d 100644 --- a/src/views/admin/general/sounds.tpl +++ b/src/views/admin/general/sounds.tpl @@ -63,7 +63,7 @@
- +
From 65dda58e0caef22ac495e870f451801f87fd350c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 29 Feb 2016 14:24:02 +0200 Subject: [PATCH 014/319] renamed tpl --- public/src/modules/uploader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index 130db479c2..cdd3792e5f 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -93,7 +93,7 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { }; function parseModal(tplVals, callback) { - templates.parse('partials/modals/upload_picture_modal', tplVals, function(html) { + templates.parse('partials/modals/upload_file_modal', tplVals, function(html) { translator.translate(html, callback); }); } From af5150095132eda65c92ffa9efcf82e1ddd8cef2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 29 Feb 2016 14:26:34 +0200 Subject: [PATCH 015/319] up themes --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8774b80911..ae93a9eaef 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.6", "nodebb-theme-lavender": "3.0.8", - "nodebb-theme-persona": "4.0.87", - "nodebb-theme-vanilla": "5.0.52", + "nodebb-theme-persona": "4.0.88", + "nodebb-theme-vanilla": "5.0.53", "nodebb-widget-essentials": "2.0.6", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", From 4b5ec512b97e22ea7e818ec7f76bffdc643556bb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 29 Feb 2016 15:26:57 +0200 Subject: [PATCH 016/319] refactor/cleanup uploader.js --- public/src/modules/uploader.js | 90 +++++++++++++++++----------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index cdd3792e5f..575508b2b9 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -1,6 +1,6 @@ 'use strict'; -/* globals define, templates, translator */ +/* globals define, templates */ define('uploader', ['csrf', 'translator'], function(csrf, translator) { @@ -35,62 +35,60 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { uploadForm.attr('action', data.route); uploadForm.find('#params').val(JSON.stringify(data.params)); - uploadModal.find('#fileUploadSubmitBtn').off('click').on('click', function() { + uploadModal.find('#fileUploadSubmitBtn').on('click', function() { uploadForm.submit(); }); - uploadForm.off('submit').submit(function() { + uploadForm.submit(function() { + onSubmit(uploadModal, callback); + return false; + }); + }); + }; - function showAlert(type, message) { - module.hideAlerts(uploadModal); - uploadModal.find('#alert-' + type).translateText(message).removeClass('hide'); - } + function onSubmit(uploadModal, callback) { + function showAlert(type, message) { + module.hideAlerts(uploadModal); + uploadModal.find('#alert-' + type).translateText(message).removeClass('hide'); + } - showAlert('status', '[[uploads:uploading-file]]'); + showAlert('status', '[[uploads:uploading-file]]'); - uploadModal.find('#upload-progress-bar').css('width', '0%'); - uploadModal.find('#upload-progress-box').show().removeClass('hide'); + uploadModal.find('#upload-progress-bar').css('width', '0%'); + uploadModal.find('#upload-progress-box').show().removeClass('hide'); - if (!uploadModal.find('#fileInput').val()) { - showAlert('error', '[[uploads:select-file-to-upload]]'); - return false; + if (!uploadModal.find('#fileInput').val()) { + return showAlert('error', '[[uploads:select-file-to-upload]]'); + } + + uploadModal.find('#uploadForm').ajaxSubmit({ + headers: { + 'x-csrf-token': csrf.get() + }, + error: function(xhr) { + xhr = maybeParse(xhr); + showAlert('error', xhr.responseJSON ? (xhr.responseJSON.error || xhr.statusText) : 'error uploading, code : ' + xhr.status); + }, + uploadProgress: function(event, position, total, percent) { + uploadModal.find('#upload-progress-bar').css('width', percent + '%'); + }, + success: function(response) { + response = maybeParse(response); + + if (response.error) { + return showAlert('error', response.error); } - $(this).ajaxSubmit({ - headers: { - 'x-csrf-token': csrf.get() - }, - error: function(xhr) { - xhr = maybeParse(xhr); - showAlert('error', xhr.responseJSON ? (xhr.responseJSON.error || xhr.statusText) : 'error uploading, code : ' + xhr.status); - }, - - uploadProgress: function(event, position, total, percent) { - uploadModal.find('#upload-progress-bar').css('width', percent + '%'); - }, - - success: function(response) { - response = maybeParse(response); - - if (response.error) { - showAlert('error', response.error); - return; - } - - callback(response[0].url); - - showAlert('success', '[[uploads:upload-success]]'); - setTimeout(function() { - module.hideAlerts(uploadModal); - uploadModal.modal('hide'); - }, 750); - } - }); + callback(response[0].url); - return false; - }); + showAlert('success', '[[uploads:upload-success]]'); + setTimeout(function() { + module.hideAlerts(uploadModal); + uploadModal.modal('hide'); + }, 750); + } }); - }; + } function parseModal(tplVals, callback) { templates.parse('partials/modals/upload_file_modal', tplVals, function(html) { From 783f57021352001ccd73ad52339410bc8e8d4b85 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 29 Feb 2016 11:26:30 -0500 Subject: [PATCH 017/319] latest translations and fallbacks --- public/language/ar/error.json | 7 +- public/language/ar/global.json | 6 +- public/language/ar/groups.json | 3 +- public/language/ar/notifications.json | 6 +- public/language/ar/pages.json | 3 +- public/language/ar/topic.json | 6 +- public/language/ar/user.json | 5 +- public/language/bg/error.json | 11 +- public/language/bg/global.json | 8 +- public/language/bg/groups.json | 3 +- public/language/bg/notifications.json | 6 +- public/language/bg/pages.json | 7 +- public/language/bg/topic.json | 10 +- public/language/bg/user.json | 5 +- public/language/bg/users.json | 2 +- public/language/bn/error.json | 7 +- public/language/bn/global.json | 6 +- public/language/bn/groups.json | 3 +- public/language/bn/notifications.json | 6 +- public/language/bn/pages.json | 3 +- public/language/bn/topic.json | 6 +- public/language/bn/user.json | 5 +- public/language/cs/error.json | 7 +- public/language/cs/global.json | 6 +- public/language/cs/groups.json | 3 +- public/language/cs/notifications.json | 6 +- public/language/cs/pages.json | 3 +- public/language/cs/topic.json | 6 +- public/language/cs/user.json | 5 +- public/language/da/error.json | 7 +- public/language/da/global.json | 6 +- public/language/da/groups.json | 3 +- public/language/da/notifications.json | 6 +- public/language/da/pages.json | 3 +- public/language/da/topic.json | 6 +- public/language/da/user.json | 5 +- public/language/de/error.json | 7 +- public/language/de/global.json | 8 +- public/language/de/groups.json | 3 +- public/language/de/notifications.json | 6 +- public/language/de/pages.json | 5 +- public/language/de/topic.json | 6 +- public/language/de/user.json | 5 +- public/language/el/error.json | 7 +- public/language/el/global.json | 6 +- public/language/el/groups.json | 3 +- public/language/el/notifications.json | 6 +- public/language/el/pages.json | 3 +- public/language/el/topic.json | 6 +- public/language/el/user.json | 5 +- public/language/en@pirate/error.json | 7 +- public/language/en@pirate/global.json | 6 +- public/language/en@pirate/groups.json | 3 +- public/language/en@pirate/notifications.json | 6 +- public/language/en@pirate/pages.json | 3 +- public/language/en@pirate/topic.json | 6 +- public/language/en@pirate/user.json | 5 +- public/language/en_US/error.json | 7 +- public/language/en_US/global.json | 6 +- public/language/en_US/groups.json | 3 +- public/language/en_US/notifications.json | 6 +- public/language/en_US/pages.json | 3 +- public/language/en_US/topic.json | 6 +- public/language/en_US/user.json | 5 +- public/language/es/error.json | 7 +- public/language/es/global.json | 6 +- public/language/es/groups.json | 3 +- public/language/es/notifications.json | 6 +- public/language/es/pages.json | 3 +- public/language/es/topic.json | 6 +- public/language/es/user.json | 5 +- public/language/et/error.json | 11 +- public/language/et/global.json | 8 +- public/language/et/groups.json | 3 +- public/language/et/notifications.json | 6 +- public/language/et/pages.json | 7 +- public/language/et/topic.json | 8 +- public/language/et/user.json | 5 +- public/language/et/users.json | 2 +- public/language/fa_IR/error.json | 7 +- public/language/fa_IR/global.json | 6 +- public/language/fa_IR/groups.json | 3 +- public/language/fa_IR/notifications.json | 6 +- public/language/fa_IR/pages.json | 3 +- public/language/fa_IR/topic.json | 6 +- public/language/fa_IR/user.json | 5 +- public/language/fi/error.json | 7 +- public/language/fi/global.json | 6 +- public/language/fi/groups.json | 3 +- public/language/fi/notifications.json | 6 +- public/language/fi/pages.json | 3 +- public/language/fi/topic.json | 6 +- public/language/fi/user.json | 5 +- public/language/fr/error.json | 11 +- public/language/fr/global.json | 8 +- public/language/fr/groups.json | 3 +- public/language/fr/notifications.json | 6 +- public/language/fr/pages.json | 7 +- public/language/fr/topic.json | 10 +- public/language/fr/user.json | 5 +- public/language/fr/users.json | 2 +- public/language/gl/error.json | 11 +- public/language/gl/global.json | 8 +- public/language/gl/groups.json | 3 +- public/language/gl/notifications.json | 6 +- public/language/gl/pages.json | 7 +- public/language/gl/topic.json | 8 +- public/language/gl/user.json | 5 +- public/language/gl/users.json | 2 +- public/language/he/error.json | 33 +++--- public/language/he/global.json | 8 +- public/language/he/groups.json | 7 +- public/language/he/modules.json | 2 +- public/language/he/notifications.json | 16 +-- public/language/he/pages.json | 7 +- public/language/he/topic.json | 10 +- public/language/he/user.json | 17 +-- public/language/he/users.json | 2 +- public/language/hu/error.json | 7 +- public/language/hu/global.json | 6 +- public/language/hu/groups.json | 3 +- public/language/hu/notifications.json | 6 +- public/language/hu/pages.json | 3 +- public/language/hu/topic.json | 6 +- public/language/hu/user.json | 5 +- public/language/id/error.json | 7 +- public/language/id/global.json | 6 +- public/language/id/groups.json | 3 +- public/language/id/notifications.json | 6 +- public/language/id/pages.json | 3 +- public/language/id/topic.json | 6 +- public/language/id/user.json | 5 +- public/language/it/error.json | 7 +- public/language/it/global.json | 6 +- public/language/it/groups.json | 3 +- public/language/it/notifications.json | 6 +- public/language/it/pages.json | 3 +- public/language/it/topic.json | 6 +- public/language/it/user.json | 5 +- public/language/ja/error.json | 7 +- public/language/ja/global.json | 6 +- public/language/ja/groups.json | 3 +- public/language/ja/notifications.json | 6 +- public/language/ja/pages.json | 3 +- public/language/ja/topic.json | 6 +- public/language/ja/user.json | 5 +- public/language/ko/email.json | 6 +- public/language/ko/error.json | 13 +-- public/language/ko/global.json | 30 +++--- public/language/ko/groups.json | 11 +- public/language/ko/modules.json | 4 +- public/language/ko/notifications.json | 20 ++-- public/language/ko/pages.json | 15 +-- public/language/ko/search.json | 26 ++--- public/language/ko/tags.json | 2 +- public/language/ko/topic.json | 24 ++--- public/language/ko/user.json | 41 ++++---- public/language/ko/users.json | 2 +- public/language/lt/error.json | 7 +- public/language/lt/global.json | 6 +- public/language/lt/groups.json | 3 +- public/language/lt/notifications.json | 6 +- public/language/lt/pages.json | 3 +- public/language/lt/topic.json | 6 +- public/language/lt/user.json | 5 +- public/language/ms/error.json | 7 +- public/language/ms/global.json | 6 +- public/language/ms/groups.json | 3 +- public/language/ms/notifications.json | 6 +- public/language/ms/pages.json | 3 +- public/language/ms/topic.json | 6 +- public/language/ms/user.json | 5 +- public/language/nb/error.json | 7 +- public/language/nb/global.json | 6 +- public/language/nb/groups.json | 3 +- public/language/nb/notifications.json | 6 +- public/language/nb/pages.json | 3 +- public/language/nb/topic.json | 6 +- public/language/nb/user.json | 5 +- public/language/nl/error.json | 11 +- public/language/nl/global.json | 8 +- public/language/nl/groups.json | 3 +- public/language/nl/notifications.json | 6 +- public/language/nl/pages.json | 7 +- public/language/nl/topic.json | 8 +- public/language/nl/user.json | 5 +- public/language/nl/users.json | 2 +- public/language/pl/error.json | 7 +- public/language/pl/global.json | 6 +- public/language/pl/groups.json | 3 +- public/language/pl/notifications.json | 6 +- public/language/pl/pages.json | 3 +- public/language/pl/topic.json | 6 +- public/language/pl/user.json | 5 +- public/language/pt_BR/error.json | 7 +- public/language/pt_BR/global.json | 6 +- public/language/pt_BR/groups.json | 3 +- public/language/pt_BR/notifications.json | 6 +- public/language/pt_BR/pages.json | 3 +- public/language/pt_BR/topic.json | 6 +- public/language/pt_BR/user.json | 5 +- public/language/ro/error.json | 7 +- public/language/ro/global.json | 6 +- public/language/ro/groups.json | 3 +- public/language/ro/notifications.json | 6 +- public/language/ro/pages.json | 3 +- public/language/ro/topic.json | 6 +- public/language/ro/user.json | 5 +- public/language/ru/email.json | 6 +- public/language/ru/error.json | 11 +- public/language/ru/global.json | 6 +- public/language/ru/groups.json | 3 +- public/language/ru/notifications.json | 6 +- public/language/ru/pages.json | 9 +- public/language/ru/topic.json | 6 +- public/language/ru/user.json | 5 +- public/language/ru/users.json | 2 +- public/language/rw/error.json | 7 +- public/language/rw/global.json | 6 +- public/language/rw/groups.json | 3 +- public/language/rw/notifications.json | 6 +- public/language/rw/pages.json | 3 +- public/language/rw/topic.json | 6 +- public/language/rw/user.json | 5 +- public/language/sc/error.json | 7 +- public/language/sc/global.json | 6 +- public/language/sc/groups.json | 3 +- public/language/sc/notifications.json | 6 +- public/language/sc/pages.json | 3 +- public/language/sc/topic.json | 6 +- public/language/sc/user.json | 5 +- public/language/sk/error.json | 7 +- public/language/sk/global.json | 6 +- public/language/sk/groups.json | 3 +- public/language/sk/notifications.json | 6 +- public/language/sk/pages.json | 3 +- public/language/sk/topic.json | 6 +- public/language/sk/user.json | 5 +- public/language/sl/error.json | 7 +- public/language/sl/global.json | 6 +- public/language/sl/groups.json | 3 +- public/language/sl/notifications.json | 6 +- public/language/sl/pages.json | 3 +- public/language/sl/topic.json | 6 +- public/language/sl/user.json | 5 +- public/language/sr/error.json | 7 +- public/language/sr/global.json | 6 +- public/language/sr/groups.json | 3 +- public/language/sr/notifications.json | 6 +- public/language/sr/pages.json | 3 +- public/language/sr/topic.json | 6 +- public/language/sr/user.json | 5 +- public/language/sv/error.json | 7 +- public/language/sv/global.json | 6 +- public/language/sv/groups.json | 3 +- public/language/sv/notifications.json | 6 +- public/language/sv/pages.json | 3 +- public/language/sv/topic.json | 6 +- public/language/sv/user.json | 5 +- public/language/th/error.json | 7 +- public/language/th/global.json | 6 +- public/language/th/groups.json | 3 +- public/language/th/notifications.json | 6 +- public/language/th/pages.json | 3 +- public/language/th/topic.json | 6 +- public/language/th/user.json | 5 +- public/language/tr/error.json | 11 +- public/language/tr/global.json | 8 +- public/language/tr/groups.json | 3 +- public/language/tr/notifications.json | 6 +- public/language/tr/pages.json | 7 +- public/language/tr/topic.json | 8 +- public/language/tr/user.json | 5 +- public/language/tr/users.json | 2 +- public/language/vi/category.json | 10 +- public/language/vi/email.json | 18 ++-- public/language/vi/error.json | 103 ++++++++++--------- public/language/vi/global.json | 46 +++++---- public/language/vi/groups.json | 71 ++++++------- public/language/vi/language.json | 2 +- public/language/vi/login.json | 8 +- public/language/vi/modules.json | 36 +++---- public/language/vi/notifications.json | 32 +++--- public/language/vi/pages.json | 75 +++++++------- public/language/vi/recent.json | 16 +-- public/language/vi/register.json | 8 +- public/language/vi/reset_password.json | 6 +- public/language/vi/search.json | 74 ++++++------- public/language/vi/tags.json | 4 +- public/language/vi/topic.json | 48 ++++----- public/language/vi/unread.json | 2 +- public/language/vi/user.json | 73 ++++++------- public/language/vi/users.json | 32 +++--- public/language/zh_CN/error.json | 7 +- public/language/zh_CN/global.json | 6 +- public/language/zh_CN/groups.json | 3 +- public/language/zh_CN/notifications.json | 6 +- public/language/zh_CN/pages.json | 3 +- public/language/zh_CN/topic.json | 6 +- public/language/zh_CN/user.json | 5 +- public/language/zh_TW/error.json | 7 +- public/language/zh_TW/global.json | 6 +- public/language/zh_TW/groups.json | 3 +- public/language/zh_TW/notifications.json | 6 +- public/language/zh_TW/pages.json | 3 +- public/language/zh_TW/topic.json | 6 +- public/language/zh_TW/user.json | 5 +- 307 files changed, 1361 insertions(+), 1041 deletions(-) diff --git a/public/language/ar/error.json b/public/language/ar/error.json index d4c19bc98a..cd567d1636 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -50,8 +50,8 @@ "still-uploading": "الرجاء انتظار الرفع", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "لقد سبق وأضفت هذا الرد إلى المفضلة", - "already-unfavourited": "لقد سبق وحذفت هذا الرد من المفضلة", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "لايمكن حظر مدبر نظام آخر.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "الرجاء استعمال اسم المستخدم الخاص بك للدخول", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/ar/global.json b/public/language/ar/global.json index 6a40d450e3..e0a2d51643 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -86,5 +86,9 @@ "delete_all": "حذف الكل", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index a76ac459b4..61c95d5799 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "انظم للمجموعة", "membership.leave-group": "غادر المجموعة", "membership.reject": "رفض", - "new-group.group_name": "اسم المجموعة" + "new-group.group_name": "اسم المجموعة", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 83c54e683b..52b338e7fa 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 أضاف مشاركتك في %2 إلى مفضلته.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 أشعَرَ بمشاركة مخلة في %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index eb40c3e50a..74170e7af3 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "جاري صيانة %1. المرجو العودة لاحقًا.", "maintenance.messageIntro": "بالإضافة إلى ذلك، قام مدبر النظام بترك هذه الرسالة:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index f83c82c767..1e66ad91eb 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "الفئات المعطلة رمادية", "confirm_move": "انقل", "confirm_fork": "فرع", - "favourite": "إضافة إلى المفضلة", - "favourites": "المفضلة", - "favourites.has_no_favourites": "ليس لديك أي ردود مفضلة. أضف بعض المشاركات إلى المفضلة لرؤيتهم هنا", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "تحميل المزيد من المشاركات", "move_topic": "نقل الموضوع", "move_topics": "نقل المواضيع", diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 577b3e0e25..e3c9502a93 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -22,7 +22,7 @@ "profile": "الملف الشخصي", "profile_views": "عدد المشاهدات", "reputation": "السمعة", - "favourites": "التفضيلات", + "favourites": "Bookmarks", "watched": "متابع", "followers": "المتابعون", "following": "يتابع", @@ -55,10 +55,11 @@ "password": "كلمة السر", "username_taken_workaround": "اسم المستخدم الذي اخترته سبق أخذه، لذا تم تغييره قليلا. أن الآن مسجل تحت الاسم %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "ارفع الصورة", "upload_a_picture": "رفع صورة", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "خيارات", "show_email": "أظهر بريدي الإلكتروني", "show_fullname": "أظهر اسمي الكامل", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 7c91315b51..c23fbe0c12 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -14,7 +14,7 @@ "invalid-password": "Невалидна парола", "invalid-username-or-password": "Моля, посочете потребителско име и парола", "invalid-search-term": "Невалиден текст за търсене", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Грешен номер на страница, трябва да бъде между %1 и %2", "username-taken": "Потребителското име е заето", "email-taken": "Е-пощата е заета", "email-not-confirmed": "Вашата е-поща все още не е потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.", @@ -50,8 +50,8 @@ "still-uploading": "Моля, изчакайте качването да приключи.", "file-too-big": "Максималният разрешен размер на файл е %1 КБ – моля, качете по-малък файл", "guest-upload-disabled": "Качването не е разрешено за гости", - "already-favourited": "Вече сте отбелязали тази публикация като любима", - "already-unfavourited": "Вече сте премахнали тази публикация от любимите си", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Не можете да блокирате другите администратори!", "cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор", "invalid-image-type": "Грешен тип на изображение. Позволените типове са: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Съобщението е твърде дълго", "cant-edit-chat-message": "Нямате право да редактирате това съобщение", "cant-remove-last-user": "Не можете да премахнете последния потребител", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Нямате право да изтриете това съобщение", "reputation-system-disabled": "Системата за репутация е изключена.", "downvoting-disabled": "Отрицателното гласуване е изключено", "not-enough-reputation-to-downvote": "Нямате достатъчно репутация, за да гласувате отрицателно за тази публикация", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Моля, използвайте потребителското си име, за да влезете", "invite-maximum-met": "Вие сте поканили максимално позволения брой хора (%1 от %2).", "no-session-found": "Не е открита сесия за вход!", - "not-in-room": "User not in room" + "not-in-room": "Потребителят не е в стаята", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/bg/global.json b/public/language/bg/global.json index 547ae7e519..a1a940c50a 100644 --- a/public/language/bg/global.json +++ b/public/language/bg/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "публикувано в %1 %2 от %3", "user_posted_ago": "%1 публикува %2", "guest_posted_ago": "гост публикува %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "последно редактирано от %1", "norecentposts": "Няма скорошни публикации", "norecenttopics": "Няма скорошни теми", "recentposts": "Скорошни публикации", @@ -86,5 +86,9 @@ "delete_all": "Изтриване на всичко", "map": "Карта", "sessions": "Сесии за вход", - "ip_address": "IP адрес" + "ip_address": "IP адрес", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index 75870b4fdd..92ba6a905f 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Присъединяване към групата", "membership.leave-group": "Напускане на групата", "membership.reject": "Отхвърляне", - "new-group.group_name": "Име на групата:" + "new-group.group_name": "Име на групата:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index 89a389d387..f47c4b8340 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 и %2 други гласуваха положително за Ваша публикация в %3.", "moved_your_post": "%1 премести публикацията Ви в %2", "moved_your_topic": "%1 премести %2", - "favourited_your_post_in": "%1 отбеляза Ваша публикация в %2 като любима.", - "favourited_your_post_in_dual": "%1 и %2 отбелязаха Ваша публикация в %3 като любима.", - "favourited_your_post_in_multiple": "%1 и %2 други отбелязаха Ваша публикация в %3 като любима.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 докладва Ваша публикация в %2", "user_flagged_post_in_dual": "%1 и %2 докладваха Ваша публикация в %3", "user_flagged_post_in_multiple": "%1 и %2 други докладваха Ваша публикация в %3", diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index 90685e0bef..3403d7f897 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -6,12 +6,12 @@ "popular-month": "Популярните теми този месец", "popular-alltime": "Популярните теми за всички времена", "recent": "Скорошни теми", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Докладвани публикации", "users/online": "Потребители на линия", "users/latest": "Последни потребители", "users/sort-posts": "Потребители с най-много публикации", "users/sort-reputation": "Потребители с най-висока репутация", - "users/banned": "Banned Users", + "users/banned": "Блокирани потребители", "users/search": "Търсене на потребители", "notifications": "Известия", "tags": "Етикети", @@ -33,12 +33,13 @@ "account/posts": "Публикации от %1", "account/topics": "Теми, създадени от %1", "account/groups": "Групите на %1", - "account/favourites": "Любимите публикации на %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Потребителски настройки", "account/watched": "Теми, следени от %1", "account/upvoted": "Публикации, получили положителен глас от %1", "account/downvoted": "Публикации, получили отрицателен глас от %1", "account/best": "Най-добрите публикации от %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 в момента е в профилактика. Моля, върнете се по-късно.", "maintenance.messageIntro": "В допълнение, администраторът е оставил това съобщение:", "throttled.text": "%1 в момента е недостъпен, поради прекомерно натоварване. Моля, върнете се отново по-късно." diff --git a/public/language/bg/topic.json b/public/language/bg/topic.json index e96fb796b9..b59e34c52b 100644 --- a/public/language/bg/topic.json +++ b/public/language/bg/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Моля, регистрирайте се или влезте, за да се абонирате за тази тема.", "markAsUnreadForAll.success": "Темата е отбелязана като непрочетена за всички.", "mark_unread": "Отбелязване като непрочетена", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Темата е отбелязана като непрочетена.", "watch": "Наблюдаване", "unwatch": "Спиране на наблюдаването", "watch.title": "Получавайте известия за новите отговори в тази тема", @@ -65,9 +65,9 @@ "disabled_categories_note": "Изключените категории са засивени", "confirm_move": "Преместване", "confirm_fork": "Разделяне", - "favourite": "Любима", - "favourites": "Любими", - "favourites.has_no_favourites": "Нямате любими, отбележете няколко публикации, за да ги видите тук!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Зареждане на още публикации", "move_topic": "Преместване на темата", "move_topics": "Преместване на темите", @@ -105,7 +105,7 @@ "stale.warning": "Темата, в която отговаряте, е доста стара. Искате ли вместо това да създадете нова и да направите препратка към тази в отговора си?", "stale.create": "Създаване на нова тема", "stale.reply_anyway": "Отговаряне в тази тема въпреки това", - "link_back": "Re: [%1](%2)", + "link_back": "Отговор: [%1](%2)", "spam": "Спам", "offensive": "Обидно", "custom-flag-reason": "Изберете причина за докладване" diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 01ee3779ae..53e2eebda7 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -22,7 +22,7 @@ "profile": "Профил", "profile_views": "Преглеждания на профила", "reputation": "Репутация", - "favourites": "Любими", + "favourites": "Bookmarks", "watched": "Наблюдавани", "followers": "Последователи", "following": "Следва", @@ -55,10 +55,11 @@ "password": "Парола", "username_taken_workaround": "Потребителското име, което искате, е заето и затова ние го променихме малко. Вие ще се наричате %1", "password_same_as_username": "Паролата е същата като потребителското Ви име. Моля, изберете друга парола.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Качване на снимка", "upload_a_picture": "Качване на снимка", "remove_uploaded_picture": "Премахване на качената снимка", - "image_spec": "Можете да качвате само файлове във форматите PNG, JPG или BMP", + "upload_cover_picture": "Upload cover picture", "settings": "Настройки", "show_email": "Да се показва е-пощата ми", "show_fullname": "Да се показва цялото ми име", diff --git a/public/language/bg/users.json b/public/language/bg/users.json index 4a3a288614..3addffa9d9 100644 --- a/public/language/bg/users.json +++ b/public/language/bg/users.json @@ -16,5 +16,5 @@ "unread_topics": "Непрочетени теми", "categories": "Категории", "tags": "Етикети", - "no-users-found": "No users found!" + "no-users-found": "Няма открити потребители!" } \ No newline at end of file diff --git a/public/language/bn/error.json b/public/language/bn/error.json index ca60095dd2..bb003ce9a0 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -50,8 +50,8 @@ "still-uploading": "আপলোড সম্পূর্ণ জন্য অনুগ্রহ করে অপেক্ষা করুন", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "আপনি ইতিমধ্যে এই পোষ্টটি পছন্দের তালিকায় যোগ করেছেন", - "already-unfavourited": "আপনি ইতিমধ্যে এই পোষ্টটি আপনার পছন্দের তালিকা থেকে সরিয়ে ফেলেছেন", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "আপনি অন্য এ্যাডমিনদের নিষিদ্ধ করতে পারেন না!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/bn/global.json b/public/language/bn/global.json index da099cd8e3..9eb59053b1 100644 --- a/public/language/bn/global.json +++ b/public/language/bn/global.json @@ -86,5 +86,9 @@ "delete_all": "সব মুছে ফেলুন", "map": "ম্যাপ", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json index 7f95a0e59c..92cb098261 100644 --- a/public/language/bn/groups.json +++ b/public/language/bn/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/bn/notifications.json b/public/language/bn/notifications.json index 1411c3b429..591abc3c4d 100644 --- a/public/language/bn/notifications.json +++ b/public/language/bn/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/bn/pages.json b/public/language/bn/pages.json index f59157d907..d7d56d0e4a 100644 --- a/public/language/bn/pages.json +++ b/public/language/bn/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/bn/topic.json b/public/language/bn/topic.json index 0c7eedeb73..9fea972e71 100644 --- a/public/language/bn/topic.json +++ b/public/language/bn/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "নিস্ক্রীয় ক্যাটাগরীসমূহ ধূসর কালিতে লেখা রয়েছে। ", "confirm_move": "সরান", "confirm_fork": "ফর্ক", - "favourite": "পছন্দ", - "favourites": "পছন্দতালিকা", - "favourites.has_no_favourites": "আপনার যদি কোন পছন্দের পোষ্ট না থেকে থাকে তাহলে কিছু পোষ্ট ফেভারিট করা হলে সেগুলো এখানে দেখতে পাবেন।", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "আরো পোষ্ট লোড করা হচ্ছে", "move_topic": "টপিক সরান", "move_topics": "টপিক সমূহ সরান", diff --git a/public/language/bn/user.json b/public/language/bn/user.json index 9972d6bbf6..b4e66060e5 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -22,7 +22,7 @@ "profile": "প্রোফাইল", "profile_views": "প্রোফাইল দেখেছেন", "reputation": "সন্মাননা", - "favourites": "পছন্দের তালিকা", + "favourites": "Bookmarks", "watched": "দেখা হয়েছে", "followers": "যাদের অনুসরণ করছেন", "following": "যারা আপনাকে অনুসরণ করছে", @@ -55,10 +55,11 @@ "password": "পাসওয়ার্ড", "username_taken_workaround": "আপনি যে ইউজারনেম চাচ্ছিলেন সেটি ইতিমধ্যে নেয়া হয়ে গেছে, কাজেই আমরা এটি কিঞ্চিং পরিবর্তন করেছি। আপনি এখন %1 হিসেবে পরিচিত", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "ছবি আপলোড করুন", "upload_a_picture": "ছবি (একটি) আপলোড করুন", "remove_uploaded_picture": "আপলোড করা ছবিটি সরিয়ে নাও", - "image_spec": "আপনি শুধুমাত্র PNG, JPG অথবা BMP ফাইল আপলোড করতে পারবেন", + "upload_cover_picture": "Upload cover picture", "settings": "সেটিংস", "show_email": "আমার ইমেইল দেখাও", "show_fullname": "আমার সম্পূর্ণ নাম দেখাও", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index d3e6559a65..2bf902b874 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -50,8 +50,8 @@ "still-uploading": "Vyčkejte, prosím, nežli se vše kompletně nahraje.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Nemůžete zakazovat ostatní administrátory!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/cs/global.json b/public/language/cs/global.json index 6b0d59a86a..1f1900a0f6 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -86,5 +86,9 @@ "delete_all": "Vymazat vše", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index d86c1e52f1..2cffe0b3b0 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 3a869b923e..4e29676790 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index bcae168282..285aa30017 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index e6da76341e..3bced7f182 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Vypnuté (disabled) kategorie jsou šedé.", "confirm_move": "Přesunout", "confirm_fork": "Rozdělit", - "favourite": "Oblíbené", - "favourites": "Oblíbené", - "favourites.has_no_favourites": "Nemáte žádné oblíbené příspěvky, přidejte některý příspěvek k oblíbeným a uvidíte ho zde!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Načítání více příspěvků", "move_topic": "Přesunout téma", "move_topics": "Move Topics", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 0c52c28cc8..9222a733e2 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Zobrazení profilu", "reputation": "Reputace", - "favourites": "Oblíbené", + "favourites": "Bookmarks", "watched": "Sledován", "followers": "Sledují ho", "following": "Sleduje", @@ -55,10 +55,11 @@ "password": "Heslo", "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Nahrát obrázek", "upload_a_picture": "Nahrát obrázek", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Nastavení", "show_email": "Zobrazovat můj email v profilu", "show_fullname": "Zobrazovat celé jméno", diff --git a/public/language/da/error.json b/public/language/da/error.json index fb66628ba2..4041a7fc2b 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -50,8 +50,8 @@ "still-uploading": "Venligst vent til overførslen er færdig", "file-too-big": "Maksimum filstørrelse er %1 kB - venligst overfør en mindre fil", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Du har allerede føjet dette indlæg til dine favoritter", - "already-unfavourited": "Du har allerede fjernet dette indlæg fra dine favoritter", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kan ikke udlukke andre administatrorer!", "cant-remove-last-admin": "Du er den eneste administrator. Tilføj en anden bruger som administrator før du fjerner dig selv som administrator", "invalid-image-type": "Invalid billed type. De tilladte typer er: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Brug venligt dit brugernavn til login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/da/global.json b/public/language/da/global.json index a6a29873ab..ef47f75ec9 100644 --- a/public/language/da/global.json +++ b/public/language/da/global.json @@ -86,5 +86,9 @@ "delete_all": "Slet alt", "map": "Kort", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/da/groups.json b/public/language/da/groups.json index eda84cdb9e..6e97812359 100644 --- a/public/language/da/groups.json +++ b/public/language/da/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Bliv medlem af gruppe", "membership.leave-group": "Forlad Gruppe", "membership.reject": "Afvis", - "new-group.group_name": "Gruppe Navn:" + "new-group.group_name": "Gruppe Navn:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/da/notifications.json b/public/language/da/notifications.json index 077e72b553..7a7d49655f 100644 --- a/public/language/da/notifications.json +++ b/public/language/da/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 har flyttet dit indlæg til %2", "moved_your_topic": "%1 har flyttet %2", - "favourited_your_post_in": "%1 har favoriseret dit indlæg i %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 har anmeldt et indlæg i %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/da/pages.json b/public/language/da/pages.json index 11409c5109..076ff501d2 100644 --- a/public/language/da/pages.json +++ b/public/language/da/pages.json @@ -33,12 +33,13 @@ "account/posts": "Indlæg oprettet af %1", "account/topics": "Tråde lavet af %1", "account/groups": "%1s grupper", - "account/favourites": "&1s favorit indlæg", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Bruger instillinger", "account/watched": "Tråde fulgt af %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 er under vedligeholdelse. Kom venligst tilbage senere.", "maintenance.messageIntro": "Administratoren har yderligere vedlagt denne besked:", "throttled.text": "%1 er ikke tilgængelig på grund af overbelastning. Venligst kom tilbage senere." diff --git a/public/language/da/topic.json b/public/language/da/topic.json index 3ad278b495..a19e01b272 100644 --- a/public/language/da/topic.json +++ b/public/language/da/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Deaktiverede kategorier er nedtonede", "confirm_move": "Flyt", "confirm_fork": "Fraskil", - "favourite": "Favoriser", - "favourites": "Favoritter", - "favourites.has_no_favourites": "Du har ingen favoritter, favoriser nogle indlæg for at se dem her!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Indlæser flere indlæg", "move_topic": "Flyt tråd", "move_topics": "Flyt tråde", diff --git a/public/language/da/user.json b/public/language/da/user.json index edd05211e1..04f90e9066 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profil visninger", "reputation": "Omdømme", - "favourites": "Favoritter", + "favourites": "Bookmarks", "watched": "Set", "followers": "Followers", "following": "Følger", @@ -55,10 +55,11 @@ "password": "Kodeord", "username_taken_workaround": "Det valgte brugernavn er allerede taget, så vi har ændret det en smule. Du hedder nu %1", "password_same_as_username": "Din adgangskode er det samme som dit brugernavn, vælg venligst en anden adgangskode.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Upload billede", "upload_a_picture": "Upload et billede", "remove_uploaded_picture": "Fjern uploaded billede", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Indstillinger", "show_email": "Vis min emailaddresse", "show_fullname": "Vis mit fulde navn", diff --git a/public/language/de/error.json b/public/language/de/error.json index 32a56b5d64..6f053540f2 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -50,8 +50,8 @@ "still-uploading": "Bitte warte bis der Vorgang abgeschlossen ist.", "file-too-big": "Die maximale Dateigröße ist %1 kB, bitte lade eine kleinere Datei hoch.", "guest-upload-disabled": "Uploads für Gäste wurden deaktiviert.", - "already-favourited": "Dieser Beitrag ist bereits in deinen Favoriten enthalten", - "already-unfavourited": "Du hast diesen Beitrag bereits aus deinen Favoriten entfernt", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!", "cant-remove-last-admin": "Du bist der einzige Administrator. Füge zuerst einen anderen Administrator hinzu, bevor du dich selbst als Administrator entfernst", "invalid-image-type": "Falsche Bildart. Erlaubte Arten sind: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Bitte nutze deinen Benutzernamen zum einloggen", "invite-maximum-met": "Du hast bereits die maximale Anzahl an Personen eingeladen (%1 von %2).", "no-session-found": "Keine Login-Sitzung gefunden!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/de/global.json b/public/language/de/global.json index 0cd14600ce..b46bf4fcbe 100644 --- a/public/language/de/global.json +++ b/public/language/de/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "Verfasst in %1 %2 von %3", "user_posted_ago": "%1 schrieb %2", "guest_posted_ago": "Gast schrieb %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "zuletzt editiert von %1", "norecentposts": "Keine aktuellen Beiträge", "norecenttopics": "Keine aktuellen Themen", "recentposts": "Aktuelle Beiträge", @@ -86,5 +86,9 @@ "delete_all": "Alles löschen", "map": "Karte", "sessions": "Login-Sitzungen", - "ip_address": "IP-Adresse" + "ip_address": "IP-Adresse", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/de/groups.json b/public/language/de/groups.json index c85d80412e..db26671315 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Gruppe beitreten", "membership.leave-group": "Gruppe verlassen", "membership.reject": "Ablehnen", - "new-group.group_name": "Gruppenname:" + "new-group.group_name": "Gruppenname:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 1657269f9a..438d6abadc 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 und %2 andere Nutzer haben deinen Beitrag in %3 positiv bewertet.", "moved_your_post": "%1 hat deinen Beitrag nach %2 verschoben.", "moved_your_topic": "%1 hat %2 verschoben.", - "favourited_your_post_in": "%1 hat deinen Beitrag in %2 favorisiert.", - "favourited_your_post_in_dual": "%1 und %2 haben deinen Beitrag in %3 favorisiert.", - "favourited_your_post_in_multiple": "%1 und %2 andere Nutzer haben deinen Beitrag in %3 favorisiert.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 hat einen Beitrag in %2 gemeldet", "user_flagged_post_in_dual": "%1 und %2 haben einen Beitrag in %3 gemeldet", "user_flagged_post_in_multiple": "%1 und %2 andere Nutzer haben einen Beitrag in %3 gemeldet", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 42fc17b802..0844e4d18d 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -33,12 +33,13 @@ "account/posts": "Beiträge von %1", "account/topics": "Themen verfasst von %1", "account/groups": "Gruppen von %1", - "account/favourites": "Von %1 favorisierte Beiträge", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Benutzer-Einstellungen", - "account/watched": "Themen angeschaut von %1", + "account/watched": "Von %1 beobachtete Themen", "account/upvoted": "Von %1 positiv bewertete Beiträge", "account/downvoted": "Von %1 negativ bewertete Beiträge", "account/best": "Bestbewertete Beiträge von %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 befindet sich derzeit in der Wartung. Bitte komme später wieder.", "maintenance.messageIntro": "Zusätzlich hat der Administrator diese Nachricht hinterlassen:", "throttled.text": "%1 ist momentan aufgrund von Überlastung nicht verfügbar. Bitte komm später wieder." diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 3e31768859..7ab5299cc8 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Deaktivierte Kategorien sind ausgegraut.", "confirm_move": "Verschieben", "confirm_fork": "Aufspalten", - "favourite": "Favorisieren", - "favourites": "Favoriten", - "favourites.has_no_favourites": "Du hast noch keine Favoriten.", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Lade mehr Beiträge", "move_topic": "Thema verschieben", "move_topics": "Themen verschieben", diff --git a/public/language/de/user.json b/public/language/de/user.json index 21456e633e..3efc474489 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profilaufrufe", "reputation": "Ansehen", - "favourites": "Favoriten", + "favourites": "Bookmarks", "watched": "Beobachtet", "followers": "Follower", "following": "Folge ich", @@ -55,10 +55,11 @@ "password": "Passwort", "username_taken_workaround": "Der gewünschte Benutzername ist bereits vergeben, deshalb haben wir ihn ein wenig verändert. Du bist jetzt unter dem Namen %1 bekannt.", "password_same_as_username": "Dein Passwort entspricht deinem Benutzernamen, bitte wähle ein anderes Passwort.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Bild hochladen", "upload_a_picture": "Ein Bild hochladen", "remove_uploaded_picture": "Hochgeladenes Bild entfernen", - "image_spec": "Du solltest nur PNG-, JPG- oder BMP-Dateien hochladen", + "upload_cover_picture": "Upload cover picture", "settings": "Einstellungen", "show_email": "Zeige meine E-Mail Adresse an.", "show_fullname": "Zeige meinen kompletten Namen an", diff --git a/public/language/el/error.json b/public/language/el/error.json index b5d58d9eed..dc22ae8c4d 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -50,8 +50,8 @@ "still-uploading": "Παρακαλώ περίμενε να τελειώσει το ανέβασμα των αρχείων.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Δεν μπορείς να αποκλείσεις άλλους διαχειριστές!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/el/global.json b/public/language/el/global.json index debb319dfe..d8be67df72 100644 --- a/public/language/el/global.json +++ b/public/language/el/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/el/groups.json b/public/language/el/groups.json index 93715a4f3d..7cfcfb976f 100644 --- a/public/language/el/groups.json +++ b/public/language/el/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/el/notifications.json b/public/language/el/notifications.json index 1484e9b98b..eefd1ccc03 100644 --- a/public/language/el/notifications.json +++ b/public/language/el/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "Η δημοσίευσή σου στο %2 αρέσει στον/ην %1.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "Ο/Η %1 επεσήμανε μια δημοσίευσή σου στο %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/el/pages.json b/public/language/el/pages.json index 18fafd820c..092f813826 100644 --- a/public/language/el/pages.json +++ b/public/language/el/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "Το %1 αυτή την στιγμή συντηρείται. Παρακαλώ έλα αργότερα.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/el/topic.json b/public/language/el/topic.json index 703e1e4f57..a2f1d0fcd7 100644 --- a/public/language/el/topic.json +++ b/public/language/el/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Οι απενεργοποιημένες κατηγορίες είναι γκριζαρισμένες", "confirm_move": "Μετακίνηση", "confirm_fork": "Διαχωρισμός", - "favourite": "Αγαπημένο", - "favourites": "Αγαπημένα", - "favourites.has_no_favourites": "Δεν έχεις καθόλου αγαπημένα, βάλε μερικές δημοσιεύσεις στα αγαπημένα σου για να τις βλέπεις εδώ!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Φόρτωση περισσότερων δημοσιεύσεων", "move_topic": "Μετακίνηση Θέματος", "move_topics": "Μετακίνηση Θεμάτων", diff --git a/public/language/el/user.json b/public/language/el/user.json index 81f2a36740..d6959816b3 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -22,7 +22,7 @@ "profile": "Προφίλ", "profile_views": "Views του προφίλ", "reputation": "Φήμη", - "favourites": "Αγαπημένα", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Ακόλουθοι", "following": "Ακολουθά", @@ -55,10 +55,11 @@ "password": "Κωδικός", "username_taken_workaround": "Το όνομα χρήστη που ζήτησες χρησιμοποιείται ήδη, οπότε το τροποποιήσαμε λίγο. Πλέον είσαι γνωστός/ή ώς %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Ανέβασμα φωτογραφίας", "upload_a_picture": "Ανέβασε μια φωτογραφία", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Επιλογές", "show_email": "Εμφάνιση του email μου", "show_fullname": "Show My Full Name", diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index ca4533474d..f9199f193e 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -50,8 +50,8 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/en@pirate/global.json b/public/language/en@pirate/global.json index 8b7fa92380..58eba7f42d 100644 --- a/public/language/en@pirate/global.json +++ b/public/language/en@pirate/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/en@pirate/groups.json b/public/language/en@pirate/groups.json index 2ac271a4c5..6138ea22ff 100644 --- a/public/language/en@pirate/groups.json +++ b/public/language/en@pirate/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/en@pirate/notifications.json b/public/language/en@pirate/notifications.json index 526e8f9a6d..b22456f660 100644 --- a/public/language/en@pirate/notifications.json +++ b/public/language/en@pirate/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/en@pirate/pages.json b/public/language/en@pirate/pages.json index bcae168282..285aa30017 100644 --- a/public/language/en@pirate/pages.json +++ b/public/language/en@pirate/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/en@pirate/topic.json b/public/language/en@pirate/topic.json index f78f1d49bb..c7ce76e07b 100644 --- a/public/language/en@pirate/topic.json +++ b/public/language/en@pirate/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Disabled Categories are greyed out", "confirm_move": "Move", "confirm_fork": "Fork", - "favourite": "Favourite", - "favourites": "Favourites", - "favourites.has_no_favourites": "You don't have any favourites, favourite some posts to see them here!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Loading More Posts", "move_topic": "Move Topic", "move_topics": "Move Topics", diff --git a/public/language/en@pirate/user.json b/public/language/en@pirate/user.json index 33e7c3e222..e907bc2200 100644 --- a/public/language/en@pirate/user.json +++ b/public/language/en@pirate/user.json @@ -22,7 +22,7 @@ "profile": "Profile", "profile_views": "Profile views", "reputation": "Reputation", - "favourites": "Favourites", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Followers", "following": "Following", @@ -55,10 +55,11 @@ "password": "Password", "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Upload picture", "upload_a_picture": "Upload a picture", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Settings", "show_email": "Show My Email", "show_fullname": "Show My Full Name", diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index f75bdad526..f9199f193e 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -50,8 +50,8 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favorited this post", - "already-unfavourited": "You have already unfavorited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/en_US/global.json b/public/language/en_US/global.json index 7579fecc9e..a206afd7cf 100644 --- a/public/language/en_US/global.json +++ b/public/language/en_US/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/en_US/groups.json b/public/language/en_US/groups.json index ce19a2e4b7..f3b661977f 100644 --- a/public/language/en_US/groups.json +++ b/public/language/en_US/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/en_US/notifications.json b/public/language/en_US/notifications.json index 65b6dcd24b..0b1d9931a5 100644 --- a/public/language/en_US/notifications.json +++ b/public/language/en_US/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favorited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/en_US/pages.json b/public/language/en_US/pages.json index 48d10023a2..285aa30017 100644 --- a/public/language/en_US/pages.json +++ b/public/language/en_US/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favorite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/en_US/topic.json b/public/language/en_US/topic.json index b4179826fb..c7ce76e07b 100644 --- a/public/language/en_US/topic.json +++ b/public/language/en_US/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Disabled Categories are greyed out", "confirm_move": "Move", "confirm_fork": "Fork", - "favourite": "Favorite", - "favourites": "Favorites", - "favourites.has_no_favourites": "You don't have any favorites, favorite some posts to see them here!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Loading More Posts", "move_topic": "Move Topic", "move_topics": "Move Topics", diff --git a/public/language/en_US/user.json b/public/language/en_US/user.json index 88356e9ce8..4be38f5a9e 100644 --- a/public/language/en_US/user.json +++ b/public/language/en_US/user.json @@ -22,7 +22,7 @@ "profile": "Profile", "profile_views": "Profile views", "reputation": "Reputation", - "favourites": "Favorites", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Followers", "following": "Following", @@ -55,10 +55,11 @@ "password": "Password", "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Upload picture", "upload_a_picture": "Upload a picture", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Settings", "show_email": "Show My Email", "show_fullname": "Show My Full Name", diff --git a/public/language/es/error.json b/public/language/es/error.json index 9251615b8d..bcf1fa0131 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -50,8 +50,8 @@ "still-uploading": "Por favor, espera a que terminen las subidas.", "file-too-big": "El tamaño de fichero máximo es de %1 kB - por favor, suba un fichero más pequeño", "guest-upload-disabled": "Las subidas están deshabilitadas para los invitados", - "already-favourited": "Ya ha marcado esta publicación como favorita", - "already-unfavourited": "Ya ha desmarcado esta publicación como favorita", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "¡No puedes expulsar a otros administradores!", "cant-remove-last-admin": "Tu eres el unico administrador. Añade otro usuario como administrador antes de eliminarte a ti mismo.", "invalid-image-type": "Tipo de imagen inválido. Los tipos permitidos son: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Por favor introduce tu nombre de usuario para acceder", "invite-maximum-met": "Has alcanzado el número máximo de personas invitadas (%1 de %2).", "no-session-found": "¡No se ha encontrado ningún inicio de sesión!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/es/global.json b/public/language/es/global.json index 83c24ff95e..6e7c532fe9 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -86,5 +86,9 @@ "delete_all": "Eliminar todo", "map": "Mapa", "sessions": "Inicios de sesión", - "ip_address": "Direcciones IP" + "ip_address": "Direcciones IP", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/es/groups.json b/public/language/es/groups.json index 28b541e573..ca0ca6e66b 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Unirse al grupo", "membership.leave-group": "Dejar el grupo", "membership.reject": "Rechazar", - "new-group.group_name": "Nombre de Grupo:" + "new-group.group_name": "Nombre de Grupo:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 96390cb0e5..3bee47fd1a 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 y otras %2 personas han votado positivamente tu respuesta en %3.", "moved_your_post": "%1 su tema ha sido movido a %2", "moved_your_topic": "%1 se ha movido %2", - "favourited_your_post_in": "%1 ha marcado como favorito su publicación en %2.", - "favourited_your_post_in_dual": "%1 y %2 han marcado como favorito tu post en %3.", - "favourited_your_post_in_multiple": "%1 y otras %2 personas han marcado como favorito tu post en %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 ha reportado una respuesta en %2", "user_flagged_post_in_dual": "%1 y %2 han reportado un post en %3", "user_flagged_post_in_multiple": "%1 y otras %2 personas han reportado un post en %3", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index a4d13047d1..b151e4cb21 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -33,12 +33,13 @@ "account/posts": "Publicados por %1", "account/topics": "Temas creados por %1", "account/groups": "Grupos de %1", - "account/favourites": "Favoritos de %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Preferencias", "account/watched": "Temas seguidos por %1", "account/upvoted": "Publicaciones votadas positivamente %1", "account/downvoted": "Publicaciones votadas negativamente %1", "account/best": "Mejores publicaciones hechas por %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 está en mantenimiento actualmente. Por favor vuelva en otro momento.", "maintenance.messageIntro": "Además, la administración ha dejado este mensaje:", "throttled.text": "%1 no está disponible debido a una carga excesiva. Por favor vuelva en otro momento" diff --git a/public/language/es/topic.json b/public/language/es/topic.json index 927570f32b..1f13a9e8e9 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Las categorías deshabilitadas están en gris", "confirm_move": "Mover", "confirm_fork": "Dividir", - "favourite": "Favorito", - "favourites": "Favoritos", - "favourites.has_no_favourites": "No tienes favoritos, ¡puedes agregar alguno y volver a verlos aquí!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Cargando más publicaciones", "move_topic": "Mover tema", "move_topics": "Mover temas", diff --git a/public/language/es/user.json b/public/language/es/user.json index 77f0084c52..fda1eb149b 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -22,7 +22,7 @@ "profile": "Perfil", "profile_views": "Visitas", "reputation": "Reputación", - "favourites": "Favoritos", + "favourites": "Bookmarks", "watched": "Suscritos", "followers": "Seguidores", "following": "Siguiendo", @@ -55,10 +55,11 @@ "password": "Contraseña", "username_taken_workaround": "El nombre de usuario que has solicitada ya está siendo usado, por tanto lo hemos alterado ligeramente. Ahora eres conocido como %1.", "password_same_as_username": "Tu Constraseña es igual al nombre de Usuario, por favor seleccione otra Constraseña.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Subir foto", "upload_a_picture": "Subir una foto", "remove_uploaded_picture": "Borrar Imagen subida", - "image_spec": "Sólo puedes subir imágenes en formato PNG, JPG o BMP", + "upload_cover_picture": "Upload cover picture", "settings": "Opciones", "show_email": "Mostrar mi correo electrónico", "show_fullname": "Mostrar mi nombre completo", diff --git a/public/language/et/error.json b/public/language/et/error.json index 5520d6f965..68c7a28745 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -14,7 +14,7 @@ "invalid-password": "Vigane parool", "invalid-username-or-password": "Palun täpsusta kasutajanime ja parooli", "invalid-search-term": "Vigane otsingusõna", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Väär lehekülje numeratsioon, peab olema vähemalt %1 ja kõige rohkem %2", "username-taken": "Kasutajanimi on juba võetud", "email-taken": "Email on võetud", "email-not-confirmed": "Su emaili aadress ei ole kinnitatud, vajuta siia et kinnitada.", @@ -50,8 +50,8 @@ "still-uploading": "Palun oota, kuni üleslaadimised on laetud.", "file-too-big": "Maksimaalne üleslaetava faili suurus on %1 kB - valige väiksema mahuga fail.", "guest-upload-disabled": "Külaliste üleslaadimine on keelatud.", - "already-favourited": "Sa juba märkisid selle postituse lemmikuks", - "already-unfavourited": "Sa juba eemaldasid selle postituse lemmikute hulgast", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!", "cant-remove-last-admin": "Te olete ainus administraator. Lisage keegi teine administraatoriks, enne kui eemaldate endalt administraatori.", "invalid-image-type": "Vigane pildi formaat. Lubatud formaadid on: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Vestluse sõnum on liiga pikk", "cant-edit-chat-message": "Sul ei ole lubatud antud sõnumit muuta", "cant-remove-last-user": "Sa ei saa viimast kasutajat eemaldada", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Sul ei ole lubatud antud sõnumit kustutada", "reputation-system-disabled": "Reputatsiooni süsteem ei ole aktiveeritud", "downvoting-disabled": "Negatiivsete häälte andmine ei ole võimaldatud", "not-enough-reputation-to-downvote": "Sul ei ole piisavalt reputatsiooni, et anda negatiivset hinnangut sellele postitusele.", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Sisse logimiseks kasuta oma kasutajanime", "invite-maximum-met": "Sa oled kutsunud maksimaalse lubatud inimeste arvu (%1 %2 'st).", "no-session-found": "Sisse logimis sessiooni ei leitud!", - "not-in-room": "User not in room" + "not-in-room": "Kasutaja pole ruumis", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/et/global.json b/public/language/et/global.json index 608274ff50..f43dd9007a 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "%3 postitas %2 kategooriasse %1", "user_posted_ago": "%1 postitas %2", "guest_posted_ago": "Külaline postitas %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "viimati muudetud %1 poolt", "norecentposts": "Hiljutisi postitusi ei ole", "norecenttopics": "Hiljutisi teemasid ei ole", "recentposts": "Hiljutised postitused", @@ -86,5 +86,9 @@ "delete_all": "Kustuta kõik", "map": "Kaart", "sessions": "Logitud Sessioonid", - "ip_address": "IP Aadress" + "ip_address": "IP Aadress", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/et/groups.json b/public/language/et/groups.json index 786ff6489a..fe3f83967d 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Liitu grupiga", "membership.leave-group": "Lahku grupist", "membership.reject": "Lükka tagasi", - "new-group.group_name": "Grupi nimi:" + "new-group.group_name": "Grupi nimi:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 1dc8c61a6b..d4d28fb48a 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 ja %2 teist on kiitnud sinu postituse heaks: %3.", "moved_your_post": "%1 liigutas sinu postituse %2 'sse", "moved_your_topic": "%1 liigutas %2", - "favourited_your_post_in": "%1 märgistas sinu postituse lemmikuks teemas %2.", - "favourited_your_post_in_dual": "%1 'le ja %2 'le meeldis sinu postitus: %3.", - "favourited_your_post_in_multiple": "%1 'le ja %2 'le teisele meeldis sinu postitus: %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 raporteeris postitust %2", "user_flagged_post_in_dual": "%1 ja %2 märgistasid postituse: %3", "user_flagged_post_in_multiple": "%1 ja %2 teist märgistasid postituse: %3", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index 6c2d826b95..f85b28ead0 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -6,12 +6,12 @@ "popular-month": "Populaarsed teemad sel kuul", "popular-alltime": "Populaarseimad teemad üldse", "recent": "Hiljutised teemad", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Märgistatud postitused", "users/online": "Sisseloginud kasutajad", "users/latest": "Hiljutised kasutajad", "users/sort-posts": "Kasutajad, kel on enim postitusi", "users/sort-reputation": "Suurima reputatsiooniga kasutajad", - "users/banned": "Banned Users", + "users/banned": "Keelustatud Kasutajad", "users/search": "Kasutajate otsing", "notifications": "Teated", "tags": "Märksõnad", @@ -33,12 +33,13 @@ "account/posts": "Postitused, mis on tehtud kasutaja %1 poolt", "account/topics": "Teemad on kirjutanud %1", "account/groups": "Kasutaja %1 grupid", - "account/favourites": "Kasutaja %1 lemmikud postitused", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Kasutaja sätted", "account/watched": "Teemasid jälgib %1 kasutajat", "account/upvoted": "Postitused %1 poolt heaks kiidetud", "account/downvoted": "Postitused %1 poolt vastu hääletatud", "account/best": "Parimad postitused %1 poolt", + "confirm": "Email Confirmed", "maintenance.text": "%1 foorumil on käimas hooldustööd. Palun külastage meid mõne aja pärast uuesti.", "maintenance.messageIntro": "Administraator on jätnud ka omaltpoolt sõnumi:", "throttled.text": "%1 ei ole hetkel kättesaadav liigse koormuse tõttu. Palun tulge tagasi mõni teine kord." diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 880709a196..d6aba7fb7a 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Palun registreeru kasutajaks või logi sisse, et tellida teateid selle postituse kohta.", "markAsUnreadForAll.success": "Teema märgitud mitte-loetuks kõikidele.", "mark_unread": "Märgi lugematuks", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Teema märgitud mitteloetuks.", "watch": "Vaata", "unwatch": "Ära järgi", "watch.title": "Saa teateid uutest postitustest siin teemas", @@ -65,9 +65,9 @@ "disabled_categories_note": "Kinnised kategooriad on hallid", "confirm_move": "Liiguta", "confirm_fork": "Fork", - "favourite": "Märgi lemmikuks", - "favourites": "Lemmikud ", - "favourites.has_no_favourites": "Sul pole lemmikuid postitusi. Märgi mõned postitused lemmikuks ning need ilmuvad automaatselt siia!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Laen postitusi", "move_topic": "Liiguta teemat", "move_topics": "Liiguta teemasi", diff --git a/public/language/et/user.json b/public/language/et/user.json index 45af939288..cf81a08eda 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -22,7 +22,7 @@ "profile": "Profiil", "profile_views": "Vaatamisi", "reputation": "Reputatsioon", - "favourites": "Lemmikud", + "favourites": "Bookmarks", "watched": "Vaadatud", "followers": "Jälgijad", "following": "Jälgimised", @@ -55,10 +55,11 @@ "password": "Parool", "username_taken_workaround": "Kasutajanimi mida soovisid, ei olnud saadaval, seeg muutsime seda natukene. Sinu uus kasutajanimi on nüüd: %1", "password_same_as_username": "Su parool kattub su kasutajanimega, palun vali mõni muu parool.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Laadi pilt", "upload_a_picture": "Lae pilt üles", "remove_uploaded_picture": "Eemalda üleslaetud pilt", - "image_spec": "Sa saad üles laadida ainult PNG, JPG või BMP vormingus faile.", + "upload_cover_picture": "Upload cover picture", "settings": "Seaded", "show_email": "Näita minu emaili", "show_fullname": "Näita minu täisnime", diff --git a/public/language/et/users.json b/public/language/et/users.json index a1dd6ba266..bb377c7239 100644 --- a/public/language/et/users.json +++ b/public/language/et/users.json @@ -16,5 +16,5 @@ "unread_topics": "Lugemata teemad", "categories": "Kategooriad", "tags": "Märksõnad", - "no-users-found": "No users found!" + "no-users-found": "Ühtki kasutajat ei leitud!" } \ No newline at end of file diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index d1ff0894f9..a038b8fe03 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -50,8 +50,8 @@ "still-uploading": "خواهشمندیم تا پایان بارگذاری‌ها شکیبا باشید.", "file-too-big": "حداکثر مجاز حجم فایل %1 کیلوبایت می باشد - لطفا فایلی با حجم کمتر بارگذاری کنید", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "شما قبلا این پست را محبوب کرده اید", - "already-unfavourited": "شما قبلا این پست را نامحبوب کرده اید", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "شما نمی‌توانید دیگر مدیران را محروم کنید!", "cant-remove-last-admin": "شما تنها مدیر می باشید . شما باید قبل از عزل خود از مدیریت یک کاربر دیگر را مدیر کنید", "invalid-image-type": "نوع تصویر نامعتبر است. نوعهای قابل قبول اینها هستند: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "لطفا از نام کاربری خود برای ورود استفاده کنید", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/fa_IR/global.json b/public/language/fa_IR/global.json index a11d36a14e..948145c589 100644 --- a/public/language/fa_IR/global.json +++ b/public/language/fa_IR/global.json @@ -86,5 +86,9 @@ "delete_all": "حذف همه", "map": "نقشه", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/fa_IR/groups.json b/public/language/fa_IR/groups.json index c3658c3425..9f4805e44a 100644 --- a/public/language/fa_IR/groups.json +++ b/public/language/fa_IR/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "ورود به گروه", "membership.leave-group": "خروج از گروه", "membership.reject": "رد", - "new-group.group_name": "نام گروه" + "new-group.group_name": "نام گروه", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/fa_IR/notifications.json b/public/language/fa_IR/notifications.json index e5e04b6461..ec7c0dfd54 100644 --- a/public/language/fa_IR/notifications.json +++ b/public/language/fa_IR/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 پست شما را به %2 انتقال داده است", "moved_your_topic": "%2 %1 را منتقل کرده است", - "favourited_your_post_in": "%1 پست شما را در %2 محبوب کرده.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 پست شما را در %2 علامتدار کرده", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/fa_IR/pages.json b/public/language/fa_IR/pages.json index 050764ba2e..06d6c1ec35 100644 --- a/public/language/fa_IR/pages.json +++ b/public/language/fa_IR/pages.json @@ -33,12 +33,13 @@ "account/posts": "پست‌های %1", "account/topics": "موضوع های %1", "account/groups": "گروه‌های %1", - "account/favourites": "پست‌های محبوب شده %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "تنظیمات کاربر", "account/watched": "موضوع های دیده شده توسط \"%1\"", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 در حال حاضر تحت تعمیر و نگهدارییست. لطفا زمان دیگری مراجعه کنید.", "maintenance.messageIntro": "علاوه بر این، مدیر این پیام را گذاشته است:", "throttled.text": "%1 به دلیل بارگذاری بیش از حد ، قابل دسترس نمی باشد. لطفا در زمان دیگری دوباره امتحان کنید" diff --git a/public/language/fa_IR/topic.json b/public/language/fa_IR/topic.json index 74dabdce53..f3265b1ca9 100644 --- a/public/language/fa_IR/topic.json +++ b/public/language/fa_IR/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "دسته‌های از کار افتاده به رنگ خاکستری در می‌آیند", "confirm_move": "جابه‌جا کردن", "confirm_fork": "شاخه ساختن", - "favourite": "محبوب کردن", - "favourites": "محبوبها", - "favourites.has_no_favourites": "شماهیچ موضوع محبوبی ندارید، چندین موضوع را محبوب کنید تا آن‌ها را در اینجا ببینید.", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "بارگذاری پست‌های بیش‌تر", "move_topic": "جابه‌جایی موضوع", "move_topics": "انتقال موضوع", diff --git a/public/language/fa_IR/user.json b/public/language/fa_IR/user.json index 6905c78acd..b9fc631187 100644 --- a/public/language/fa_IR/user.json +++ b/public/language/fa_IR/user.json @@ -22,7 +22,7 @@ "profile": "پروفایل", "profile_views": "بازدیدهای نمایه", "reputation": "اعتبار", - "favourites": "محبوبها", + "favourites": "Bookmarks", "watched": "پیگیری شده", "followers": "دنبال‌کننده‌ها", "following": "دنبال‌شونده‌ها", @@ -55,10 +55,11 @@ "password": "گذرواژه", "username_taken_workaround": "نام کاربری درخواستی شما در حال حاضر گرفته شده است، بنابراین ما آن را کمی تغییر داده‌ایم. شما هم‌اکنون با نام %1%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/fi/pages.json b/public/language/fi/pages.json index e25e4f740e..9ae6d2e904 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index 066d0256a5..37b9b98e80 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Käytöstä poistetut aihealueet ovat harmaina", "confirm_move": "Siirrä", "confirm_fork": "Haaroita", - "favourite": "Lisää suosikiksi", - "favourites": "Suosikit", - "favourites.has_no_favourites": "Sinulla ei ole yhtään suosikkiviestiä. Lisää joitakin viestejä suosikeiksi nähdäksesi ne täällä!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Ladataan lisää viestejä", "move_topic": "Siirrä aihe", "move_topics": "Move Topics", diff --git a/public/language/fi/user.json b/public/language/fi/user.json index c7e1232c35..eff54da44b 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -22,7 +22,7 @@ "profile": "Profiili", "profile_views": "Profiilia katsottu", "reputation": "Maine", - "favourites": "Suosikit", + "favourites": "Bookmarks", "watched": "Seurattu", "followers": "Seuraajat", "following": "Seuratut", @@ -55,10 +55,11 @@ "password": "Salasana", "username_taken_workaround": "Pyytämäsi käyttäjänimi oli jo varattu, joten muutimme sitä hieman. Käyttäjänimesi on siis nyt %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Lataa kuva", "upload_a_picture": "Lataa kuva", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Asetukset", "show_email": "Näytä sähköpostiosoitteeni", "show_fullname": "Näytä koko nimeni", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index b372224e92..f8542c3dad 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -14,7 +14,7 @@ "invalid-password": "Mot de passe invalide", "invalid-username-or-password": "Veuillez entrer un nom d'utilisateur et un mot de passe", "invalid-search-term": "Données de recherche invalides", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Valeur de pagination invalide. Celle-ci doit être comprise entre %1 et %2.", "username-taken": "Nom d’utilisateur déjà utilisé", "email-taken": "Email déjà utilisé", "email-not-confirmed": "Votre adresse email n'est pas confirmée, cliquez ici pour la valider.", @@ -50,8 +50,8 @@ "still-uploading": "Veuillez patienter pendant le téléchargement.", "file-too-big": "La taille maximale autorisée pour un fichier est de %1 kb. Veuillez envoyer un fichier plus petit.", "guest-upload-disabled": "Le téléversement est désactivé pour les Invités.", - "already-favourited": "Vous avez déjà mis ce message en favoris", - "already-unfavourited": "Vous avez déjà retiré ce message des favoris", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Vous ne pouvez pas bannir les autres administrateurs !", "cant-remove-last-admin": "Vous seul êtes administrateur. Ajouter un autre utilisateur en tant qu'administrateur avant de vous en retirer.", "invalid-image-type": "Type d'image invalide. Les types autorisés sont: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Le message de Chat est trop long", "cant-edit-chat-message": "Vous n'avez pas l'autorisation de modifier ce message", "cant-remove-last-user": "Vous ne pouvez pas supprimer le dernier utilisateur", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Vous n'avez pas l'autorisation de supprimer ce message", "reputation-system-disabled": "Le système de réputation est désactivé", "downvoting-disabled": "Les votes négatifs ne sont pas autorisés", "not-enough-reputation-to-downvote": "Vous n'avez pas une réputation assez élevée pour noter négativement ce message", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Veuillez utiliser votre identifiant pour vous connecter", "invite-maximum-met": "Vous avez invité la quantité maximale de personnes (%1 de %2).", "no-session-found": "Pas de session de connexion trouvé!", - "not-in-room": "User not in room" + "not-in-room": "L'utilisateur n'est pas dans cette salle", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/fr/global.json b/public/language/fr/global.json index aaabd06939..19d556a037 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "posté dans %1 %2 par %3", "user_posted_ago": "%1 a posté %2", "guest_posted_ago": "Un invité a posté %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "dernière édition par %1", "norecentposts": "Aucun message récent", "norecenttopics": "Aucun sujet récent", "recentposts": "Messages récents", @@ -86,5 +86,9 @@ "delete_all": "Tout supprimer", "map": "Carte", "sessions": "Sessions de connexion", - "ip_address": "Adresse IP" + "ip_address": "Adresse IP", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 6ffb22ecfa..b7c0f03351 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Rejoindre le groupe", "membership.leave-group": "Quitter le groupe", "membership.reject": "Refuser", - "new-group.group_name": "Nom du groupe :" + "new-group.group_name": "Nom du groupe :", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index 02dbd67398..5a24d4c9eb 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 et %2 autres on voté pour votre message dans %3.", "moved_your_post": "%1 a déplacé votre message vers %2", "moved_your_topic": "%1 a déplacé %2.", - "favourited_your_post_in": "%1 a mis votre message en favoris dans %2.", - "favourited_your_post_in_dual": "%1 et %2 ont mis votre message dans %3 en favori.", - "favourited_your_post_in_multiple": "%1 et %2 autres on mis votre message en favori %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 a signalé un message dans %2.", "user_flagged_post_in_dual": "%1 et %2 ont signalé un message dans %3", "user_flagged_post_in_multiple": "%1 et %2 autres on signalé un message dans %3", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 5726e2d1cb..c3cdfe1f55 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -6,12 +6,12 @@ "popular-month": "Sujets populaires ce mois-ci", "popular-alltime": "Sujets populaires depuis toujours", "recent": "Sujets récents", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Messages signalés", "users/online": "Utilisateurs en ligne", "users/latest": "Derniers inscrits", "users/sort-posts": "Utilisateurs avec le plus de messages", "users/sort-reputation": "Utilisateurs avec la plus grande réputation", - "users/banned": "Banned Users", + "users/banned": "Utilisateurs bannis", "users/search": "Rechercher des utilisateurs", "notifications": "Notifications", "tags": "Mots-clés", @@ -33,12 +33,13 @@ "account/posts": "Messages postés par %1", "account/topics": "Sujets créés par %1", "account/groups": "Groupes auxquels appartient %1", - "account/favourites": "Messages favoris de %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Paramètres d'utilisateur", "account/watched": "Sujets surveillés par %1", "account/upvoted": "Messages pour lesquels %1 a voté", "account/downvoted": "Messages contre lesquels %1 a voté", "account/best": "Meilleurs messages postés par %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 est en maintenance. Veuillez revenir un peu plus tard.", "maintenance.messageIntro": "De plus, l'administrateur a laissé ce message:", "throttled.text": "%1 est actuellement indisponible en raison d'une charge excessive. Merci de réessayer plus tard." diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index 318acf7f65..16a0e0628d 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Veuillez vous enregistrer ou vous connecter afin de vous abonner à ce sujet.", "markAsUnreadForAll.success": "Sujet marqué comme non lu pour tout le monde.", "mark_unread": "Marquer comme non-lu", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Sujet marqué comme non lu.", "watch": "Surveiller", "unwatch": "Ne plus surveiller", "watch.title": "Être notifié des nouvelles réponses dans ce sujet", @@ -65,9 +65,9 @@ "disabled_categories_note": "Les catégories désactivées sont grisées", "confirm_move": "Déplacer", "confirm_fork": "Scinder", - "favourite": "Favori", - "favourites": "Favoris", - "favourites.has_no_favourites": "Vous n'avez aucun favori, mettez des messages en favoris pour les voir ici !", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Charger plus de messages", "move_topic": "Déplacer le sujet", "move_topics": "Déplacer des sujets", @@ -105,7 +105,7 @@ "stale.warning": "Le sujet auquel vous répondez est assez ancien. Ne voudriez-vous pas créer un nouveau sujet à la place et placer une référence vers celui-ci dans votre réponse ?", "stale.create": "Créer un nouveau sujet", "stale.reply_anyway": "Répondre à ce sujet quand même", - "link_back": "Re: [%1](%2)", + "link_back": "Re : [%1](%2)", "spam": "Spam", "offensive": "Offensif", "custom-flag-reason": "Entrez une raison pour laquelle vous signalez ce message" diff --git a/public/language/fr/user.json b/public/language/fr/user.json index f11322f2c9..1cb2e97861 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Vues", "reputation": "Réputation", - "favourites": "Favoris", + "favourites": "Bookmarks", "watched": "Suivis", "followers": "Abonnés", "following": "Abonnements", @@ -55,10 +55,11 @@ "password": "Mot de passe", "username_taken_workaround": "Le nom d'utilisateur désiré est déjà utilisé, nous l'avons donc légèrement modifié. Vous êtes maintenant connu comme %1", "password_same_as_username": "Votre mot de passe est identique à votre nom d'utilisateur. Veuillez en choisir un autre.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Envoyer l'image", "upload_a_picture": "Envoyer une image", "remove_uploaded_picture": "Supprimer l'image envoyée", - "image_spec": "Vous ne pouvez envoyer que des fichiers PNG, JPG ou BMP", + "upload_cover_picture": "Upload cover picture", "settings": "Paramètres", "show_email": "Afficher mon email", "show_fullname": "Afficher mon nom complet", diff --git a/public/language/fr/users.json b/public/language/fr/users.json index 9a19daf831..d70a54698e 100644 --- a/public/language/fr/users.json +++ b/public/language/fr/users.json @@ -16,5 +16,5 @@ "unread_topics": "Sujets Non-Lus", "categories": "Catégories", "tags": "Mots-clés", - "no-users-found": "No users found!" + "no-users-found": "Aucun utilisateur trouvé !" } \ No newline at end of file diff --git a/public/language/gl/error.json b/public/language/gl/error.json index f17f526582..480abe1f63 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -14,7 +14,7 @@ "invalid-password": "Contrasinal Inválido", "invalid-username-or-password": "Especifica ámbolos dous por favor, nome de usuario e contrasinal", "invalid-search-term": "Termo de búsqueda inválido", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Valor de paxinación incorreto, ten que estar entre %1 e %2", "username-taken": "Nome de usuario en uso", "email-taken": "Correo en uso", "email-not-confirmed": "O teu correo aínda non está confirmado, por favor pica aquí para confirmalo.", @@ -50,8 +50,8 @@ "still-uploading": "Por favor, agarda a que remate a subida.", "file-too-big": "O tamaño máximo permitido é %1 kB - por favor, sube un arquivo máis pequeno", "guest-upload-disabled": "As subidas están deshabilitadas para os convidados", - "already-favourited": "Marcache como favorita esta publicación", - "already-unfavourited": "Desmarcache como favorita esta publicación", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Non podes botar outros administradores!", "cant-remove-last-admin": "Eres o único administrador. Engade outros administradores antes de quitarte a ti mesmo como administrador.", "invalid-image-type": "Tipo de imaxe inválida. Tipos admitidos: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Mensaxe moi longa", "cant-edit-chat-message": "Non tes permitido editar esta mensaxe.", "cant-remove-last-user": "Non podes quitar o último usuario", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Non tes permitido borrar esta mensaxe.", "reputation-system-disabled": "O sistema de reputación está deshabilitado", "downvoting-disabled": "Os votos negativos están deshabilitados", "not-enough-reputation-to-downvote": "Non tes reputación dabonda para esta acción", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Por favor, usa o teu nome de usuario para conectarte", "invite-maximum-met": "Convidaches á cantidade máxima de persoas (%1 de %2).", "no-session-found": "Non se atopa ningún inicio de sesión!", - "not-in-room": "User not in room" + "not-in-room": "O usuario non se encontra nesta sala", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/gl/global.json b/public/language/gl/global.json index ccb30d5d1f..6ff44536a7 100644 --- a/public/language/gl/global.json +++ b/public/language/gl/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "Publicado en %1 %2 por %3", "user_posted_ago": "%1 publicado %2", "guest_posted_ago": "Invitado publicou %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "última edición por %1", "norecentposts": "Non hai mensaxes recentes", "norecenttopics": "Non hai temas recentes", "recentposts": "Mensaxes recentes", @@ -86,5 +86,9 @@ "delete_all": "Borrar todo", "map": "Mapa", "sessions": "Inicios de sesión", - "ip_address": "Enderezo IP" + "ip_address": "Enderezo IP", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/gl/groups.json b/public/language/gl/groups.json index cf974c1089..f32273ce32 100644 --- a/public/language/gl/groups.json +++ b/public/language/gl/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Unirse ao grupo", "membership.leave-group": "Marchar do grupo", "membership.reject": "Rexeitar", - "new-group.group_name": "Nome do grupo:" + "new-group.group_name": "Nome do grupo:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 4bc6bcc706..34829191b3 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 e %2 máis votaron positivamente a túa mensaxe en %3.", "moved_your_post": "%1 moveu a túa publicación a%2", "moved_your_topic": "%1 foi movido %2", - "favourited_your_post_in": "%1 marcou favorita a túa publicación en %2.", - "favourited_your_post_in_dual": "%1 y %2 marcaron como favorita a túa mensaxe en %3.", - "favourited_your_post_in_multiple": "%1 e outras %2 persoas marcaron como favorita a túa mensaxe en %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 reportou unha mensaxe en %2", "user_flagged_post_in_dual": "%1 e %2 reportaron a túa mensaxe en %3", "user_flagged_post_in_multiple": "%1 e outras %2 persoas reportaron unha mensaxe en %3", diff --git a/public/language/gl/pages.json b/public/language/gl/pages.json index d9ac21ded1..b0a97d55cd 100644 --- a/public/language/gl/pages.json +++ b/public/language/gl/pages.json @@ -6,12 +6,12 @@ "popular-month": "Temas populares do mes", "popular-alltime": "Temas populares de tódolos tempos", "recent": "Temas recentes", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Publicacions Marcadas.", "users/online": "Usuarios conectados", "users/latest": "Últimos usuarios", "users/sort-posts": "Usuarios con máis temas", "users/sort-reputation": "Usuarios máis reputados", - "users/banned": "Banned Users", + "users/banned": "Usuarios Expulsados", "users/search": "Búsqueda de usuarios", "notifications": "Notificacións", "tags": "Etiquetas", @@ -33,12 +33,13 @@ "account/posts": "Publicación de %1", "account/topics": "Temas de %1", "account/groups": "%1's Grupos", - "account/favourites": "%1's Publicacións Favoritas", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Opcións de Usuario", "account/watched": "Temas vistos por %1", "account/upvoted": "Mensaxes votadas positivamente por %1", "account/downvoted": "Mensaxes votadas negativamente por %1", "account/best": "Mellores mensaxes escritas por %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 está baixo mantemento. Por favor, volve máis tarde.", "maintenance.messageIntro": "A máis, o administrador deixou esta mensaxe: ", "throttled.text": "&1 non está dispoñible debido a unha carga excesiva. Por favor, volva noutro momento" diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index 2994d605d8..e892d34146 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Por favor, identifícate para subscribirte a este tema.", "markAsUnreadForAll.success": "Publicación marcada como non lida para todos.", "mark_unread": "Marcar coma non lido", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Tema marcado como non lido", "watch": "Vixiar", "unwatch": "Deixar de vixiar", "watch.title": "Serás notificado canto haxa novas respostas neste tema", @@ -65,9 +65,9 @@ "disabled_categories_note": "As categorías deshabilitadas están en gris", "confirm_move": "Mover", "confirm_fork": "Dividir", - "favourite": "Favorito", - "favourites": "Favoritos", - "favourites.has_no_favourites": "Non tes favoritos. Podes engadir algún e velos aquí despois!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Cargando máis publicacións", "move_topic": "Mover Tema", "move_topics": "Mover Temas", diff --git a/public/language/gl/user.json b/public/language/gl/user.json index c5ffff6012..003f8ed360 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -22,7 +22,7 @@ "profile": "Perfil", "profile_views": "Visitas ao perfil:", "reputation": "Reputación", - "favourites": "Favoritos", + "favourites": "Bookmarks", "watched": "Visto", "followers": "Seguidores", "following": "Seguindo", @@ -55,10 +55,11 @@ "password": "Contrasinal", "username_taken_workaround": "Ese nome de usuario xa estaba collido, así que o modificamos lixeiramente. Agora o teu nome é %1 ", "password_same_as_username": "O teu contrasinal e o teu nome de usuario son os mesmos, por favor, escolle outro contrasinal.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Subir foto", "upload_a_picture": "Subir unha foto", "remove_uploaded_picture": "Borrar unha foto subida", - "image_spec": "Só podes subir imaxes en formato PNG, JPG ou BMP", + "upload_cover_picture": "Upload cover picture", "settings": "Opcións", "show_email": "Amosa-lo meu Email", "show_fullname": "Amosa-lo meu Nome Completo", diff --git a/public/language/gl/users.json b/public/language/gl/users.json index 0162c1c350..625c85f741 100644 --- a/public/language/gl/users.json +++ b/public/language/gl/users.json @@ -16,5 +16,5 @@ "unread_topics": "Temas non lidos", "categories": "Categorías", "tags": "Etiquetas", - "no-users-found": "No users found!" + "no-users-found": "Non se atoparon usuarios!" } \ No newline at end of file diff --git a/public/language/he/error.json b/public/language/he/error.json index ff63886ec9..d4a969d21a 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -14,7 +14,7 @@ "invalid-password": "סיסמא שגויה", "invalid-username-or-password": "אנא הגדר שם משתמש וסיסמה", "invalid-search-term": "מילת חיפוש לא תקינה", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "ערך דף לא חוקי, חייב להיות לפחות %1 ולא מעל %2", "username-taken": "שם משתמש תפוס", "email-taken": "כתובת אימייל תפוסה", "email-not-confirmed": "כתובת המייל שלך עוד לא אושרה, לחץ כאן על-מנת לאשר את המייל שלך.", @@ -40,18 +40,18 @@ "content-too-short": "אנא הכנס פוסט ארוך יותר. פוסטים חייבים להכיל לפחות %1 תווים.", "content-too-long": "אנא הכנס פוסט קצר יותר. פוסטים חייבים להיות קצרים יותר מ-%1 תווים.", "title-too-short": "אנא הכנס כותרת ארוכה יותר. כותרות חייבות להכיל לפחות %1 תווים.", - "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", - "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", - "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", - "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)", - "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)", + "title-too-long": "אנא הכנס כותרת קצרה יותר. כותרות אינן יכולות להיות ארוכות מ-%1 תווים.", + "too-many-posts": "אתה יכול לפרסם פוסט רק פעם ב-%1 שניות - אנא המתן לפני פרסום שוב", + "too-many-posts-newbie": "כמשתמש חדש, אתה יכול לפרסם פוסט רק פעם ב-%1 שניות עד שיהיו לך %2 נקודות מוניטין - אנא המתן לפני פרסום שוב", + "tag-too-short": "אנא הכנס תגית ארוכה יותר. תגיות חייבות להכיל לפחות %1 תווים", + "tag-too-long": "אנא הכנס תגית קצרה יותר. תגיות אינן יכולות להיות ארוכות יותר מ-%1 תווים", + "not-enough-tags": "אין מספיק תגיות. לנושא חייב להיות לפחות %1 תגיות", + "too-many-tags": "יותר מדי תגיות. לנושאים לא יכולים להיות יותר מ-%1 תגיות", "still-uploading": "אנא המתן לסיום ההעלאות", - "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", + "file-too-big": "הגודל המקסימלי של הקובץ הוא %1 קילובייט - אנא העלה קובץ קטן יותר", "guest-upload-disabled": "העלאת אורחים אינה מאופשרת", - "already-favourited": "כבר הוספת פוסט זה למועדפים", - "already-unfavourited": "כבר הסרת פוסט זה מהמועדפים", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "אינך יכול לחסום מנהלים אחרים!", "cant-remove-last-admin": "אתה המנהל היחיד. הוסף משתמש אחר לניהול לפני שאתה מוריד את עצמך מניהול", "invalid-image-type": "פורמט תמונה לא תקין. הפורמטים המורשים הם: %1", @@ -64,16 +64,16 @@ "group-not-member": "לא חבר בקבוצה זו", "group-needs-owner": "קבוצה זו חייבת לפחות מנהל אחד", "group-already-invited": "משתמש זה כבר הוזמן", - "group-already-requested": "Your membership request has already been submitted", + "group-already-requested": "בקשת החברות שלך כבר נשלחה", "post-already-deleted": "פוסט זה כבר נמחק", "post-already-restored": "פוסט זה כבר שוחזר", "topic-already-deleted": "נושא זה כבר נמחק", "topic-already-restored": "נושא זה כבר שוחזר", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", + "cant-purge-main-post": "אתה לא יכול למחוק את הפוסט הראשי, אנא מחק את הנושא במקום", "topic-thumbnails-are-disabled": "תמונות ממוזערות לנושא אינן מאופשרות.", "invalid-file": "קובץ לא תקין", "uploads-are-disabled": "העלאת קבצים אינה מאופשרת", - "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", + "signature-too-long": "מצטערים, החתימה שלך לא יכולה להכיל יותר מ-%1 תווים.", "about-me-too-long": "מצטערים, דף האודות שלך לא יכול להיות ארוך מ-%1 תווים.", "cant-chat-with-yourself": "לא ניתן לעשות צ'אט עם עצמך!", "chat-restricted": "משתמש זה חסם את הודעות הצ'אט שלו ממשתמשים זרים. המשתמש חייב לעקוב אחריך לפני שתוכל לשוחח איתו בצ'אט", @@ -83,7 +83,7 @@ "chat-message-too-long": "הודעת הצ'אט ארוכה מדי", "cant-edit-chat-message": "אתה לא רשאי לערוך הודעה זו", "cant-remove-last-user": "אינך יכול למחוק את המשתמש האחרון", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "אתה לא רשאי למחוק הודעה זו", "reputation-system-disabled": "מערכת המוניטין לא פעילה.", "downvoting-disabled": "היכולת להצביע נגד לא פעילה", "not-enough-reputation-to-downvote": "אין לך מספיק מוניטין כדי להוריד את הדירוג של פוסט זה", @@ -96,5 +96,6 @@ "wrong-login-type-username": "בבקשה השתמש בשם המשתמש שלך להתחברות", "invite-maximum-met": "הזמנת את הכמות המירבית של אנשים (%1 מתוך %2).", "no-session-found": "לא נמצאו סשני התחברות!", - "not-in-room": "User not in room" + "not-in-room": "משתמש זה לא בצ'אט", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/he/global.json b/public/language/he/global.json index f38444f7cc..b1ada66688 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "הפוסט הועלה ב %1 %2 על ידי %3", "user_posted_ago": "%1 העלה פוסט %2", "guest_posted_ago": "אורח העלה פוסט %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "נערך לאחרונה על ידי %1", "norecentposts": "אין פוסטים מהזמן האחרון", "norecenttopics": "אין נושאים מהזמן החרון", "recentposts": "פוסטים אחרונים", @@ -86,5 +86,9 @@ "delete_all": "מחק הכל", "map": "מפה", "sessions": "סשני התחברות", - "ip_address": "כתובת IP" + "ip_address": "כתובת IP", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/he/groups.json b/public/language/he/groups.json index 31788099a0..30ffe57467 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -25,7 +25,7 @@ "details.latest_posts": "פוסטים אחרונים", "details.private": "פרטי", "details.disableJoinRequests": "בטל בקשות הצטרפות", - "details.grant": "Grant/Rescind Ownership", + "details.grant": "הענק/בטל בעלות", "details.kick": "גרש", "details.owner_options": "ניהול הקבוצה", "details.group_name": "שם הקבוצה", @@ -39,7 +39,7 @@ "details.userTitleEnabled": "הצג סמל", "details.private_help": "אם מאופשר, הצטרפות לקבוצות דורשות אישור מבעל הקבוצה", "details.hidden": "מוסתר", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.hidden_help": "אם מאופשר, הקבוצה לא תופיע ברשימת הקבוצות, ומשתמשים יצטרכו להיות מוזמנים ידנית", "details.delete_group": "מחק קבוצה", "event.updated": "פרטי הקבוצה עודכנו", "event.deleted": "קבוצת \"%1\" נמחקה", @@ -48,5 +48,6 @@ "membership.join-group": "הצטרף לקבוצה", "membership.leave-group": "עזוב קבוצה", "membership.reject": "דחה", - "new-group.group_name": "שם קבוצה" + "new-group.group_name": "שם קבוצה", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/he/modules.json b/public/language/he/modules.json index bf5598adf7..87b52ee8a2 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -26,7 +26,7 @@ "composer.user_said": "%1 אמר:", "composer.discard": "האם למחוק פוסט זה?", "composer.submit_and_lock": "אשר ונעל", - "composer.toggle_dropdown": "Toggle Dropdown", + "composer.toggle_dropdown": "הדלק/כבה את התפריט הנפתח", "composer.uploading": "העלאה %1", "bootbox.ok": "בסדר", "bootbox.cancel": "בטל", diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index d60e3513d0..d6cddc6d7e 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -16,20 +16,20 @@ "upvoted_your_post_in_multiple": "%1 ו%2 אחרים הצביעו לפוסט שלך ב%3.", "moved_your_post": "%1 העביר את הפוסט שלך ל%2", "moved_your_topic": "%1 הוזז ל%2", - "favourited_your_post_in": "%1 הוסיף את הפוסט שלך ב %2 למועדפים שלו.", - "favourited_your_post_in_dual": "%1 ו%2 הוסיפו את הפוסט שלך למועדפים ב%3.", - "favourited_your_post_in_multiple": "%1 ו%2 אחרים הוסיפו את הפוסט שלך למועדפים שלהם ב%3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 דיווח על פוסט ב %2", "user_flagged_post_in_dual": "%1 ו%2 סימנו פוסט ב%3", "user_flagged_post_in_multiple": "%1 ו%2 נוספים סימנו פוסט ב%3", "user_posted_to": "%1 פרסם תגובה ל: %2", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", + "user_posted_to_dual": "%1 ו%2 הגיבו ל: %3", + "user_posted_to_multiple": "%1 ו%2 אחרים הגיבו ל: %3", "user_posted_topic": "%1 העלה נושא חדש: %2", "user_started_following_you": "%1 התחיל לעקוב אחריך.", - "user_started_following_you_dual": "%1 and %2 started following you.", - "user_started_following_you_multiple": "%1 and %2 others started following you.", - "new_register": "%1 sent a registration request.", + "user_started_following_you_dual": "%1 ו%1 התחילו לעקוב אחריך.", + "user_started_following_you_multiple": "%1 ו%2 התחילו לעקוב אחריך.", + "new_register": "%1 שלח בקשת הרשמה.", "email-confirmed": "כתובת המייל אושרה", "email-confirmed-message": "תודה שאישרת את כתובת המייל שלך. החשבון שלך פעיל כעת.", "email-confirm-error-message": "אירעה שגיאה בעת אישור המייל שלך. ייתכן כי הקוד היה שגוי או פג תוקף.", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index 8344a86f2f..de5b360411 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -6,12 +6,12 @@ "popular-month": "נושאים חמים החודש", "popular-alltime": "הנושאים החמים בכל הזמנים", "recent": "נושאים אחרונים", - "flagged-posts": "Flagged Posts", + "flagged-posts": "פוסטים מסומנים", "users/online": "משתמשים מחוברים", "users/latest": "משתמשים אחרונים", "users/sort-posts": "משתמשים עם המונה הגבוה ביותר", "users/sort-reputation": "משתמשים עם המוניטין הגבוה ביותר", - "users/banned": "Banned Users", + "users/banned": "משתמשים מורחקים", "users/search": "חיפוש משתמשים", "notifications": "התראות", "tags": "תגיות", @@ -33,12 +33,13 @@ "account/posts": "הודעות שפורסמו על ידי %1", "account/topics": "נושאים שנוצרו על ידי %1", "account/groups": "הקבוצות של %1", - "account/favourites": "הנושאים האהובים על %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "הגדרות משתמש", "account/watched": "נושאים שנצפו על ידי %1", "account/upvoted": "פוסטים שהוצבעו לטובה על ידי %1", "account/downvoted": "פוסטים שהוצבעו לרעה על ידי %1", "account/best": "הפוסטים הטובים ביותר שנוצרו על ידי %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 כרגע תחת עבודות תחזוקה. אנא חזור בזמן מאוחר יותר.", "maintenance.messageIntro": "בנוסף, המנהל השאיר את ההודעה הזו:", "throttled.text": "%1 לא זמן כעת עקב טעינת יתר. אנא חזור מאוחר יותר." diff --git a/public/language/he/topic.json b/public/language/he/topic.json index f68e532e56..84200d1908 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "אנא הרשם או התחבר על-מנת לעקוב אחר נושא זה.", "markAsUnreadForAll.success": "נושא זה סומן כלא נקרא לכולם.", "mark_unread": "סמן כלא נקרא", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "הנושא סומן כלא נקרא.", "watch": "עקוב", "unwatch": "הפסק לעקוב", "watch.title": "קבל התראה כאשר יש תגובות חדשות בנושא זה", @@ -65,9 +65,9 @@ "disabled_categories_note": "קטגוריות מבוטלות צבועות באפור", "confirm_move": "הזז", "confirm_fork": "שכפל", - "favourite": "מועדף", - "favourites": "מועדפים", - "favourites.has_no_favourites": "אין לך כרגע פוסטים מועדפים, סמן מספר פוסטים כמועדפים על מנת לראות אותם כאן!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "טוען פוסטים נוספים", "move_topic": "הזז נושא", "move_topics": "הזז נושאים", @@ -105,7 +105,7 @@ "stale.warning": "הנושא בו אתה מגיב הוא דיי ישן. האם ברצונך לפתוח נושא חדש, ולהזכיר את הנושא הזה בתגובתך?", "stale.create": "צור נושא חדש", "stale.reply_anyway": "הגב לנושא זה בכל מקרה", - "link_back": "Re: [%1](%2)", + "link_back": "תגובה: [%1](%2)", "spam": "ספאם", "offensive": "פוגעני", "custom-flag-reason": "הכנס סיבה מסמנת" diff --git a/public/language/he/user.json b/public/language/he/user.json index f63645e7fb..ea8a1aaffd 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -22,7 +22,7 @@ "profile": "פרופיל", "profile_views": "צפיות בפרופיל", "reputation": "מוניטין", - "favourites": "מועדפים", + "favourites": "Bookmarks", "watched": "נצפה", "followers": "עוקבים", "following": "עוקב אחרי", @@ -55,10 +55,11 @@ "password": "סיסמה", "username_taken_workaround": "שם המשתמש שבחרת כבר תפוס, אז שינינו אותו מעט. שם המשתמש שלך כעת הוא %1", "password_same_as_username": "הסיסמה שלך זהה לשם המשתמש, אנא בחר סיסמה שונה.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "העלה תמונה", "upload_a_picture": "העלה תמונה", "remove_uploaded_picture": "מחק את התמונה שהועלתה", - "image_spec": "עלייך להעלות רק תמונות מפורמט PNG, JPG או BMP", + "upload_cover_picture": "Upload cover picture", "settings": "הגדרות", "show_email": "פרסם את כתובת האימייל שלי", "show_fullname": "הצג את שמי המלא", @@ -71,7 +72,7 @@ "digest_monthly": "חודשי", "send_chat_notifications": "שלח לי הודעה למייל כאשר הודעת צ'אט נשלחה אלי בזמן שאיני מחובר", "send_post_notifications": "שלח לי הודעה למייל כאשר תגובות חדשות פורסמו לנושאים שאני עוקב אחריהם", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "כמה שינויים בהגדרות דורשים ריענון לדף. לחץ כאן כדי לרענן את הדף.", "has_no_follower": "למשתמש זה אין עוקבים :(", "follows_no_one": "משתמש זה אינו עוקב אחרי אחרים :(", "has_no_posts": "המשתמש טרם יצר פוסטים כלשהם.", @@ -82,14 +83,14 @@ "has_no_voted_posts": "למשתמש אין פוסטים שהוצבעו", "email_hidden": "כתובת אימייל מוסתרת", "hidden": "מוסתר", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "הצג נושאים ופוסטים כדפים במקום כרשימת גלילה אין-סופית", "topics_per_page": "כמות נושאים בעמוד", "posts_per_page": "כמות פוסטים בעמוד", "notification_sounds": "נגן סאונד כשמתקבלת התראה", "browsing": "הגדרות צפייה", "open_links_in_new_tab": "פתח קישורים חיצוניים בכרטיסייה חדשה", "enable_topic_searching": "הפעל חיפוש בתוך נושא", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", + "topic_search_help": "אם מאופשר, החיפוש בתוך הנושא יעקוף את שיטת החיפוש של הדפדפן, ויאפשר לך לחפש בכל הנושא - ולא רק במה שמוצג על המסך", "follow_topics_you_reply_to": "עקוב אחרת נושאים שהגבת בהם", "follow_topics_you_create": "עקוב אחר נושאים שיצרת", "grouptitle": "בחר את כותרת הקבוצה שברצונך להציג", @@ -98,9 +99,9 @@ "select-homepage": "בחר דף בית", "homepage": "דף הבית", "homepage_description": "בחר דף שיהיה דף הבית של הפורום או \"כלום\" על מנת להשתמש בדף הבית ברירת המחדל.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", + "custom_route": "נתיב דף הבית המותאם-אישית", + "custom_route_help": "הכנס שם נתיב כאן, ללא לוכסן לפני (לדוגמא \"אחרונים\", או \"פופולארי\")", + "sso.title": "שירות יחיד להתחברות", "sso.associated": "משוייך עם", "sso.not-associated": "לחץ כאן כדי לשייך" } \ No newline at end of file diff --git a/public/language/he/users.json b/public/language/he/users.json index 30c141ca8e..7bbdc26e0b 100644 --- a/public/language/he/users.json +++ b/public/language/he/users.json @@ -16,5 +16,5 @@ "unread_topics": "נושאים שלא נקראו", "categories": "קטגוריות", "tags": "תגיות", - "no-users-found": "No users found!" + "no-users-found": "לא נמצאו משתמשים!" } \ No newline at end of file diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 48bc10ed16..156b9806a5 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -50,8 +50,8 @@ "still-uploading": "Kérlek várj, amíg a feltöltés befejeződik.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Már bejelölted Kedvencnek ezt a hozzászólást", - "already-unfavourited": "Már kivetted a Kedvenceid közül ezt a hozzászólást", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Nem tilthatsz ki másik adminisztrátort!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Érvénytelen a kép típusa. Engedett kiterjesztések: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Kérlek a felhasználónevedet használd a belépéshez", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/hu/global.json b/public/language/hu/global.json index ef85232149..63ad09e507 100644 --- a/public/language/hu/global.json +++ b/public/language/hu/global.json @@ -86,5 +86,9 @@ "delete_all": "Összes törlése", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json index d62227498f..9b6032c023 100644 --- a/public/language/hu/groups.json +++ b/public/language/hu/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index a9c8917764..33f71e2c35 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index 8bb9535fac..c67ccb5355 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 jelenleg karbantartás alatt van. Kérlek nézz vissza késöbb!", "maintenance.messageIntro": "Ezenkívúl, az adminisztrátor ezt az üzenetet hagyta:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 504121693a..189f065bde 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Kikapcsolt kategóriák kiszürkülve", "confirm_move": "Áthelyezés", "confirm_fork": "Szétszedés", - "favourite": "Kedvenc", - "favourites": "Kedvencek", - "favourites.has_no_favourites": "Nincs egyetlen kedvenc hozzászólásod sem, jelölj meg párat hogy itt láthasd őket!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Hozzászólások betöltése", "move_topic": "Topik áthelyezése", "move_topics": "Move Topics", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 7066698025..0322d8a95d 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Megtekintések", "reputation": "Hírnév", - "favourites": "Kedvencek", + "favourites": "Bookmarks", "watched": "Megfigyeli", "followers": "Követők", "following": "Követve", @@ -55,10 +55,11 @@ "password": "Jelszó", "username_taken_workaround": "A kívánt felhasználónév már foglalt, így változtatnunk kellett rajta egy kicsit. Mostantól %1 nicknév alatt vagy ismert.", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Kép feltöltése", "upload_a_picture": "Egy kép feltöltése", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Beállítások", "show_email": "E-mail címem mutatása", "show_fullname": "A teljes nevem mutatása", diff --git a/public/language/id/error.json b/public/language/id/error.json index 2d10453279..39415ab992 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -50,8 +50,8 @@ "still-uploading": "Tunggu proses upload sampai selesai", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Post ini sudah kamu favorit", - "already-unfavourited": "Postingan ini sudah kamu unfavorit", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Kamu tidak dapat ban admin lainnya!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/id/global.json b/public/language/id/global.json index 7b6b19afa8..c488a606a9 100644 --- a/public/language/id/global.json +++ b/public/language/id/global.json @@ -86,5 +86,9 @@ "delete_all": "Hapus Semua", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/id/groups.json b/public/language/id/groups.json index 19d5b3d393..750914dd01 100644 --- a/public/language/id/groups.json +++ b/public/language/id/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/id/notifications.json b/public/language/id/notifications.json index cf4e6165f6..aeb0f894a7 100644 --- a/public/language/id/notifications.json +++ b/public/language/id/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 telah memfavoritkan posting mu di %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 menandai sebuah posting di %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/id/pages.json b/public/language/id/pages.json index 3c791e897d..0ec372ded8 100644 --- a/public/language/id/pages.json +++ b/public/language/id/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 saat ini sedang dalam masa pemeliharaan. Silahkan kembali lain waktu.", "maintenance.messageIntro": "Tambahan, Administrator meninggalkan pesan ini:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/id/topic.json b/public/language/id/topic.json index 8040d55ae4..6ba52cacce 100644 --- a/public/language/id/topic.json +++ b/public/language/id/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Indikator Kategori yang Ditiadakan keabu-abuan", "confirm_move": "Pindah", "confirm_fork": "Cabangkan", - "favourite": "Favorit", - "favourites": "Beberapa Favorit", - "favourites.has_no_favourites": "Kamu tidak memiliki favorit, favoritkan beberapa posting untuk melihatnya di sini! ", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Memuat Lebih Banyak Posting", "move_topic": "Pindahkan Topik", "move_topics": "Pindahkan Beberapa Topik", diff --git a/public/language/id/user.json b/public/language/id/user.json index 0a478472f5..c02d4258b0 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Tampilan profil", "reputation": "Reputasi", - "favourites": "Favorit", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Pengikut", "following": "Mengikuti", @@ -55,10 +55,11 @@ "password": "Kata Sandi", "username_taken_workaround": "Nama pengguna yang kamu inginkan telah diambil, jadi kami merubahnya sedikit. Kamu saat ini dikenal sebagai %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Unggah gambar/foto", "upload_a_picture": "Unggah sebuah gambar/foto", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Pengaturan", "show_email": "Tampilkan Email Saya", "show_fullname": "Tampilkan Nama Lengkap Saya", diff --git a/public/language/it/error.json b/public/language/it/error.json index f498726867..d7be6f572b 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -50,8 +50,8 @@ "still-uploading": "Per favore attendere il completamento degli uploads.", "file-too-big": "La dimensione massima consentita è di %1 kB - si prega di caricare un file più piccolo", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Hai già inserito tra i preferiti questo post", - "already-unfavourited": "Hai già inserito tra i Non Preferiti questo post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Non puoi bannare altri amministratori!", "cant-remove-last-admin": "Sei l'unico Amministratore. Aggiungi un altro amministratore prima di rimuovere il tuo ruolo", "invalid-image-type": "Tipo dell'immagine non valido. I tipi permessi sono: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Per favore usa il tuo nome utente per accedere", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/it/global.json b/public/language/it/global.json index 722cad0af7..3e19f1688b 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -86,5 +86,9 @@ "delete_all": "Elimina Tutto", "map": "Mappa", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 4d03c957de..9130a2135d 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Entra nel Gruppo", "membership.leave-group": "Lascia il Gruppo", "membership.reject": "Rifiuta", - "new-group.group_name": "Nome Gruppo:" + "new-group.group_name": "Nome Gruppo:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 0980d7b430..3addf77765 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 ha messo nei favoriti il tuo post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 ha segnalato un post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index 836a6d5181..dd6de7ed92 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -33,12 +33,13 @@ "account/posts": "Post creati da %1", "account/topics": "Discussioni create da %1", "account/groups": "Gruppi di %1", - "account/favourites": "Post Favoriti da %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Impostazioni Utente", "account/watched": "Discussioni osservate da %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 è attualmente in manutenzione. Per favore ritorna più tardi.", "maintenance.messageIntro": "Inoltre, l'amministratore ha lasciato questo messaggio:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/it/topic.json b/public/language/it/topic.json index 0f7ab7fc1d..8bbcf4c4c2 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Le Categorie disabilitate sono in grigio", "confirm_move": "Sposta", "confirm_fork": "Dividi", - "favourite": "Preferito", - "favourites": "Preferiti", - "favourites.has_no_favourites": "Non hai ancun post preferito; aggiungi qualche post ai preferiti per vederli qui!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Caricamento altri post", "move_topic": "Sposta Discussione", "move_topics": "Sposta Discussioni", diff --git a/public/language/it/user.json b/public/language/it/user.json index ced2e232f1..a5f0447305 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -22,7 +22,7 @@ "profile": "Profilo", "profile_views": "Visite al profilo", "reputation": "Reputazione", - "favourites": "Favoriti", + "favourites": "Bookmarks", "watched": "Osservati", "followers": "Da chi è seguito", "following": "Chi segue", @@ -55,10 +55,11 @@ "password": "Password", "username_taken_workaround": "Il nome utente che hai richiesto era già stato utilizzato, quindi lo abbiamo modificato leggermente. Ora il tuo è %1", "password_same_as_username": "La tua password è uguale al tuo username, per piacere scegli un'altra password", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Carica foto", "upload_a_picture": "Carica una foto", "remove_uploaded_picture": "Elimina foto caricata", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Impostazioni", "show_email": "Mostra la mia Email", "show_fullname": "Vedi il Mio Nome Completo", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 0fd0029421..8ff2746da8 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -50,8 +50,8 @@ "still-uploading": "アップロードが完成するまでお待ちください。", "file-too-big": "%1kBより大きいサイズファイルが許されません-より小さいファイルをアップして下さい。", "guest-upload-disabled": "ゲストさんからのアップを無効にしています", - "already-favourited": "あなたはこの投稿をお気に入りにしました", - "already-unfavourited": "あなたはこの投稿をお気に入り解除しました", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "ほかの管理者を停止することはできません!", "cant-remove-last-admin": "あなたが唯一の管理者です。管理者としてあなた自身を削除する前に、管理者として別のユーザーを追加します。", "invalid-image-type": "無効なイメージタイプです。許可された種類は: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/ja/global.json b/public/language/ja/global.json index 97696d28b6..82cc2ea677 100644 --- a/public/language/ja/global.json +++ b/public/language/ja/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index a3793e5a72..0277cc5abb 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "拒否", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index 25cb5e89e6..9d0ca95f07 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index 63e409692c..717c66327e 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 746897fdeb..f24579e205 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "使用不可の板はグレーに表示されます。", "confirm_move": "移動", "confirm_fork": "フォーク", - "favourite": "お気に入り", - "favourites": "お気に入り", - "favourites.has_no_favourites": "お気に入りはまだありません!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "もっと見る", "move_topic": "スレッドを移動", "move_topics": "トピックを移動する", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 174930b30c..50da3ac31a 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -22,7 +22,7 @@ "profile": "プロフィール", "profile_views": "閲覧数", "reputation": "評価", - "favourites": "お気に入り", + "favourites": "Bookmarks", "watched": "Watched", "followers": "フォロワー", "following": "フォロー中", @@ -55,10 +55,11 @@ "password": "パスワード", "username_taken_workaround": "このユーザー名はすでに使用されています。いまのユーザー名は %1 です。", "password_same_as_username": "パスワードがユーザー名と同じですから、他のパスワードを使って下さい。", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "画像をアップロード", "upload_a_picture": "画像をアップロード", "remove_uploaded_picture": "アップした写真を取り消します", - "image_spec": "PNG、JPGとBMPのファイルしかアップできません", + "upload_cover_picture": "Upload cover picture", "settings": "設定", "show_email": "メールアドレスを表示", "show_fullname": "フルネームを示します", diff --git a/public/language/ko/email.json b/public/language/ko/email.json index 0474c36a09..ff07b4a927 100644 --- a/public/language/ko/email.json +++ b/public/language/ko/email.json @@ -21,9 +21,9 @@ "digest.cta": "%1에 방문하시려면 클릭하세요.", "digest.unsub.info": "이 대화는 사용자의 구독 설정에 따라 전송되었습니다.", "digest.no_topics": "%1 동안 활성화된 주제가 없습니다.", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "일", + "digest.week": "주", + "digest.month": "월", "notif.chat.subject": "%1님이 대화 메시지를 보냈습니다.", "notif.chat.cta": "대화를 계속하려면 여기를 클릭하세요.", "notif.chat.unsub.info": "이 대화 알림은 사용자의 구독 설정에 따라 전송되었습니다.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index cf908e8447..0bd26d9348 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -14,7 +14,7 @@ "invalid-password": "올바르지 않은 비밀번호입니다.", "invalid-username-or-password": "사용자 이름과 패스워드를 모두 설정해주세요.", "invalid-search-term": "올바르지 않은 검색어입니다.", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "올바르지 않은 값입니다. 최소 1%에서 최대 2%까지 설정해야 합니다.", "username-taken": "이미 사용 중인 사용자 이름입니다.", "email-taken": "이미 사용 중인 이메일입니다.", "email-not-confirmed": "아직 이메일이 인증되지 않았습니다. 여기를 누르면 인증 메일을 발송할 수 있습니다.", @@ -24,7 +24,7 @@ "confirm-email-already-sent": "인증 메일이 이미 발송되었습니다. %1 분 이후에 재 발송이 가능합니다.", "username-too-short": "사용자 이름이 너무 짧습니다.", "username-too-long": "사용자 이름이 너무 깁니다.", - "password-too-long": "Password too long", + "password-too-long": "패스워드가 너무 깁니다.", "user-banned": "차단된 사용자입니다.", "user-too-new": "죄송합니다, 첫 번째 게시물은 %1 초 후에 작성할 수 있습니다.", "no-category": "존재하지 않는 카테고리입니다.", @@ -50,8 +50,8 @@ "still-uploading": "업로드가 끝날 때까지 기다려주세요.", "file-too-big": "업로드 가능한 파일크기는 최대 %1 KB 입니다 - 파일의 용량을 줄이거나 압축을 활용하세요.", "guest-upload-disabled": "손님의 파일 업로드는 제한되어 있습니다.", - "already-favourited": "이미 이 게시물을 즐겨찾기 하셨습니다.", - "already-unfavourited": "이미 이 게시물의 즐겨찾기를 해제하셨습니다.", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "다른 관리자를 차단할 수 없습니다.", "cant-remove-last-admin": "귀하는 유일한 관리자입니다. 관리자를 그만두시기 전에 다른 사용자를 관리자로 선임하세요.", "invalid-image-type": "올바르지 않은 이미지입니다. 사용가능한 유형: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "메시지가 너무 깁니다.", "cant-edit-chat-message": "편집 할 수 있는 권한이 없습니다.", "cant-remove-last-user": "마지막 사용자를 삭제할 수 없습니다.", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "메세지를 지울 권한이 없습니다.", "reputation-system-disabled": "인지도 기능이 비활성 상태입니다.", "downvoting-disabled": "비추천 기능이 비활성 상태입니다.", "not-enough-reputation-to-downvote": "인지도가 낮아 이 게시물에 반대할 수 없습니다.", @@ -96,5 +96,6 @@ "wrong-login-type-username": "사용자명을 통해 로그인하세요.", "invite-maximum-met": "초대가능한 사용자를 모두 초대했습니다. (%2명 중 %1을 초대)", "no-session-found": "로그인 세션을 찾을 수 없습니다.", - "not-in-room": "User not in room" + "not-in-room": "없는 유저입니다.", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/ko/global.json b/public/language/ko/global.json index b112c196fd..4457d09311 100644 --- a/public/language/ko/global.json +++ b/public/language/ko/global.json @@ -3,8 +3,8 @@ "search": "검색", "buttons.close": "닫기", "403.title": "접근이 거부되었습니다.", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "접속할 수 없는 페이지에 접근하였습니다.", + "403.login": "로그인되어 있는지 확인해 주세요.", "404.title": "페이지를 찾을 수 없습니다.", "404.message": "존재하지 않는 페이지에 접근하였습니다. 홈 페이지로 이동합니다.", "500.title": "내부 오류가 발생했습니다.", @@ -49,7 +49,7 @@ "users": "사용자", "topics": "주제", "posts": "게시물", - "best": "Best", + "best": "베스트", "upvoted": "Upvoted", "downvoted": "Downvoted", "views": "조회 수", @@ -59,19 +59,19 @@ "posted_ago_by_guest": "익명 사용자가 %1에 작성했습니다.", "posted_ago_by": "%2님이 %1에 작성했습니다.", "posted_ago": "%1에 작성되었습니다.", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", + "posted_in": "%1에 작성되었습니다.", + "posted_in_by": "%2님이 %1에 작성했습니다.", "posted_in_ago": "%2 %1에 작성되었습니다. ", "posted_in_ago_by": "%3님이 %2 %1에 작성했습니다.", "user_posted_ago": "%1님이 %2에 작성했습니다.", "guest_posted_ago": "익명 사용자가 %1에 작성했습니다.", - "last_edited_by": "last edited by %1", + "last_edited_by": "%1님이 마지막으로 수정했습니다.", "norecentposts": "최근 작성된 게시물이 없습니다.", "norecenttopics": "최근 생성된 생성된 주제가 없습니다.", "recentposts": "최근 게시물", "recentips": "최근 로그인 IP", "away": "자리 비움", - "dnd": "Do not disturb", + "dnd": "방해 금지", "invisible": "오프라인으로 표시", "offline": "오프라인", "email": "이메일", @@ -81,10 +81,14 @@ "updated.title": "포럼이 업데이트 되었습니다.", "updated.message": "이 포럼은 지금 최신 버전으로 업데이트 되었습니다. 여기를 누르면 페이지를 새로고침합니다.", "privacy": "개인정보", - "follow": "Follow", - "unfollow": "Unfollow", - "delete_all": "Delete All", - "map": "Map", - "sessions": "Login Sessions", - "ip_address": "IP Address" + "follow": "팔로우", + "unfollow": "언팔로우", + "delete_all": "모두 삭제하기", + "map": "맵", + "sessions": "로그인 세션", + "ip_address": "아이피 주소", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index 3c521d70c7..bea6c7d39c 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -14,7 +14,7 @@ "invited.search": "그룹에 초대할 사용자를 검색하세요.", "invited.notification_title": "%1 그룹에 초대되었습니다.", "request.notification_title": "%1 님으로부터 그룹 구성원 요청이 들어왔습니다.", - "request.notification_text": "%1 has requested to become a member of %2", + "request.notification_text": "%1 님이 %2 의 멤버 가입을 신청했습니다.", "cover-save": "저장", "cover-saving": "저장 중", "details.title": "그룹 상세정보", @@ -24,8 +24,8 @@ "details.has_no_posts": "이 그룹의 구성원이 작성한 게시물이 없습니다.", "details.latest_posts": "최근 게시물", "details.private": "비공개", - "details.disableJoinRequests": "Disable join requests", - "details.grant": "Grant/Rescind Ownership", + "details.disableJoinRequests": "가입 신청 비활성화하기", + "details.grant": "소유권 이전/포기하기", "details.kick": "내보내기", "details.owner_options": "그룹 관리", "details.group_name": "그룹명", @@ -44,9 +44,10 @@ "event.updated": "그룹 정보가 업데이트 되었습니다.", "event.deleted": "%1 그룹이 삭제되었습니다.", "membership.accept-invitation": "초대 수락", - "membership.invitation-pending": "Invitation Pending", + "membership.invitation-pending": "보류중인 초대 수락", "membership.join-group": "그룹 들어가기", "membership.leave-group": "그룹 나가기", "membership.reject": "거절", - "new-group.group_name": "그룹명:" + "new-group.group_name": "그룹명:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index e9b92a7110..2a11ff7ae0 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -18,7 +18,7 @@ "chat.three_months": "3개월", "chat.delete_message_confirm": "이 대화를 삭제하시겠습니까?", "chat.roomname": "%1 대화방 ", - "chat.add-users-to-room": "Add users to room", + "chat.add-users-to-room": "유저 추가하기", "composer.compose": "작성", "composer.show_preview": "미리보기", "composer.hide_preview": "미리보기 숨김", @@ -26,7 +26,7 @@ "composer.user_said": "%1님의 말:", "composer.discard": "이 게시물을 지우겠습니까?", "composer.submit_and_lock": "잠금 상태로 작성 완료", - "composer.toggle_dropdown": "Toggle Dropdown", + "composer.toggle_dropdown": "내려서 확인하기", "composer.uploading": "%1 업로드 중", "bootbox.ok": "확인", "bootbox.cancel": "취소", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 67d76f1766..910681d2fb 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -5,7 +5,7 @@ "mark_all_read": "모든 알림을 읽음 상태로 변경", "back_to_home": "%1로 돌아가기", "outgoing_link": "외부 링크", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "%1 에서 나오셨습니다.", "continue_to": "%1 사이트로 이동", "return_to": "%1 사이트로 돌아가기", "new_notification": "새 알림", @@ -13,18 +13,18 @@ "new_message_from": "%1님이 메시지를 보냈습니다.", "upvoted_your_post_in": "%1님이 %2의 내 게시물을 추천했습니다.", "upvoted_your_post_in_dual": "%1님과 %2님이 %3의 내 게시물을 추천했습니다.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", + "upvoted_your_post_in_multiple": "%1 님과 다른 %2 명이 %3 안의 당신의 게시물을 upvote 했습니다.", "moved_your_post": "%1님이 귀하의 게시물을 %2로 옮겼습니다.", - "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1님이 %2의 내 게시물을 좋아합니다.", - "favourited_your_post_in_dual": "%1님과 %2님이 %3을 좋아합니다.", - "favourited_your_post_in_multiple": "%1님 외 %2명이 %3을 좋아합니다.", + "moved_your_topic": "%1%2 로 옮겨졌습니다.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1님이 %2의 게시물을 신고했습니다.", - "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", - "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", + "user_flagged_post_in_dual": "%1 님과 %2 님이 %3 안의 게시물에 플래그를 세웠습니다.", + "user_flagged_post_in_multiple": "%1 님과 %2 명의 다른 유저들이 %3 안의 게시물에 플래그를 세웠습니다.", "user_posted_to": "%1님이 %2에 답글을 작성했습니다.", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", + "user_posted_to_dual": "%1 님과 %2 님이 %3 에 답글을 달았습니다.", + "user_posted_to_multiple": "%1 님과 %2 명의 다른 유저들이 %3 에 답글을 달았습니다.", "user_posted_topic": "%1님이 새 주제를 작성했습니다: %2", "user_started_following_you": "%1님이 나를 팔로우합니다.", "user_started_following_you_dual": "%1님과 %2님이 당신을 팔로우 시작했습니다.", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index 2f9ceae518..242c610438 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -6,12 +6,12 @@ "popular-month": "인기있는 주제 (월간)", "popular-alltime": "인기있는 주제", "recent": "최근 주제", - "flagged-posts": "Flagged Posts", + "flagged-posts": "플래그된 게시물", "users/online": "온라인 사용자", "users/latest": "최근 사용자", "users/sort-posts": "가장 많은 게시물을 작성한 사용자", "users/sort-reputation": "가장 높은 인지도를 가진 사용자", - "users/banned": "Banned Users", + "users/banned": "차단된 유저", "users/search": "사용자 검색", "notifications": "알림", "tags": "태그", @@ -33,13 +33,14 @@ "account/posts": "%1 님이 작성한 게시물", "account/topics": "%1 님이 생성한 주제", "account/groups": "%1님의 그룹", - "account/favourites": "%1님이 좋아하는 게시물", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "사용자 설정", "account/watched": "%1님이 지켜보는 주제", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", + "account/upvoted": "%1 님이 upvote한 게시물", + "account/downvoted": "%1 님에 의해 Downvote된 게시물", + "account/best": "%1 님 최고의 게시물", + "confirm": "Email Confirmed", "maintenance.text": "%1 사이트는 현재 점검 중입니다. 나중에 다시 방문해주세요.", "maintenance.messageIntro": "다음은 관리자가 전하는 메시지입니다.", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "throttled.text": "과도한 부하로 %1 를 로드할 수 없습니다. 잠시후에 다시 시도해주세요." } \ No newline at end of file diff --git a/public/language/ko/search.json b/public/language/ko/search.json index 52dbc78711..611597011a 100644 --- a/public/language/ko/search.json +++ b/public/language/ko/search.json @@ -2,7 +2,7 @@ "results_matching": "\"%2\"와 일치하는 %1개의 결과를 찾았습니다 (검색시간: %3초)", "no-matches": "일치하는 결과가 없습니다.", "advanced-search": "고급 검색", - "in": "In", + "in": "안에서 검색", "titles": "제목", "titles-posts": "제목과 게시물", "posted-by": "다음 사용자에 의해 작성됨", @@ -10,10 +10,10 @@ "search-child-categories": "하위 카테고리를 검색", "reply-count": "답변 수", "at-least": "적어도", - "at-most": "At most", + "at-most": "최대", "post-time": "작성시간", - "newer-than": "Newer than", - "older-than": "Older than", + "newer-than": "이전", + "older-than": "이후", "any-date": "모든 시간", "yesterday": "어제", "one-week": "일 주", @@ -22,19 +22,19 @@ "three-months": "세 달", "six-months": "여섯 달", "one-year": "일 년", - "sort-by": "Sort by", - "last-reply-time": "Last reply time", - "topic-title": "Topic title", - "number-of-replies": "Number of replies", - "number-of-views": "Number of views", - "topic-start-date": "Topic start date", + "sort-by": "정렬", + "last-reply-time": "마지막으로 답글이 달린 시간", + "topic-title": "주제 제목", + "number-of-replies": "답글 수", + "number-of-views": "조회 수", + "topic-start-date": "주제가 게시된 날짜", "username": "사용자명", "category": "카테고리", "descending": "내림차순", "ascending": "오름차순", "save-preferences": "설정 저장", "clear-preferences": "설정 초기화", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "search-preferences-saved": "검색 설정이 저장되었습니다.", + "search-preferences-cleared": "검색 설정이 초기화되었습니다.", + "show-results-as": "검색결과 정렬 - " } \ No newline at end of file diff --git a/public/language/ko/tags.json b/public/language/ko/tags.json index 8e1011bd29..d088ef7041 100644 --- a/public/language/ko/tags.json +++ b/public/language/ko/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "이 태그에 해당하는 주제가 없습니다.", "tags": "태그", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "%1 와 %2 글자 안에서 태그를 입력하세요.", "enter_tags_here_short": "태그 입력...", "no_tags": "아직 아무런 태그도 없습니다." } \ No newline at end of file diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index a4110c5839..59b1ae0e47 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -26,7 +26,7 @@ "tools": "도구", "flag": "신고", "locked": "잠김", - "bookmark_instructions": "Click here to return to the last unread post in this thread.", + "bookmark_instructions": "여기를 누르면 마지막으로 읽지 않은 포스트로 이동합니다.", "flag_title": "이 게시물을 신고", "flag_success": "이 게시물은 신고되었습니다.", "deleted_message": "이 주제는 삭제되었습니다. 주제 관리 권한이 있는 사용자만 볼 수 있습니다.", @@ -35,7 +35,7 @@ "login_to_subscribe": "이 주제의 알림을 받기 위해서는 로그인해야 합니다.", "markAsUnreadForAll.success": "모든 사용자에 대해 읽지 않음으로 표시했습니다.", "mark_unread": "읽지 않음으로 표시", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "성공적으로 읽지 않음으로 표시했습니다.", "watch": "관심 주제", "unwatch": "관심 주제 해제", "watch.title": "이 주제의 새 답글 알리기", @@ -51,7 +51,7 @@ "thread_tools.move_all": "모두 이동", "thread_tools.fork": "주제 분리", "thread_tools.delete": "삭제", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "게시물 삭제", "thread_tools.delete_confirm": "이 주제를 삭제하시겠습니까?", "thread_tools.restore": "복원", "thread_tools.restore_confirm": "이 주제를 복원하시겠습니까?", @@ -65,9 +65,9 @@ "disabled_categories_note": "비활성화된 카테고리는 회색으로 표시됩니다.", "confirm_move": "이동", "confirm_fork": "분리", - "favourite": "좋아요", - "favourites": "좋아요", - "favourites.has_no_favourites": "좋아하는 게시물이 없습니다.", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "게시물을 로딩 중", "move_topic": "주제 이동", "move_topics": "주제 이동", @@ -78,9 +78,9 @@ "fork_topic_instruction": "분리할 게시물을 선택하세요.", "fork_no_pids": "게시물이 선택되지 않았습니다.", "fork_success": "주제가 분리되었습니다! 분리된 주제를 보려면 여기를 클릭하세요.", - "delete_posts_instruction": "Click the posts you want to delete/purge", + "delete_posts_instruction": "삭제할 게시물을 선택하세요.", "composer.title_placeholder": "여기에 제목을 입력하세요.", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "이름", "composer.discard": "취소", "composer.submit": "등록", "composer.replying_to": "'%1'에 대한 답글", @@ -100,12 +100,12 @@ "oldest_to_newest": "오래된 순으로 정렬", "newest_to_oldest": "최신 순으로 정렬", "most_votes": "추천수 순으로 정렬", - "most_posts": "Most posts", - "stale.title": "Create new topic instead?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", + "most_posts": "포스트 많은 순으로 정렬", + "stale.title": "새로 주제를 생성하시겠습니까?", + "stale.warning": "현재 답글을 작성중인 주제가 꽤 오래되었습니다. 새로 주제를 생성하시고 이글을 인용하시겠습니까?", "stale.create": "새로운 주제를 작성", "stale.reply_anyway": "아무튼 이 주제에 답변해주세요.", - "link_back": "Re: [%1](%2)", + "link_back": "답글: [%1](%2)", "spam": "스팸", "offensive": "공격적인", "custom-flag-reason": "신고 사유를 입력하세요." diff --git a/public/language/ko/user.json b/public/language/ko/user.json index ea5c2d9c82..592af0f1ce 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -22,8 +22,8 @@ "profile": "프로필", "profile_views": "프로필 조회 수", "reputation": "인기도", - "favourites": "좋아요", - "watched": "Watched", + "favourites": "Bookmarks", + "watched": "읽음", "followers": "이 사용자를 팔로우", "following": "이 사용자가 팔로우", "aboutme": "나를 소개", @@ -55,10 +55,11 @@ "password": "패스워드", "username_taken_workaround": "새 사용자 이름이 이미 존재하여 %1로 저장되었습니다.", "password_same_as_username": "패스워드가 사용자명과 동일합니다. 다시 입력하세요.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "사진 업로드", "upload_a_picture": "사진 업로드", "remove_uploaded_picture": "등록된 사진을 삭제", - "image_spec": "PNG, JPG 또는 BMP 파일만 업로드 가능합니다.", + "upload_cover_picture": "Upload cover picture", "settings": "설정", "show_email": "이메일 공개", "show_fullname": "실명 공개", @@ -70,37 +71,37 @@ "digest_weekly": "매주", "digest_monthly": "매월", "send_chat_notifications": "오프라인일 때 채팅 메시지가 도착하면 알림 메일을 보냅니다.", - "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "send_post_notifications": "내가 구독한 주제에 답글이 달리면 메일 보내기.", + "settings-require-reload": "일부 설정 변경은 리로딩이 필요합니다. 여기를 눌러서 페이지를 리로딩 해주세요.", "has_no_follower": "아무도 이 사용자를 팔로우하지 않습니다.", "follows_no_one": "이 사용자는 아무도 팔로우하지 않습니다.", "has_no_posts": "이 사용자가 생성한 게시물이 없습니다.", "has_no_topics": "이 사용자가 생성한 주제가 없습니다.", - "has_no_watched_topics": "This user hasn't watched any topics yet.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_watched_topics": "이 유저가 관심 목록에 추가한 주제가 없습니다.", + "has_no_upvoted_posts": "이 유저가 upvote한 게시물이 없습니다.", + "has_no_downvoted_posts": "이 유저가 downvote한 게시물이 없습니다.", + "has_no_voted_posts": "이 유저가 vote한 게시물이 없습니다.", "email_hidden": "이메일 비공개", "hidden": "비공개", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "주제와 게시물을 무한 스크롤 대신 페이지뷰로 보기", "topics_per_page": "페이지 당 주제 수", "posts_per_page": "페이지 당 게시물 수", "notification_sounds": "알림 수신시 소리로 알려주기", "browsing": "페이지 열기", "open_links_in_new_tab": "외부 링크를 새로운 탭을 사용하여 열람", "enable_topic_searching": "주제 내 검색 허용", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", - "grouptitle": "Select the group title you would like to display", - "no-group-title": "No group title", + "topic_search_help": "활성화 된후 브라우저의 기본 페이지 검색 기능을 연관 주제 검색 기능으로 대신하고 화면에 보여지는 것 뿐만 아니라 주제와 연관된 모든것을 검색합니다.", + "follow_topics_you_reply_to": "답글 단 게시물을 팔로우 합니다.", + "follow_topics_you_create": "생성한 주제를 팔로우 합니다.", + "grouptitle": "표시할 그룹 이름을 선택하세요.", + "no-group-title": "그룹 이름이 없습니다.", "select-skin": "스킨 선택", "select-homepage": "홈페이지 선택", "homepage": "홈페이지", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", + "homepage_description": "포럼 홈페이지로 사용할 페이지를 선택하거나 'None'으로 설정하여 기본 홈페이지를 사용합니다.", "custom_route": "홈페이지 수동 경로", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", - "sso.not-associated": "Click here to associate with" + "custom_route_help": "라우팅 이름을 앞쪽 '/' 없이 입력해주세요 (예: \"최근 목록\", \"인기 게시물\")", + "sso.title": "통합 인증 서비스", + "sso.associated": "연관짓기 - ", + "sso.not-associated": "이 곳을 클리하여 연관지으세요." } \ No newline at end of file diff --git a/public/language/ko/users.json b/public/language/ko/users.json index 4436acc08d..a3ba794ca2 100644 --- a/public/language/ko/users.json +++ b/public/language/ko/users.json @@ -16,5 +16,5 @@ "unread_topics": "읽지 않은 주제", "categories": "카테고리", "tags": "태그", - "no-users-found": "No users found!" + "no-users-found": "유저를 찾을 수 없습니다!" } \ No newline at end of file diff --git a/public/language/lt/error.json b/public/language/lt/error.json index b124eff563..c587a40803 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -50,8 +50,8 @@ "still-uploading": "Prašome palaukti kol bus baigti visi kėlimai į serverį", "file-too-big": "Didžiausias įkelimo dydis yra %1 kB - prašome kelti mažesni failą", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Jums jau patinka šis pranešimas", - "already-unfavourited": "Jums jau nebepatinka šis pranešimas", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Jūs negalite užblokuoti kitų administratorių!", "cant-remove-last-admin": "Jūs esate vienintelis administratorius. Pridėkite kitą vartotoja kaip administratorių prieš pašalindamas save", "invalid-image-type": "Neteisingas vaizdo tipas. Leidžiami tipai :%1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Prisijungimui prašome naudoti vartotojo vardą", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/lt/global.json b/public/language/lt/global.json index aca3f94cfe..5ecfc4b4ab 100644 --- a/public/language/lt/global.json +++ b/public/language/lt/global.json @@ -86,5 +86,9 @@ "delete_all": "Viską ištrinti", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index 5c34f449e8..982d48e853 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Prisijungti Prie Grupės", "membership.leave-group": "Palikti Grupę", "membership.reject": "Atšaukti", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 16f475d739..079591f953 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 patinka jūsų pranešimas čia %2", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1pagrįso nuomone čia %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index 7e87980eb1..9eb817a26c 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 dabar atnaujinimo darbuose. Prašome grįžti vėliau", "maintenance.messageIntro": "Be to, administratorius paliko šį pranešimą:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 2972a90118..a12bdd4c4e 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Neaktyvios kategorijos pažymėtos pilkai", "confirm_move": "Perkelti", "confirm_fork": "Išskaidyti", - "favourite": "Mėgsta", - "favourites": "Mėgstamiausi", - "favourites.has_no_favourites": "Neturite jokių mėgiamų pranešimų. Įtraukite pranešimą į mėgiamų sąrašą, kad pamatytumėte juos čia!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Įkeliama daugiau įrašų", "move_topic": "Perkelti temą", "move_topics": "Perkelti temas", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 6c139be63f..9f4884f53b 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -22,7 +22,7 @@ "profile": "Profilis", "profile_views": "Profilio peržiūros", "reputation": "Reputacija", - "favourites": "Mėgstamiausi", + "favourites": "Bookmarks", "watched": "Peržiūrėjo", "followers": "Sekėjai", "following": "Seka", @@ -55,10 +55,11 @@ "password": "Slaptažodis", "username_taken_workaround": "Jūsų norimas vartotojo vardas jau užimtas, todėl mes jį šiek tiek pakeitėme. Dabar jūs esate žinomas kaip %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Įkelti paveikslėlį", "upload_a_picture": "Įkelti paveikslėlį", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Nustatymai", "show_email": "Rodyti mano el. paštą viešai", "show_fullname": "Rodyti mano vardą ir pavardę", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 176782b812..13c72ed7de 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -50,8 +50,8 @@ "still-uploading": "Sila tunggu muatnaik untuk siap.", "file-too-big": "Maksimum saiz fail yang dibenarkan ialah %1 kB - sila muatnaik fail yang lebih kecil", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Anda telah pun menggemari kiriman ini", - "already-unfavourited": "Anda telah pun nyah-gemar kiriman ini", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Anda tidak boleh haramkan admin / pentadbir!", "cant-remove-last-admin": "Anda satu-satunya pentadbir. Tambah pentadbir lain sebelum membuang diri anda sebagai pentadbir", "invalid-image-type": "Jenis imej tak sah. Jenis yang dibenarkan ialah: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Sila guna nama pengguna anda untuk log masuk", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/ms/global.json b/public/language/ms/global.json index 866e0f17f2..4e71e55dfa 100644 --- a/public/language/ms/global.json +++ b/public/language/ms/global.json @@ -86,5 +86,9 @@ "delete_all": "Padam Semua", "map": "Peta", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index 876b702f74..6ddfd1c2a2 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Masuk Kumpulan", "membership.leave-group": "Keluar Kumpulan", "membership.reject": "Tolak", - "new-group.group_name": "Nama Kumpulan:" + "new-group.group_name": "Nama Kumpulan:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index e0900929f0..2700d7d248 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 dan %2 lagi telah menambah undi pada kiriman anda di %3. ", "moved_your_post": "%1 telah memindahkan kiriman anda ke %2", "moved_your_topic": "%1 telah memindahkan %2", - "favourited_your_post_in": "%1 menggemari kiriman and di %2.", - "favourited_your_post_in_dual": "%1 dan %2 telah menggemari kiriman anda di %3.", - "favourited_your_post_in_multiple": "%1, %2 dan lain-lain telah menggemari kirimian anda pada %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 menanda kiriman anda di %2", "user_flagged_post_in_dual": "%1 dan %2 telah menanda kiriman anda pada %3", "user_flagged_post_in_multiple": "%1 dan %2 lagi telah mendanda kiriman anda pada %3", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index 57368ebc06..efc15626e0 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -33,12 +33,13 @@ "account/posts": "Kiriman oleh %1", "account/topics": "Topik olej %1", "account/groups": "Kumpulan %1", - "account/favourites": "Kiriman Kegemaran %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Tetapan Pengguna", "account/watched": "Topik Diperhati Oleh %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 sedang berada dalam mod pembaikpulihan. Sila cuba lagi nanti.", "maintenance.messageIntro": "Tambahan, admin meninggalkan mesej ini :", "throttled.text": "%1 tiada buat masa ini kerana permintaan yang berlebihan. Sila datang lagi lain kali." diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index 057b3de204..8c12c5a409 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Kategori yang disekat diwarnakan kelabu", "confirm_move": "Pindahkan", "confirm_fork": "Salin", - "favourite": "Kegemaran", - "favourites": "Kegemaran-kegemaran", - "favourites.has_no_favourites": "Anda tiada sebarang kegemaran, tandakan kiriman yang digemari untuk dilihat disini", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Memuatkan lagi kiriman", "move_topic": "Pindahkan topik", "move_topics": "Pindahkan topik-topik", diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 469bce6721..10e3082736 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Paparan Profil", "reputation": "Reputasi", - "favourites": "Kegemaran", + "favourites": "Bookmarks", "watched": "Melihat", "followers": "Pengikut", "following": "Mengikuti", @@ -55,10 +55,11 @@ "password": "kata laluan", "username_taken_workaround": "Nama pengguna yang anda minta telah digunakan oleh orang lain, jadi kami telah mengubahsuaikannya sedikit. Anda kini dikenali sebagai %1", "password_same_as_username": "Kata laluan anda adalah sama seperti nama pengguna, sila pilih kata laluan yang lain", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Muatnaik gambar", "upload_a_picture": "Muatnaik sekeping gambar", "remove_uploaded_picture": "Buang Gambar Yang Dimuatnaik", - "image_spec": "Anda hanya boleh muatnaik fail PNG, JPG atau BMP sahaja", + "upload_cover_picture": "Upload cover picture", "settings": "Tetapan", "show_email": "Tunjukkan emel saya", "show_fullname": "Tunjukkan Nama Penuh", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 400ac52998..bf16914921 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -50,8 +50,8 @@ "still-uploading": "Vennligst vent til opplastingene er fullført.", "file-too-big": "Største tillatte filstørrelse er %1 kB – vennligst last opp en mindre fil", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Du har allerede favorittmerket dette innlegget", - "already-unfavourited": "Du har allerede avfavorisert dette innlegget", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kan ikke utestenge andre administratorer!", "cant-remove-last-admin": "Du er den eneste administratoren. Legg til en annen bruker som administrator før du fjerner deg selv.", "invalid-image-type": "Ugyldig bildetype. Tilatte typer er: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Vennligst benytt brukernavnet ditt for å logge inn", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/nb/global.json b/public/language/nb/global.json index d2b6a90c7d..6a7e5f4165 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -86,5 +86,9 @@ "delete_all": "Slett alle", "map": "Kart", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json index 7378fdf292..62da7c12aa 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Bli med i gruppe", "membership.leave-group": "Forlat gruppe", "membership.reject": "Avslå", - "new-group.group_name": "Gruppenavn:" + "new-group.group_name": "Gruppenavn:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index 4329e4e661..927f144414 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 har favorittmerket innlegget ditt i %2", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 har flagget et innlegg i %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index a586c6d11f..cda5867418 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -33,12 +33,13 @@ "account/posts": "Innlegg opprettet av %1", "account/topics": "Emner opprettet av %1", "account/groups": "%1 sine grupper", - "account/favourites": "%1 sine favoritt-innlegg", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Brukerinnstillinger", "account/watched": "Innlegg overvåket av %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 er for tiden under vedlikehold. Kom tilbake en annen gang.", "maintenance.messageIntro": "I tillegg har administratoren skrevet denne meldingen:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 5a31251834..3e37dc2ba7 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Deaktiverte kategorier er grået ut", "confirm_move": "Flytt", "confirm_fork": "Forgren", - "favourite": "Favoritt", - "favourites": "Favoritter", - "favourites.has_no_favourites": "Du har ingen favoritter, marker noen innlegg som favoritt for å se dem her!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Laster flere innlegg", "move_topic": "Flytt emne", "move_topics": "Flytt emner", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index e28bcf8eea..a39a1787db 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profilvisninger", "reputation": "Rykte", - "favourites": "Favoritter", + "favourites": "Bookmarks", "watched": "Overvåkede", "followers": "Følgere", "following": "Følger", @@ -55,10 +55,11 @@ "password": "Passord", "username_taken_workaround": "Brukernavnet du ønsket er opptatt, så vi har endret ditt litt. Du er nå kjent som %1", "password_same_as_username": "Ditt passord er det samme som ditt brukernavn, vennligst velg et annet passord.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Last opp bilde", "upload_a_picture": "Last opp et bilde", "remove_uploaded_picture": "Fjern Opplastet Bilde", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Innstillinger", "show_email": "Vis min e-post", "show_fullname": "Vis mitt fulle navn", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 6c12e80542..936903cf0f 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -14,7 +14,7 @@ "invalid-password": "Ongeldig wachtwoord", "invalid-username-or-password": "Geef zowel een gebruikersnaam als wachtwoord op", "invalid-search-term": "Ongeldig zoekopdracht, een of meerdere termen", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Invalide paginering waarde. De waarde moet op z'n minst %1 zijn en niet hoger dan %2 zijn.", "username-taken": "Gebruikersnaam is al in gebruik ", "email-taken": "E-mailadres is al eens eerder gebruikt", "email-not-confirmed": "Het e-mailadres van dit account is nog niet bevestigd. Klik hier om het e-mailadres te bevestigen en de registratie af te ronden.", @@ -50,8 +50,8 @@ "still-uploading": "Een moment geduld tot alle bestanden overgebracht zijn...", "file-too-big": "Maximum toegestane bestandsgrootte is %1 kB - probeer een kleiner bestand te verzenden", "guest-upload-disabled": "Uploads voor gasten zijn uitgeschaleld ", - "already-favourited": "Dit bericht staat al tussen de favorieten", - "already-unfavourited": "Dit bericht is al uit favorieten verwijderd", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Het is niet toegestaan andere beheerders te verbannen!", "cant-remove-last-admin": "U bent de enige administrator. Voeg een andere gebruiker toe als administrator voordat u uw zelf verwijderd als admin", "invalid-image-type": "Ongeldig bestandstype afbeelding. Deze afbeelding is van een bestandstype dat niet ondersteund wordt. Toegestane bestandstypes voor afbeeldingsbestanden zijn: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Het chatbericht is te lang", "cant-edit-chat-message": "Het is niet toegestaan om dit bericht aan te passen", "cant-remove-last-user": "Je kan de laatste gebruiker niet verwijderen", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Het is niet toegestaan om dit bericht te verwijderen", "reputation-system-disabled": "Reputatie systeem is uitgeschakeld.", "downvoting-disabled": "Negatief stemmen staat uitgeschakeld.", "not-enough-reputation-to-downvote": "Dit gebruikersaccount beschikt over onvoldoende reputatie om een negatieve stem uit te mogen brengen.", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Geef de gebruikersnaam voor aanmelden", "invite-maximum-met": "Je heb het maximum aantal mensen uitgenodigd (%1 van de %2).", "no-session-found": "Geen login sessie gevonden!", - "not-in-room": "User not in room" + "not-in-room": "Geen gebruiker in deze chat room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/nl/global.json b/public/language/nl/global.json index 4940d479ec..3a3d7afe18 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "geplaatst in %1 %2 door %3", "user_posted_ago": "%1 plaatste %2", "guest_posted_ago": "Gast plaatste %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "voor het laatst aangepast door %1", "norecentposts": "Geen recente berichten", "norecenttopics": "Geen recente onderwerpen", "recentposts": "Recente berichten", @@ -86,5 +86,9 @@ "delete_all": "Alles verwijderen", "map": "Kaart", "sessions": "Login Sessies", - "ip_address": "IP Adres" + "ip_address": "IP Adres", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 7e914a227b..82100e579f 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Deelnemen aan groep", "membership.leave-group": "Verlaat groep", "membership.reject": "Afwijzen", - "new-group.group_name": "Groepsnaam:" + "new-group.group_name": "Groepsnaam:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index a047b2fad8..ba06d7ce93 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 en %2 andere hebben in gestemd in %3.", "moved_your_post": "%1 heeft je bericht verplaatst naar %2", "moved_your_topic": "%1 heeft %2 verplaatst", - "favourited_your_post_in": "%1 heeft een van je berichten in %2 aan zijn of haar favorieten toegevoegd.", - "favourited_your_post_in_dual": "%1 en %2 hebben een van je berichten in %3 aan zijn of haar favorieten toegevoegd.", - "favourited_your_post_in_multiple": "%1 en %2 hebben een van je berichten in 3 aan hun favorieten toegevoegd.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 rapporteerde een bericht in %2", "user_flagged_post_in_dual": "%1 en %2 rapporteerde een bericht in %3", "user_flagged_post_in_multiple": "%1 en %2 andere rapporteede een bericht in %3", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 1e709dec0e..131dccb6e4 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -6,12 +6,12 @@ "popular-month": "De populaire onderwerpen van deze maand", "popular-alltime": "De populaire onderwerpen", "recent": "Recente onderwerpen", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Ongepaste berichten", "users/online": "Online Gebruikers", "users/latest": "Meest recente gebruikers", "users/sort-posts": "Gebruikers met de meeste berichten", "users/sort-reputation": "Gebruikers met de meeste reputatie", - "users/banned": "Banned Users", + "users/banned": "Verbannen Gebruikers", "users/search": "Zoek Gebruiker", "notifications": "Notificaties", "tags": "Tags", @@ -33,12 +33,13 @@ "account/posts": "Berichten geplaatst door %1", "account/topics": "Onderwerpen begonnen door %1", "account/groups": "%1's groepen", - "account/favourites": "Favoriete berichten van %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Gebruikersinstellingen", "account/watched": "Berichten die door %1 bekeken worden", "account/upvoted": "Berichten omhoog gestemd door %1", "account/downvoted": "Berichten omlaag gestemd door %1", "account/best": "Beste berichten geplaast door %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is momenteel in onderhoud. Excuses voor het ongemak en probeer het later nog eens.", "maintenance.messageIntro": "Daarnaast heeft de beheerder het volgende bericht achtergelaten:", "throttled.text": "%1 is momenteel niet beschikbaar door overmatig gebruikt. Excuses voor het ongemak en probeer het later nog eens." diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index c1202c9e9e..d597851e73 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Log in or registreer om dit onderwerp te volgen.", "markAsUnreadForAll.success": "Onderwerp is voor iedereen als 'gelezen' gemarkeerd.", "mark_unread": "Ongelezen markeren", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Onderwerp is als 'gelezen' gemarkeerd", "watch": "Volgen", "unwatch": "Niet meer volgen", "watch.title": "Krijg meldingen van nieuwe reacties op dit onderwerp", @@ -65,9 +65,9 @@ "disabled_categories_note": "Uitgeschakelde Categorieën zijn grijs", "confirm_move": "Verplaatsen", "confirm_fork": "Splits", - "favourite": "Favoriet", - "favourites": "Favorieten", - "favourites.has_no_favourites": "Er zijn momenteel nog geen favorieten, markeer eerst enkele berichten om ze hier te kunnen zien.", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Meer berichten...", "move_topic": "Onderwerp verplaatsen", "move_topics": "Verplaats onderwerpen", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index b19040a6a2..036e69dd6d 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -22,7 +22,7 @@ "profile": "Profiel", "profile_views": "Bekeken", "reputation": "Reputatie", - "favourites": "Favorieten", + "favourites": "Bookmarks", "watched": "Bekeken", "followers": "Volgers", "following": "Volgend", @@ -55,10 +55,11 @@ "password": "Wachtwoord", "username_taken_workaround": "Helaas, de gewenste gebruikersnaam is al door iemand in gebruik genomen dus vandaar een kleine aanpassing naar %1 doorgevoerd", "password_same_as_username": "Je wachtwoord is hetzelfde als je gebruikersnaam. Kies een ander wachtwoord.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Upload afbeelding", "upload_a_picture": "Upload een afbeelding", "remove_uploaded_picture": "Verwijder gëuploade foto", - "image_spec": "U mag alleen PNG, JPG of BMP bestanden uploaden.", + "upload_cover_picture": "Upload cover picture", "settings": "Instellingen", "show_email": "Inschakelen weergave van e-mailadres op profielpagina", "show_fullname": "Laat mijn volledige naam zien", diff --git a/public/language/nl/users.json b/public/language/nl/users.json index a00d246ab7..2330e1b0e6 100644 --- a/public/language/nl/users.json +++ b/public/language/nl/users.json @@ -16,5 +16,5 @@ "unread_topics": "Ongelezen onderwerpen", "categories": "Categorieën", "tags": "Tags", - "no-users-found": "No users found!" + "no-users-found": "Geen gebruikers gevonden!" } \ No newline at end of file diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 1e7438c4a2..444dca9cf7 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -50,8 +50,8 @@ "still-uploading": "Poczekaj na pełne załadowanie", "file-too-big": "Maksymalny dopuszczalny rozmiar pliku to %1kB - prosimy przesłać mniejszy plik", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Już polubiłeś ten post", - "already-unfavourited": "Już przestałeś lubić ten post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Nie możesz zbanować innych adminów!", "cant-remove-last-admin": "Jesteś jedynym administratorem. Dodaj innego użytkownika jako administratora przed usunięciem siebie z tej grupy", "invalid-image-type": "Błędny typ obrazka. Dozwolone typy to: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Zaloguj się używając nazwy użytkownika", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/pl/global.json b/public/language/pl/global.json index 03bd0ac844..2aba9da79d 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -86,5 +86,9 @@ "delete_all": "Usuń wszystko", "map": "Mapa", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 52e28b2263..e8e7b370f9 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Dołącz Do Grupy", "membership.leave-group": "Opuść Grupę", "membership.reject": "Odrzuć", - "new-group.group_name": "Nazwa Grupy:" + "new-group.group_name": "Nazwa Grupy:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 75ea1cff24..4bafa8c8e7 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 polubił Twój post w %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 oflagował Twój post w %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index a2550c5a43..a9def8e4aa 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posty napisane przez %1", "account/topics": "Tematy stworzone przez %1", "account/groups": "Grupy %1", - "account/favourites": "Ulubione posty %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Ustawienia Użytkownika", "account/watched": "Tematy obserwowane przez %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "Obecnie trwają prace konserwacyjne nad %1. Proszę wrócić później.", "maintenance.messageIntro": "Dodatkowo, administrator zostawił wiadomość:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 6280c7ddd0..974a61dd94 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Zablokowane kategorie zostały wyszarzone.", "confirm_move": "Przenieś", "confirm_fork": "Skopiuj", - "favourite": "Polub", - "favourites": "Ulubione", - "favourites.has_no_favourites": "Nie masz żadnych ulubionych. Polub kilka postów!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Załaduj więcej postów", "move_topic": "Przenieś Temat", "move_topics": "Przenieś Tematy", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 1b36470c6a..ff82870ef0 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "wyświetleń", "reputation": "reputacji", - "favourites": "Ulubione", + "favourites": "Bookmarks", "watched": "Obserwowane", "followers": "Obserwujących", "following": "Obserwowanych", @@ -55,10 +55,11 @@ "password": "Hasło", "username_taken_workaround": "Wybrany login jest już zajęty, więc zmieniliśmy go trochę. Proponujemy %1", "password_same_as_username": "Twoje hasło jest takie samo jak nazwa użytkownika, prosimy wybrać inne hasło.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Prześlij zdjęcie", "upload_a_picture": "Prześlij zdjęcie", "remove_uploaded_picture": "Usuń Przesłane Zdjęcie", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Ustawienia", "show_email": "Wyświetlaj mój adres e-mail", "show_fullname": "Wyświetlaj moją pełną nazwę", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index 59ae2a5047..76498a42fa 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -50,8 +50,8 @@ "still-uploading": "Aguarde a conclusão dos uploads.", "file-too-big": "O tamanho máximo permitido de arquivo é de %1 kB - por favor faça upload de um arquivo menor", "guest-upload-disabled": "O upload por visitantes foi desabilitado", - "already-favourited": "Você já adicionou este post aos favoritos", - "already-unfavourited": "Você já removeu este post dos favoritos", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Você não pode banir outros administradores!", "cant-remove-last-admin": "Você é o único administrador. Adicione outro usuário como administrador antes de remover a si mesmo como admin", "invalid-image-type": "Tipo inválido de imagem. Os tipos permitidos são: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Por favor use o seu nome de usuário para fazer login", "invite-maximum-met": "Você já convidou o número máximo de pessoas (%1 de %2).", "no-session-found": "Nenhuma sessão de login encontrada!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/pt_BR/global.json b/public/language/pt_BR/global.json index fe803d80f6..c241e68710 100644 --- a/public/language/pt_BR/global.json +++ b/public/language/pt_BR/global.json @@ -86,5 +86,9 @@ "delete_all": "Deletar Tudo", "map": "Mapa", "sessions": "Sessões de Login", - "ip_address": "Endereço IP" + "ip_address": "Endereço IP", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/pt_BR/groups.json b/public/language/pt_BR/groups.json index 91c729622d..7634c801bc 100644 --- a/public/language/pt_BR/groups.json +++ b/public/language/pt_BR/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Entrar no Grupo", "membership.leave-group": "Deixar Grupo", "membership.reject": "Rejeitar", - "new-group.group_name": "Nome do Grupo:" + "new-group.group_name": "Nome do Grupo:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/pt_BR/notifications.json b/public/language/pt_BR/notifications.json index b1f5f21914..a50d8a3f4f 100644 --- a/public/language/pt_BR/notifications.json +++ b/public/language/pt_BR/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 e %2 outros deram voto positivo ao seu post em %3.", "moved_your_post": "%1 moveu seu post para %2", "moved_your_topic": "%1 se mudou %2", - "favourited_your_post_in": "%1 adicionou seu tópico aos favoritos em %2.", - "favourited_your_post_in_dual": "%1 e %2 adicionaram seu post aos favoritos em %3.", - "favourited_your_post_in_multiple": "%1 e %2 outros adicionaram seu post aos favoritos em %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 sinalizou um post em %2", "user_flagged_post_in_dual": "%1 e %2 sinalizaram um post em %3", "user_flagged_post_in_multiple": "%1 e %2 outros sinalizaram um post em %3", diff --git a/public/language/pt_BR/pages.json b/public/language/pt_BR/pages.json index cbbecbf80b..54f72ed8ce 100644 --- a/public/language/pt_BR/pages.json +++ b/public/language/pt_BR/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts feitos por %1", "account/topics": "Tópicos criados por %1", "account/groups": "Grupos de %1", - "account/favourites": "Posts Favoritos de %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Configurações de Usuário", "account/watched": "Tópicos assistidos por %1", "account/upvoted": "Posts votados positivamente por %1", "account/downvoted": "Posts votados negativamente por %1", "account/best": "Melhores posts de %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 está atualmente sob manutenção. Por favor retorne em outro momento.", "maintenance.messageIntro": "Adicionalmente, o administrador deixou esta mensagem:", "throttled.text": "%1 está atualmente indisponível devido a excesso de contingente. Por favor retorne em outro momento." diff --git a/public/language/pt_BR/topic.json b/public/language/pt_BR/topic.json index 0601402aa0..ef4df47135 100644 --- a/public/language/pt_BR/topic.json +++ b/public/language/pt_BR/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Categorias desabilitadas estão em cinza", "confirm_move": "Mover", "confirm_fork": "Ramificar", - "favourite": "Favoritar", - "favourites": "Favoritos", - "favourites.has_no_favourites": "Você não tem nenhum item nos favoritos, adicione algo aos favoritos para ver aqui!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Carregando Mais Posts", "move_topic": "Mover Tópico", "move_topics": "Mover Tópicos", diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index 5f01d4eeeb..f3ce7cdcbf 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -22,7 +22,7 @@ "profile": "Perfil", "profile_views": "Visualizações de perfil", "reputation": "Reputação", - "favourites": "Favoritos", + "favourites": "Bookmarks", "watched": "Acompanhado", "followers": "Seguidores", "following": "Seguindo", @@ -55,10 +55,11 @@ "password": "Senha", "username_taken_workaround": "O nome de usuário que você escolheu já existia, então nós o alteramos um pouquinho. Agora você é conhecido como %1", "password_same_as_username": "A sua senha é igual ao seu nome de usuário, por favor escolha outra senha.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Carregar Foto", "upload_a_picture": "Carregue uma Foto", "remove_uploaded_picture": "Remover Foto Enviada", - "image_spec": "Você pode fazer upload apenas de arquivos PNG, JPG ou BMP", + "upload_cover_picture": "Upload cover picture", "settings": "Configurações", "show_email": "Mostrar Meu Email", "show_fullname": "Mostrar Meu Nome Completo", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 82407bac70..4d1eceb05f 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -50,8 +50,8 @@ "still-uploading": "Te rugăm să aștepți până se termină uploadul.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Nu poți bana alți administratori!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/ro/global.json b/public/language/ro/global.json index 280a6dfb2b..501638ec86 100644 --- a/public/language/ro/global.json +++ b/public/language/ro/global.json @@ -86,5 +86,9 @@ "delete_all": "Şterge Tot", "map": "Hartă", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index 28471f1bff..3e424b4085 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index d771741795..1c01843b8a 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 a adăugat mesajul tău la favorite în %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 a semnalizat un mesaj în %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 13a8e26fb1..b90accee42 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 este momentan în mentenanță. Întoarce-te în curând!", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index e6186c8225..5503fa8c3d 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Categoriile dezactivate sunt decolorate cu gri", "confirm_move": "Mută", "confirm_fork": "Bifurcă", - "favourite": "Favorit", - "favourites": "Favorite", - "favourites.has_no_favourites": "Nu ai nici un mesaj favorit, adaugă mesaje la favorit pentru a le putea vedea aici!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Se încarcă mai multe mesaje", "move_topic": "Mută Subiect", "move_topics": "Mută Subiecte", diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 2637691632..580617c4e5 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Vizualizări", "reputation": "Reputație", - "favourites": "Favorite", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Urmărit de", "following": "Îi urmărește pe", @@ -55,10 +55,11 @@ "password": "Parolă", "username_taken_workaround": "Numele de utilizator pe care l-ai cerut este deja luat, așa că l-am modificat puțin. Acum ești cunoscut ca %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Uploadează poză", "upload_a_picture": "Uploadează o poză", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Setări", "show_email": "Arată adresa mea de email", "show_fullname": "Show My Full Name", diff --git a/public/language/ru/email.json b/public/language/ru/email.json index f415bae1e8..a4b378b897 100644 --- a/public/language/ru/email.json +++ b/public/language/ru/email.json @@ -21,9 +21,9 @@ "digest.cta": "Нажмите здесь для просмотра %1", "digest.unsub.info": "Вам была выслана сводка новостей в соответствии с Вашими настройками.", "digest.no_topics": "Нет активных тем за указанный период времени: %1", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "день", + "digest.week": "неделя", + "digest.month": "месяц", "notif.chat.subject": "Новое сообщение от %1", "notif.chat.cta": "Нажмите для продолжения диалога", "notif.chat.unsub.info": "Вы получили это уведомление в соответствии с настройками подписок.", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 907a8f9f83..a29d08c816 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -24,7 +24,7 @@ "confirm-email-already-sent": "Сообщение для подтверждения уже выслано на E-mail. Повторная отправка возможна через %1 мин.", "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", - "password-too-long": "Password too long", + "password-too-long": "Пароль слишком длинный", "user-banned": "Пользователь заблокирован", "user-too-new": "Вы можете написать свое первой сообщение через %1 сек.", "no-category": "Категория не существует", @@ -50,8 +50,8 @@ "still-uploading": "Пожалуйста, подождите завершения загрузки.", "file-too-big": "Слишком большой файл. Максимальный размер: %1 Кбайт.", "guest-upload-disabled": "Загрузка для гостей была отключена", - "already-favourited": "Вы уже добавили это сообщение в избранное", - "already-unfavourited": "Вы уже удалили это сообщение из избранного", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Вы не можете забанить других администраторов!", "cant-remove-last-admin": "Вы единственный администратор. Назначьте другого пользователя администратором, прежде чем складывать с себя полномочия админа", "invalid-image-type": "Неверный формат изображения. Поддерживаемые форматы: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Слишком длинное сообщение чата", "cant-edit-chat-message": "У вас нет доступа для редактирования этого сообщения", "cant-remove-last-user": "Вы не можете убрать последнего пользователя", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "У вас нет доступа на удаление этого сообщения", "reputation-system-disabled": "Система репутации отключена.", "downvoting-disabled": "Понижение оценки отключено", "not-enough-reputation-to-downvote": "У Вас недостаточно репутации для понижения оценки сообщения", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Пожалуйста, используйте своё имя пользователя для входа.", "invite-maximum-met": "Вы пригласили максимальное количество людей (%1 из %2).", "no-session-found": "Сессия входа не найдена!", - "not-in-room": "User not in room" + "not-in-room": "Пользователь не в комнате", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/ru/global.json b/public/language/ru/global.json index f6f1703c69..9c72d1db9a 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -86,5 +86,9 @@ "delete_all": "Удалить все", "map": "Карта", "sessions": "Сессии входа", - "ip_address": "IP адрес" + "ip_address": "IP адрес", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index c9d711a028..4273a0e3ee 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Вступить", "membership.leave-group": "Покинуть", "membership.reject": "Отклонить", - "new-group.group_name": "Название группы:" + "new-group.group_name": "Название группы:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index a6c76e8aaa..4a40bdc5c3 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 и %2 другие проголосовали за ваше сообщение в %3", "moved_your_post": "%1 переместил Ваше сообщение в %2", "moved_your_topic": "%1 переместил %2", - "favourited_your_post_in": "%1 добавил в избранное Ваше сообщение в %2.", - "favourited_your_post_in_dual": "%1 и %2 добавили в избранное Ваше сообщение в %3.", - "favourited_your_post_in_multiple": "%1 и %2 другие добавили в избранное ваше сообщение в %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 пометил сообщение в %2", "user_flagged_post_in_dual": "%1 и %2 пометили ваше сообщение в %3", "user_flagged_post_in_multiple": "%1 и %2 другие пометили ваше сообщение %3", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 61718d5a69..f5b7fe7a0a 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -6,12 +6,12 @@ "popular-month": "Популярные темы этого месяца", "popular-alltime": "Популярные темы за все время", "recent": "Последние темы", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Отмеченные сообщения", "users/online": "В сети", "users/latest": "Новые пользователи", "users/sort-posts": "Пользователи по кол-ву сообщений", "users/sort-reputation": "Пользователи по кол-ву репутации", - "users/banned": "Banned Users", + "users/banned": "Заблокированные пользователи", "users/search": "Поиск пользователей", "notifications": "Уведомления", "tags": "Теги", @@ -33,12 +33,13 @@ "account/posts": "Сообщение от %1", "account/topics": "Тема создана %1", "account/groups": "%1 Групп", - "account/favourites": "%1 Избранных сообщений", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Настройки пользователя", "account/watched": "Тему смотрели %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", + "account/best": "Лучшее сообщение написано %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 в настоящее время на обслуживании. Пожалуйста, возвращайтесь позже.", "maintenance.messageIntro": "Администратор оставил сообщение:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 04a3c5894d..27e85f376f 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Отключенные категории затемнены", "confirm_move": "Перенести", "confirm_fork": "Ответвление", - "favourite": "Избранное", - "favourites": "Избранные", - "favourites.has_no_favourites": "У вас нет избранного, добавьте несколько сообщений в избранное, чтобы увидеть их здесь", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Загружаем еще сообщения", "move_topic": "Перенести тему", "move_topics": "Перенести темы", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 36758fad50..88685f4ebe 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -22,7 +22,7 @@ "profile": "Профиль", "profile_views": "Просмотров профиля", "reputation": "Репутация", - "favourites": "Избранное", + "favourites": "Bookmarks", "watched": "Просмотров", "followers": "Читателей", "following": "Читаемых", @@ -55,10 +55,11 @@ "password": "Пароль", "username_taken_workaround": "Логин, который Вы запросили, уже занят. Мы его немного изменили. Теперь Ваш логин %1", "password_same_as_username": "Ваш пароль совпадает с именем пользователя, пожалуйста выберете другой пароль.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Загрузить фотографию", "upload_a_picture": "Загрузить фотографию", "remove_uploaded_picture": "Удалить загруженные фотографии", - "image_spec": "Вы можете загружать только PNG, JPG или BMP файлы", + "upload_cover_picture": "Upload cover picture", "settings": "Настройки", "show_email": "Показывать мой Email", "show_fullname": "Показывать Полное Имя", diff --git a/public/language/ru/users.json b/public/language/ru/users.json index 6ab7df5038..40c180685a 100644 --- a/public/language/ru/users.json +++ b/public/language/ru/users.json @@ -16,5 +16,5 @@ "unread_topics": "Непрочитанные темы", "categories": "Категории", "tags": "Теги", - "no-users-found": "No users found!" + "no-users-found": "Пользователи не найдены!" } \ No newline at end of file diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 5584e6b5f3..91ddd6ca7d 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -50,8 +50,8 @@ "still-uploading": "Tegereza gupakira bibanze birangire.", "file-too-big": "Ubunini bwemewe bushoboka bw'ifayilo ni kB %1. Gerageza upakire ifayilo ntoyaho", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Wari wararangije gutonesha iki ngiki", - "already-unfavourited": "Wari wararekeye aho gutonesha iki ngiki", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Ntabwo wakwirukana abandi bayobozi!", "cant-remove-last-admin": "Ni wowe muyobozi wenyine. Ongeramo undi muntu nk'umuyobozi mbere y'uko wikura ku buyobozi", "invalid-image-type": "Ubwoko bw'ifoto wahisemo ntibwemewe. Hemewe gusa: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Koresha izina ry'umukoresha ryawe kugirango winjiremo", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/rw/global.json b/public/language/rw/global.json index e543582ea0..fa7e6d6ab3 100644 --- a/public/language/rw/global.json +++ b/public/language/rw/global.json @@ -86,5 +86,9 @@ "delete_all": "Siba Byose", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/rw/groups.json b/public/language/rw/groups.json index 982f067a39..f14eccef93 100644 --- a/public/language/rw/groups.json +++ b/public/language/rw/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Injira mu Itsinda", "membership.leave-group": "Va mu Itsinda", "membership.reject": "Hakanira", - "new-group.group_name": "Izina ry'Itsinda:" + "new-group.group_name": "Izina ry'Itsinda:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/rw/notifications.json b/public/language/rw/notifications.json index 93abd5898f..83a7b7eb4e 100644 --- a/public/language/rw/notifications.json +++ b/public/language/rw/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 yatonesheje %2 washyizeho.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 yatambikanye ikintu muri %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/rw/pages.json b/public/language/rw/pages.json index 26c0ac71e9..e4c597f8f0 100644 --- a/public/language/rw/pages.json +++ b/public/language/rw/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 ntiboneka kuko ubu iri gutunganywa. Muze kongera kugaruka. ", "maintenance.messageIntro": "Byongeye, kandi, umuyobozi yasize ubu butumwa: ", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/rw/topic.json b/public/language/rw/topic.json index 2f3e53b21d..81574d5241 100644 --- a/public/language/rw/topic.json +++ b/public/language/rw/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Ibyiciro bitagaragazwa birasa n'ibipfutse", "confirm_move": "Imura", "confirm_fork": "Gabanyaho", - "favourite": "Tonesha", - "favourites": "Ibyatoneshejwe", - "favourites.has_no_favourites": "Nta kintu na kimwe wari watonesha. Tonesha ibintu bimwe na bimwe kugirango ujye ubibona aha!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Ibindi Biraje", "move_topic": "Imura Ikiganiro", "move_topics": "Imura Ibiganiro", diff --git a/public/language/rw/user.json b/public/language/rw/user.json index a489bf8a32..0542acc9b9 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -22,7 +22,7 @@ "profile": "Ishusho", "profile_views": "Ishusho Yarebwe", "reputation": "Amanota", - "favourites": "Ibitoneshwa", + "favourites": "Bookmarks", "watched": "Ibikurikiranwa", "followers": "Abamukurikira", "following": "Akurikira", @@ -55,10 +55,11 @@ "password": "Ijambobanga", "username_taken_workaround": "Izina ushaka kujya ukoresha twasanze ryarafashwe. Ntugire impungenge kuko twakuboneye iryo byenda kumera kimwe. Uzaba uzwi ku izina rya %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Gushyiraho ifoto", "upload_a_picture": "Shyiraho ifoto", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Itunganya", "show_email": "Hagaragazwe Email Yanjye", "show_fullname": "Hagaragazwe Izina Ryuzuye Ryanjye", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index ca4533474d..f9199f193e 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -50,8 +50,8 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/sc/global.json b/public/language/sc/global.json index 09c4882bd4..586d9340bf 100644 --- a/public/language/sc/global.json +++ b/public/language/sc/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json index 2ac271a4c5..6138ea22ff 100644 --- a/public/language/sc/groups.json +++ b/public/language/sc/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index e2efe63c40..fc3ba602f5 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index 8af7d8e199..a2e82aa90f 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index 5dd4e78fa4..1f58d8582d 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Is Crezes Disativadas sunt postas in colore de chìghine", "confirm_move": "Move", "confirm_fork": "Partzi", - "favourite": "Preferidu", - "favourites": "Preferidos", - "favourites.has_no_favourites": "Non tenes perunu preferidu, pone intre is preferidos carchi arresonu pro ddu bìdere inoghe!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Càrriga Prus Arresonos", "move_topic": "Move Arresonada", "move_topics": "Move Topics", diff --git a/public/language/sc/user.json b/public/language/sc/user.json index d6d36d0c4a..3da03f2093 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -22,7 +22,7 @@ "profile": "Perfilu", "profile_views": "Bìsitas a su perfilu", "reputation": "Nodidos", - "favourites": "Preferidos", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Sighidores", "following": "Sighende", @@ -55,10 +55,11 @@ "password": "Password", "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Càrriga immàgine", "upload_a_picture": "Càrriga un'immàgine", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Sèberos", "show_email": "Ammustra s'Email Mia", "show_fullname": "Show My Full Name", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 3ad3058253..c1f9cbdb12 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -50,8 +50,8 @@ "still-uploading": "Prosím čakajte na dokončenie nahrávania", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Nemožte zakázať druhých adminov.", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/sk/global.json b/public/language/sk/global.json index b3dd3aa13a..652bb0e62a 100644 --- a/public/language/sk/global.json +++ b/public/language/sk/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index eaa2eea404..1073025324 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index c151af7abd..fbb3535f62 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index 53d8874789..f5d5c49231 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index 8096d584e7..39f4ca03d8 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Vypnuté (disabled) kategorie sú šedé.", "confirm_move": "Presunúť", "confirm_fork": "Rozdeliť", - "favourite": "Oblúbené", - "favourites": "Obľúbené", - "favourites.has_no_favourites": "Nemáte žiadne obľúbené príspevky, pridajte niektorý príspevok k obľúbeným a uvidíte ho tu!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Načítavanie viac príspevkov", "move_topic": "Presunúť tému", "move_topics": "Viac tém", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 2e721e8d5a..9cfba749c8 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Zobrazenie profilu", "reputation": "Reputácia", - "favourites": "Obľúbené", + "favourites": "Bookmarks", "watched": "Watched", "followers": "Nasledujú ho", "following": "Nasleduje", @@ -55,10 +55,11 @@ "password": "Heslo", "username_taken_workaround": "Vaše požadované prihlasovacie meno je už obsadené, tak sme si ho dovolili mierne upraviť. Budeme Vás evidovať ako %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Nahrať obrázok", "upload_a_picture": "Nahrať obrázok", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Nastavenia", "show_email": "Zobrazovať môj email v profile", "show_fullname": "Show My Full Name", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index a450802630..57aa64574d 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -50,8 +50,8 @@ "still-uploading": "Prosimo počakajte, da se prenosi končajo.", "file-too-big": "Največja dovoljena velikost datoteke je %1 kB - prosimo naložite manjšo datoteko", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "To objavo ste že dodali med priljubljene", - "already-unfavourited": "To objavo ste že odstranili iz priljubljenih", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Ne morete blokirati drugih administratorjev!", "cant-remove-last-admin": "Ste edini administrator. Dodajte novega administratorja preden boste odstranili sebe.", "invalid-image-type": "Nedovoljen format slike. Dovoljeni formati so: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Uporabite svoje uporabniško ime za prijavo", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/sl/global.json b/public/language/sl/global.json index 3f5101bdd4..c8ba8fe3d2 100644 --- a/public/language/sl/global.json +++ b/public/language/sl/global.json @@ -86,5 +86,9 @@ "delete_all": "Izbriši vse", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/sl/groups.json b/public/language/sl/groups.json index 5779451fb7..478bcb39d0 100644 --- a/public/language/sl/groups.json +++ b/public/language/sl/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Pridruži se skupini", "membership.leave-group": "Zapusti skupino", "membership.reject": "Zavrni", - "new-group.group_name": "Ime skupine:" + "new-group.group_name": "Ime skupine:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/sl/notifications.json b/public/language/sl/notifications.json index 469f331406..f5d94351e4 100644 --- a/public/language/sl/notifications.json +++ b/public/language/sl/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 je dodal med priljubljene vašo objavo v %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1je prijavil vašo objavo v %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/sl/pages.json b/public/language/sl/pages.json index 134a6e6f3e..3c206aadf4 100644 --- a/public/language/sl/pages.json +++ b/public/language/sl/pages.json @@ -33,12 +33,13 @@ "account/posts": "Objave uporabnika %1", "account/topics": "Ustvarjene teme uporabnika %1", "account/groups": "Teme uporabnika %1", - "account/favourites": "Priljubljene objave uporabnika %1", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Uporabniške nastavitve", "account/watched": "Teme, ki jih spremlja uporabnik %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 je trenutno v prenovi. Prosimo pridite nazaj kasneje.", "maintenance.messageIntro": "Administrator obvešča:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/sl/topic.json b/public/language/sl/topic.json index 1d842fe0fb..503f7ee250 100644 --- a/public/language/sl/topic.json +++ b/public/language/sl/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Onemogočene kategorije so obarvane sivo", "confirm_move": "Premakni", "confirm_fork": "Razcepi", - "favourite": "Dodaj med priljubljene", - "favourites": "Priljubljene", - "favourites.has_no_favourites": "Nimaš priljubljenih objav, dodaj nekaj objav pod priljubljene.", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Nalagam več objav", "move_topic": "Premakni temo", "move_topics": "Premakni teme", diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 916f4c5ed6..93725fc5b8 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Ogledi", "reputation": "Naziv", - "favourites": "Priljubljene", + "favourites": "Bookmarks", "watched": "Zgodovina ogledov", "followers": "Sledilci", "following": "Sledim", @@ -55,10 +55,11 @@ "password": "Geslo", "username_taken_workaround": "Predlagano uporabniško ime je že zasedeno, zato predlagamo %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Naloži fotografijo", "upload_a_picture": "Naloži fotografijo", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Nastavitve.", "show_email": "Pokaži moj e-poštni naslov.", "show_fullname": "Pokaži moj ime in priimek.", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index e9e7ce0a01..d3c6ea76d6 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -50,8 +50,8 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/sr/global.json b/public/language/sr/global.json index aadbb16820..1891007d72 100644 --- a/public/language/sr/global.json +++ b/public/language/sr/global.json @@ -86,5 +86,9 @@ "delete_all": "Обриши све", "map": "Мапа", "sessions": "Логин сесија", - "ip_address": "IP адреса" + "ip_address": "IP адреса", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/sr/groups.json b/public/language/sr/groups.json index 3e44a09035..9cda34c5a7 100644 --- a/public/language/sr/groups.json +++ b/public/language/sr/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Учланите се у групу", "membership.leave-group": "Напусти групу", "membership.reject": "Одбаци", - "new-group.group_name": "Име групе:" + "new-group.group_name": "Име групе:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index 712538ba0e..d919bc82e7 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 и %2 осталих су гласали за вашу поруку у %3.", "moved_your_post": "%1 је померио вашу поруку у %2", "moved_your_topic": "%1 је померио %2", - "favourited_your_post_in": "%1 доду вашу поруку из %2 у омиљене.", - "favourited_your_post_in_dual": "%1 и %2 кажу да им се допада ваша порука у %3.", - "favourited_your_post_in_multiple": "%1 и осталим %2 се допала ваша порука %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 означи поруку у %2", "user_flagged_post_in_dual": "%1 и %2 су означили поруку у %3", "user_flagged_post_in_multiple": "%1 и осталих %2 су означили поруку у %3", diff --git a/public/language/sr/pages.json b/public/language/sr/pages.json index e3eae6f34b..0e7387583e 100644 --- a/public/language/sr/pages.json +++ b/public/language/sr/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", "maintenance.messageIntro": "Additionally, the administrator has left this message:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/sr/topic.json b/public/language/sr/topic.json index cf7b76fc3e..37e042c18f 100644 --- a/public/language/sr/topic.json +++ b/public/language/sr/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Disabled Categories are greyed out", "confirm_move": "Move", "confirm_fork": "Fork", - "favourite": "Favourite", - "favourites": "Favourites", - "favourites.has_no_favourites": "You don't have any favourites, favourite some posts to see them here!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Loading More Posts", "move_topic": "Move Topic", "move_topics": "Move Topics", diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 2fe581051f..a1c2676cb8 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -22,7 +22,7 @@ "profile": "Профил", "profile_views": "Прикази профила", "reputation": "Репутација", - "favourites": "Омиљени", + "favourites": "Bookmarks", "watched": "Надгледани", "followers": "Пратиоци", "following": "Прати", @@ -55,10 +55,11 @@ "password": "Лозинка", "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", "password_same_as_username": "Ваша лозинка је иста као ваше име, промените лозинку", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Додајте слику", "upload_a_picture": "Upload a picture", "remove_uploaded_picture": "Уклоните додату слику", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Подешавања", "show_email": "Прикажи моју лозинку", "show_fullname": "Прикажи моје пуно име", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 8f3513edaf..4a5cfa45a1 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -50,8 +50,8 @@ "still-uploading": "Vänta medan uppladdningen slutförs.", "file-too-big": "Den maximalt tillåtna filstorleken är %1 kB - ladda upp en mindre fil", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Du har redan favoriserat det här inlägget", - "already-unfavourited": "Du har redan avfavoriserat det här inlägget", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Du kan inte bannlysa andra administratörer.", "cant-remove-last-admin": "Du är den enda administratören. Lägg till en annan användare som administratör innan du tar bort dig själv.", "invalid-image-type": "Ogiltig bildtyp. Tillåtna typer är: % 1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Använd ditt användarnamn för att logga in", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/sv/global.json b/public/language/sv/global.json index d984b99cc5..a9cb801869 100644 --- a/public/language/sv/global.json +++ b/public/language/sv/global.json @@ -86,5 +86,9 @@ "delete_all": "Ta bort Alla", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index 7a9f14b04a..4515d5e0de 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Gå med i grupp", "membership.leave-group": "Lämna grupp", "membership.reject": "Neka", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index b0879d499b..0db2dee665 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 har favoriserat ditt inlägg i %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flaggade ett inlägg i %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 1e8f24f5cb..6953bf554e 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Avnändarinställningar", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 genomgår underhåll just nu. Vänligen kom tillbaka lite senare.", "maintenance.messageIntro": "Ytterligare så lämnade administratören detta meddelande:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index 119caa86e5..4fa03da4ee 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Inaktiverade kategorier är utgråade", "confirm_move": "Flytta", "confirm_fork": "Grena", - "favourite": "Favorit", - "favourites": "Favoriter", - "favourites.has_no_favourites": "Du har inga favoriter, markera inlägg som favorit för att se dem här!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Laddar fler inlägg", "move_topic": "Flytta ämne", "move_topics": "Flytta ämnen", diff --git a/public/language/sv/user.json b/public/language/sv/user.json index a807bdb73f..d8aeed1d65 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profil-visningar", "reputation": "Rykte", - "favourites": "Favoriter", + "favourites": "Bookmarks", "watched": "Bevakad", "followers": "Följare", "following": "Följer", @@ -55,10 +55,11 @@ "password": "Lösenord", "username_taken_workaround": "Användarnamnet är redan upptaget, så vi förändrade det lite. Du kallas nu för %1", "password_same_as_username": "Ditt lösenord är samma som ditt användarnamn, välj ett annat lösenord.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Ladda upp bild", "upload_a_picture": "Ladda upp en bild", "remove_uploaded_picture": "Ta bort uppladdad bild", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "Inställningar", "show_email": "Visa min epost", "show_fullname": "Visa Fullständigt Namn", diff --git a/public/language/th/error.json b/public/language/th/error.json index 7d046a412b..ec944b68dd 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -50,8 +50,8 @@ "still-uploading": "Please wait for uploads to complete.", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "You can't ban other admins!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "Invalid image type. Allowed types are: %1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Please use your username to login", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/th/global.json b/public/language/th/global.json index f655109acb..36acafc94d 100644 --- a/public/language/th/global.json +++ b/public/language/th/global.json @@ -86,5 +86,9 @@ "delete_all": "Delete All", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/th/groups.json b/public/language/th/groups.json index 5f40f59e30..1ec533f3b2 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index d6228f8518..a00e594a93 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 flagged a post in %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index 5534337e1e..e017b8df5e 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 กำลังอยู่ระหว่างการปิดปรับปรุงชั่วคราว กรุณาลองใหม่อีกครั้งในภายหลัง", "maintenance.messageIntro": "ผู้ดูแลระบบได้ฝากข้อความต่อไปนี้เอาไว้", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/th/topic.json b/public/language/th/topic.json index 6e979ef48c..19cecadf9d 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "หมวดหมู่ที่ปิดใช้งานจะเป็นสีเทา", "confirm_move": "ย้าย", "confirm_fork": "แยก", - "favourite": "ฮิต", - "favourites": "ฮิต", - "favourites.has_no_favourites": "คุณไม่ได้มีโพสต์ที่ชอบ รายการโพสต์ที่ชอบที่จะเห็นได้ที่นี่", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "โหลดโพสเพิ่มเติม", "move_topic": "ย้ายกระทู้", "move_topics": "Move Topics", diff --git a/public/language/th/user.json b/public/language/th/user.json index 129c3f3c7c..357aa42419 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -22,7 +22,7 @@ "profile": "รายละเอียด", "profile_views": "ดูข้อมูลส่วนตัว", "reputation": "ชื่อเสียง", - "favourites": "ชอบ", + "favourites": "Bookmarks", "watched": "ดูแล้ว", "followers": "คนติดตาม", "following": "ติดตาม", @@ -55,10 +55,11 @@ "password": "รหัสผ่าน", "username_taken_workaround": "ชื่อนี้มีคนใช้แล้ว เราเลยแก้ไขชื่อคุณ โดยคุณจะถูกรู้จักในชื่อ %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "อัปโหลดรูป", "upload_a_picture": "อัปโหลดรูป", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "ตั้งค่า", "show_email": "แสดงอีเมล์", "show_fullname": "แสดงชื่อจริง", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 3e9a52baef..f086d8dcbe 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -14,7 +14,7 @@ "invalid-password": "Geçersiz Şifre", "invalid-username-or-password": "Lütfen kullanıcı ismi ve parola girin.", "invalid-search-term": "Geçersiz arama", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Geçersiz sayfalama değeri, en az %1 ve en fazla %2 olabilir", "username-taken": "Kullanıcı İsmi Alınmış", "email-taken": "E-posta Alınmış", "email-not-confirmed": "E-postanız onaylanmamış, onaylamak için lütfen buraya tıklayın.", @@ -50,8 +50,8 @@ "still-uploading": "Lütfen yüklemelerin bitmesini bekleyin.", "file-too-big": "İzin verilen en büyük dosya boyutu %1 kb - lütfen daha küçük bir dosya yükleyin", "guest-upload-disabled": "Ziyaretçilerin yükleme yapması devre dışı bırakıldı", - "already-favourited": "Bu iletiyi zaten favorilerinize eklediniz", - "already-unfavourited": "Bu iletiyi zaten favorilerinizden çıkardınız", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Başka yöneticileri yasaklayamazsınız!", "cant-remove-last-admin": "Tek yönetici sizsiniz. Kendinizi adminlikten çıkarmadan önce başka bir kullanıcıyı admin olarak ekleyiniz", "invalid-image-type": "Geçersiz resim uzantısı. Izin verilen uzantılar: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Sohbet mesajı çok uzun", "cant-edit-chat-message": "Bu mesajı düzenlemek için izin verilmez", "cant-remove-last-user": "Son kullanıcıyı silemezsiniz", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Bu mesajı silmek için izin verilmez", "reputation-system-disabled": "Saygınlık sistemi kapatılmış.", "downvoting-disabled": "Aşagı oylama kapatılmış", "not-enough-reputation-to-downvote": "Bu iletiyi aşagı oylamak için yeterince saygınlığınız yok.", @@ -96,5 +96,6 @@ "wrong-login-type-username": "Lütfen giriş için kullanıcı adınızı kullanın", "invite-maximum-met": "Sen maksimum miktarda insanı davet ettin (%2 üzerinden %1).", "no-session-found": "Giriş yapılmış bir oturum bulunamadı!", - "not-in-room": "User not in room" + "not-in-room": "Odada kullanıcı yok", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 7c99284277..72455cc80f 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "%1 içinde %3 tarafından %2 yayımlandı", "user_posted_ago": "%1 %2 yayımladı", "guest_posted_ago": "Ziyaretçi %1 yayımladı", - "last_edited_by": "last edited by %1", + "last_edited_by": "en son düzenleyen %1", "norecentposts": "Güncel İletiler Yok", "norecenttopics": "Güncel Başlıklar Yok", "recentposts": "Güncel İletiler", @@ -86,5 +86,9 @@ "delete_all": "Hepsini Sil", "map": "Harita", "sessions": "Giriş Oturumları", - "ip_address": "IP Adresleri" + "ip_address": "IP Adresleri", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index afb293df5c..1618633a48 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Gruba Katıl", "membership.leave-group": "Gruptan Ayrıl", "membership.reject": "Reddet", - "new-group.group_name": "Grup İsmi:" + "new-group.group_name": "Grup İsmi:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index e378b748e7..dfd4849065 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 ve %2 iki kişi daha %3 içindeki gönderini beğendi.", "moved_your_post": "%1 senin iletin %2 taşındı", "moved_your_topic": "%1 taşındı %2", - "favourited_your_post_in": "%1 iletinizi favorilerine ekledi. %2.", - "favourited_your_post_in_dual": "%1 ve %2 %3 içindeki gönderini favoriye ekledi.", - "favourited_your_post_in_multiple": "%1 ve %2 iki kişi daha %3 içindeki gönderini favoriye ekledi.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 bir iletiyi bayrakladı. %2", "user_flagged_post_in_dual": " %1 ve %2 %3 gönderini bayrakladı", "user_flagged_post_in_multiple": "%1 ve %2 kişi daha %3 gönderini bayrakladı", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 5f6856b98f..77d821ad43 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -6,12 +6,12 @@ "popular-month": "Bu ayki popüler başlıklar", "popular-alltime": "En popüler başlıklar", "recent": "Güncel Konular", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Bayraklanmış İletiler", "users/online": "Çevrimiçi Kullanıcılar", "users/latest": "En Yeni Kullanıcılar", "users/sort-posts": "En çok ileti gönderen kullanıcılar", "users/sort-reputation": "En çok saygınlığı olan kullanıcılar", - "users/banned": "Banned Users", + "users/banned": "Yasaklanmış Kullanıcılar", "users/search": "Kullanıcı Ara", "notifications": "Bildirimler", "tags": "Etiketler", @@ -33,12 +33,13 @@ "account/posts": "%1 tarafından gönderilen iletiler", "account/topics": "%1 tarafından gönderilen başlıklar", "account/groups": "%1 Kişisine Ait Gruplar", - "account/favourites": "%1'in Favori İletileri", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "Kullanıcı Ayarları", "account/watched": "%1 tarafından izlenen konular", "account/upvoted": "%1 tarafından artılanan gönderiler", "account/downvoted": "%1 tarafından eksilenen gönderiler", "account/best": "%1 tarafından en iyi gönderiler", + "confirm": "Email Confirmed", "maintenance.text": "%1 şu anda bakımda. Lütfen bir süre sonra tekrar deneyin.", "maintenance.messageIntro": "Ayrıca, yönetici şu mesaji bıraktı:", "throttled.text": "%1 şu anda kullanılamıyor. Lütfen daha sonra tekrar dene." diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index b6616f0624..ea140fc028 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Lütfen bu iletiyi başlığa üye olmak için giriş yapın.", "markAsUnreadForAll.success": "Başlık herkes için okunmadı olarak işaretlendi.", "mark_unread": "Okunmadı olarak işaretle", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Başlık okunmamış olarak işaretlendi.", "watch": "İzle", "unwatch": "İzleme", "watch.title": "Bu başlığa gelen yeni iletilerden haberdar ol", @@ -65,9 +65,9 @@ "disabled_categories_note": "Etkin Olmayan Kategoriler soluklaştırılır", "confirm_move": "Taşı", "confirm_fork": "Ayır", - "favourite": "Favori", - "favourites": "Favoriler", - "favourites.has_no_favourites": "Favorilerde hiç iletiniz yok, görebilmek için iletileri favorilere ekleyin.", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Daha fazla ileti ", "move_topic": "Başlığı Taş", "move_topics": "Konuları Taşı", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index b7b5a65d10..e793dd7b0e 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profil Görüntülemeleri", "reputation": "Saygınlık", - "favourites": "Favoriler", + "favourites": "Bookmarks", "watched": "İzlendi", "followers": "Takipçiler", "following": "Takip Ediyor", @@ -55,10 +55,11 @@ "password": "Şifre", "username_taken_workaround": "İstediğiniz kullanıcı ismi zaten alınmış, bu yüzden biraz degiştirdik. Şimdiki kullanıcı isminiz %1", "password_same_as_username": "Parolanız kullanıcı adınız ile aynı, lütfen başka bir parola seçiniz.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Resim Yükle", "upload_a_picture": "Bir Resim Yükle", "remove_uploaded_picture": "Yüklenmiş fotoğrafı kaldır", - "image_spec": "Sadece PNG, JPG veya BMP dosyalarını yükleyebilirsin.", + "upload_cover_picture": "Upload cover picture", "settings": "Ayarlar", "show_email": "E-postamı göster", "show_fullname": "Tam ismimi göster", diff --git a/public/language/tr/users.json b/public/language/tr/users.json index b4b5afe4e4..fa0bc51096 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -16,5 +16,5 @@ "unread_topics": "Okunmamış Başlıklar", "categories": "Kategoriler", "tags": "Etiketler", - "no-users-found": "No users found!" + "no-users-found": "Kullanıcı bulunamadı!" } \ No newline at end of file diff --git a/public/language/vi/category.json b/public/language/vi/category.json index 1f06930274..77836d6492 100644 --- a/public/language/vi/category.json +++ b/public/language/vi/category.json @@ -1,16 +1,16 @@ { - "category": "Danh mục", - "subcategories": "Danh mục con", + "category": "Chuyên mục", + "subcategories": "Chuyên mục con", "new_topic_button": "Chủ đề mới", "guest-login-post": "Đăng nhập để viết bài", "no_topics": "Không có bài viết trong danh mục này.
Hãy đăng một bài viết mới.", "browsing": "đang xem", "no_replies": "Chưa có bình luận nào", "no_new_posts": "Không có bài mới.", - "share_this_category": "Chia sẻ thư mục này", + "share_this_category": "Chia sẻ chuyên mục này", "watch": "Theo dõi", "ignore": "Bỏ qua", "watch.message": "Bạn đang theo dõi các cập nhật của danh mục này", - "ignore.message": "Bạn đang gỡ bỏ theo dõi danh mục này", - "watched-categories": "Watched categories" + "ignore.message": "Bạn đã tắt cập nhật từ chuyên mục này", + "watched-categories": "Chuyên mục đang theo dõi" } \ No newline at end of file diff --git a/public/language/vi/email.json b/public/language/vi/email.json index cf8f8e86e1..de77b60125 100644 --- a/public/language/vi/email.json +++ b/public/language/vi/email.json @@ -1,11 +1,11 @@ { - "password-reset-requested": "Yêu cầu tạo lại mật khẩu - %1!", - "welcome-to": "Chào mừng đến với %1", + "password-reset-requested": "Yêu cầu phục hồi mật khẩu - %1!", + "welcome-to": "Chào mừng bạn đến với %1", "invite": "Lời mời từ %1", "greeting_no_name": "Xin chào", "greeting_with_name": "Xin chào %1", "welcome.text1": "Cảm ơn bạn đã đăng ký tại %1!", - "welcome.text2": "Để kích hoạt đầy đủ tính năng của tài khoản, chúng tôi cần xác định bạn là chủ của địa chỉ email mà bạn đã đăng ký.", + "welcome.text2": "Để kích hoạt đầy đủ tính năng của tài khoản, chúng tôi cần xác nhận bạn là chủ của địa chỉ email mà bạn đã đăng ký.", "welcome.text3": "Quản trị viên đã chấp nhận đơn đăng ký của bạn. Bạn có thể đăng nhập với tên đăng nhập/mật khẩu ngay bây giờ.", "welcome.cta": "Nhấn vào đây để xác nhận địa chỉ email", "invitation.text1": "%1 đã mời bạn tham gia %2", @@ -14,16 +14,16 @@ "reset.text2": "Để đặt lại mật khẩu, hãy click vào liên kết sau:", "reset.cta": "Click vào đây để khởi tạo lại mật khẩu", "reset.notify.subject": "Thay đổi mật khẩu thành công", - "reset.notify.text1": "Chúng tôi thông báo với bạn trên %1, mật khẩu của bạn đã thay đổi thành công", - "reset.notify.text2": "Nếu bạn không cho phép điều này, vui lòng thông báo cho quản trị viên ngay lập tức", - "digest.notifications": "Bạn có thông báo chưa đọc từ %1", + "reset.notify.text1": "Xin thông báo với bạn: mật khẩu của bạn trên %1 đã được thay đổi thành công.", + "reset.notify.text2": "Nếu bạn không cho phép điều này, vui lòng thông báo cho quản trị viên ngay lập tức.", + "digest.notifications": "Bạn có thông báo chưa đọc từ %1:", "digest.latest_topics": "Chủ đề mới nhất từ %1", "digest.cta": "Click vào đây để truy cập %1", "digest.unsub.info": "Tập san này được gửi đến bạn dựa theo cài đặt theo dõi của bạn.", "digest.no_topics": "Không có chủ đề nào hoạt động trong %1 ", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "ngày", + "digest.week": "tuần", + "digest.month": "tháng", "notif.chat.subject": "Bạn có tin nhắn mới từ %1", "notif.chat.cta": "Nhấn vào đây để tiếp tục cuộc hội thoại", "notif.chat.unsub.info": "Thông báo tin nhắn này được gửi tới dựa theo cài đặt theo dõi của bạn.", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 2d3f6d74dc..db957c5b53 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -1,9 +1,9 @@ { "invalid-data": "Dữ liệu không hợp lệ", - "not-logged-in": "Bạn chưa đăng nhập", + "not-logged-in": "Có vẻ bạn chưa đăng nhập.", "account-locked": "Tài khoản của bạn đang tạm thời bị khóa", - "search-requires-login": "Searching requires an account - please login or register.", - "invalid-cid": "Danh mục ID không hợp lệ", + "search-requires-login": "Bạn cần phải có tài khoản để tìm kiếm - vui lòng đăng nhập hoặc đăng ký.", + "invalid-cid": "ID chuyên mục không hợp lệ", "invalid-tid": "ID chủ đề không hợp lệ", "invalid-pid": "ID bài viết không hợp lệ", "invalid-uid": "ID tài khoản không hợp lệ", @@ -14,19 +14,19 @@ "invalid-password": "Mật khẩu không hợp lệ", "invalid-username-or-password": "Xin hãy nhập cả tên đăng nhập và mật khẩu", "invalid-search-term": "Từ khóa không hợp lệ", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Giá trị trang không hợp lệ, tối thiểu phải là %1 và tối đa là %2", "username-taken": "Tên đăng nhập đã tồn tại", "email-taken": "Email đã được đăng kí", "email-not-confirmed": "Email của bạn chưa được xác nhận, xin hãy nhấn vào đây để xác nhận địa chỉ này là của bạn", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", + "email-not-confirmed-chat": "Bạn không được quyền chat nếu email của bạn chưa được xác nhận, vui lòng click vào đây để xác nhận email của bạn.", + "no-email-to-confirm": "Diễn đàn này yêu cầu xác nhận email, vui lòng nhấn vào đây để nhập email.", + "email-confirm-failed": "Chúng tôi không thể xác nhận email của bạn, vui lòng thử lại sau.", + "confirm-email-already-sent": "Email xác nhận đã được gửi, vui lòng chờ %1 phút để yêu cầu gửi lại.", "username-too-short": "Tên đăng nhập quá ngắn", "username-too-long": "Tên đăng nhập quá dài", - "password-too-long": "Password too long", + "password-too-long": "Mật khẩu quá dài", "user-banned": "Tài khoản bị ban", - "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", + "user-too-new": "Rất tiếc, bạn phải chờ %1 giây để đăng bài viết đầu tiên.", "no-category": "Danh mục không tồn tại", "no-topic": "Chủ đề không tồn tại", "no-post": "Bài viết không tồn tại", @@ -36,65 +36,66 @@ "no-privileges": "Bạn không đủ quyền để thực thi hành động này", "category-disabled": "Danh mục bị khóa", "topic-locked": "Chủ đề bị khóa", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", - "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", - "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", - "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", - "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", - "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", - "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", - "not-enough-tags": "Not enough tags. Topics must have at least %1 tag(s)", - "too-many-tags": "Too many tags. Topics can't have more than %1 tag(s)", + "post-edit-duration-expired": "Bạn chỉ được phép sửa bài viết sau khi đăng %1 giây.", + "content-too-short": "Vui lòng nhập một bài viết dài hơn. Bài viết phải có tối thiểu %1 ký tự.", + "content-too-long": "Vui lòng nhập một bài viết ngắn hơn. Bài viết chỉ có thể có tối đa %1 ký tự.", + "title-too-short": "Vui lòng nhập tiêu đề dài hơn. Tiêu đề phải có tối thiểu %1 ký tự.", + "title-too-long": "Vui lòng nhập tiêu đề ngắn hơn. Tiêu đề chỉ có thể có tối đa %1 ký tự.", + "too-many-posts": "Bạn chỉ có đăng bài mới mỗi %1 giây - vui lòng đợi để tiếp tục đăng bài.", + "too-many-posts-newbie": "Bạn chỉ có thể đăng bài mỗi %1 giây cho đến khi bạn tích luỹ được %2 điểm tín nhiệm - vui lòng đợi để tiếp tục đăng bài.", + "tag-too-short": "Vui lòng nhập tag dài hơn. Tag phải có tối thiểu %1 ký tự.", + "tag-too-long": "Vui lòng nhập tag ngắn hơn. Tag chỉ có thể có tối đa %1 ký tự.", + "not-enough-tags": "Quá ít tag. Chủ đề phải có tối thiểu %1 tag.", + "too-many-tags": "Quá nhiều tag. Chủ đề chỉ có thể có tối đa %1 tag.", "still-uploading": "Vui lòng chờ upload", - "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", - "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "Bạn đã bấm yêu thích cho bài viết này rồi", - "already-unfavourited": "Bạn đã bỏ thích bài này rồi", + "file-too-big": "Kích cỡ file được cho phép tối đa là %1 kB - vui lòng tải lên file có dung lượng nhỏ hơn.", + "guest-upload-disabled": "Khách (chưa có tài khoản) không có quyền tải lên file.", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "Bạn không thể ban được các admin khác", - "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "cant-remove-last-admin": "Bạn là quản trị viên duy nhất. Hãy cho thành viên khác làm quản trị viên trước khi huỷ bỏ quyền quản trị của bạn.", + "invalid-image-type": "Định dạng ảnh không hợp lệ. Những định dạng được cho phép là: %1", + "invalid-image-extension": "Định dạng ảnh không hợp lệ", + "invalid-file-type": "Định dạng file không hợp lệ. Những định dạng được cho phép là: %1", "group-name-too-short": "Tên nhóm quá ngắn", "group-already-exists": "Nhóm đã tồn tại", "group-name-change-not-allowed": "Không cho phép đổi tên nhóm", - "group-already-member": "Already part of this group", - "group-not-member": "Not a member of this group", - "group-needs-owner": "This group requires at least one owner", - "group-already-invited": "This user has already been invited", - "group-already-requested": "Your membership request has already been submitted", + "group-already-member": "Bạn đã là thành viên của nhóm này.", + "group-not-member": "Không phải là thành viên của nhóm này.", + "group-needs-owner": "Nhóm này phải có tối thiểu một chủ sỡ hữu", + "group-already-invited": "Thành viên này đã được mời", + "group-already-requested": "Yêu cầu tham gia của bạn đã được gửi.", "post-already-deleted": "Bài viết này đã bị xóa", "post-already-restored": "Bài viết này đã được phục hồi", "topic-already-deleted": "Chủ đề này đã bị xóa", "topic-already-restored": "Chủ đề này đã được phục hồi", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", + "cant-purge-main-post": "Bạn không thể xoá bài viết chính, thay vào đó, vui lòng xoá chủ đề.", "topic-thumbnails-are-disabled": "Thumbnails cho chủ đề đã bị tắt", "invalid-file": "File không hợp lệ", "uploads-are-disabled": "Đã khóa lựa chọn tải lên", - "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", - "about-me-too-long": "Sorry, your about me cannot be longer than %1 character(s).", + "signature-too-long": "Rất tiếc, chữ ký của bạn chỉ có thể có tối đa %1 ký tự.", + "about-me-too-long": "Rất tiếc, giới thiệu bản thân của bạn chỉ có thể có tối đa %1 ký tự.", "cant-chat-with-yourself": "Bạn không thể chat với chính bạn!", "chat-restricted": "Người dùng này đã bật chế độ hạn chế tin nhắn chat. Bạn phải được anh/cô ta follow thì mới có thể gởi tin nhắn đến họ được.", - "chat-disabled": "Chat system disabled", - "too-many-messages": "You have sent too many messages, please wait awhile.", - "invalid-chat-message": "Invalid chat message", - "chat-message-too-long": "Chat message is too long", - "cant-edit-chat-message": "You are not allowed to edit this message", - "cant-remove-last-user": "You can't remove the last user", - "cant-delete-chat-message": "You are not allowed to delete this message", + "chat-disabled": "Hệ thống chat đã bị vô hiệu hoá", + "too-many-messages": "Bạn đã gửi quá nhiều tin nhắn, vui lòng đợi trong giây lát.", + "invalid-chat-message": "Tin nhắn không hợp lệ", + "chat-message-too-long": "Tin nhắn quá dài", + "cant-edit-chat-message": "Bạn không được phép chỉnh sửa tin nhắn này", + "cant-remove-last-user": "Bạn không thể xoá thành viên cuối cùng", + "cant-delete-chat-message": "Bạn không được phép xoá tin nhắn này", "reputation-system-disabled": "Hệ thống tín nhiệm đã bị vô hiệu hóa.", "downvoting-disabled": "Downvote đã bị tắt", "not-enough-reputation-to-downvote": "Bạn không có đủ phiếu tín nhiệm để downvote bài này", "not-enough-reputation-to-flag": "Bạn không đủ tín nhiệm để đánh dấu bài viết này", - "already-flagged": "You have already flagged this post", + "already-flagged": "Bạn đã gắn cờ cho bài viết này", "reload-failed": "NodeBB gặp lỗi trong khi tải lại: \"%1\". NodeBB sẽ tiếp tục hoạt động với dữ liệu trước đó, tuy nhiên bạn nên tháo gỡ những gì bạn vừa thực hiện trước khi tải lại.", "registration-error": "Lỗi đăng kí", - "parse-error": "Something went wrong while parsing server response", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login", - "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", - "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "parse-error": "Có gì không ổn khi nhận kết quả từ máy chủ", + "wrong-login-type-email": "Xin vui lòng sửa dụng email của bạn để đăng nhập", + "wrong-login-type-username": "Vui lòng sử dụng tên đăng nhập của bạn để đăng nhập", + "invite-maximum-met": "Bạn đã sử dụng hết số lượng lời mời bạn có thể gửi (%1 đã gửi trên tổng số %2 được cho phép)", + "no-session-found": "Không tìm thấy phiên đăng nhập!", + "not-in-room": "Thành viên không có trong phòng", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/vi/global.json b/public/language/vi/global.json index 55d850c49d..e466d74fae 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -2,11 +2,11 @@ "home": "Trang chủ", "search": "Tìm kiếm", "buttons.close": "Đóng lại", - "403.title": "Từ chối truy cập", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.title": "Truy cập bị từ chối", + "403.message": "Có vẻ bạn đang cố vào một trang mà bạn không có quyền truy cập.", + "403.login": "Có lẽ bạn nên thử đăng nhập?", "404.title": "Không tìm thấy", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "Có vẻ như bạn đang cố vào một trang không tồn tại. Hãy trở lại trang chủ.", "500.title": "Lỗi nội bộ", "500.message": "Úi chà! Có vẻ như có trục trặc rồi!", "register": "Đăng ký", @@ -22,7 +22,7 @@ "pagination.out_of": "%1 trong số %2", "pagination.enter_index": "Nhập khóa", "header.admin": "Quản trị viên", - "header.categories": "Categories", + "header.categories": "Chuyên mục", "header.recent": "Gần đây", "header.unread": "Chưa đọc", "header.tags": "Tags", @@ -33,12 +33,12 @@ "header.notifications": "Thông báo", "header.search": "Tìm kiếm", "header.profile": "Hồ sơ", - "header.navigation": "Navigation", + "header.navigation": "Điều hướng", "notifications.loading": "Đang tải Thông báo", - "chats.loading": "Đang tải phần Chat", + "chats.loading": "Đang tải chat", "motd.welcome": "Chào mừng bạn tới NodeBB, Platform của tương lai", "previouspage": "Trang trước", - "nextpage": "Trang kế tiếp", + "nextpage": "Trang kế", "alert.success": "Thành công", "alert.error": "Lỗi", "alert.banned": "Bị cấm", @@ -49,29 +49,29 @@ "users": "Số người dùng", "topics": "Số Chủ đề", "posts": "Số bài viết", - "best": "Best", - "upvoted": "Upvoted", - "downvoted": "Downvoted", - "views": "Số lượt view", - "reputation": "Độ uy tín", + "best": "Hay nhất", + "upvoted": "Tán thành", + "downvoted": "Phản đối", + "views": "Lượt xem", + "reputation": "Điểm tín nhiệm", "read_more": "Đọc thêm", - "more": "More", + "more": "Xem thêm", "posted_ago_by_guest": "Đã viết %1 bởi Khách", "posted_ago_by": "Đã viết %1 bởi %2", "posted_ago": "Đã viết %1", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", + "posted_in": "được đăng trong %1", + "posted_in_by": "được đăng trong %1 bởi %2", "posted_in_ago": "được đăng trong %1 %2", "posted_in_ago_by": "Đã viết trong %1 %2 bởi %3", "user_posted_ago": "%1 đã viết %2", "guest_posted_ago": "Khách đã viết %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "được chỉnh sửa lần cuối bởi %1", "norecentposts": "Không có bài viết nào gần đây", "norecenttopics": "Không có chủ đề gần đây", "recentposts": "Số bài viết gần đây", "recentips": "Các IP vừa mới đăng nhập", "away": "Đang đi vắng", - "dnd": "Do not disturb", + "dnd": "Đừng làm phiền", "invisible": "Ẩn", "offline": "Đang offline", "email": "Email", @@ -84,7 +84,11 @@ "follow": "Theo dõi", "unfollow": "Huỷ theo dõi", "delete_all": "Xóa hết", - "map": "Map", - "sessions": "Login Sessions", - "ip_address": "IP Address" + "map": "Bản đồ", + "sessions": "Phiên đăng nhập", + "ip_address": "Địa chỉ IP", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index 7ce867cb97..3ea795c76b 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -6,47 +6,48 @@ "no_groups_found": "Không có nhóm nào để hiển thị", "pending.accept": "Chấp nhận", "pending.reject": "Từ chối", - "pending.accept_all": "Accept All", - "pending.reject_all": "Reject All", - "pending.none": "There are no pending members at this time", - "invited.none": "There are no invited members at this time", - "invited.uninvite": "Rescind Invitation", - "invited.search": "Search for a user to invite to this group", - "invited.notification_title": "You have been invited to join %1", - "request.notification_title": "Group Membership Request from %1", - "request.notification_text": "%1 has requested to become a member of %2", + "pending.accept_all": "Chấp nhận tất cả", + "pending.reject_all": "Từ chối tất cả", + "pending.none": "Hiện tại không có thành viên nào đang chờ được duyệt để tham gia nhóm", + "invited.none": "Hiện tại không có thành viên nào được mời tham gia nhóm", + "invited.uninvite": "Từ chối lời mời", + "invited.search": "Tìm kiếm thành viên để mời vào nhóm", + "invited.notification_title": "Bạn đã được mời tham gia %1", + "request.notification_title": "Yêu cầu tham gia nhóm từ %1", + "request.notification_text": "%1 yêu cầu chấp nhận để trở thành thành viên của %2", "cover-save": "Lưu", "cover-saving": "Đang lưu", "details.title": "Thông tin nhóm", "details.members": "Danh sách thành viên", - "details.pending": "Pending Members", - "details.invited": "Invited Members", + "details.pending": "Thành viên đang chờ trả lời", + "details.invited": "Thành viên đã được mời", "details.has_no_posts": "Nhóm thành viên này chưa viết bài viết nào.", "details.latest_posts": "Bài mới nhất", - "details.private": "Private", - "details.disableJoinRequests": "Disable join requests", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", - "details.owner_options": "Group Administration", + "details.private": "Riêng tư", + "details.disableJoinRequests": "Vô hiệu hóa yêu cầu tham gia", + "details.grant": "Cấp/Huỷ quyền trưởng nhóm", + "details.kick": "Đá ra", + "details.owner_options": "Quản trị nhóm", "details.group_name": "Tên nhóm", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "details.delete_group": "Delete Group", + "details.member_count": "Số thành viên", + "details.creation_date": "Ngày mở nhóm", + "details.description": "Miêu tả", + "details.badge_preview": "Xem thử huy hiệu", + "details.change_icon": "Đổi icon", + "details.change_colour": "Đổi màu", + "details.badge_text": "Huy hiệu", + "details.userTitleEnabled": "Hiện huy hiệu", + "details.private_help": "Nếu bật, để tham gia nhóm cần phải có sự chấp thuận từ trưởng nhóm", + "details.hidden": "Đã ẩn", + "details.hidden_help": "Nếu bật, nhóm này sẽ không được hiện thị trong danh sách nhóm, và thành viên phải được mời để tham gia", + "details.delete_group": "Xoá nhóm", "event.updated": "Thông tin nhóm đã được cập nhật", - "event.deleted": "The group \"%1\" has been deleted", - "membership.accept-invitation": "Accept Invitation", - "membership.invitation-pending": "Invitation Pending", - "membership.join-group": "Join Group", - "membership.leave-group": "Leave Group", - "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "event.deleted": "Nhóm \"%1\" đã bị xoá", + "membership.accept-invitation": "Chấp nhận lời mời", + "membership.invitation-pending": "Lời mời đang chờ trả lời", + "membership.join-group": "Tham gia nhóm", + "membership.leave-group": "Rời khỏi nhóm", + "membership.reject": "Từ chối", + "new-group.group_name": "Tên nhóm", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/vi/language.json b/public/language/vi/language.json index fbe233f267..f0787f748a 100644 --- a/public/language/vi/language.json +++ b/public/language/vi/language.json @@ -1,5 +1,5 @@ { - "name": "Tiếng Anh", + "name": "Tiếng Việt", "code": "vi", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/vi/login.json b/public/language/vi/login.json index 4ae9230b8a..01b7f2dc96 100644 --- a/public/language/vi/login.json +++ b/public/language/vi/login.json @@ -1,10 +1,10 @@ { - "username-email": "Username / Email", - "username": "Username", + "username-email": "Tên đăng nhập / Email", + "username": "Tên đăng nhập", "email": "Email", - "remember_me": "Ghi nhớ tôi?", + "remember_me": "Ghi nhớ?", "forgot_password": "Quên mật khẩu?", - "alternative_logins": "Đăng nhập bằng tên khác", + "alternative_logins": "Đăng nhập bằng tài khoản khác", "failed_login_attempt": "Đăng nhập thất bại, xin hãy thử lại", "login_successful": "Bạn đã đăng nhập thành công!", "dont_have_account": "Chưa có tài khoản?" diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index f0ad033020..f53818ced6 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -1,13 +1,13 @@ { "chat.chatting_with": "Chat với ", "chat.placeholder": "Nhập tin nhắn ở đây, nhấn enter để gửi", - "chat.send": "Gửi đi", + "chat.send": "Gửi", "chat.no_active": "Bạn hiện giờ không có cuộc chat nào", - "chat.user_typing": "%1b đang gõ", + "chat.user_typing": "%1b đang gõ...", "chat.user_has_messaged_you": "%1 đã gửi tin cho bạn.", - "chat.see_all": "See all chats", + "chat.see_all": "Xem tất cả", "chat.no-messages": "Hãy chọn 1 tài khoản để xem lịch sử chat", - "chat.no-users-in-room": "No users in this room", + "chat.no-users-in-room": "Không có người nào trong phòng này.", "chat.recent-chats": "Vừa chat", "chat.contacts": "Liên hệ", "chat.message-history": "Lịch sử tin nhắn", @@ -16,22 +16,22 @@ "chat.seven_days": "7 ngày", "chat.thirty_days": "30 ngày", "chat.three_months": "3 tháng", - "chat.delete_message_confirm": "Are you sure you wish to delete this message?", - "chat.roomname": "Chat Room %1", - "chat.add-users-to-room": "Add users to room", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "chat.delete_message_confirm": "Bạn có chắc chắn bạn muốn xoá tin nhắn này chứ?", + "chat.roomname": "Phòng chat %1", + "chat.add-users-to-room": "Thêm người vào phòng", + "composer.compose": "Soạn thảo", + "composer.show_preview": "Hiện Xem trước", + "composer.hide_preview": "Ẩn Xem trước", "composer.user_said_in": "%1 đã nói trong %2:", "composer.user_said": "%1 đã nói:", "composer.discard": "Bạn có chắc chắn hủy bỏ bài viết này?", - "composer.submit_and_lock": "Submit and Lock", - "composer.toggle_dropdown": "Toggle Dropdown", - "composer.uploading": "Uploading %1", + "composer.submit_and_lock": "Đăng và Khoá", + "composer.toggle_dropdown": "Đóng/mở dropdown", + "composer.uploading": "Đang tải lên %1", "bootbox.ok": "OK", - "bootbox.cancel": "Cancel", - "bootbox.confirm": "Confirm", - "cover.dragging_title": "Cover Photo Positioning", - "cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"", - "cover.saved": "Cover photo image and position saved" + "bootbox.cancel": "Huỷ bỏ", + "bootbox.confirm": "Xác nhận", + "cover.dragging_title": "Điều chỉnh vị trí ảnh cover", + "cover.dragging_message": "Kéo ảnh cover vào vị trí bạn ưng ý và nhấn \"Lưu\"", + "cover.saved": "Ảnh cover và vị trí đã được lưu" } \ No newline at end of file diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index 922275e1c3..8780782f08 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -1,35 +1,35 @@ { "title": "Thông báo", "no_notifs": "Bạn không có thông báo nào mới", - "see_all": "See all notifications", + "see_all": "Xem tất cả thông báo", "mark_all_read": "Đánh dấu đã xem tất cả thông báo", "back_to_home": "Quay lại %1", "outgoing_link": "Liên kết ngoài", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "Bạn đang rời khỏi %1", "continue_to": "Tiếp tục tới %1", "return_to": "Quay lại %1", "new_notification": "Thông báo mới", "you_have_unread_notifications": "Bạn có thông báo chưa đọc", "new_message_from": "Tin nhắn mới từ %1", "upvoted_your_post_in": "%1 đã bình chọn bài của bạn trong %2.", - "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", - "moved_your_post": "%1 has moved your post to %2", - "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 đã thích bài của bạn trong %2.", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "upvoted_your_post_in_dual": "%1%2 đã tán thành với bài viết của bạn trong %3.", + "upvoted_your_post_in_multiple": "%1 và %2 others đã tán thành với bài viết của bạn trong %3.", + "moved_your_post": "%1 đã chuyển bài viết của bạn tới %2", + "moved_your_topic": "%1 đã chuyển %2", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 gắn cờ 1 bài trong %2", - "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", - "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", + "user_flagged_post_in_dual": "%1%2 đã gắn cờ một bài viết trong %3", + "user_flagged_post_in_multiple": "%1 và %2 người khác đã gắn cờ bài viết của bạn trong %3", "user_posted_to": "%1 đã trả lời %2", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", + "user_posted_to_dual": "%1%2 đã trả lời: %3", + "user_posted_to_multiple": "%1 và %2 người khác đã trả lời: %3", "user_posted_topic": "%1 đã gởi chủ đề mới ở %2", "user_started_following_you": "%1 đã theo dõi bạn.", - "user_started_following_you_dual": "%1 and %2 started following you.", - "user_started_following_you_multiple": "%1 and %2 others started following you.", - "new_register": "%1 sent a registration request.", + "user_started_following_you_dual": "%1%2 đã bắt đầu theo dõi bạn.", + "user_started_following_you_multiple": "%1 và %2 người khác đã bắt đầu theo dõi bạn.", + "new_register": "%1 đã gửi một yêu cầu tham gia.", "email-confirmed": "Đã xác nhận email", "email-confirmed-message": "Cảm ơn bạn đã xác nhận địa chỉ email của bạn. Tài khoản của bạn đã được kích hoạt đầy đủ.", "email-confirm-error-message": "Đã có lỗi khi xác nhận địa chỉ email. Có thể đoạn mã không đúng hoặc đã hết hạn.", diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index ea0217f9aa..13b6ab018d 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -1,45 +1,46 @@ { "home": "Trang chủ", "unread": "Chủ đề chưa đọc", - "popular-day": "Popular topics today", - "popular-week": "Popular topics this week", - "popular-month": "Popular topics this month", - "popular-alltime": "All time popular topics", + "popular-day": "Chủ đề nổi bật hôm nay", + "popular-week": "Chủ đề nội bật tuần này", + "popular-month": "Chủ đề nổi bật tháng này", + "popular-alltime": "Chủ đề nổi bật mọi thời đại", "recent": "Chủ đề gần đây", - "flagged-posts": "Flagged Posts", - "users/online": "Online Users", - "users/latest": "Latest Users", - "users/sort-posts": "Users with the most posts", - "users/sort-reputation": "Users with the most reputation", - "users/banned": "Banned Users", - "users/search": "User Search", + "flagged-posts": "Bài viết bị gắn cờ", + "users/online": "Thành viên đang online", + "users/latest": "Thành viên mới nhất", + "users/sort-posts": "Thành viên có nhiều bài đăng nhất", + "users/sort-reputation": "Thành viên có điểm tín nhiệm cao nhất", + "users/banned": "Thành viên đã bị cấm", + "users/search": "Tìm kiếm thành viên", "notifications": "Thông báo", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", - "register": "Register an account", - "login": "Login to your account", - "reset": "Reset your account password", - "categories": "Categories", - "groups": "Groups", - "group": "%1 group", - "chats": "Chats", - "chat": "Chatting with %1", - "account/edit": "Editing \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", - "account/following": "People %1 follows", - "account/followers": "People who follow %1", - "account/posts": "Posts made by %1", - "account/topics": "Topics created by %1", - "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", - "account/settings": "User Settings", - "account/watched": "Topics watched by %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", + "tags": "Tag", + "tag": "Chủ đề được gắn tag \"%1\"", + "register": "Đăng ký một tài khoản mới", + "login": "Đăng nhập vào tài khoản của bạn", + "reset": "Phục hồi mật khẩu của bạn", + "categories": "Chuyên mục", + "groups": "Nhóm", + "group": "Nhóm %1", + "chats": "Chat", + "chat": "Chat với %1", + "account/edit": "Chỉnh sửa \"%1\"", + "account/edit/password": "Chỉnh sửa mật khẩu của \"%1\"", + "account/edit/username": "Chỉnh sửa tên đăng nhập của \"%1\"", + "account/edit/email": "Chỉnh sửa email của \"%1\"", + "account/following": "Thành viên %1 đang theo dõi", + "account/followers": "Thành viên đang theo dõi %1", + "account/posts": "Bài viết được đăng bởi %1", + "account/topics": "Chủ đề được tạo bởi %1", + "account/groups": "Nhóm của %1", + "account/favourites": "%1's Bookmarked Posts", + "account/settings": "Thiết lập", + "account/watched": "Chủ đề %1 đang theo dõi", + "account/upvoted": "Bài viết %1 tán thành", + "account/downvoted": "Bài viết %1 phản đối", + "account/best": "Bài viết hay nhất của %1", + "confirm": "Email Confirmed", "maintenance.text": "%1 đang được bảo trì. Xin vui lòng quay lại sau.", "maintenance.messageIntro": "Ban quản lí để lại lời nhắn sau:", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "throttled.text": "%1 hiện đang bị quá tải. Vui lòng quay lại sau." } \ No newline at end of file diff --git a/public/language/vi/recent.json b/public/language/vi/recent.json index 12a131279d..99766aefda 100644 --- a/public/language/vi/recent.json +++ b/public/language/vi/recent.json @@ -5,15 +5,15 @@ "month": "Tháng", "year": "Năm", "alltime": "Tất cả thời gian", - "no_recent_topics": "Không có chủ đề nào gần đây", - "no_popular_topics": "There are no popular topics.", + "no_recent_topics": "Không có chủ đề nào gần đây.", + "no_popular_topics": "Không có chủ đề nào phổ biến.", "there-is-a-new-topic": "Có chủ đề mới", "there-is-a-new-topic-and-a-new-post": "Có chủ đề mới và bài viết mới", - "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", - "there-are-new-topics": "There are %1 new topics.", - "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", - "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", + "there-is-a-new-topic-and-new-posts": "Có 1 chủ đề mới và %1 bài viết mới.", + "there-are-new-topics": "Có %1 chủ đề mới.", + "there-are-new-topics-and-a-new-post": "Có %1 chủ đề mới và 1 bài viết mới.", + "there-are-new-topics-and-new-posts": "Có %1 chủ đề mới và %2 bài viết mới.", "there-is-a-new-post": "Có bài viết mới", - "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Nhấn vào đây để tải lại" + "there-are-new-posts": "Có %1 bài viết mới.", + "click-here-to-reload": "Nhấn vào đây để tải lại." } \ No newline at end of file diff --git a/public/language/vi/register.json b/public/language/vi/register.json index b24f67d78e..91e70a7d0b 100644 --- a/public/language/vi/register.json +++ b/public/language/vi/register.json @@ -1,12 +1,12 @@ { "register": "Đăng ký", - "help.email": "Theo mặc định, Email của bạn sẽ ở dạng ẩn và public sẽ không thấy được", + "help.email": "Theo mặc định, Email của bạn sẽ được ẩn và public sẽ không thấy được", "help.username_restrictions": "Một tên truy cập duy nhất có từ %1 đến %2 ký tự. Những người khác có thể nhắc đến bạn bằng @tên truy cập.", "help.minimum_password_length": "Mật khẩu của bạn phải có ít nhất %1 ký tự", "email_address": "Địa chỉ Email", "email_address_placeholder": "Nhập địa chỉ Email", - "username": "Tên truy cập", - "username_placeholder": "Nhập tên truy cập", + "username": "Tên đăng nhập", + "username_placeholder": "Nhập tên đăng nhập", "password": "Mật khẩu", "password_placeholder": "Nhập mật khẩu", "confirm_password": "Xác nhận mật khẩu", @@ -15,5 +15,5 @@ "alternative_registration": "Đăng ký tài khoản khác", "terms_of_use": "Điều khoản sử dụng", "agree_to_terms_of_use": "Tôi đồng ý với các điều khoản sử dụng", - "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator." + "registration-added-to-queue": "Yêu cầu đăng ký của bạn đang chờ được chấp thuận. Bạn sẽ nhận được email khi tài khoản của bạn đã được chấp thuận bởi quản trị viên." } \ No newline at end of file diff --git a/public/language/vi/reset_password.json b/public/language/vi/reset_password.json index 7e3ce09565..53e9e4060c 100644 --- a/public/language/vi/reset_password.json +++ b/public/language/vi/reset_password.json @@ -11,7 +11,7 @@ "enter_email_address": "Nhập địa chỉ Email", "password_reset_sent": "Đã gửi mật khẩu được thiết lập lại", "invalid_email": "Email không đúng / Email không tồn tại!", - "password_too_short": "The password entered is too short, please pick a different password.", - "passwords_do_not_match": "The two passwords you've entered do not match.", - "password_expired": "Your password has expired, please choose a new password" + "password_too_short": "Mật khẩu bạn nhập quá ngắn, vui lòng chọn một mật khẩu khác.", + "passwords_do_not_match": "Hai mật khẩu bạn nhập không trùng khớp với nhau.", + "password_expired": "Mật khẩu của bạn đã hết hạn, vui lòng chọn một mật khẩu mới." } \ No newline at end of file diff --git a/public/language/vi/search.json b/public/language/vi/search.json index 312c315c73..6e3244bf2d 100644 --- a/public/language/vi/search.json +++ b/public/language/vi/search.json @@ -1,40 +1,40 @@ { "results_matching": "%1 kết quả(s) trùng với \"%2\", (%3 giây)", - "no-matches": "No matches found", - "advanced-search": "Advanced Search", - "in": "In", - "titles": "Titles", - "titles-posts": "Titles and Posts", - "posted-by": "Posted by", - "in-categories": "In Categories", - "search-child-categories": "Search child categories", - "reply-count": "Reply Count", - "at-least": "At least", - "at-most": "At most", - "post-time": "Post time", - "newer-than": "Newer than", - "older-than": "Older than", - "any-date": "Any date", - "yesterday": "Yesterday", - "one-week": "One week", - "two-weeks": "Two weeks", - "one-month": "One month", - "three-months": "Three months", - "six-months": "Six months", - "one-year": "One year", - "sort-by": "Sort by", - "last-reply-time": "Last reply time", - "topic-title": "Topic title", - "number-of-replies": "Number of replies", - "number-of-views": "Number of views", - "topic-start-date": "Topic start date", - "username": "Username", - "category": "Category", - "descending": "In descending order", - "ascending": "In ascending order", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "no-matches": "Không tìm thấy kết quả phù hợp", + "advanced-search": "Tìm kiếm nâng cao", + "in": "Trong", + "titles": "Các tựa đề", + "titles-posts": "Tựa đề và Bài viết", + "posted-by": "Đăng bởi", + "in-categories": "Nằm trong chuyên mục", + "search-child-categories": "Tìm kiếm chuyên mục con", + "reply-count": "Số lượt trả lời", + "at-least": "Tối thiểu", + "at-most": "Tối đa", + "post-time": "Thời điểm đăng bài", + "newer-than": "Mới hơn", + "older-than": "Cũ hơn", + "any-date": "Bất kì ngày nào", + "yesterday": "Hôm qua", + "one-week": "Một tuần", + "two-weeks": "Hai tuần", + "one-month": "Một tháng", + "three-months": "Ba tháng", + "six-months": "Sáu tháng", + "one-year": "Một năm", + "sort-by": "Sắp xếp theo", + "last-reply-time": "Thời điểm trả lời lần cuối", + "topic-title": "Tựa đề chủ đề", + "number-of-replies": "Số lượt trả lời", + "number-of-views": "Số lượt xem", + "topic-start-date": "Ngày bắt đầu chủ đề", + "username": "Tên đăng nhập", + "category": "Chuyên mục ", + "descending": "Theo thứ tự giảm dần", + "ascending": "Theo thứ tự tăng dần", + "save-preferences": "Lưu tuỳ chọn", + "clear-preferences": "Xoá tuỳ chọn", + "search-preferences-saved": "Tìm kiếm tuỳ chọn đã lưu", + "search-preferences-cleared": "Tìm kiếm tuỳ chọn đã xoá", + "show-results-as": "Hiện thị kết quả theo" } \ No newline at end of file diff --git a/public/language/vi/tags.json b/public/language/vi/tags.json index 7b8931883f..f0bd336781 100644 --- a/public/language/vi/tags.json +++ b/public/language/vi/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Không có bài viết nào với thẻ này.", "tags": "Thẻ", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", - "enter_tags_here_short": "Tên thẻ...", + "enter_tags_here": "Nhập thẻ ở đây, mỗi thẻ phải có từ %1 tới %2 ký tự.", + "enter_tags_here_short": "Nhập thẻ...", "no_tags": "Chưa có thẻ nào." } \ No newline at end of file diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 0248c39aad..683acae9fa 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -13,20 +13,20 @@ "notify_me": "Được thông báo khi có trả lời mới trong chủ đề này", "quote": "Trích dẫn", "reply": "Trả lời", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "Trả lời dưới dạng chủ đề", "guest-login-reply": "Hãy đăng nhập để trả lời", "edit": "Chỉnh sửa", "delete": "Xóa", "purge": "Xóa hẳn", "restore": "Phục hồi", "move": "Chuyển đi", - "fork": "Fork", - "link": "đường dẫn", + "fork": "Tạo bản sao", + "link": "Đường dẫn", "share": "Chia sẻ", "tools": "Công cụ", - "flag": "Flag", + "flag": "Gắn cờ", "locked": "Khóa", - "bookmark_instructions": "Click here to return to the last unread post in this thread.", + "bookmark_instructions": "Nhấn vào đây để trở lại bài viết cuối cùng mà bạn chưa đọc trong chủ đề này.", "flag_title": "Flag bài viết này để chỉnh sửa", "flag_success": "Chủ đề này đã được flag để chỉnh sửa", "deleted_message": "Chủ đề này đã bị xóa. Chỉ ban quản trị mới xem được.", @@ -34,8 +34,8 @@ "not_following_topic.message": "Bạn sẽ không còn nhận được thông báo từ chủ đề này", "login_to_subscribe": "Xin hãy đăng ký hoặc đăng nhập để theo dõi topic này", "markAsUnreadForAll.success": "Chủ đề đã được đánh dấu là chưa đọc toàn bộ", - "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread": "Đánh dấu chưa đọc", + "mark_unread.success": "Chủ đề đã được đánh dấu chưa đọc.", "watch": "Theo dõi", "unwatch": "Ngừng theo dõi", "watch.title": "Được thông báo khi có trả lời mới trong chủ đề này", @@ -49,9 +49,9 @@ "thread_tools.unlock": "Mở khóa chủ đề", "thread_tools.move": "Chuyển chủ đề", "thread_tools.move_all": "Chuyển tất cả", - "thread_tools.fork": "Fork chủ đề", + "thread_tools.fork": "Tạo bản sao chủ đề", "thread_tools.delete": "Xóa chủ đề", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "Xoá bài viết", "thread_tools.delete_confirm": "Bạn có muốn xóa chủ đề này?", "thread_tools.restore": "Phục hồi chủ đề", "thread_tools.restore_confirm": "Bạn có muốn phục hồi chủ đề này?", @@ -63,25 +63,25 @@ "post_purge_confirm": "Bạn có chắc muốn xóa hẳn bài này?", "load_categories": "Đang tải các phần mục", "disabled_categories_note": "Các phần mục bị khóa đã được đánh xám", - "confirm_move": "Chuyển", - "confirm_fork": "Fork", - "favourite": "Yêu thích", - "favourites": "Đang yêu thích", - "favourites.has_no_favourites": "Bạn đang không có yêu thích nào. Hãy yêu thích một vài bài viết để thấy được chúng tại đây!", + "confirm_move": "Di chuyển", + "confirm_fork": "Tạo bảo sao", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "Tải thêm các bài gửi khác", "move_topic": "Chuyển chủ đề", "move_topics": "Di chuyển chủ đề", "move_post": "Chuyển bài gửi", "post_moved": "Đã chuyển bài gửi!", - "fork_topic": "Fork chủ đề", + "fork_topic": "Tạo bản sao chủ đề", "topic_will_be_moved_to": "Chủ đề này sẽ được chuyển tới phần mục", - "fork_topic_instruction": "Nhấp vào bài gửi mà bạn muốn fork", + "fork_topic_instruction": "Chọn vào bài gửi mà bạn muốn fork", "fork_no_pids": "Chưa chọn bài gửi nào!", "fork_success": "Tạo bản sao thành công! Nhấn vào đây để chuyển tới chủ đề vừa tạo.", - "delete_posts_instruction": "Click the posts you want to delete/purge", + "delete_posts_instruction": "Chọn những bài viết bạn muốn xoá", "composer.title_placeholder": "Nhập tiêu đề cho chủ đề của bạn tại đây...", "composer.handle_placeholder": "Tên", - "composer.discard": "Loại bỏ", + "composer.discard": "Huỷ bỏ", "composer.submit": "Gửi", "composer.replying_to": "Đang trả lời %1", "composer.new_topic": "Chủ đề mới", @@ -101,12 +101,12 @@ "newest_to_oldest": "Mới đến cũ", "most_votes": "Bình chọn nhiều nhất", "most_posts": "Có nhiều bài viết nhất", - "stale.title": "Create new topic instead?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", - "stale.reply_anyway": "Reply to this topic anyway", + "stale.title": "Tạo chủ đề mới?", + "stale.warning": "Chủ đề bạn đang trả lời đã khá cũ. Bạn có muốn tạo chủ đề mới, và liên kết với chủ đề hiện tại trong bài viết trả lời của bạn?", + "stale.create": "Tạo chủ đề mới", + "stale.reply_anyway": "Trả lời chủ đề này", "link_back": "Re: [%1](%2)", "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "offensive": "Phản cảm", + "custom-flag-reason": "Nhập lý do bị gắn cờ" } \ No newline at end of file diff --git a/public/language/vi/unread.json b/public/language/vi/unread.json index 049d36dba3..14233ae900 100644 --- a/public/language/vi/unread.json +++ b/public/language/vi/unread.json @@ -5,6 +5,6 @@ "mark_as_read": "Đánh dấu đã đọc", "selected": "Đã chọn", "all": "Tất cả", - "all_categories": "All categories", + "all_categories": "Tất cả chuyên mục", "topics_marked_as_read.success": "Chủ đề được đánh dấu đã đọc" } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index a6e095cadb..188905b64b 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -6,13 +6,13 @@ "postcount": "Số bài viết", "email": "Email", "confirm_email": "Xác nhận email", - "ban_account": "Ban Account", - "ban_account_confirm": "Do you really want to ban this user?", - "unban_account": "Unban Account", + "ban_account": "Cấm thành viên", + "ban_account_confirm": "Bạn có chắc bạn muốn cấm thành viên này?", + "unban_account": "Bỏ cấm thành viên", "delete_account": "Xóa tài khoản", "delete_account_confirm": "Bạn có chắc muốn xóa tài khoản của mình?
Hành động này không thể khôi phục và bạn sẽ mất toàn bộ dữ liệu

Hãy nhập tên đăng nhập để xác nhận.", - "delete_this_account_confirm": "Are you sure you want to delete this account?
This action is irreversible and you will not be able to recover any data

", - "account-deleted": "Account deleted", + "delete_this_account_confirm": "Bạn có chắc bạn muốn xoá tài khoản này chứ?
Tác vụ này không thể đảo ngược và bạn sẽ không thể phục hồi lại được dữ liệu đã xoá

", + "account-deleted": "Tài khoản đã bị xoá", "fullname": "Tên đầy đủ", "website": "Website", "location": "Địa điểm", @@ -22,24 +22,24 @@ "profile": "Hồ sơ", "profile_views": "Số lượt người ghé thăm", "reputation": "Mức uy tín", - "favourites": "Yêu thích", + "favourites": "Bookmarks", "watched": "Đã theo dõi", "followers": "Số người theo dõi", "following": "Đang theo dõi", - "aboutme": "About me", + "aboutme": "Giới thiệu bản thân", "signature": "Chữ ký", "birthday": "Ngày sinh ", "chat": "Chat", - "chat_with": "Chat with %1", + "chat_with": "Chat với %1", "follow": "Theo dõi", "unfollow": "Hủy theo dõi", "more": "Xem thêm", "profile_update_success": "Hồ sơ đã được cập nhật thành công", "change_picture": "Thay đổi hình ảnh", - "change_username": "Change Username", - "change_email": "Change Email", + "change_username": "Đổi tên đăng nhập", + "change_email": "Đổi email", "edit": "Chỉnh sửa", - "default_picture": "Default Icon", + "default_picture": "Icon mặc định", "uploaded_picture": "Ảnh đã tải lên", "upload_new_picture": "Tải lên ảnh mới", "upload_new_picture_from_url": "Tải ảnh mới từ URL", @@ -54,11 +54,12 @@ "confirm_password": "Xác nhận mật khẩu", "password": "Mật khẩu", "username_taken_workaround": "Tên truy cập này đã tồn tại, vì vậy chúng tôi đã sửa đổi nó một chút. Tên truy cập của bạn giờ là %1", - "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_username": "Mật khẩu của bạn trùng với tên đăng nhập, vui lòng chọn một mật khẩu khác.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "Tải lên hình ảnh", "upload_a_picture": "Tải lên một hình ảnh", - "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "remove_uploaded_picture": "Xoá ảnh đã tải lên", + "upload_cover_picture": "Upload cover picture", "settings": "Thiết lập", "show_email": "Hiện Email của tôi", "show_fullname": "Hiện tên đầy đủ", @@ -74,33 +75,33 @@ "settings-require-reload": "Một số thay đổi trong cài đặt đòi hỏi tải lại. Nhấn vào đây để tải lại trang.", "has_no_follower": "Người dùng này hiện chưa có ai theo dõi :(", "follows_no_one": "Người dùng này hiện chưa theo dõi ai :(", - "has_no_posts": "This user hasn't posted anything yet.", - "has_no_topics": "This user hasn't posted any topics yet.", - "has_no_watched_topics": "This user hasn't watched any topics yet.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_posts": "Thành viên này chưa đăng bài viết nào cả.", + "has_no_topics": "Thành viên này chưa đăng chủ đề nào cả.", + "has_no_watched_topics": "Thành viên này chưa theo dõi chủ đề nào cả.", + "has_no_upvoted_posts": "Thành viên này chưa tán thành bài viết nào cả.", + "has_no_downvoted_posts": "Thành viên này chưa phản đối bài viết nào cả.", + "has_no_voted_posts": "Thành viên này không có bài viết nào được tán thành.", "email_hidden": "Ẩn Email", "hidden": "Đã ẩn", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "Phân trang chủ đề và bài viết thay vì sử dụng cuộn vô hạn", "topics_per_page": "Số chủ đề trong một trang", "posts_per_page": "Số bài viết trong một trang", - "notification_sounds": "Play a sound when you receive a notification", + "notification_sounds": "Phát âm thanh khi bạn nhận được thông báo mới", "browsing": "Đang xem cài đặt", - "open_links_in_new_tab": "Open outgoing links in new tab", + "open_links_in_new_tab": "Mở link trong tab mới.", "enable_topic_searching": "Bật In-topic Searching", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", + "topic_search_help": "Nếu bật, tìm kiếm trong chủ đề sẽ thay thế tính năng tính năng tìm kiếm của trình duyệt và cho phép bạn tìm kiếm trong toàn bộ chủ đề, thay vì chỉ tìm kiếm nội dung đang hiện thị trên màn hình", + "follow_topics_you_reply_to": "Theo dõi chủ đề bạn trả lời", + "follow_topics_you_create": "Theo dõi chủ đề bạn tạo", "grouptitle": "Chọn tên nhóm mà bạn muốn hiển thị", - "no-group-title": "No group title", - "select-skin": "Select a Skin", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", - "sso.not-associated": "Click here to associate with" + "no-group-title": "Không có tên nhóm", + "select-skin": "Chọn một giao diện", + "select-homepage": "Chọn Trang chủ", + "homepage": "Trang chủ", + "homepage_description": "Chọn một trang để sử dụng như trang chủ của diễn đàn hoặc chọn \"None\" để sử dụng trang chủ mặc định.", + "custom_route": "Đường dẫn trang chủ tuỳ chọn", + "custom_route_help": "Nhập đường dẫn ở đây, mà không có dấu gạch chéo ở trước (chẳng hạn \"recent\" hoặc \"popular)", + "sso.title": "Đăng nhập một lần", + "sso.associated": "Đã liên kết với", + "sso.not-associated": "Nhấn vào đây để liên kết với" } \ No newline at end of file diff --git a/public/language/vi/users.json b/public/language/vi/users.json index adf12ca433..0e60994360 100644 --- a/public/language/vi/users.json +++ b/public/language/vi/users.json @@ -1,20 +1,20 @@ { - "latest_users": "Những người dùng mới nhất", - "top_posters": "Những người viết bài nhiều nhất", - "most_reputation": "Uy tín nhất", + "latest_users": "Thành viên mới nhất", + "top_posters": "Thành viên đăng bài nhiều nhất", + "most_reputation": "Thành viên có điểm tín nhiệm cao nhất", "search": "Tìm kiếm", - "enter_username": "Gõ tên người dùng để tìm kiếm", + "enter_username": "Gõ tên thành viên để tìm kiếm", "load_more": "Tải thêm", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", - "filter-by": "Filter By", - "online-only": "Online only", - "invite": "Invite", - "invitation-email-sent": "An invitation email has been sent to %1", - "user_list": "User List", - "recent_topics": "Recent Topics", - "popular_topics": "Popular Topics", - "unread_topics": "Unread Topics", - "categories": "Categories", - "tags": "Tags", - "no-users-found": "No users found!" + "users-found-search-took": "Đã tìm thấy %1 thành viên! Tìm kiếm mất %2 giây.", + "filter-by": "Lọc bằng", + "online-only": "Đang online", + "invite": "Mời", + "invitation-email-sent": "Email mời đã được gửi tới %1", + "user_list": "Danh sách thành viên", + "recent_topics": "Chủ đề mới", + "popular_topics": "Chủ để nổi bật", + "unread_topics": "Chủ đề chưa đọc", + "categories": "Chuyên mục", + "tags": "Thẻ", + "no-users-found": "Không tìm thấy thành viên nào!" } \ No newline at end of file diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index 730af9e35d..ab0a5b42b8 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -50,8 +50,8 @@ "still-uploading": "请等待上传完成", "file-too-big": "上传文件的大小限制为 %1 KB - 请缩减文件大小", "guest-upload-disabled": "未登录用户不允许上传", - "already-favourited": "您已收藏该帖", - "already-unfavourited": "您已取消收藏此帖", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "您不能封禁其他管理员!", "cant-remove-last-admin": "您是唯一的管理员。在删除您的管理员权限前,请添加另一个管理员。", "invalid-image-type": "无效的图像类型。允许的类型有:%1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "请输入您的用户名登录", "invite-maximum-met": "您的邀请人数超出了上限 (%1 超过了 %2)。", "no-session-found": "未登录!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/zh_CN/global.json b/public/language/zh_CN/global.json index 0b11cde25a..e6501acb20 100644 --- a/public/language/zh_CN/global.json +++ b/public/language/zh_CN/global.json @@ -86,5 +86,9 @@ "delete_all": "全部删除", "map": "地图", "sessions": "已登录的会话", - "ip_address": "IP地址" + "ip_address": "IP地址", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index 81e38901cb..45964d8d2b 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "加入小组", "membership.leave-group": "退出小组", "membership.reject": "拒绝", - "new-group.group_name": "组名: " + "new-group.group_name": "组名: ", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/zh_CN/notifications.json b/public/language/zh_CN/notifications.json index 2880311394..9d22253112 100644 --- a/public/language/zh_CN/notifications.json +++ b/public/language/zh_CN/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 和 %2 个其他人在 %3 赞了您的帖子。", "moved_your_post": "您的帖子已被 %1 移动到了 %2", "moved_your_topic": "%1 移动到了 %2", - "favourited_your_post_in": "%1%2 收藏了您的帖子。", - "favourited_your_post_in_dual": "%1%2%3 收藏了您的帖子。", - "favourited_your_post_in_multiple": "%1 和 %2 个其他人在 %3 收藏了您的帖子。", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1%2 标记了一个帖子", "user_flagged_post_in_dual": "%1%2%3 标记了一个帖子", "user_flagged_post_in_multiple": "%1 和 %2 个其他人在 %3 标记了一个帖子", diff --git a/public/language/zh_CN/pages.json b/public/language/zh_CN/pages.json index 1b8ffa7227..bc9f7f1fa5 100644 --- a/public/language/zh_CN/pages.json +++ b/public/language/zh_CN/pages.json @@ -33,12 +33,13 @@ "account/posts": "%1 发布的帖子", "account/topics": "%1 创建的主题", "account/groups": "%1 的小组", - "account/favourites": "%1 收藏的帖子", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "用户设置", "account/watched": "主题已被 %1 关注", "account/upvoted": "帖子被 %1 顶过", "account/downvoted": "帖子被 %1 踩过", "account/best": "%1 发布的最佳帖子", + "confirm": "Email Confirmed", "maintenance.text": "%1 正在进行维护。请稍后再来。", "maintenance.messageIntro": "此外,管理员留下的消息:", "throttled.text": "%1 因负荷超载暂不可用。请稍后再来。" diff --git a/public/language/zh_CN/topic.json b/public/language/zh_CN/topic.json index eb76dc0eaf..7b1a9d98f0 100644 --- a/public/language/zh_CN/topic.json +++ b/public/language/zh_CN/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "停用的版面为灰色", "confirm_move": "移动", "confirm_fork": "分割", - "favourite": "收藏", - "favourites": "收藏", - "favourites.has_no_favourites": "您还没有任何收藏,收藏后的帖子会显示在这里!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "正在加载更多帖子", "move_topic": "移动主题", "move_topics": "移动主题", diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index fd4439ca6b..3eda0be577 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -22,7 +22,7 @@ "profile": "资料", "profile_views": "资料浏览", "reputation": "威望", - "favourites": "收藏的帖子", + "favourites": "Bookmarks", "watched": "已订阅", "followers": "粉丝", "following": "关注", @@ -55,10 +55,11 @@ "password": "密码", "username_taken_workaround": "您申请的用户名已被占用,所以我们稍作更改。您现在的用户名是 %1", "password_same_as_username": "您的密码与用户名相同,请选择另外的密码。", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "上传头像", "upload_a_picture": "上传头像", "remove_uploaded_picture": "删除已上传的头像", - "image_spec": "您只可以上传PNG、JPG或 BMP 格式的文件", + "upload_cover_picture": "Upload cover picture", "settings": "设置", "show_email": "显示我的电子邮箱", "show_fullname": "显示我的全名", diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index c36a4ed0bb..f56559ea37 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -50,8 +50,8 @@ "still-uploading": "請等待上傳完成。", "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "你已經收藏了這篇文章", - "already-unfavourited": "你已放棄收藏這篇文章", + "already-favourited": "You have already bookmarked this post", + "already-unfavourited": "You have already unbookmarked this post", "cant-ban-other-admins": "您無法禁止其他的管理員!", "cant-remove-last-admin": "You are the only administrator. Add another user as an administrator before removing yourself as admin", "invalid-image-type": "無效的圖像類型。允許的類型:%1", @@ -96,5 +96,6 @@ "wrong-login-type-username": "請使用您的使用者名稱進行登錄", "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", - "not-in-room": "User not in room" + "not-in-room": "User not in room", + "no-users-in-room": "No users in this room" } \ No newline at end of file diff --git a/public/language/zh_TW/global.json b/public/language/zh_TW/global.json index 82d1ff0589..10e4169e07 100644 --- a/public/language/zh_TW/global.json +++ b/public/language/zh_TW/global.json @@ -86,5 +86,9 @@ "delete_all": "全部刪除", "map": "Map", "sessions": "Login Sessions", - "ip_address": "IP Address" + "ip_address": "IP Address", + "enter_page_number": "Enter page number", + "upload_file": "Upload file", + "upload": "Upload", + "allowed-file-types": "Allowed file types are %1" } \ No newline at end of file diff --git a/public/language/zh_TW/groups.json b/public/language/zh_TW/groups.json index 170bf7ee23..9e8658c7e1 100644 --- a/public/language/zh_TW/groups.json +++ b/public/language/zh_TW/groups.json @@ -48,5 +48,6 @@ "membership.join-group": "Join Group", "membership.leave-group": "Leave Group", "membership.reject": "Reject", - "new-group.group_name": "Group Name:" + "new-group.group_name": "Group Name:", + "upload-group-cover": "Upload group cover" } \ No newline at end of file diff --git a/public/language/zh_TW/notifications.json b/public/language/zh_TW/notifications.json index 4711f56a36..477d2e91ab 100644 --- a/public/language/zh_TW/notifications.json +++ b/public/language/zh_TW/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", "moved_your_post": "%1 has moved your post to %2", "moved_your_topic": "%1 has moved %2", - "favourited_your_post_in": "%1 收藏了你在 %2的post。", - "favourited_your_post_in_dual": "%1 and %2 have favourited your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have favourited your post in %3.", + "favourited_your_post_in": "%1 has bookmarked your post in %2.", + "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", + "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", "user_flagged_post_in": "%1 舉報了 %2裡的一個post。", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index be4eda4d90..121be06593 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -33,12 +33,13 @@ "account/posts": "Posts made by %1", "account/topics": "Topics created by %1", "account/groups": "%1's Groups", - "account/favourites": "%1's Favourite Posts", + "account/favourites": "%1's Bookmarked Posts", "account/settings": "User Settings", "account/watched": "Topics watched by %1", "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "confirm": "Email Confirmed", "maintenance.text": "目前 %1 正在進行維修。請稍後再來。", "maintenance.messageIntro": "此外,管理員有以下訊息:", "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." diff --git a/public/language/zh_TW/topic.json b/public/language/zh_TW/topic.json index 39184aa828..62f48e9523 100644 --- a/public/language/zh_TW/topic.json +++ b/public/language/zh_TW/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "停用的版面為灰色", "confirm_move": "移動", "confirm_fork": "作為主題", - "favourite": "收藏", - "favourites": "收藏", - "favourites.has_no_favourites": "你還沒有任何收藏,收藏的文章將會出現在這裡!", + "favourite": "Bookmark", + "favourites": "Bookmarks", + "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", "loading_more_posts": "載入更多文章", "move_topic": "移動主題", "move_topics": "移動主題", diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index e0c737d761..b69a38a69f 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -22,7 +22,7 @@ "profile": "個人資料", "profile_views": "資料被查看", "reputation": "聲譽", - "favourites": "我的最愛", + "favourites": "Bookmarks", "watched": "觀看者", "followers": "跟隨者", "following": "正在關注", @@ -55,10 +55,11 @@ "password": "密碼", "username_taken_workaround": "您所註冊的使用者名稱已經被使用了,所以我們將它略微改變。你現在改稱 %1", "password_same_as_username": "Your password is the same as your username, please select another password.", + "password_same_as_email": "Your password is the same as your email, please select another password.", "upload_picture": "上傳頭像", "upload_a_picture": "上傳一張照片", "remove_uploaded_picture": "Remove Uploaded Picture", - "image_spec": "You may only upload PNG, JPG, or BMP files", + "upload_cover_picture": "Upload cover picture", "settings": "設定", "show_email": "顯示我的郵箱", "show_fullname": "顯示我的全名", From fb4f1e1315bed7b425756ad25a396c42b2ba3891 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 29 Feb 2016 11:37:19 -0500 Subject: [PATCH 018/319] 1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae93a9eaef..bc15145237 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "0.9.4", + "version": "1.0.0", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From df8c1abf7dfede6f718655833f5be3a3a41737a2 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Mon, 29 Feb 2016 14:05:17 -0600 Subject: [PATCH 019/319] fast path for mongodb batches (otherwise it's O(n^2) memory, which gets ugly fast) --- src/batch.js | 7 ++++++- src/database/mongo/sorted.js | 38 +++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/batch.js b/src/batch.js index 70ccd8df01..1a425e1a21 100644 --- a/src/batch.js +++ b/src/batch.js @@ -23,6 +23,11 @@ var async = require('async'), return callback(new Error('[[error:process-not-a-function]]')); } + // use the fast path if possible + if (db.processSortedSet && typeof options.doneIf !== 'function' && !utils.isNumber(options.alwaysStartAt)) { + return db.processSortedSet(setKey, process, options.batch || DEFAULT_BATCH_SIZE, callback); + } + // custom done condition options.doneIf = typeof options.doneIf === 'function' ? options.doneIf : function(){}; @@ -58,4 +63,4 @@ var async = require('async'), ); }; -}(exports)); \ No newline at end of file +}(exports)); diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index ba392fa42a..08d7310a3e 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -533,4 +533,40 @@ module.exports = function(db, module) { callback(err, data); }); }; -}; \ No newline at end of file + + module.processSortedSet = function(setKey, process, batch, callback) { + var done = false, ids = [], cursor = db.collection('objects'). + find({_key: setKey}). + sort({score: 1}). + project({_id: 0, value: 1}). + batchSize(batch); + + async.whilst( + function() { + return !done; + }, + function(next) { + cursor.next(function(err, item) { + if (err) { + return next(err); + } + if (item === null) { + done = true; + } else { + ids.push(item.value); + } + + if (ids.length < batch && (!done || ids.length === 0)) { + return next(null); + } + + process(ids, function(err) { + ids = []; + return next(err); + }); + }); + }, + callback + ); + }; +}; From 3d432839c97a7197b917880b733f14b12901c1af Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 1 Mar 2016 12:28:26 -0500 Subject: [PATCH 020/319] using carat range for underscore --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc15145237..862fb7558d 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "templates.js": "0.3.1", "toobusy-js": "^0.4.2", "uglify-js": "^2.6.0", - "underscore": "~1.8.3", + "underscore": "^1.8.3", "underscore.deep": "^0.5.1", "validator": "^5.0.0", "winston": "^2.1.0", From 8b0fa2146c53d4147a8b7edbec0ec5725b8242b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 1 Mar 2016 20:33:36 +0200 Subject: [PATCH 021/319] 1.0.12 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8774b80911..ad611b8336 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "0.9.4", + "version": "1.0.12", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 60fc5c6c5ccafe2734418e8c0e7f52526db7963b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 1 Mar 2016 20:35:26 +0200 Subject: [PATCH 022/319] Revert "1.0.12" This reverts commit 8b0fa2146c53d4147a8b7edbec0ec5725b8242b7. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ad611b8336..8774b80911 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.0.12", + "version": "0.9.4", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 4316c9a566887435ecf7bcc415050576c9e777b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 1 Mar 2016 21:38:36 +0200 Subject: [PATCH 023/319] style changes --- src/database/mongo/sorted.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 08d7310a3e..b79ab7918a 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -535,11 +535,12 @@ module.exports = function(db, module) { }; module.processSortedSet = function(setKey, process, batch, callback) { - var done = false, ids = [], cursor = db.collection('objects'). - find({_key: setKey}). - sort({score: 1}). - project({_id: 0, value: 1}). - batchSize(batch); + var done = false; + var ids = []; + var cursor = db.collection('objects').find({_key: setKey}) + .sort({score: 1}) + .project({_id: 0, value: 1}) + .batchSize(batch); async.whilst( function() { From 2b448a0f760296c92a8e0251b6a568252aef6e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 1 Mar 2016 22:00:28 +0200 Subject: [PATCH 024/319] closes #4293 --- src/user/posts.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/user/posts.js b/src/user/posts.js index e9f64ef073..78a2db0923 100644 --- a/src/user/posts.js +++ b/src/user/posts.js @@ -72,6 +72,9 @@ module.exports = function(User) { }, function(next) { User.setUserField(postData.uid, 'lastposttime', postData.timestamp, next); + }, + function(next) { + User.updateLastOnlineTime(postData.uid, next); } ], callback); }; From 3c7a42c9598a732b9ce99101ce822d2fb7d8d593 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 1 Mar 2016 16:13:01 -0500 Subject: [PATCH 025/319] fixed #4294 --- src/notifications.js | 57 ++++++++++++++++++++++++++++++++++++++- src/user/notifications.js | 26 ++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 86feff02b4..2351319413 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -5,6 +5,7 @@ var async = require('async'), cron = require('cron').CronJob, nconf = require('nconf'), S = require('string'), + _ = require('underscore'), db = require('./database'), User = require('./user'), @@ -80,6 +81,36 @@ var async = require('async'), }); }; + Notifications.findRelated = function(mergeIds, set, callback) { + // A related notification is one in a zset that has the same mergeId + var _nids; + + async.waterfall([ + async.apply(db.getSortedSetRevRange, set, 0, -1), + function(nids, next) { + _nids = nids; + + var keys = nids.map(function(nid) { + return 'notifications:' + nid; + }); + + db.getObjectsFields(keys, ['mergeId'], next); + }, + ], function(err, sets) { + if (err) { + return callback(err); + } + + sets = sets.map(function(set) { + return set.mergeId; + }); + + callback(null, _nids.filter(function(nid, idx) { + return mergeIds.indexOf(sets[idx]) !== -1 + })); + }); + }; + Notifications.create = function(data, callback) { if (!data.nid) { return callback(new Error('no-notification-id')); @@ -255,15 +286,39 @@ var async = require('async'), return 'notifications:' + nid; }); - db.getObjectsFields(notificationKeys, ['nid', 'datetime'], function(err, notificationData) { + async.waterfall([ + async.apply(db.getObjectsFields, notificationKeys, ['mergeId']), + function(mergeIds, next) { + // Isolate mergeIds and find related notifications + mergeIds = mergeIds.map(function(set) { + return set.mergeId; + }).reduce(function(memo, mergeId, idx, arr) { + if (mergeId && idx === arr.indexOf(mergeId)) { + memo.push(mergeId); + } + return memo; + }, []); + + Notifications.findRelated(mergeIds, 'uid:' + uid + ':notifications:unread', next); + }, + function(relatedNids, next) { + notificationKeys = _.union(nids, relatedNids).map(function(nid) { + return 'notifications:' + nid; + }); + + db.getObjectsFields(notificationKeys, ['nid', 'datetime'], next); + } + ], function(err, notificationData) { if (err) { return callback(err); } + // Filter out notifications that didn't exist notificationData = notificationData.filter(function(notification) { return notification && notification.nid; }); + // Extract nid nids = notificationData.map(function(notification) { return notification.nid; }); diff --git a/src/user/notifications.js b/src/user/notifications.js index 6c7634362a..b04cd8ba75 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -208,8 +208,30 @@ var async = require('async'), if (!parseInt(uid, 10)) { return callback(null, 0); } - db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99, function(err, nids) { - callback(err, Array.isArray(nids) ? nids.length : 0); + + // Collapse any notifications with identical mergeIds + async.waterfall([ + async.apply(db.getSortedSetRevRange, 'uid:' + uid + ':notifications:unread', 0, 99), + function(nids, next) { + var keys = nids.map(function(nid) { + return 'notifications:' + nid; + }); + + db.getObjectsFields(keys, ['mergeId'], next); + } + ], function(err, mergeIds) { + // A missing (null) mergeId means that notification is counted separately. + mergeIds = mergeIds.map(function(set) { + return set.mergeId; + }); + + callback(err, mergeIds.reduce(function(count, cur, idx, arr) { + if (cur === null || idx === arr.indexOf(cur)) { + ++count; + } + + return count; + }, 0)); }); }; From 9d0f53fcd64a9c37af86c0693b83d8b0c6c5540b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 1 Mar 2016 16:42:19 -0500 Subject: [PATCH 026/319] closed #4098 --- public/language/en_GB/notifications.json | 1 + src/notifications.js | 20 +++++++++++++++----- src/user/approval.js | 3 ++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/public/language/en_GB/notifications.json b/public/language/en_GB/notifications.json index a02cada4a6..07ec757374 100644 --- a/public/language/en_GB/notifications.json +++ b/public/language/en_GB/notifications.json @@ -32,6 +32,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", diff --git a/src/notifications.js b/src/notifications.js index 2351319413..1776103031 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -395,7 +395,8 @@ var async = require('async'), 'notifications:upvoted_your_post_in', 'notifications:user_started_following_you', 'notifications:user_posted_to', - 'notifications:user_flagged_post_in' + 'notifications:user_flagged_post_in', + 'new_register' ], isolated, differentiators, differentiator, modifyIndex, set; @@ -414,7 +415,7 @@ var async = require('async'), // Each isolated mergeId may have multiple differentiators, so process each separately differentiators = isolated.reduce(function(cur, next) { - differentiator = next.mergeId.split('|')[1]; + differentiator = next.mergeId.split('|')[1] || 0; if (cur.indexOf(differentiator) === -1) { cur.push(differentiator); } @@ -423,9 +424,14 @@ var async = require('async'), }, []); differentiators.forEach(function(differentiator) { - set = isolated.filter(function(notifObj) { - return notifObj.mergeId === (mergeId + '|' + differentiator); - }); + if (differentiator === 0 && differentiators.length === 1) { + set = isolated; + } else { + set = isolated.filter(function(notifObj) { + return notifObj.mergeId === (mergeId + '|' + differentiator); + }); + } + modifyIndex = notifications.indexOf(set[0]); if (modifyIndex === -1 || set.length === 1) { return notifications; @@ -450,6 +456,10 @@ var async = require('async'), notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers-1) + ', ' + notifications[modifyIndex].topicTitle + ']]'; } break; + + case 'new_register': + notifications[modifyIndex].bodyShort = '[[notifications:' + mergeId + '_multiple, ' + set.length + ']]'; + break; } // Filter out duplicates diff --git a/src/user/approval.js b/src/user/approval.js index a4a3981002..9ed17be898 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -47,7 +47,8 @@ module.exports = function(User) { notifications.create({ bodyShort: '[[notifications:new_register, ' + username + ']]', nid: 'new_register:' + username, - path: '/admin/manage/registration' + path: '/admin/manage/registration', + mergeId: 'new_register' }, function(err, notification) { if (err || !notification) { return callback(err); From c2b428cc9533db75083f1c83a619cb478b756cd4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 1 Mar 2016 16:48:20 -0500 Subject: [PATCH 027/319] fixes #4289 --- public/src/ajaxify.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index c6b9418693..6b527658b3 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -96,7 +96,9 @@ $(document).ready(function() { app.previousUrl = window.location.href; } - ajaxify.currentPage = url; + var location = document.createElement('a'); + location.href = url; + ajaxify.currentPage = location.pathname; if (window.history && window.history.pushState) { window.history[!quiet ? 'pushState' : 'replaceState']({ From 66cf13e546a80b04cb78cca25bb99d0bdb3258a9 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 1 Mar 2016 17:53:16 -0500 Subject: [PATCH 028/319] topics.deleteTopicField --- src/topics/data.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/topics/data.js b/src/topics/data.js index 48aa81419e..dec8c60d69 100644 --- a/src/topics/data.js +++ b/src/topics/data.js @@ -78,4 +78,8 @@ module.exports = function(Topics) { db.setObjectField('topic:' + tid, field, value, callback); }; + Topics.deleteTopicField = function(tid, field, callback) { + db.deleteObjectField('topic:' + tid, field, callback); + }; + }; \ No newline at end of file From 09e5f053f064161a8c6b1beacb9358451d7f164e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 1 Mar 2016 18:16:51 -0500 Subject: [PATCH 029/319] action:post.tools.load --- public/src/client/topic/postTools.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 803955c092..9ac20b1ac4 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -28,6 +28,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator var postEl = $this.parents('[data-pid]'); var pid = postEl.attr('data-pid'); var index = parseInt(postEl.attr('data-index'), 10); + socket.emit('posts.loadPostTools', {pid: pid, cid: ajaxify.data.cid}, function(err, data) { if (err) { return app.alertError(err); @@ -38,6 +39,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator templates.parse('partials/topic/post-menu-list', data, function(html) { translator.translate(html, function(html) { dropdownMenu.html(html); + $(window).trigger('action:post.tools.load'); }); }); }); From effcd205977cc40d8ff8b13fbc6de9ba53c44805 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 1 Mar 2016 18:40:15 -0500 Subject: [PATCH 030/319] fixed a bug calling getSortedSetRangeByScoreWithScores --- src/rewards/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rewards/index.js b/src/rewards/index.js index c693b550fc..1b46b190d9 100644 --- a/src/rewards/index.js +++ b/src/rewards/index.js @@ -68,7 +68,7 @@ function getIDsByCondition(condition, callback) { } function filterCompletedRewards(uid, rewards, callback) { - db.getSortedSetRangeByScoreWithScores('uid:' + uid + ':rewards', 0, -1, 1, Infinity, function(err, data) { + db.getSortedSetRangeByScoreWithScores('uid:' + uid + ':rewards', 0, -1, 1, '+inf', function(err, data) { if (err) { return callback(err); } From 56125ac2d0039077cf6bab5f761108bfc61e092f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 1 Mar 2016 18:41:17 -0500 Subject: [PATCH 031/319] up'd rewards --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 862fb7558d..0966081600 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "nodebb-plugin-mentions": "1.0.17", "nodebb-plugin-soundpack-default": "0.1.5", "nodebb-plugin-spam-be-gone": "0.4.5", - "nodebb-rewards-essentials": "0.0.6", + "nodebb-rewards-essentials": "0.0.7", "nodebb-theme-lavender": "3.0.8", "nodebb-theme-persona": "4.0.88", "nodebb-theme-vanilla": "5.0.53", From 8917ea9f8130bc8cfec5821f4bfef2bb6ae18e7e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 2 Mar 2016 15:15:11 +0200 Subject: [PATCH 032/319] closes #4297 --- src/controllers/accounts/helpers.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index f2c579a05e..a7393e1c23 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -89,6 +89,8 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { userData.showHidden = self || isAdmin || isGlobalModerator; userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : []; userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; + userData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; + userData['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); userData.profile_links = filterLinks(results.profile_links, self); userData.sso = results.sso.associations; From 37bca5e40cc112096fb121845c36054ffc49c9df Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 2 Mar 2016 15:15:32 +0200 Subject: [PATCH 033/319] style --- src/controllers/accounts/profile.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/controllers/accounts/profile.js b/src/controllers/accounts/profile.js index d734ebe142..e52b5f4861 100644 --- a/src/controllers/accounts/profile.js +++ b/src/controllers/accounts/profile.js @@ -1,15 +1,15 @@ 'use strict'; -var nconf = require('nconf'), - async = require('async'), - S = require('string'), - - user = require('../../user'), - posts = require('../../posts'), - plugins = require('../../plugins'), - meta = require('../../meta'), - accountHelpers = require('./helpers'), - helpers = require('../helpers'); +var nconf = require('nconf'); +var async = require('async'); +var S = require('string'); + +var user = require('../../user'); +var posts = require('../../posts'); +var plugins = require('../../plugins'); +var meta = require('../../meta'); +var accountHelpers = require('./helpers'); +var helpers = require('../helpers'); var profileController = {}; From 9614bd30d0118ecc550a667e0750bbeea2c2df39 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 2 Mar 2016 15:18:35 +0200 Subject: [PATCH 034/319] other pages --- src/controllers/accounts/helpers.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index a7393e1c23..6d6148b13b 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -157,6 +157,8 @@ helpers.getBaseUser = function(userslug, callerUID, callback) { results.user.showHidden = results.user.isSelf || results.isAdmin || results.isGlobalModerator; results.user.profile_links = filterLinks(results.profile_links, results.user.isSelf); + results.user['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; + resutls.user['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; results.user['cover:url'] = results.user['cover:url'] || require('../../coverPhoto').getDefaultProfileCover(results.user.uid); results.user['cover:position'] = results.user['cover:position'] || '50% 50%'; From 7c2041e8d84fa2c34803a8c5a9a2c7527d2060e9 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 2 Mar 2016 15:58:33 +0200 Subject: [PATCH 035/319] fix typo --- src/controllers/accounts/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index 6d6148b13b..b75ace0576 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -158,7 +158,7 @@ helpers.getBaseUser = function(userslug, callerUID, callback) { results.user.profile_links = filterLinks(results.profile_links, results.user.isSelf); results.user['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; - resutls.user['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; + results.user['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; results.user['cover:url'] = results.user['cover:url'] || require('../../coverPhoto').getDefaultProfileCover(results.user.uid); results.user['cover:position'] = results.user['cover:position'] || '50% 50%'; From cf00371892f4cd16a77c26b45a6d9d43c824ebad Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 2 Mar 2016 16:04:16 +0200 Subject: [PATCH 036/319] closes #4295 --- src/controllers/uploads.js | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index d455eaac2f..17db1741a1 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -46,15 +46,9 @@ uploadsController.upload = function(req, res, filesIterator, next) { uploadsController.uploadPost = function(req, res, next) { uploadsController.upload(req, res, function(uploadedFile, next) { if (uploadedFile.type.match(/image./)) { - file.isFileTypeAllowed(uploadedFile.path, function(err, tempPath) { - if (err) { - return next(err); - } - - uploadImage(req.user ? req.user.uid : 0, uploadedFile, next); - }); + uploadImage(req.uid, uploadedFile, next); } else { - uploadFile(req.user ? req.user.uid : 0, uploadedFile, next); + uploadFile(req.uid, uploadedFile, next); } }, next); }; @@ -82,7 +76,7 @@ uploadsController.uploadThumb = function(req, res, next) { if (err) { return next(err); } - uploadImage(req.user ? req.user.uid : 0, uploadedFile, next); + uploadImage(req.uid, uploadedFile, next); }); } else { next(new Error('[[error:invalid-file]]')); @@ -108,11 +102,16 @@ function uploadImage(uid, image, callback) { return plugins.fireHook('filter:uploadImage', {image: image, uid: uid}, callback); } - if (parseInt(meta.config.allowFileUploads, 10)) { - uploadFile(uid, image, callback); - } else { - callback(new Error('[[error:uploads-are-disabled]]')); - } + file.isFileTypeAllowed(image.path, function(err, tempPath) { + if (err) { + return callback(err); + } + if (parseInt(meta.config.allowFileUploads, 10)) { + uploadFile(uid, image, callback); + } else { + callback(new Error('[[error:uploads-are-disabled]]')); + } + }); } function uploadFile(uid, uploadedFile, callback) { From 07266eab9eb067c10911cd72ae7ac5e41d7201eb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 2 Mar 2016 16:43:10 +0200 Subject: [PATCH 037/319] closes #3793 --- public/src/client/infinitescroll.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/src/client/infinitescroll.js b/public/src/client/infinitescroll.js index b05c3a5a10..42443aa27e 100644 --- a/public/src/client/infinitescroll.js +++ b/public/src/client/infinitescroll.js @@ -23,6 +23,9 @@ define('forum/infinitescroll', ['translator'], function(translator) { }; function onScroll() { + if (loadingMore) { + return; + } var currentScrollTop = $(window).scrollTop(); var wh = $(window).height(); var viewportHeight = container.height() - wh; From 45bc387749bd0a01eadf6f3a2a252ee4dc62a50b Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 1 Mar 2016 18:51:41 -0500 Subject: [PATCH 038/319] Revert "fixes #4289" This reverts commit c2b428cc9533db75083f1c83a619cb478b756cd4. --- public/src/ajaxify.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 6b527658b3..c6b9418693 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -96,9 +96,7 @@ $(document).ready(function() { app.previousUrl = window.location.href; } - var location = document.createElement('a'); - location.href = url; - ajaxify.currentPage = location.pathname; + ajaxify.currentPage = url; if (window.history && window.history.pushState) { window.history[!quiet ? 'pushState' : 'replaceState']({ From 92f86eee9cf7cbf883a3e2657a0e7aeab9e0ef5f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 2 Mar 2016 13:05:30 -0500 Subject: [PATCH 039/319] closes #4296 --- src/views/admin/settings/general.tpl | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/views/admin/settings/general.tpl b/src/views/admin/settings/general.tpl index 147657195e..fa41b38f61 100644 --- a/src/views/admin/settings/general.tpl +++ b/src/views/admin/settings/general.tpl @@ -102,7 +102,7 @@
-
Miscellaneous
+
Outgoing Links
@@ -111,13 +111,6 @@ Use Outgoing Links Warning Page
-
- -
-
From e8de1b268e9ff64dfdb832350251fbda5f2dc35e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 2 Mar 2016 13:15:22 -0500 Subject: [PATCH 040/319] https://github.com/NodeBB/NodeBB/issues/4287 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 0966081600..2412691472 100644 --- a/package.json +++ b/package.json @@ -48,13 +48,13 @@ "nodebb-plugin-emoji-extended": "0.5.0", "nodebb-plugin-markdown": "4.0.17", "nodebb-plugin-mentions": "1.0.17", - "nodebb-plugin-soundpack-default": "0.1.5", + "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.5", - "nodebb-rewards-essentials": "0.0.7", + "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.8", "nodebb-theme-persona": "4.0.88", "nodebb-theme-vanilla": "5.0.53", - "nodebb-widget-essentials": "2.0.6", + "nodebb-widget-essentials": "2.0.7", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", "nodemailer-smtp-transport": "^2.4.1", From 329a7a1e08b5e9d84ac41244cf7c42d9f8629940 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 2 Mar 2016 23:56:47 -0500 Subject: [PATCH 041/319] @barisusakli fixing minfile caching for multiple processes --- app.js | 4 ++-- src/meta/js.js | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 445b21c845..da819da310 100644 --- a/app.js +++ b/app.js @@ -151,8 +151,8 @@ function start() { meta.reload(); break; case 'js-propagate': - meta.js.cache = message.cache; - meta.js.map = message.map; + meta.js.target[message.target].cache = message.cache; + meta.js.target[message.target].map = message.map; emitter.emit('meta:js.compiled'); winston.verbose('[cluster] Client-side javascript and mapping propagated to worker %s', process.pid); break; diff --git a/src/meta/js.js b/src/meta/js.js index 314e10a400..3d791d9d3d 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -115,7 +115,8 @@ module.exports = function(Meta) { process.send({ action: 'js-propagate', cache: Meta.js.target[target].cache, - map: Meta.js.target[target].map + map: Meta.js.target[target].map, + target: target }); } From aa2af345f9c60824aa4028f98e64fa35633f4a69 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 2 Mar 2016 23:58:01 -0500 Subject: [PATCH 042/319] removed unused deps --- app.js | 5 +---- src/meta/js.js | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app.js b/app.js index da819da310..483a6f0004 100644 --- a/app.js +++ b/app.js @@ -25,13 +25,10 @@ nconf.argv().env('__'); var url = require('url'), async = require('async'), - semver = require('semver'), winston = require('winston'), - colors = require('colors'), path = require('path'), pkg = require('./package.json'), - file = require('./src/file'), - utils = require('./public/src/utils.js'); + file = require('./src/file'); global.env = process.env.NODE_ENV || 'production'; diff --git a/src/meta/js.js b/src/meta/js.js index 3d791d9d3d..d8e4c04143 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -4,7 +4,6 @@ var winston = require('winston'), fork = require('child_process').fork, path = require('path'), async = require('async'), - _ = require('underscore'), nconf = require('nconf'), fs = require('fs'), file = require('../file'), From 65cadaf8be2cf851aaa48f83ab98c187f2069712 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 3 Mar 2016 00:03:28 -0500 Subject: [PATCH 043/319] another fix for minfile + multiple processes --- app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app.js b/app.js index 483a6f0004..8023eef6e0 100644 --- a/app.js +++ b/app.js @@ -148,6 +148,7 @@ function start() { meta.reload(); break; case 'js-propagate': + meta.js.target[message.target] = meta.js.target[message.target] || {}; meta.js.target[message.target].cache = message.cache; meta.js.target[message.target].map = message.map; emitter.emit('meta:js.compiled'); From 80b0815d389b8b548e978e246c836ce941a21a8d Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 3 Mar 2016 00:09:52 -0500 Subject: [PATCH 044/319] @barisusakli last one --- loader.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/loader.js b/loader.js index 20e8335a9a..5451a4e412 100644 --- a/loader.js +++ b/loader.js @@ -24,8 +24,7 @@ var pidFilePath = __dirname + '/pidfile', Loader = { timesStarted: 0, js: { - cache: undefined, - map: undefined + target: {} }, css: { cache: undefined, @@ -86,11 +85,12 @@ Loader.addWorkerEvents = function(worker) { if (message && typeof message === 'object' && message.action) { switch (message.action) { case 'ready': - if (Loader.js.cache && !worker.isPrimary) { + if (Loader.js[message.target].cache && !worker.isPrimary) { worker.send({ action: 'js-propagate', - cache: Loader.js.cache, - map: Loader.js.map + cache: Loader.js[message.target].cache, + map: Loader.js[message.target].map, + target: message.target }); } @@ -113,13 +113,15 @@ Loader.addWorkerEvents = function(worker) { Loader.reload(); break; case 'js-propagate': - Loader.js.cache = message.cache; - Loader.js.map = message.map; + Loader.js.target[message.target] = Loader.js.target[message.target] || {}; + Loader.js.target[message.target].cache = message.cache; + Loader.js.target[message.target].map = message.map; Loader.notifyWorkers({ action: 'js-propagate', cache: message.cache, - map: message.map + map: message.map, + loader: message.loader }, worker.pid); break; case 'css-propagate': From c512fed93a95bf567a42948f277a9766347aae1b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 07:14:35 +0200 Subject: [PATCH 045/319] one more fix --- loader.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/loader.js b/loader.js index 5451a4e412..13572d26fc 100644 --- a/loader.js +++ b/loader.js @@ -85,12 +85,21 @@ Loader.addWorkerEvents = function(worker) { if (message && typeof message === 'object' && message.action) { switch (message.action) { case 'ready': - if (Loader.js[message.target].cache && !worker.isPrimary) { + if (Loader.js.target['nodebb.min.js'].cache && !worker.isPrimary) { worker.send({ action: 'js-propagate', - cache: Loader.js[message.target].cache, - map: Loader.js[message.target].map, - target: message.target + cache: Loader.js.target['nodebb.min.js'].cache, + map: Loader.js.target['nodebb.min.js'].map, + target: 'nodebb.min.js' + }); + } + + if (Loader.js.target['acp.min.js'].cache && !worker.isPrimary) { + worker.send({ + action: 'js-propagate', + cache: Loader.js.target['acp.min.js'].cache, + map: Loader.js.target['acp.min.js'].map, + target: 'acp.min.js' }); } From 9527ac6255387316ac96b2e15fbdb74ee0e34ad7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 07:20:07 +0200 Subject: [PATCH 046/319] more fixes to loader --- loader.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/loader.js b/loader.js index 13572d26fc..5676a02bbd 100644 --- a/loader.js +++ b/loader.js @@ -85,7 +85,7 @@ Loader.addWorkerEvents = function(worker) { if (message && typeof message === 'object' && message.action) { switch (message.action) { case 'ready': - if (Loader.js.target['nodebb.min.js'].cache && !worker.isPrimary) { + if (Loader.js.target['nodebb.min.js'] && Loader.js.target['nodebb.min.js'].cache && !worker.isPrimary) { worker.send({ action: 'js-propagate', cache: Loader.js.target['nodebb.min.js'].cache, @@ -94,7 +94,7 @@ Loader.addWorkerEvents = function(worker) { }); } - if (Loader.js.target['acp.min.js'].cache && !worker.isPrimary) { + if (Loader.js.target['acp.min.js'] && Loader.js.target['acp.min.js'].cache && !worker.isPrimary) { worker.send({ action: 'js-propagate', cache: Loader.js.target['acp.min.js'].cache, @@ -130,7 +130,7 @@ Loader.addWorkerEvents = function(worker) { action: 'js-propagate', cache: message.cache, map: message.map, - loader: message.loader + target: message.target }, worker.pid); break; case 'css-propagate': From e55168aa11e44fbc11c772919a215c0a325e53a5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 13:31:39 +0200 Subject: [PATCH 047/319] fix plugin warnings --- src/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins.js b/src/plugins.js index cb015cf1d1..21c67e9303 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -115,7 +115,7 @@ var fs = require('fs'), process.stdout.write('\n'); winston.warn('[plugins/load] The following plugins may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing. In the event of an unresponsive NodeBB caused by this plugin, run `./nodebb reset -p PLUGINNAME` to disable it.'); for(var x=0,numPlugins=Plugins.versionWarning.length;x Date: Thu, 3 Mar 2016 13:51:42 +0200 Subject: [PATCH 048/319] closes #4299 --- public/src/client/chats.js | 2 +- public/src/modules/chat.js | 2 +- src/messaging/rooms.js | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 21da307713..280123d4c0 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -376,7 +376,7 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll', Chats.onChatEdit(); socket.on('event:chats.roomRename', function(data) { - $('[component="chat/room/name"]').val(data.newName); + $('[component="chat/room/name"]').val($('
').html(data.newName).text()); }); }; diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 7721b6e70a..5fd69083da 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -71,7 +71,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra }); socket.on('event:chats.roomRename', function(data) { - module.getModal(data.roomId).find('[component="chat/room/name"]').val(data.newName); + module.getModal(data.roomId).find('[component="chat/room/name"]').val($('
').html(data.newName).text()); }); Chats.onChatEdit(); diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js index 784c6cb2c0..0c9c5bb01f 100644 --- a/src/messaging/rooms.js +++ b/src/messaging/rooms.js @@ -147,7 +147,10 @@ module.exports = function(Messaging) { if (!newName) { return callback(new Error('[[error:invalid-name]]')); } - + newName = newName.trim(); + if (newName.length > 75) { + return callback(new Error('[[error:chat-room-name-too-long]]')); + } async.waterfall([ function (next) { Messaging.isRoomOwner(uid, roomId, next); From 3bb484b234c0c027d0d0abc8d6cec25b9d3bd425 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 14:24:26 +0200 Subject: [PATCH 049/319] https://github.com/NodeBB/NodeBB/issues/4287 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2412691472..0b25fab84b 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "nodebb-plugin-dbsearch": "0.3.1", "nodebb-plugin-emoji-extended": "0.5.0", "nodebb-plugin-markdown": "4.0.17", - "nodebb-plugin-mentions": "1.0.17", + "nodebb-plugin-mentions": "1.0.18", "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", From 974fa7b253720597668ccec6eac67c962146985d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 15:01:07 +0200 Subject: [PATCH 050/319] temp disable for #4302 --- public/src/client/categories.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/src/client/categories.js b/public/src/client/categories.js index 03885a4e23..3a17c29633 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -14,8 +14,9 @@ define('forum/categories', ['components', 'translator'], function(components, tr categories.init = function() { app.enterRoom('categories'); - socket.removeListener('event:new_post', categories.onNewPost); - socket.on('event:new_post', categories.onNewPost); + // enable once https://github.com/NodeBB/NodeBB/issues/4302 is fixed + // socket.removeListener('event:new_post', categories.onNewPost); + // socket.on('event:new_post', categories.onNewPost); $('.category-header').tooltip({ placement: 'bottom' From 4a649be94e4c7f93d0a2c9e3fc2e7c12da3c90cd Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 15:05:34 +0200 Subject: [PATCH 051/319] https://github.com/NodeBB/NodeBB/issues/4287 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0b25fab84b..e9d8fc68a1 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.8", - "nodebb-theme-persona": "4.0.88", - "nodebb-theme-vanilla": "5.0.53", + "nodebb-theme-persona": "4.0.90", + "nodebb-theme-vanilla": "5.0.54", "nodebb-widget-essentials": "2.0.7", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", From 49e12e94340cbe2ac4d12bea659890e3b94c6f65 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 15:16:18 +0200 Subject: [PATCH 052/319] https://github.com/NodeBB/NodeBB/issues/4287 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9d8fc68a1..6dab6260d2 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "morgan": "^1.3.2", "nconf": "~0.8.2", "nodebb-plugin-composer-default": "3.0.6", - "nodebb-plugin-dbsearch": "0.3.1", + "nodebb-plugin-dbsearch": "0.3.2", "nodebb-plugin-emoji-extended": "0.5.0", "nodebb-plugin-markdown": "4.0.17", "nodebb-plugin-mentions": "1.0.18", From 1a1d322d9c693f538e170364ef12170e16af3094 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 17:12:52 +0200 Subject: [PATCH 053/319] closes #4305 --- src/user/data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/data.js b/src/user/data.js index 04c6d0e999..66fedbefcd 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -94,7 +94,7 @@ module.exports = function(User) { return; } - user.username = validator.escape(user.username || ''); + user.username = validator.escape(user.username ? user.username.toString() : ''); if (user.password) { user.password = undefined; From 2d4fde5af3deadb477e6e9c4b23d42b38b5def74 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 17:53:38 +0200 Subject: [PATCH 054/319] closes #4306 dont escape username twice, its already escape in user/data.js --- src/controllers/accounts/helpers.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index b75ace0576..0a35315854 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -102,7 +102,6 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { userData.followingCount = parseInt(userData.followingCount, 10) || 0; userData.followerCount = parseInt(userData.followerCount, 10) || 0; - userData.username = validator.escape(userData.username || ''); userData.email = validator.escape(userData.email || ''); userData.fullname = validator.escape(userData.fullname || ''); userData.location = validator.escape(userData.location || ''); From b2b104dab316fcbff40917044391e22f919718aa Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 18:15:20 +0200 Subject: [PATCH 055/319] closes #4306 --- public/src/modules/autocomplete.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/public/src/modules/autocomplete.js b/public/src/modules/autocomplete.js index ecf15c2ead..60a5550b8c 100644 --- a/public/src/modules/autocomplete.js +++ b/public/src/modules/autocomplete.js @@ -9,7 +9,7 @@ define('autocomplete', function() { module.user = function (input, onselect) { app.loadJQueryUI(function() { input.autocomplete({ - delay: 100, + delay: 200, open: function() { $(this).autocomplete('widget').css('z-index', 20000); }, @@ -22,9 +22,10 @@ define('autocomplete', function() { if (result && result.users) { var names = result.users.map(function(user) { + var username = $('
').html(user.username).text() return user && { - label: user.username, - value: user.username, + label: username, + value: username, user: { uid: user.uid, name: user.username, @@ -44,7 +45,7 @@ define('autocomplete', function() { module.group = function(input, onselect) { app.loadJQueryUI(function() { input.autocomplete({ - delay: 100, + delay: 200, select: onselect, source: function(request, response) { socket.emit('groups.search', { From 018f7ba65aeb0fdc907b651281c65467be15e5e4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 19:52:48 +0200 Subject: [PATCH 056/319] closes #4307 ability to send an array of keys to getSortedSetRange use getSortedSetRevRange instead of getSortedSetRevUnion --- src/categories/topics.js | 14 ++------ src/database/mongo/sorted.js | 6 ++++ src/database/redis/sorted.js | 62 +++++++++++++++++++++++++----------- src/groups.js | 2 +- 4 files changed, 54 insertions(+), 30 deletions(-) diff --git a/src/categories/topics.js b/src/categories/topics.js index b38a861f91..8ee7105256 100644 --- a/src/categories/topics.js +++ b/src/categories/topics.js @@ -53,18 +53,10 @@ module.exports = function(Categories) { }; Categories.getTopicIds = function(set, reverse, start, stop, callback) { - if (Array.isArray(set)) { - if (reverse) { - db.getSortedSetRevUnion(set, start, stop, callback); - } else { - db.getSortedSetUnion(set, start, stop, callback); - } + if (reverse) { + db.getSortedSetRevRange(set, start, stop, callback); } else { - if (reverse) { - db.getSortedSetRevRange(set, start, stop, callback); - } else { - db.getSortedSetRange(set, start, stop, callback); - } + db.getSortedSetRange(set, start, stop, callback); } }; diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index b79ab7918a..db1c698e0b 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -125,6 +125,11 @@ module.exports = function(db, module) { if (withScores) { fields.score = 1; } + + if (Array.isArray(key)) { + key = {$in: key}; + } + db.collection('objects').find({_key: key}, {fields: fields}) .limit(stop - start + 1) .skip(start) @@ -459,6 +464,7 @@ module.exports = function(db, module) { getSortedSetUnion(sets, -1, start, stop, callback); }; + function getSortedSetUnion(sets, sort, start, stop, callback) { if (!Array.isArray(sets) || !sets.length) { return callback(); diff --git a/src/database/redis/sorted.js b/src/database/redis/sorted.js index 8d9b35896d..0341c043f7 100644 --- a/src/database/redis/sorted.js +++ b/src/database/redis/sorted.js @@ -76,29 +76,41 @@ module.exports = function(redisClient, module) { }; module.getSortedSetRange = function(key, start, stop, callback) { - redisClient.zrange(key, start, stop, callback); + sortedSetRange('zrange', key, start, stop, false, callback); }; module.getSortedSetRevRange = function(key, start, stop, callback) { - redisClient.zrevrange(key, start, stop, callback); + sortedSetRange('zrevrange', key, start, stop, false, callback); }; module.getSortedSetRangeWithScores = function(key, start, stop, callback) { - sortedSetRangeWithScores('zrange', key, start, stop, callback); + sortedSetRange('zrange', key, start, stop, true, callback); }; module.getSortedSetRevRangeWithScores = function(key, start, stop, callback) { - sortedSetRangeWithScores('zrevrange', key, start, stop, callback); + sortedSetRange('zrevrange', key, start, stop, true, callback); }; - function sortedSetRangeWithScores(method, key, start, stop, callback) { - redisClient[method]([key, start, stop, 'WITHSCORES'], function(err, data) { + function sortedSetRange(method, key, start, stop, withScores, callback) { + if (Array.isArray(key)) { + return sortedSetUnion(method, key, start, stop, withScores, callback); + } + + var params = [key, start, stop]; + if (withScores) { + params.push('WITHSCORES'); + } + + redisClient[method](params, function(err, data) { if (err) { return callback(err); } + if (!withScores) { + return callback(null, data); + } var objects = []; for(var i=0; i Date: Thu, 3 Mar 2016 11:59:40 -0500 Subject: [PATCH 057/319] Revert "temp disable for #4302" This reverts commit 974fa7b253720597668ccec6eac67c962146985d. --- public/src/client/categories.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/src/client/categories.js b/public/src/client/categories.js index 3a17c29633..03885a4e23 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -14,9 +14,8 @@ define('forum/categories', ['components', 'translator'], function(components, tr categories.init = function() { app.enterRoom('categories'); - // enable once https://github.com/NodeBB/NodeBB/issues/4302 is fixed - // socket.removeListener('event:new_post', categories.onNewPost); - // socket.on('event:new_post', categories.onNewPost); + socket.removeListener('event:new_post', categories.onNewPost); + socket.on('event:new_post', categories.onNewPost); $('.category-header').tooltip({ placement: 'bottom' From 5d01060fbc9d3224fe2cb42909c60342a1b034da Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 3 Mar 2016 13:12:03 -0500 Subject: [PATCH 058/319] closes #4302 --- public/src/client/categories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/categories.js b/public/src/client/categories.js index 03885a4e23..9187a8cfe8 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -59,7 +59,7 @@ define('forum/categories', ['components', 'translator'], function(components, tr } function parseAndTranslate(posts, callback) { - templates.parse('categories', 'categories.posts', {categories: {posts: posts}}, function(html) { + templates.parse('categories', '(categories.)?posts', {categories: {posts: posts}}, function(html) { translator.translate(html, function(translatedHTML) { translatedHTML = $(translatedHTML); translatedHTML.find('img:not(.not-responsive)').addClass('img-responsive'); From 2936e79740d51222bab806856981f1b923b0b297 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 3 Mar 2016 13:12:19 -0500 Subject: [PATCH 059/319] up tjs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6dab6260d2..19ef49f47c 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "socket.io-redis": "^1.0.0", "socketio-wildcard": "~0.3.0", "string": "^3.0.0", - "templates.js": "0.3.1", + "templates.js": "0.3.3", "toobusy-js": "^0.4.2", "uglify-js": "^2.6.0", "underscore": "^1.8.3", From f3d2ad5f1f172b3bd9706da049336a691aa58864 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 20:13:30 +0200 Subject: [PATCH 060/319] lets break some themes :evil: --- src/posts.js | 4 ++-- src/posts/summary.js | 2 +- src/topics/create.js | 2 +- src/topics/data.js | 2 +- src/topics/teaser.js | 2 +- src/user/approval.js | 2 +- src/views/admin/manage/flags.tpl | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/posts.js b/src/posts.js index 0f3cad00f9..a3d19e7a7f 100644 --- a/src/posts.js +++ b/src/posts.js @@ -56,8 +56,8 @@ var async = require('async'), return next(); } - post.relativeTime = utils.toISOString(post.timestamp); - post.relativeEditTime = parseInt(post.edited, 10) !== 0 ? utils.toISOString(post.edited) : ''; + post.timestampISO = utils.toISOString(post.timestamp); + post.editedISO = parseInt(post.edited, 10) !== 0 ? utils.toISOString(post.edited) : ''; Posts.parsePost(post, next); }, next); }, diff --git a/src/posts/summary.js b/src/posts/summary.js index 0d9822b30c..3cb5586bc6 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -81,7 +81,7 @@ module.exports = function(Posts) { post.user = results.users[post.uid]; post.topic = results.topics[post.tid]; post.category = results.categories[post.topic.cid]; - post.relativeTime = utils.toISOString(post.timestamp); + post.timestampISO = utils.toISOString(post.timestamp); if (!post.content || !options.parse) { if (options.stripTags) { diff --git a/src/topics/create.js b/src/topics/create.js index 6c7c4bccf1..e9669d4c44 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -307,7 +307,7 @@ module.exports = function(Topics) { postData.display_moderator_tools = true; postData.display_move_tools = true; postData.selfPost = false; - postData.relativeTime = utils.toISOString(postData.timestamp); + postData.timestampISO = utils.toISOString(postData.timestamp); postData.topic.title = validator.escape(postData.topic.title); next(null, postData); diff --git a/src/topics/data.js b/src/topics/data.js index dec8c60d69..a32ce5256a 100644 --- a/src/topics/data.js +++ b/src/topics/data.js @@ -60,7 +60,7 @@ module.exports = function(Topics) { } topic.titleRaw = topic.title; topic.title = validator.escape(topic.title); - topic.relativeTime = utils.toISOString(topic.timestamp); + topic.timestampISO = utils.toISOString(topic.timestamp); topic.lastposttimeISO = utils.toISOString(topic.lastposttime); } diff --git a/src/topics/teaser.js b/src/topics/teaser.js index 3973e8ebd6..c772b271d4 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -60,7 +60,7 @@ module.exports = function(Topics) { } post.user = users[post.uid]; - post.timestamp = utils.toISOString(post.timestamp); + post.timestampISO = utils.toISOString(post.timestamp); tidToPost[post.tid] = post; posts.parsePost(post, next); }, next); diff --git a/src/user/approval.js b/src/user/approval.js index 9ed17be898..890d6ee2ca 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -149,7 +149,7 @@ module.exports = function(User) { function(users, next) { users.forEach(function(user, index) { if (user) { - user.timestamp = utils.toISOString(data[index].score); + user.timestampISO = utils.toISOString(data[index].score); } }); diff --git a/src/views/admin/manage/flags.tpl b/src/views/admin/manage/flags.tpl index 6370630c20..b6abe3252a 100644 --- a/src/views/admin/manage/flags.tpl +++ b/src/views/admin/manage/flags.tpl @@ -57,7 +57,7 @@
- Posted in {posts.category.name}, • + Posted in {posts.category.name}, Read More From 392814824ea78efea955d33ad4931af1810900a4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 20:18:42 +0200 Subject: [PATCH 061/319] fix timestamp --- src/views/admin/manage/registration.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index 278ba279b1..6cf35b65cc 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -44,7 +44,7 @@ {users.ip} - +
From c7ca045d0b4e541d3e2cb47a3aa17e4bccafcefb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 20:28:30 +0200 Subject: [PATCH 062/319] fix teaserTimestamp --- src/controllers/categories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 28a4f92192..7ed087c704 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -66,7 +66,7 @@ categoriesController.list = function(req, res, next) { if (category && Array.isArray(category.posts) && category.posts.length) { category.teaser = { url: nconf.get('relative_path') + '/topic/' + category.posts[0].topic.slug + '/' + category.posts[0].index, - timestampISO: category.posts[0].timestamp + timestampISO: category.posts[0].timestampISO }; } }); From e03bacf032ae46e268c7c2633ee0796587e04327 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 3 Mar 2016 20:35:54 +0200 Subject: [PATCH 063/319] fixes timeago --- public/src/client/categories.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/client/categories.js b/public/src/client/categories.js index 9187a8cfe8..a73ed617bb 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -49,6 +49,7 @@ define('forum/categories', ['components', 'translator'], function(components, tr html.fadeIn(); app.createUserTooltips(); + html.find('.timeago').timeago(); if (category.find('[component="category/posts"]').length > parseInt(numRecentReplies, 10)) { recentPosts.last().remove(); @@ -63,7 +64,7 @@ define('forum/categories', ['components', 'translator'], function(components, tr translator.translate(html, function(translatedHTML) { translatedHTML = $(translatedHTML); translatedHTML.find('img:not(.not-responsive)').addClass('img-responsive'); - translatedHTML.find('.timeago').timeago(); + callback(translatedHTML); }); }); From 4ba667fa61bd1bdc1ab821e1fb87e4a7def32ef2 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 3 Mar 2016 15:11:42 -0500 Subject: [PATCH 064/319] closes #4303 Resolves regression introduced in aa2af345f9c60824aa4028f98e64fa35633f4a69 --- app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app.js b/app.js index 8023eef6e0..c75c70f9cf 100644 --- a/app.js +++ b/app.js @@ -26,6 +26,7 @@ nconf.argv().env('__'); var url = require('url'), async = require('async'), winston = require('winston'), + colors = require('colors'), path = require('path'), pkg = require('./package.json'), file = require('./src/file'); From 3abe19ffcf325086c830555dfb63e74f4455497f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 3 Mar 2016 16:14:22 -0500 Subject: [PATCH 065/319] updated emoji extended to install latest, @frissdiegurke --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19ef49f47c..4a2f0c7ad1 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "nconf": "~0.8.2", "nodebb-plugin-composer-default": "3.0.6", "nodebb-plugin-dbsearch": "0.3.2", - "nodebb-plugin-emoji-extended": "0.5.0", + "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", "nodebb-plugin-mentions": "1.0.18", "nodebb-plugin-soundpack-default": "0.1.6", From 4d87f0276bfe0eed7e9d3cca5d552c948e48e1c5 Mon Sep 17 00:00:00 2001 From: HSam Date: Thu, 3 Mar 2016 21:09:44 -0600 Subject: [PATCH 066/319] In the process of adding the delete button to the invitation panel. Apparently, the delete method doesn't work with the invitation items, so I might need to add some extra logic. --- public/src/admin/manage/registration.js | 18 ++++++++++++++++++ src/socket.io/admin/user.js | 6 +++++- src/user/invite.js | 1 + src/views/admin/manage/registration.tpl | 13 +++++++++---- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 0592fc02a9..981f1e812c 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -22,6 +22,24 @@ define('admin/manage/registration', function() { }); return false; }); + + $('.invites-list').on('click', '[data-action]', function(ev) { + var $this = this; + var parent = $(this).parents('[data-invitation-mail]'); + var email = parent.attr('data-invitation-mail'); + var action = $(this).attr('data-action'); + var method = 'admin.user.deleteInvitation'; + + if (action === 'delete') { + socket.emit(method, {email: email}, function(err) { + if (err) { + return app.alertError(err.message); + } + parent.remove(); + }); + } + return false; + }); }; return Registration; diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index a241affb90..4597314ee1 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -212,6 +212,10 @@ User.search = function(socket, data, callback) { }); }; +User.deleteInvitation = function(socket, data, callback) { + user.deleteInvitation(data.email, callback); +}; + User.acceptRegistration = function(socket, data, callback) { user.acceptRegistration(data.username, callback); }; @@ -221,4 +225,4 @@ User.rejectRegistration = function(socket, data, callback) { }; -module.exports = User; \ No newline at end of file +module.exports = User; diff --git a/src/user/invite.js b/src/user/invite.js index 638432e810..99194100e3 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -122,6 +122,7 @@ module.exports = function(User) { User.deleteInvitation = function(email, callback) { callback = callback || function() {}; + console.log('invitation:email:' + email); db.delete('invitation:email:' + email, callback); }; diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index 278ba279b1..a3a8e2f905 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -66,18 +66,23 @@

The username will be displayed to the right of the emails for users who have redeemed their invitations.

- +
- - + + + - + From 6828d4c23920ab9113599dabdb3886aaedb24b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 4 Mar 2016 22:43:55 +0200 Subject: [PATCH 067/319] closes #4306 --- public/src/client/chats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 280123d4c0..9046318212 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -242,7 +242,7 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll', if (data.users && data.users.length) { data.users.forEach(function(user) { - tagEl.tagsinput('add', user.username); + tagEl.tagsinput('add', $('
').html(user.username).text()); }); } From 697ac309f8845050da822848f73e38e8c44eb288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 4 Mar 2016 22:47:08 +0200 Subject: [PATCH 068/319] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4a2f0c7ad1..00892e83e3 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.8", - "nodebb-theme-persona": "4.0.90", + "nodebb-theme-persona": "4.0.91", "nodebb-theme-vanilla": "5.0.54", "nodebb-widget-essentials": "2.0.7", "nodemailer": "2.0.0", From 7180174b91895c907991e29238ecb5822d5d7cb6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 5 Mar 2016 11:45:17 +0200 Subject: [PATCH 069/319] fix global moderators upgrade script --- src/upgrade.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrade.js b/src/upgrade.js index 2d2001fc41..f6f1ce0093 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -384,7 +384,7 @@ Upgrade.upgrade = function(callback) { }, function (exists, next) { if (exists) { - return next(); + return next(null, null); } groups.create({ name: 'Global Moderators', From 41bd65e81a1aa26828e504c1b0a0d08f7f64047a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 5 Mar 2016 19:20:40 +0200 Subject: [PATCH 070/319] fix dashboard stats --- src/socket.io/admin/rooms.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js index bf66873a52..d5e6dd5da6 100644 --- a/src/socket.io/admin/rooms.js +++ b/src/socket.io/admin/rooms.js @@ -105,28 +105,26 @@ function getLocalStats(callback) { onlineRegisteredCount: websockets.getOnlineUserCount(), socketCount: websockets.getSocketCount(), users: { - categories: roomClients.categories ? Object.keys(roomClients.categories).length : 0, - recent: roomClients.recent_topics ? Object.keys(roomClients.recent_topics).length : 0, - unread: roomClients.unread_topics ? Object.keys(roomClients.unread_topics).length: 0, + categories: roomClients.categories ? roomClients.categories.length : 0, + recent: roomClients.recent_topics ? roomClients.recent_topics.length : 0, + unread: roomClients.unread_topics ? roomClients.unread_topics.length: 0, topics: 0, category: 0 }, topics: {} }; - var topTenTopics = [], - tid; + var topTenTopics = []; + var tid; for (var room in roomClients) { if (roomClients.hasOwnProperty(room)) { tid = room.match(/^topic_(\d+)/); if (tid) { - var length = Object.keys(roomClients[room]).length; - socketData.users.topics += length; - - topTenTopics.push({tid: tid[1], count: length}); + socketData.users.topics += roomClients[room].length; + topTenTopics.push({tid: tid[1], count: roomClients[room].length}); } else if (room.match(/^category/)) { - socketData.users.category += Object.keys(roomClients[room]).length; + socketData.users.category += roomClients[room].length; } } } From cf681721d535250fc9628dfd51ff786abf6a9d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 6 Mar 2016 00:45:32 +0200 Subject: [PATCH 071/319] responseJSON is undefined on 502 --- public/src/ajaxify.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index c6b9418693..0d894b588e 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -119,8 +119,9 @@ $(document).ready(function() { if (data.responseJSON) { data.responseJSON.config = config; } + $('#footer, #content').removeClass('hide').addClass('ajaxifying'); - return renderTemplate(url, status.toString(), data.responseJSON, callback); + return renderTemplate(url, status.toString(), data.responseJSON || {}, callback); } else if (status === 401) { app.alertError('[[global:please_log_in]]'); app.previousUrl = url; From 891e747adb59b23faa48de0b16f5626ece1ea914 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Sat, 5 Mar 2016 19:12:41 -0500 Subject: [PATCH 072/319] fixes crash in analytics --- src/analytics.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/analytics.js b/src/analytics.js index c907d784a8..c1ede42eba 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -2,6 +2,7 @@ var cronJob = require('cron').CronJob; var async = require('async'); +var winston = require('winston'); var db = require('./database'); @@ -84,8 +85,10 @@ var db = require('./database'); if (Object.keys(counters).length > 0) { for(var key in counters) { - dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:' + key, counters[key], today.getTime())); - delete counters[key]; + if (counters.hasOwnProperty(key)) { + dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:' + key, counters[key], today.getTime())); + delete counters[key]; + } } } From 48db16fba75cdb999177df0b316c6644c10b0aaa Mon Sep 17 00:00:00 2001 From: HSam Date: Sun, 6 Mar 2016 11:59:31 -0600 Subject: [PATCH 073/319] Finished adding a new delete to also remove the reference from the invites list on the APM. --- public/src/admin/manage/registration.js | 5 +++-- src/controllers/authentication.js | 2 +- src/socket.io/admin/user.js | 2 +- src/user.js | 2 -- src/user/invite.js | 27 +++++++++++++++++++++++-- src/views/admin/manage/registration.tpl | 4 ++-- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 981f1e812c..6de647b467 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -25,13 +25,14 @@ define('admin/manage/registration', function() { $('.invites-list').on('click', '[data-action]', function(ev) { var $this = this; - var parent = $(this).parents('[data-invitation-mail]'); + var parent = $(this).parents('[data-invitation-mail][data-invited-by]'); var email = parent.attr('data-invitation-mail'); + var invitedBy = parent.attr('data-invited-by'); var action = $(this).attr('data-action'); var method = 'admin.user.deleteInvitation'; if (action === 'delete') { - socket.emit(method, {email: email}, function(err) { + socket.emit(method, {email: email, invitedBy: invitedBy}, function(err) { if (err) { return app.alertError(err.message); } diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index fa6cc6fd8c..efa30d36ba 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -93,7 +93,7 @@ function registerAndLoginUser(req, res, userData, callback) { } }, function(next) { - user.deleteInvitation(userData.email); + user.deleteInvitationKey(userData.email); plugins.fireHook('filter:register.complete', {uid: uid, referrer: req.body.referrer || nconf.get('relative_path') + '/'}, next); } ], callback); diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index 4597314ee1..c46e01a99c 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -213,7 +213,7 @@ User.search = function(socket, data, callback) { }; User.deleteInvitation = function(socket, data, callback) { - user.deleteInvitation(data.email, callback); + user.deleteInvitation(data.invitedBy, data.email, callback); }; User.acceptRegistration = function(socket, data, callback) { diff --git a/src/user.js b/src/user.js index e9546b8c6e..582686f774 100644 --- a/src/user.js +++ b/src/user.js @@ -39,7 +39,6 @@ var async = require('async'), if (err || userData.status === 'offline' || now - parseInt(userData.lastonline, 10) < 300000) { return callback(err); } - User.setUserField(uid, 'lastonline', now, callback); }); }; @@ -257,4 +256,3 @@ var async = require('async'), }(exports)); - diff --git a/src/user/invite.js b/src/user/invite.js index 99194100e3..34521550a5 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -120,9 +120,32 @@ module.exports = function(User) { ], callback); }; - User.deleteInvitation = function(email, callback) { + User.deleteInvitation = function(invitedBy, email, callback) { + callback = callback || function() {}; + async.waterfall([ + function getInvitedByUid(next) { + User.getUidByUsername(invitedBy, next); + }, + function deleteRegistries(invitedByUid, next) { + if (!invitedByUid) { + return next(new Error('[[error:invalid-username]]')); + } + async.parallel([ + function deleteFromReferenceList(next) { + db.setRemove('invitation:uid:' + invitedByUid, email, next); + }, + function deleteInviteKey(next) { + db.delete('invitation:email:' + email, callback); + } + ], function(err) { + next(err) + }); + } + ], callback); + }; + + User.deleteInvitationKey = function(email, callback) { callback = callback || function() {}; - console.log('invitation:email:' + email); db.delete('invitation:email:' + email, callback); }; diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index a3a8e2f905..7abc4f34b9 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -74,8 +74,8 @@ -
- + - +
Inviter Username Invitee Email Invitee Username (if registered)
{invites.username} {invites.invitations.email}{invites.invitations.username}{invites.invitations.username} +
+ +
+
{invites.username} {invites.invitations.email} {invites.invitations.username} From a62e31dc7058d85bf343ca71d661f7956de2409f Mon Sep 17 00:00:00 2001 From: HSam Date: Sun, 6 Mar 2016 14:12:24 -0600 Subject: [PATCH 074/319] Finished the invite removal button changes. --- public/src/admin/manage/registration.js | 21 +++++++++++++++++---- src/views/admin/manage/registration.tpl | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 6de647b467..451c01f716 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -31,12 +31,25 @@ define('admin/manage/registration', function() { var action = $(this).attr('data-action'); var method = 'admin.user.deleteInvitation'; + var removeRow = function () { + var nextRow = parent.next(), + thisRowinvitedBy = parent.find('.invited-by'), + nextRowInvitedBy = nextRow.find('.invited-by'); + if (nextRowInvitedBy.html() !== undefined && nextRowInvitedBy.html().length < 2) { + nextRowInvitedBy.html(thisRowinvitedBy.html()); + } + parent.remove(); + }; if (action === 'delete') { - socket.emit(method, {email: email, invitedBy: invitedBy}, function(err) { - if (err) { - return app.alertError(err.message); + bootbox.confirm('Are you sure you wish to delete this invitation?', function(confirm) { + if (confirm) { + socket.emit(method, {email: email, invitedBy: invitedBy}, function(err) { + if (err) { + return app.alertError(err.message); + } + removeRow(); + }); } - parent.remove(); }); } return false; diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index 7abc4f34b9..c3fd4400c2 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -76,7 +76,7 @@
{invites.username}{invites.username} {invites.invitations.email} {invites.invitations.username}
From 30c48315e3ebd864c6c79a1932365ef6befa279a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 7 Mar 2016 18:25:00 +0200 Subject: [PATCH 075/319] up dbsearch --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00892e83e3..feb782d262 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "morgan": "^1.3.2", "nconf": "~0.8.2", "nodebb-plugin-composer-default": "3.0.6", - "nodebb-plugin-dbsearch": "0.3.2", + "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", "nodebb-plugin-mentions": "1.0.18", From a7e5f596c8f97c506636524cc347621acefb4133 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 7 Mar 2016 18:40:47 +0200 Subject: [PATCH 076/319] up lavender --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index feb782d262..46198d6caf 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", - "nodebb-theme-lavender": "3.0.8", + "nodebb-theme-lavender": "3.0.9", "nodebb-theme-persona": "4.0.91", "nodebb-theme-vanilla": "5.0.54", "nodebb-widget-essentials": "2.0.7", From 469dcbea05a4d777260db922ad5ae529e10571f8 Mon Sep 17 00:00:00 2001 From: pichalite Date: Mon, 7 Mar 2016 18:55:30 +0000 Subject: [PATCH 077/319] fixes #4320 --- src/controllers/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index cc83f0727a..51c5c316ba 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -36,7 +36,7 @@ Controllers.home = function(req, res, next) { if (err) { return next(err); } - if (settings.homePageRoute !== 'undefined' && settings.homePageRoute !== 'none') { + if (parseInt(meta.config.allowUserHomePage, 10) === 1 && settings.homePageRoute !== 'undefined' && settings.homePageRoute !== 'none') { route = settings.homePageRoute || route; } From 54d47e1e245d59b5844e181fcb3154c862c956eb Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 7 Mar 2016 15:37:14 -0500 Subject: [PATCH 078/319] allow data-ajaxify=false for external links to override config.openOutgoingLinksInNewTab --- public/src/ajaxify.js | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 0d894b588e..98efc424f1 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -275,17 +275,26 @@ $(document).ready(function() { $(document.body).on('click', 'a', function (e) { if (this.target !== '' || (this.protocol !== 'http:' && this.protocol !== 'https:')) { return; - } else if (hrefEmpty(this.href) || this.protocol === 'javascript:' || $(this).attr('data-ajaxify') === 'false' || $(this).attr('href') === '#') { + } + + var internalLink = this.host === '' || // Relative paths are always internal links + (this.host === window.location.host && this.protocol === window.location.protocol && // Otherwise need to check if protocol and host match + (RELATIVE_PATH.length > 0 ? this.pathname.indexOf(RELATIVE_PATH) === 0 : true)); // Subfolder installs need this additional check + + if ($(this).attr('data-ajaxify') === 'false') { + if (!internalLink) { + return; + } else { + return e.preventDefault(); + } + } + + if (hrefEmpty(this.href) || this.protocol === 'javascript:' || $(this).attr('href') === '#') { return e.preventDefault(); } if (!e.ctrlKey && !e.shiftKey && !e.metaKey && e.which === 1) { - if ( - this.host === '' || // Relative paths are always internal links... - (this.host === window.location.host && this.protocol === window.location.protocol && // Otherwise need to check that protocol and host match - (RELATIVE_PATH.length > 0 ? this.pathname.indexOf(RELATIVE_PATH) === 0 : true)) // Subfolder installs need this additional check - ) { - // Internal link + if (internalLink) { var pathname = this.href.replace(rootUrl + RELATIVE_PATH + '/', ''); // Special handling for urls with hashes @@ -297,7 +306,6 @@ $(document).ready(function() { } } } else if (window.location.pathname !== '/outgoing') { - // External Link if (config.openOutgoingLinksInNewTab) { window.open(this.href, '_blank'); e.preventDefault(); From 8d9f7d8e19161a7b62a479f772cd4828059d7cb9 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 11:24:32 +0200 Subject: [PATCH 079/319] added socket methods --- src/controllers/api.js | 177 ++++++++++++++++++++++-------------- src/socket.io/categories.js | 6 +- src/socket.io/posts.js | 40 +++++--- src/socket.io/topics.js | 33 +++++-- src/socket.io/user.js | 15 ++- 5 files changed, 179 insertions(+), 92 deletions(-) diff --git a/src/controllers/api.js b/src/controllers/api.js index fb5ab709b6..77ae7131ad 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -1,32 +1,21 @@ "use strict"; -var async = require('async'), - validator = require('validator'), - nconf = require('nconf'), - - meta = require('../meta'), - user = require('../user'), - posts = require('../posts'), - topics = require('../topics'), - categories = require('../categories'), - privileges = require('../privileges'), - plugins = require('../plugins'), - helpers = require('./helpers'), - widgets = require('../widgets'); +var async = require('async'); +var validator = require('validator'); +var nconf = require('nconf'); + +var meta = require('../meta'); +var user = require('../user'); +var posts = require('../posts'); +var topics = require('../topics'); +var categories = require('../categories'); +var privileges = require('../privileges'); +var plugins = require('../plugins'); +var widgets = require('../widgets'); var apiController = {}; apiController.getConfig = function(req, res, next) { - function filterConfig() { - plugins.fireHook('filter:config.get', config, function(err, config) { - if (res.locals.isAPI) { - res.status(200).json(config); - } else { - next(err, config); - } - }); - } - var config = {}; config.environment = process.env.NODE_ENV; config.relative_path = nconf.get('relative_path'); @@ -51,7 +40,6 @@ apiController.getConfig = function(req, res, next) { config.allowFileUploads = parseInt(meta.config.allowFileUploads, 10) === 1; config.allowTopicsThumbnail = parseInt(meta.config.allowTopicsThumbnail, 10) === 1; config.usePagination = parseInt(meta.config.usePagination, 10) === 1; - config.disableSocialButtons = parseInt(meta.config.disableSocialButtons, 10) === 1; config.disableChat = parseInt(meta.config.disableChat, 10) === 1; config.socketioTransports = nconf.get('socket.io:transports') || ['polling', 'websocket']; config.websocketAddress = nconf.get('socket.io:address') || ''; @@ -73,27 +61,41 @@ apiController.getConfig = function(req, res, next) { config.searchEnabled = plugins.hasListeners('filter:search.query'); config.bootswatchSkin = 'default'; - if (!req.user) { - return filterConfig(); - } - - user.getSettings(req.user.uid, function(err, settings) { + async.waterfall([ + function (next) { + if (!req.user) { + return next(null, config); + } + user.getSettings(req.uid, function(err, settings) { + if (err) { + return next(err); + } + config.usePagination = settings.usePagination; + config.topicsPerPage = settings.topicsPerPage; + config.postsPerPage = settings.postsPerPage; + config.notificationSounds = settings.notificationSounds; + config.userLang = req.query.lang || settings.userLang || config.defaultLang; + config.openOutgoingLinksInNewTab = settings.openOutgoingLinksInNewTab; + config.topicPostSort = settings.topicPostSort || config.topicPostSort; + config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort; + config.topicSearchEnabled = settings.topicSearchEnabled || false; + config.bootswatchSkin = settings.bootswatchSkin || config.bootswatchSkin; + next(null, config); + }); + }, + function (config, next) { + plugins.fireHook('filter:config.get', config, next); + } + ], function(err, config) { if (err) { return next(err); } - config.usePagination = settings.usePagination; - config.topicsPerPage = settings.topicsPerPage; - config.postsPerPage = settings.postsPerPage; - config.notificationSounds = settings.notificationSounds; - config.userLang = req.query.lang || settings.userLang || config.defaultLang; - config.openOutgoingLinksInNewTab = settings.openOutgoingLinksInNewTab; - config.topicPostSort = settings.topicPostSort || config.topicPostSort; - config.categoryTopicSort = settings.categoryTopicSort || config.categoryTopicSort; - config.topicSearchEnabled = settings.topicSearchEnabled || false; - config.bootswatchSkin = settings.bootswatchSkin || config.bootswatchSkin; - - filterConfig(); + if (res.locals.isAPI) { + res.json(config); + } else { + next(null, config); + } }); }; @@ -126,6 +128,16 @@ apiController.renderWidgets = function(req, res, next) { }; apiController.getObject = function(req, res, next) { + apiController.getObjectByType(req.uid, req.params.type, req.params.id, function(err, results) { + if (err) { + return next(err); + } + + res.json(results); + }); +}; + +apiController.getObjectByType = function(uid, type, id, callback) { var methods = { post: { canRead: privileges.posts.can, @@ -141,74 +153,101 @@ apiController.getObject = function(req, res, next) { } }; - if (!methods[req.params.type]) { - return next(); + if (!methods[type]) { + return callback(); } - async.parallel({ - canRead: async.apply(methods[req.params.type].canRead, 'read', req.params.id, req.uid), - data: async.apply(methods[req.params.type].data, req.params.id) - }, function(err, results) { - if (err || !results.data) { - return next(err); - } - - if (!results.canRead) { - return helpers.notAllowed(req, res); + async.waterfall([ + function (next) { + methods[type].canRead('read', id, uid, next); + }, + function (canRead, next) { + if (!canRead) { + return next(new Error('[[error:no-privileges]]')); + } + methods[type].data(id, next); } - - res.json(results.data); - }); + ], callback); }; - apiController.getUserByUID = function(req, res, next) { var uid = req.params.uid ? req.params.uid : 0; - getUserByUID(uid, res, next); + apiController.getUserDataByUID(req.uid, uid, function(err, data) { + if (err) { + return next(err); + } + res.json(data); + }); }; apiController.getUserByUsername = function(req, res, next) { var username = req.params.username ? req.params.username : 0; + apiController.getUserDataByUsername(req.uid, username, function(err, data) { + if (err) { + return next(err); + } + res.json(data); + }); +}; + +apiController.getUserByEmail = function(req, res, next) { + var email = req.params.email ? req.params.email : 0; + + apiController.getUserDataByEmail(req.uid, email, function(err, data) { + if (err) { + return next(err); + } + res.json(data); + }); +}; + +apiController.getUserDataByUsername = function(callerUid, username, callback) { async.waterfall([ function(next) { user.getUidByUsername(username, next); }, function(uid, next) { - getUserByUID(uid, res, next); + apiController.getUserDataByUID(callerUid, uid, next); } - ], next); + ], callback); }; -apiController.getUserByEmail = function(req, res, next) { - var email = req.params.email ? req.params.email : 0; - +apiController.getUserDataByEmail = function(callerUid, email, callback) { async.waterfall([ function(next) { user.getUidByEmail(email, next); }, function(uid, next) { - getUserByUID(uid, res, next); + apiController.getUserDataByUID(callerUid, uid, next); } - ], next); + ], callback); }; -function getUserByUID(uid, res, next) { +apiController.getUserDataByUID = function(callerUid, uid, callback) { + if (!parseInt(callerUid, 10) && parseInt(meta.config.privateUserInfo, 10) === 1) { + return callback(new Error('[[error:no-privileges]]')); + } + + if (!parseInt(uid, 10)) { + return callback(new Error('[[error:no-user]]')); + } + async.parallel({ userData: async.apply(user.getUserData, uid), settings: async.apply(user.getSettings, uid) }, function(err, results) { if (err || !results.userData) { - return next(err); + return callback(err || new Error('[[error:no-user]]')); } results.userData.email = results.settings.showemail ? results.userData.email : undefined; results.userData.fullname = results.settings.showfullname ? results.userData.fullname : undefined; - res.json(results.userData); + callback(null, results.userData); }); -} +}; apiController.getModerators = function(req, res, next) { categories.getModerators(req.params.cid, function(err, moderators) { diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index 7e8b6000f3..262a5e8a41 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -6,7 +6,7 @@ var categories = require('../categories'); var privileges = require('../privileges'); var user = require('../user'); var topics = require('../topics'); - +var apiController = require('../controllers/api'); var SocketCategories = {}; @@ -192,4 +192,8 @@ SocketCategories.isModerator = function(socket, cid, callback) { user.isModerator(socket.uid, cid, callback); }; +SocketCategories.getCategory = function(socket, cid, callback) { + apiController.getObjectByType(socket.uid, 'category', cid, callback); +}; + module.exports = SocketCategories; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 64b5b75076..b0384820ea 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -1,18 +1,20 @@ "use strict"; -var async = require('async'), +var async = require('async'); - posts = require('../posts'), - privileges = require('../privileges'), - meta = require('../meta'), - topics = require('../topics'), - user = require('../user'), - websockets = require('./index'), - socketTopics = require('./topics'), - socketHelpers = require('./helpers'), - utils = require('../../public/src/utils'), +var posts = require('../posts'); +var privileges = require('../privileges'); +var meta = require('../meta'); +var topics = require('../topics'); +var user = require('../user'); +var websockets = require('./index'); +var socketTopics = require('./topics'); +var socketHelpers = require('./helpers'); +var utils = require('../../public/src/utils'); - SocketPosts = {}; +var apiController = require('../controllers/api'); + +var SocketPosts = {}; require('./posts/edit')(SocketPosts); @@ -77,6 +79,20 @@ SocketPosts.getRawPost = function(socket, pid, callback) { ], callback); }; +SocketPosts.getPost = function(socket, pid, callback) { + async.waterfall([ + function(next) { + apiController.getObjectByType(socket.uid, 'post', pid, next); + }, + function(postData, next) { + if (parseInt(postData.deleted, 10) === 1) { + return next(new Error('[[error:no-post]]')); + } + next(null, postData); + } + ], callback); +}; + SocketPosts.loadMoreFavourites = function(socket, data, callback) { loadMorePosts('uid:' + data.uid + ':favourites', socket.uid, data, callback); }; @@ -119,4 +135,6 @@ SocketPosts.getPidIndex = function(socket, data, callback) { posts.getPidIndex(data.pid, data.tid, data.topicPostSort, callback); }; + + module.exports = SocketPosts; diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 940ed0a470..72e6e7c510 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -1,18 +1,17 @@ 'use strict'; -var nconf = require('nconf'), - async = require('async'), - winston = require('winston'), +var async = require('async'); +var winston = require('winston'); - topics = require('../topics'), - privileges = require('../privileges'), - plugins = require('../plugins'), - notifications = require('../notifications'), - websockets = require('./index'), - user = require('../user'), +var topics = require('../topics'); +var privileges = require('../privileges'); +var plugins = require('../plugins'); +var websockets = require('./index'); +var user = require('../user'); +var apiController = require('../controllers/api'); - SocketTopics = {}; +var SocketTopics = {}; require('./topics/unread')(SocketTopics); require('./topics/move')(SocketTopics); @@ -126,4 +125,18 @@ SocketTopics.isModerator = function(socket, tid, callback) { }); }; +SocketTopics.getTopic = function (socket, tid, callback) { + async.waterfall([ + function (next) { + apiController.getObjectByType(socket.uid, 'topic', tid, next); + }, + function (topicData, next) { + if (parseInt(topicData.deleted, 10) === 1) { + return next(new Error('[[error:no-topic]]')); + } + next(null, topicData); + } + ], callback); +}; + module.exports = SocketTopics; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index be884d4c54..ed6caae39e 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -12,6 +12,7 @@ var meta = require('../meta'); var events = require('../events'); var emailer = require('../emailer'); var db = require('../database'); +var apiController = require('../controllers/api'); var SocketUser = {}; @@ -194,7 +195,7 @@ SocketUser.saveSettings = function(socket, data, callback) { return next(null, true); } user.isAdminOrGlobalMod(socket.uid, next); - }, + }, function(allowed, next) { if (!allowed) { return next(new Error('[[error:no-privileges]]')); @@ -332,5 +333,17 @@ SocketUser.invite = function(socket, email, callback) { }; +SocketUser.getUserByUID = function(socket, uid, callback) { + apiController.getUserDataByUID(socket.uid, uid, callback); +}; + +SocketUser.getUserByUsername = function(socket, username, callback) { + apiController.getUserDataByUsername(socket.uid, username, callback); +}; + +SocketUser.getUserByEmail = function(socket, email, callback) { + apiController.getUserDataByEmail(socket.uid, email, callback); +}; + module.exports = SocketUser; From 07c1a822db0bb3cb914beed83df40f4698194644 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 12:06:45 +0200 Subject: [PATCH 080/319] closes #4318 closes #4309 --- public/src/modules/translator.js | 6 +----- src/topics/follow.js | 10 +++++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index 58c8ef6f26..5892f6dde8 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -215,11 +215,7 @@ if (value) { var variable; for (var i = 1, ii = variables.length; i < ii; i++) { - - // see https://github.com/NodeBB/NodeBB/issues/1951 - variables[i] = variables[i].replace(/%/g, '%').replace(/,/g, ','); - - variable = S(variables[i]).chompRight(']]').collapseWhitespace().escapeHTML().s; + variable = S(variables[i]).chompRight(']]').collapseWhitespace().decodeHTMLEntities().escapeHTML().s; value = value.replace('%' + i, variable); } diff --git a/src/topics/follow.js b/src/topics/follow.js index dc441b1ca4..c05a796741 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -100,7 +100,9 @@ module.exports = function(Topics) { Topics.notifyFollowers = function(postData, exceptUid, callback) { callback = callback || function() {}; - var followers, title; + var followers; + var title; + var titleEscaped; async.waterfall([ function (next) { @@ -126,12 +128,14 @@ module.exports = function(Topics) { return callback(); } title = postData.topic.title; + if (title) { title = S(title).decodeHTMLEntities().s; + titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); } notifications.create({ - bodyShort: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + title + ']]', + bodyShort: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + titleEscaped + ']]', bodyLong: postData.content, pid: postData.pid, nid: 'new_post:tid:' + postData.topic.tid + ':pid:' + postData.pid + ':uid:' + exceptUid, @@ -162,7 +166,7 @@ module.exports = function(Topics) { emailer.send('notif_post', toUid, { pid: postData.pid, subject: '[' + (meta.config.title || 'NodeBB') + '] ' + title, - intro: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + title + ']]', + intro: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + titleEscaped + ']]', postBody: postData.content.replace(/"\/\//g, '"http://'), site_title: meta.config.title || 'NodeBB', username: data.userData.username, From 37b1d3c8be24cde803867796adac704c9f6cd91b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 12:17:12 +0200 Subject: [PATCH 081/319] #4261 --- src/controllers/authentication.js | 94 +++++++++++++++++-------------- 1 file changed, 52 insertions(+), 42 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index fa6cc6fd8c..931dbe2a3c 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -1,20 +1,20 @@ "use strict"; -var async = require('async'), - winston = require('winston'), - passport = require('passport'), - nconf = require('nconf'), - validator = require('validator'), - _ = require('underscore'), - - db = require('../database'), - meta = require('../meta'), - user = require('../user'), - plugins = require('../plugins'), - utils = require('../../public/src/utils'), - Password = require('../password'), - - authenticationController = {}; +var async = require('async'); +var winston = require('winston'); +var passport = require('passport'); +var nconf = require('nconf'); +var validator = require('validator'); +var _ = require('underscore'); + +var db = require('../database'); +var meta = require('../meta'); +var user = require('../user'); +var plugins = require('../plugins'); +var utils = require('../../public/src/utils'); +var Password = require('../password'); + +var authenticationController = {}; authenticationController.register = function(req, res, next) { var registrationType = meta.config.registrationType || 'normal'; @@ -86,8 +86,8 @@ function registerAndLoginUser(req, res, userData, callback) { }, function(_uid, next) { uid = _uid; - if (res.locals.processLogin === true) { - doLogin(req, uid, next); + if (res.locals.processLogin) { + authenticationController.doLogin(req, uid, next); } else { next(); } @@ -171,7 +171,7 @@ function continueLogin(req, res, next) { res.status(200).send(nconf.get('relative_path') + '/reset/' + code); }); } else { - doLogin(req, userData.uid, function(err) { + authenticationController.doLogin(req, userData.uid, function(err) { if (err) { return res.status(403).send(err.message); } @@ -189,39 +189,49 @@ function continueLogin(req, res, next) { })(req, res, next); } -function doLogin(req, uid, callback) { +authenticationController.doLogin = function(req, uid, callback) { + if (!uid) { + return callback(); + } + req.login({uid: uid}, function(err) { if (err) { return callback(err); } - if (uid) { - var uuid = utils.generateUUID(); - req.session.meta = {}; - - // Associate IP used during login with user account - user.logIP(uid, req.ip); - req.session.meta.ip = req.ip; - - // Associate metadata retrieved via user-agent - req.session.meta = _.extend(req.session.meta, { - uuid: uuid, - datetime: Date.now(), - platform: req.useragent.platform, - browser: req.useragent.browser, - version: req.useragent.version - }); + var uuid = utils.generateUUID(); + req.session.meta = {}; - // Associate login session with user - user.auth.addSession(uid, req.sessionID); - db.setObjectField('uid:' + uid + 'sessionUUID:sessionId', uuid, req.sessionID); + // Associate IP used during login with user account + user.logIP(uid, req.ip); + req.session.meta.ip = req.ip; - plugins.fireHook('action:user.loggedIn', uid); - } + // Associate metadata retrieved via user-agent + req.session.meta = _.extend(req.session.meta, { + uuid: uuid, + datetime: Date.now(), + platform: req.useragent.platform, + browser: req.useragent.browser, + version: req.useragent.version + }); - callback(); + // Associate login session with user + async.parallel([ + function (next) { + user.auth.addSession(uid, req.sessionID, next); + }, + function (next) { + db.setObjectField('uid:' + uid + 'sessionUUID:sessionId', uuid, req.sessionID, next); + } + ], function(err) { + if (err) { + return callback(err); + } + plugins.fireHook('action:user.loggedIn', uid); + callback(); + }); }); -} +}; authenticationController.localLogin = function(req, username, password, next) { if (!username) { From 5f76695d5adcf06b34ac72181cb37e039a5deeef Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 12:29:19 +0200 Subject: [PATCH 082/319] #4261 --- src/controllers/authentication.js | 65 +++++++++++++++++-------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 931dbe2a3c..a6c9ef3288 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -199,37 +199,42 @@ authenticationController.doLogin = function(req, uid, callback) { return callback(err); } - var uuid = utils.generateUUID(); - req.session.meta = {}; - - // Associate IP used during login with user account - user.logIP(uid, req.ip); - req.session.meta.ip = req.ip; - - // Associate metadata retrieved via user-agent - req.session.meta = _.extend(req.session.meta, { - uuid: uuid, - datetime: Date.now(), - platform: req.useragent.platform, - browser: req.useragent.browser, - version: req.useragent.version - }); + authenticationController.onSuccessfulLogin(req, uid, callback); + }); +}; - // Associate login session with user - async.parallel([ - function (next) { - user.auth.addSession(uid, req.sessionID, next); - }, - function (next) { - db.setObjectField('uid:' + uid + 'sessionUUID:sessionId', uuid, req.sessionID, next); - } - ], function(err) { - if (err) { - return callback(err); - } - plugins.fireHook('action:user.loggedIn', uid); - callback(); - }); +authenticationController.onSuccessfulLogin = function(req, uid, callback) { + callback = callback || function() {}; + var uuid = utils.generateUUID(); + req.session.meta = {}; + + // Associate IP used during login with user account + user.logIP(uid, req.ip); + req.session.meta.ip = req.ip; + + // Associate metadata retrieved via user-agent + req.session.meta = _.extend(req.session.meta, { + uuid: uuid, + datetime: Date.now(), + platform: req.useragent.platform, + browser: req.useragent.browser, + version: req.useragent.version + }); + + // Associate login session with user + async.parallel([ + function (next) { + user.auth.addSession(uid, req.sessionID, next); + }, + function (next) { + db.setObjectField('uid:' + uid + 'sessionUUID:sessionId', uuid, req.sessionID, next); + } + ], function(err) { + if (err) { + return callback(err); + } + plugins.fireHook('action:user.loggedIn', uid); + callback(); }); }; From f8b494bc1fa0c72027919d7a225fd9578877f0df Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 13:38:22 +0200 Subject: [PATCH 083/319] closes #4313 --- src/user/reset.js | 49 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/user/reset.js b/src/user/reset.js index 26acc5ecbc..0a4329cb7e 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -36,12 +36,27 @@ var async = require('async'), var code = utils.generateUUID(); async.parallel([ async.apply(db.setObjectField, 'reset:uid', code, uid), - async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code) + async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code), + async.apply(db.sortedSetAdd, 'reset:issueDate:uid', Date.now(), uid), ], function(err) { callback(err, code); }); }; + function canGenerate(uid, callback) { + async.waterfall([ + function (next) { + db.sortedSetScore('reset:issueDate:uid', uid, next); + }, + function (score, next) { + if (score > Date.now() - 1000 * 60) { + return next(new Error('[[error:cant-reset-password-more-than-once-a-minute]]')); + } + next(); + } + ], callback); + } + UserReset.send = function(email, callback) { var uid; async.waterfall([ @@ -54,6 +69,9 @@ var async = require('async'), } uid = _uid; + canGenerate(uid, next); + }, + function(next) { UserReset.generate(uid, next); }, function(code, next) { @@ -102,6 +120,7 @@ var async = require('async'), async.apply(user.setUserField, uid, 'password', hash), async.apply(db.deleteObjectField, 'reset:uid', code), async.apply(db.sortedSetRemove, 'reset:issueDate', code), + async.apply(db.sortedSetRemove, 'reset:issueDate:uid', uid), async.apply(user.reset.updateExpiry, uid), async.apply(user.auth.resetLockout, uid) ], next); @@ -110,9 +129,9 @@ var async = require('async'), }; UserReset.updateExpiry = function(uid, callback) { - var oneDay = 1000*60*60*24, - expireDays = parseInt(meta.config.passwordExpiryDays || 0, 10), - expiry = Date.now() + (oneDay * expireDays); + var oneDay = 1000 * 60 * 60 * 24; + var expireDays = parseInt(meta.config.passwordExpiryDays || 0, 10); + var expiry = Date.now() + (oneDay * expireDays); callback = callback || function() {}; user.setUserField(uid, 'passwordExpiry', expireDays > 0 ? expiry : 0, callback); @@ -120,16 +139,26 @@ var async = require('async'), UserReset.clean = function(callback) { async.waterfall([ - async.apply(db.getSortedSetRangeByScore, 'reset:issueDate', 0, -1, 0, Date.now() - twoHours), - function(tokens, next) { - if (!tokens.length) { + function(next) { + async.parallel({ + tokens: function(next) { + db.getSortedSetRangeByScore('reset:issueDate', 0, -1, 0, Date.now() - twoHours, next); + }, + uids: function(next) { + db.getSortedSetRangeByScore('reset:issueDate:uid', 0, -1, 0, Date.now() - twoHours, next); + } + }, next); + }, + function(results, next) { + if (!results.tokens.length && !results.uids.length) { return next(); } - winston.verbose('[UserReset.clean] Removing ' + tokens.length + ' reset tokens from database'); + winston.verbose('[UserReset.clean] Removing ' + results.tokens.length + ' reset tokens from database'); async.parallel([ - async.apply(db.deleteObjectFields, 'reset:uid', tokens), - async.apply(db.sortedSetRemove, 'reset:issueDate', tokens) + async.apply(db.deleteObjectFields, 'reset:uid', results.tokens), + async.apply(db.sortedSetRemove, 'reset:issueDate', results.tokens), + async.apply(db.sortedSetRemove, 'reset:issueDate:uid', results.uids) ], next); } ], callback); From ad1ffdfd81c3957969fbb7817e049e478eb2f050 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 13:54:08 +0200 Subject: [PATCH 084/319] fix test --- src/user/reset.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/user/reset.js b/src/user/reset.js index 0a4329cb7e..808e7d1f41 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -36,8 +36,7 @@ var async = require('async'), var code = utils.generateUUID(); async.parallel([ async.apply(db.setObjectField, 'reset:uid', code, uid), - async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code), - async.apply(db.sortedSetAdd, 'reset:issueDate:uid', Date.now(), uid), + async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code) ], function(err) { callback(err, code); }); @@ -71,6 +70,9 @@ var async = require('async'), uid = _uid; canGenerate(uid, next); }, + function(next) { + db.sortedSetAdd('reset:issueDate:uid', Date.now(), uid, next); + }, function(next) { UserReset.generate(uid, next); }, From 7bf808d0f4658c825dea90e47132efc9fe10e2aa Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 14:38:44 +0200 Subject: [PATCH 085/319] closes #4322 --- public/src/client/topic/postTools.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 9ac20b1ac4..28701dd56a 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -35,7 +35,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator } data.posts.display_move_tools = data.posts.display_move_tools && index !== 0; data.postSharing = data.postSharing.filter(function(share) { return share.activated === true; }); - + templates.parse('partials/topic/post-menu-list', data, function(html) { translator.translate(html, function(html) { dropdownMenu.html(html); @@ -181,14 +181,16 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator function onReplyClicked(button, tid) { showStaleWarning(function(proceed) { if (!proceed) { - var selectionText = '', - selection = window.getSelection ? window.getSelection() : document.selection.createRange(); + var selectionText = ''; + var selection = window.getSelection ? window.getSelection() : document.selection.createRange(); + var selectionNode = $(selection.baseNode || selection.anchorNode); - if ($(selection.baseNode).parents('[component="post/content"]').length > 0) { + if (selectionNode.parents('[component="post/content"]').length > 0) { selectionText = selection.toString(); } - var username = getUserName(selectionText ? $(selection.baseNode) : button); + button = selectionText ? selectionNode : button; + var username = getUserName(button); if (getData(button, 'data-uid') === '0' || !getData(button, 'data-userslug')) { username = ''; } @@ -308,11 +310,13 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator } function getUserName(button) { - var username = '', - post = button.parents('[data-pid]'); + var username = ''; + var post = button.parents('[data-pid]'); + if (button.attr('component') === 'topic/reply') { return username; } + if (post.length) { username = post.attr('data-username').replace(/\s/g, '-'); } From b1cc1725a93e94c0ca9136259f4703663568f24f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 15:12:02 +0200 Subject: [PATCH 086/319] fix crash in notifications --- src/notifications.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 1776103031..0e73b34723 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -60,7 +60,7 @@ var async = require('async'), if (userData.username === '[[global:guest]]') { notification.bodyShort = notification.bodyShort.replace(/([\s\S]*?),[\s\S]*?,([\s\S]*?)/, '$1, [[global:guest]], $2'); } - + next(null, notification); }); return; @@ -444,7 +444,7 @@ var async = require('async'), case 'notifications:user_posted_to': case 'notifications:user_flagged_post_in': var usernames = set.map(function(notifObj) { - return notifObj.user.username; + return notifObj && notifObj.user && notifObj.user.username; }).filter(function(username, idx, array) { return array.indexOf(username) === idx; }); From 7441c181b46e58811ba87033b82a848a1a2c6216 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 15:23:42 +0200 Subject: [PATCH 087/319] closes #4312 --- public/src/client/account/edit/email.js | 4 ++++ public/src/client/account/edit/password.js | 7 +++++-- public/src/client/account/edit/username.js | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/public/src/client/account/edit/email.js b/public/src/client/account/edit/email.js index 4014039740..1772f76c49 100644 --- a/public/src/client/account/edit/email.js +++ b/public/src/client/account/edit/email.js @@ -19,6 +19,10 @@ define('forum/account/edit/email', ['forum/account/header'], function(header) { return; } + if (userData.email === userData.password) { + return app.alertError('[[user:email_same_as_password]]'); + } + var btn = $(this); btn.addClass('disabled').find('i').removeClass('hide'); diff --git a/public/src/client/account/edit/password.js b/public/src/client/account/edit/password.js index d5e500e7df..3dc36c25b2 100644 --- a/public/src/client/account/edit/password.js +++ b/public/src/client/account/edit/password.js @@ -21,12 +21,15 @@ define('forum/account/edit/password', ['forum/account/header', 'translator'], fu var passwordsmatch = false; function onPasswordChanged() { + passwordvalid = false; if (password.val().length < ajaxify.data.minimumPasswordLength) { showError(password_notify, '[[user:change_password_error_length]]'); - passwordvalid = false; } else if (!utils.isPasswordValid(password.val())) { showError(password_notify, '[[user:change_password_error]]'); - passwordvalid = false; + } else if (password.val() === ajaxify.data.username) { + showError(password_notify, '[[user:password_same_as_username]]'); + } else if (password.val() === ajaxify.data.email) { + showError(password_notify, '[[user:password_same_as_email]]'); } else { showSuccess(password_notify); passwordvalid = true; diff --git a/public/src/client/account/edit/username.js b/public/src/client/account/edit/username.js index 4448568157..64f9baa0bc 100644 --- a/public/src/client/account/edit/username.js +++ b/public/src/client/account/edit/username.js @@ -18,6 +18,11 @@ define('forum/account/edit/username', ['forum/account/header'], function(header) if (!userData.username) { return; } + + if (userData.username === userData.password) { + return app.alertError('[[user:username_same_as_password]]'); + } + var btn = $(this); btn.addClass('disabled').find('i').removeClass('hide'); socket.emit('user.changeUsernameEmail', userData, function(err, data) { From 7ca7a31a5a747349ef9e9c26f7eab76165000b7d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 16:12:07 +0200 Subject: [PATCH 088/319] only send user status on first connect --- src/socket.io/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index a67ca29869..d6744f7d9b 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -59,6 +59,9 @@ function onConnect(socket) { socket.join('uid_' + socket.uid); socket.join('online_users'); + if (Sockets.getUserSocketCount(socket.uid) > 1) { + return; + } user.getUserFields(socket.uid, ['status'], function(err, userData) { if (err || !userData) { return; From dc7a861a49157ee7f81675de7c2e8303801fcedb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 16:17:55 +0200 Subject: [PATCH 089/319] removed unused vars --- public/src/app.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index dc66cfc462..4f7b009a30 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -134,13 +134,7 @@ app.cacheBuster = null; callback = callback || function() {}; if (socket && app.user.uid && app.currentRoom !== room) { socket.emit('meta.rooms.enter', { - enter: room, - username: app.user.username, - userslug: app.user.userslug, - picture: app.user.picture, - status: app.user.status, - 'icon:bgColor': app.user['icon:bgColor'], - 'icon:text': app.user['icon:text'] + enter: room }, function(err) { if (err) { return app.alertError(err.message); From 37d53db6930fe8b32e282888073d7361f1515027 Mon Sep 17 00:00:00 2001 From: samhax Date: Tue, 8 Mar 2016 10:34:43 -0600 Subject: [PATCH 090/319] Removed unused variable from click events. --- public/src/admin/manage/registration.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 451c01f716..55578901e8 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -8,7 +8,6 @@ define('admin/manage/registration', function() { Registration.init = function() { $('.users-list').on('click', '[data-action]', function(ev) { - var $this = this; var parent = $(this).parents('[data-username]'); var action = $(this).attr('data-action'); var username = parent.attr('data-username'); @@ -24,7 +23,6 @@ define('admin/manage/registration', function() { }); $('.invites-list').on('click', '[data-action]', function(ev) { - var $this = this; var parent = $(this).parents('[data-invitation-mail][data-invited-by]'); var email = parent.attr('data-invitation-mail'); var invitedBy = parent.attr('data-invited-by'); From c50d65592271b315726dc38adf77e0a82aac4622 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 19:01:45 +0200 Subject: [PATCH 091/319] closes #4325 --- src/controllers/uploads.js | 11 ++++-- src/file.js | 2 +- src/groups/cover.js | 7 +--- src/user/picture.js | 69 +++++++++++++++++++------------------- 4 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index 17db1741a1..8dff27b47c 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -60,7 +60,7 @@ uploadsController.uploadThumb = function(req, res, next) { } uploadsController.upload(req, res, function(uploadedFile, next) { - file.isFileTypeAllowed(uploadedFile.path, function(err, tempPath) { + file.isFileTypeAllowed(uploadedFile.path, function(err) { if (err) { return next(err); } @@ -94,7 +94,12 @@ uploadsController.uploadGroupCover = function(uid, uploadedFile, callback) { return plugins.fireHook('filter:uploadFile', {file: uploadedFile, uid: uid}, callback); } - saveFileToLocal(uploadedFile, callback); + file.isFileTypeAllowed(uploadedFile.path, function(err) { + if (err) { + return callback(err); + } + saveFileToLocal(uploadedFile, callback); + }); }; function uploadImage(uid, image, callback) { @@ -102,7 +107,7 @@ function uploadImage(uid, image, callback) { return plugins.fireHook('filter:uploadImage', {image: image, uid: uid}, callback); } - file.isFileTypeAllowed(image.path, function(err, tempPath) { + file.isFileTypeAllowed(image.path, function(err) { if (err) { return callback(err); } diff --git a/src/file.js b/src/file.js index 7fe5aa8f06..1c1cab7781 100644 --- a/src/file.js +++ b/src/file.js @@ -52,7 +52,7 @@ file.base64ToLocal = function(imageData, uploadPath, callback) { file.isFileTypeAllowed = function(path, callback) { // Attempt to read the file, if it passes, file type is allowed jimp.read(path, function(err) { - callback(err, path); + callback(err); }); }; diff --git a/src/groups/cover.js b/src/groups/cover.js index 492138e75a..89ef97df94 100644 --- a/src/groups/cover.js +++ b/src/groups/cover.js @@ -7,7 +7,6 @@ var fs = require('fs'); var crypto = require('crypto'); var Jimp = require('jimp'); - var db = require('../database'); var file = require('../file'); var uploadsController = require('../controllers/uploads'); @@ -39,11 +38,7 @@ module.exports = function(Groups) { writeImageDataToFile(data.imageData, next); }, function (_tempPath, next) { - tempPath = _tempPath; // set in local var so it can be deleted if file type invalid - next(null, tempPath); - }, - async.apply(file.isFileTypeAllowed), - function (_tempPath, next) { + tempPath = _tempPath; uploadsController.uploadGroupCover(uid, { name: 'groupCover', path: tempPath diff --git a/src/user/picture.js b/src/user/picture.js index db0ea234f1..c9a760f10e 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -37,39 +37,39 @@ module.exports = function(User) { function(next) { next(!extension ? new Error('[[error:invalid-image-extension]]') : null); }, - function(next) { - file.isFileTypeAllowed(picture.path, next); - }, - function(path, next) { - image.resizeImage({ - path: picture.path, - extension: extension, - width: imageDimension, - height: imageDimension - }, next); - }, - function(next) { - if (convertToPNG) { - image.normalise(picture.path, extension, next); - } else { - next(); - } - }, function(next) { if (plugins.hasListeners('filter:uploadImage')) { return plugins.fireHook('filter:uploadImage', {image: picture, uid: updateUid}, next); } var filename = updateUid + '-profileimg' + (convertToPNG ? '.png' : extension); - + async.waterfall([ + function(next) { + file.isFileTypeAllowed(picture.path, next); + }, + function(next) { + image.resizeImage({ + path: picture.path, + extension: extension, + width: imageDimension, + height: imageDimension + }, next); + }, + function(next) { + if (convertToPNG) { + image.normalise(picture.path, extension, next); + } else { + next(); + } + }, function(next) { User.getUserField(updateUid, 'uploadedpicture', next); }, function(oldpicture, next) { if (!oldpicture) { return file.saveFileToLocal(filename, 'profile', picture.path, next); - } + } var oldpicturePath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'profile', path.basename(oldpicture)); fs.unlink(oldpicturePath, function (err) { @@ -79,7 +79,7 @@ module.exports = function(User) { file.saveFileToLocal(filename, 'profile', picture.path, next); }); - }, + }, ], next); }, function(_image, next) { @@ -167,12 +167,9 @@ module.exports = function(User) { }, next); }, function(next) { - file.isFileTypeAllowed(data.file.path, next); - }, - function(tempPath, next) { var image = { name: 'profileCover', - path: tempPath, + path: data.file.path, uid: data.uid }; @@ -181,16 +178,20 @@ module.exports = function(User) { } var filename = data.uid + '-profilecover'; - file.saveFileToLocal(filename, 'profile', image.path, function(err, upload) { - if (err) { - return next(err); + async.waterfall([ + function (next) { + file.isFileTypeAllowed(data.file.path, next); + }, + function (next) { + file.saveFileToLocal(filename, 'profile', image.path, next); + }, + function (upload, next) { + next(null, { + url: nconf.get('relative_path') + upload.url, + name: image.name + }); } - - next(null, { - url: nconf.get('relative_path') + upload.url, - name: image.name - }); - }); + ], next); }, function(uploadData, next) { url = uploadData.url; From c10ec6b81019682e13c6d4a22036490ff2eea6c2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 19:06:59 +0200 Subject: [PATCH 092/319] closes #4326 --- src/topics/posts.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/topics/posts.js b/src/topics/posts.js index 85f2979513..8177e93ebd 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -144,6 +144,8 @@ module.exports = function(Topics) { post.display_moderator_tools = topicPrivileges.isAdminOrMod || post.selfPost; post.display_move_tools = topicPrivileges.isAdminOrMod && post.index !== 0; post.display_post_menu = topicPrivileges.isAdminOrMod || post.selfPost || !post.deleted; + post.ip = topicPrivileges.isAdminOrMod ? post.ip : undefined; + if (post.deleted && !(topicPrivileges.isAdminOrMod || post.selfPost)) { post.content = '[[topic:post_is_deleted]]'; } From b6ddbc3071c200834ff3e96a0b1229bbd98d944f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 19:45:18 +0200 Subject: [PATCH 093/319] closes #4111 --- src/topics/create.js | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/topics/create.js b/src/topics/create.js index e9669d4c44..dea303709c 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -1,17 +1,17 @@ 'use strict'; -var async = require('async'), - validator = require('validator'), - db = require('../database'), - utils = require('../../public/src/utils'), - plugins = require('../plugins'), - analytics = require('../analytics'), - user = require('../user'), - meta = require('../meta'), - posts = require('../posts'), - privileges = require('../privileges'), - categories = require('../categories'); +var async = require('async'); +var validator = require('validator'); +var db = require('../database'); +var utils = require('../../public/src/utils'); +var plugins = require('../plugins'); +var analytics = require('../analytics'); +var user = require('../user'); +var meta = require('../meta'); +var posts = require('../posts'); +var privileges = require('../privileges'); +var categories = require('../categories'); module.exports = function(Topics) { @@ -25,21 +25,13 @@ module.exports = function(Topics) { db.incrObjectField('global', 'nextTid', next); }, function(tid, next) { - var slug = utils.slugify(data.title); - - if (!slug.length) { - return callback(new Error('[[error:invalid-title]]')); - } - - slug = tid + '/' + slug; - topicData = { 'tid': tid, 'uid': data.uid, 'cid': data.cid, 'mainPid': 0, 'title': data.title, - 'slug': slug, + 'slug': tid + '/' + (utils.slugify(data.title) || 'topic'), 'timestamp': timestamp, 'lastposttime': 0, 'postcount': 0, From 91312a0c5b3e7546f50325ded3055166e47be067 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 8 Mar 2016 19:46:45 +0200 Subject: [PATCH 094/319] up composer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46198d6caf..0d05ea6b41 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "mongodb": "~2.1.3", "morgan": "^1.3.2", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.6", + "nodebb-plugin-composer-default": "3.0.7", "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", From b147f42f0ad2f429be9b86844e61f757aef21bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 8 Mar 2016 23:07:45 +0200 Subject: [PATCH 095/319] show unique user count in acp --- src/socket.io/index.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index d6744f7d9b..1ce84f076d 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -225,6 +225,7 @@ Sockets.getUserSocketCount = function(uid) { if (!io) { return 0; } + var room = io.sockets.adapter.rooms['uid_' + uid]; return room ? room.length : 0; }; @@ -233,8 +234,14 @@ Sockets.getOnlineUserCount = function() { if (!io) { return 0; } - var room = io.sockets.adapter.rooms.online_users; - return room ? room.length : 0; + var count = 0; + for (var key in io.sockets.adapter.rooms) { + if (io.sockets.adapter.rooms.hasOwnProperty(key) && key.startsWith('uid_')) { + ++ count; + } + } + + return count; }; Sockets.getOnlineAnonCount = function () { From 0b2f01b8bc47f672b49db6ea975948da81903b6c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 13:19:37 +0200 Subject: [PATCH 096/319] info page --- .gitignore | 1 + src/controllers/admin/info.js | 50 ++++++++++++++---- src/controllers/users.js | 12 ++++- src/socket.io/admin/rooms.js | 78 ++++++++++++++++++++-------- src/socket.io/index.js | 57 -------------------- src/socket.io/user.js | 4 -- src/views/admin/development/info.tpl | 34 ++++++++++-- 7 files changed, 137 insertions(+), 99 deletions(-) diff --git a/.gitignore b/.gitignore index ddb37093ba..144cfe268a 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ pidfile ## Directory-based project format: .idea/ +.vscode/ ## File-based project format: *.ipr diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index ec8b79e0a3..4f2c878db2 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -2,24 +2,45 @@ var async = require('async'); var os = require('os'); +var winston = require('winston'); var nconf = require('nconf'); var exec = require('child_process').exec; +var pubsub = require('../../pubsub'); var rooms = require('../../socket.io/admin/rooms'); var infoController = {}; +var info = []; + infoController.get = function(req, res, next) { + info = []; + pubsub.publish('sync:node:info:start'); + setTimeout(function() { + res.render('admin/development/info', {info: info, infoJSON: JSON.stringify(info, null, 4), host: os.hostname(), port: nconf.get('port')}); + }, 100); +}; + +pubsub.on('sync:node:info:start', function() { + getNodeInfo(function(err, data) { + if (err) { + return winston.error(err); + } + pubsub.publish('sync:node:info:end', data); + }); +}); + +pubsub.on('sync:node:info:end', function(data) { + info.push(data); +}); +function getNodeInfo(callback) { var data = { process: { port: nconf.get('port'), pid: process.pid, title: process.title, - arch: process.arch, - platform: process.platform, version: process.version, - versions: process.versions, memoryUsage: process.memoryUsage(), uptime: process.uptime() }, @@ -28,19 +49,28 @@ infoController.get = function(req, res, next) { type: os.type(), platform: os.platform(), arch: os.arch(), - release: os.release() + release: os.release(), + load: os.loadavg().map(function(load){ return load.toFixed(2); }).join(', ') } }; - getGitInfo(function(err, gitInfo) { + async.parallel({ + pubsub: function(next) { + pubsub.publish('sync:stats:start'); + next(); + }, + gitInfo: function(next) { + getGitInfo(next); + } + }, function(err, results) { if (err) { - return next(err); + return callback(err); } - data.git = gitInfo; - - res.render('admin/development/info', {info: JSON.stringify(data, null, 4), stats: JSON.stringify(rooms.getStats(), null, 4)}); + data.git = results.gitInfo; + data.stats = rooms.stats[data.os.hostname + ':' + data.process.port]; + callback(null, data); }); -}; +} function getGitInfo(callback) { function get(cmd, callback) { diff --git a/src/controllers/users.js b/src/controllers/users.js index b014ac3452..cefa6b6cc7 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -13,10 +13,18 @@ var helpers = require('./helpers'); var usersController = {}; usersController.getOnlineUsers = function(req, res, next) { - usersController.getUsers('users:online', req.uid, req.query.page, function(err, userData) { + async.parallel({ + users: function(next) { + usersController.getUsers('users:online', req.uid, req.query.page, next); + }, + guests: function(next) { + require('../socket.io/admin/rooms').getTotalGuestCount(next); + } + }, function(err, results) { if (err) { return next(err); } + var userData = results.users; var hiddenCount = 0; if (!userData.isAdminOrGlobalMod) { userData.users = userData.users.filter(function(user) { @@ -27,7 +35,7 @@ usersController.getOnlineUsers = function(req, res, next) { }); } - userData.anonymousUserCount = require('../socket.io').getOnlineAnonCount() + hiddenCount; + userData.anonymousUserCount = results.guests + hiddenCount; render(req, res, userData, next); }); diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js index d5e6dd5da6..6d8843b8ca 100644 --- a/src/socket.io/admin/rooms.js +++ b/src/socket.io/admin/rooms.js @@ -8,9 +8,13 @@ var validator = require('validator'); var topics = require('../../topics'); var pubsub = require('../../pubsub'); -var SocketRooms = {}; - var stats = {}; +var totals = {}; +var SocketRooms = { + stats: stats, + totals: totals +}; + pubsub.on('sync:stats:start', function() { getLocalStats(function(err, stats) { @@ -25,20 +29,42 @@ pubsub.on('sync:stats:end', function(data) { stats[data.id] = data.stats; }); +SocketRooms.getTotalGuestCount = function(callback) { + var count = 0; + pubsub.once('sync:stats:guests', function() { + var io = require('../index').server; + + var roomClients = io.sockets.adapter.rooms; + var guestCount = roomClients.online_guests ? roomClients.online_guests.length : 0; + pubsub.publish('sync:stats:guests:end', guestCount); + }); + + pubsub.on('sync:stats:guests:end', function(guestCount) { + count += guestCount; + }); + + pubsub.publish('sync:stats:guests'); + + setTimeout(function() { + pubsub.removeAllListeners('sync:stats:guests:end'); + callback(null, count); + }, 100); +} + + SocketRooms.getAll = function(socket, data, callback) { pubsub.publish('sync:stats:start'); - var totals = { - onlineGuestCount: 0, - onlineRegisteredCount: 0, - socketCount: 0, - users: { - categories: 0, - recent: 0, - unread: 0, - topics: 0, - category: 0 - }, - topics: {} + + totals.onlineGuestCount = 0; + totals.onlineRegisteredCount = 0; + totals.socketCount = 0; + totals.topics = {}; + totals.users = { + categories: 0, + recent: 0, + unread: 0, + topics: 0, + category: 0 }; for(var instance in stats) { @@ -88,22 +114,32 @@ SocketRooms.getAll = function(socket, data, callback) { }); }; -SocketRooms.getStats = function() { - return stats; +SocketRooms.getOnlineUserCount = function(io) { + if (!io) { + return 0; + } + var count = 0; + for (var key in io.sockets.adapter.rooms) { + if (io.sockets.adapter.rooms.hasOwnProperty(key) && key.startsWith('uid_')) { + ++ count; + } + } + + return count; }; function getLocalStats(callback) { - var websockets = require('../index'); - var io = websockets.server; + var io = require('../index').server; + if (!io) { return callback(); } var roomClients = io.sockets.adapter.rooms; var socketData = { - onlineGuestCount: websockets.getOnlineAnonCount(), - onlineRegisteredCount: websockets.getOnlineUserCount(), - socketCount: websockets.getSocketCount(), + onlineGuestCount: roomClients.online_guests ? roomClients.online_guests.length : 0, + onlineRegisteredCount: SocketRooms.getOnlineUserCount(io), + socketCount: Object.keys(io.sockets.sockets).length, users: { categories: roomClients.categories ? roomClients.categories.length : 0, recent: roomClients.recent_topics ? roomClients.recent_topics.length : 0, diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 1ce84f076d..73c98f34ea 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -213,14 +213,6 @@ Sockets.in = function(room) { return io.in(room); }; -Sockets.getSocketCount = function() { - if (!io) { - return 0; - } - - return Object.keys(io.sockets.sockets).length; -}; - Sockets.getUserSocketCount = function(uid) { if (!io) { return 0; @@ -230,27 +222,6 @@ Sockets.getUserSocketCount = function(uid) { return room ? room.length : 0; }; -Sockets.getOnlineUserCount = function() { - if (!io) { - return 0; - } - var count = 0; - for (var key in io.sockets.adapter.rooms) { - if (io.sockets.adapter.rooms.hasOwnProperty(key) && key.startsWith('uid_')) { - ++ count; - } - } - - return count; -}; - -Sockets.getOnlineAnonCount = function () { - if (!io) { - return 0; - } - var room = io.sockets.adapter.rooms.online_guests; - return room ? room.length : 0; -}; Sockets.reqFromSocket = function(socket) { var headers = socket.request.headers; @@ -268,33 +239,5 @@ Sockets.reqFromSocket = function(socket) { }; }; -Sockets.isUserOnline = function(uid) { - winston.warn('[deprecated] Sockets.isUserOnline'); - return false; -}; - -Sockets.isUsersOnline = function(uids, callback) { - winston.warn('[deprecated] Sockets.isUsersOnline'); - callback(null, uids.map(function() { return false; })); -}; - -Sockets.getUsersInRoom = function (uid, roomName, start, stop, callback) { - winston.warn('[deprecated] Sockets.getUsersInRoom'); - callback(null, { - users: [], - room: roomName, - total: 0, - hidden: 0 - }); - return; -}; - -Sockets.getUidsInRoom = function(roomName, callback) { - winston.warn('[deprecated] Sockets.getUidsInRoom'); - callback = callback || function() {}; - callback(null, []); -}; - -/* Exporting */ module.exports = Sockets; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index ed6caae39e..2f33ef9f87 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -217,10 +217,6 @@ SocketUser.setCategorySort = function(socket, sort, callback) { } }; -SocketUser.getOnlineAnonCount = function(socket, data, callback) { - callback(null, module.parent.exports.getOnlineAnonCount()); -}; - SocketUser.getUnreadCount = function(socket, data, callback) { if (!socket.uid) { return callback(null, 0); diff --git a/src/views/admin/development/info.tpl b/src/views/admin/development/info.tpl index 2581c9c2ad..c4f9ddde1b 100644 --- a/src/views/admin/development/info.tpl +++ b/src/views/admin/development/info.tpl @@ -1,24 +1,48 @@
-

Info

+

Info - You are on {host}:{port}

-
-
{info}
+ + + + + + + + + + + + + + + + + + + + + + + + + +
hostpidnodejsonlinegitloaduptime
{info.os.hostname}:{info.process.port}{info.process.pid}{info.process.version}{info.stats.onlineRegisteredCount} / {info.stats.onlineGuestCount} / {info.stats.socketCount}{info.git.branch}@{info.git.hash}{info.os.load}{info.process.uptime}
-

Stats

+

Info

-
{stats}
+
{infoJSON}
From 96a3db6365c6f509fe100a0d4a416e44942f9ab2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 14:19:49 +0200 Subject: [PATCH 097/319] only send back err --- src/image.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/image.js b/src/image.js index 2c5c5ceb8c..f4b85acd4d 100644 --- a/src/image.js +++ b/src/image.js @@ -72,7 +72,9 @@ image.normalise = function(path, extension, callback) { if (err) { return callback(err); } - image.write(path + '.png', callback); + image.write(path + '.png', function(err) { + callback(err); + }); }); } }; From 2c28e181471c351a73c3bc54de32db4e9826ed85 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 14:53:32 +0200 Subject: [PATCH 098/319] closes #4332 --- src/plugins.js | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/plugins.js b/src/plugins.js index 21c67e9303..853c6f44f2 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -1,23 +1,23 @@ 'use strict'; -var fs = require('fs'), - path = require('path'), - async = require('async'), - winston = require('winston'), - semver = require('semver'), - express = require('express'), - nconf = require('nconf'), - - db = require('./database'), - emitter = require('./emitter'), - meta = require('./meta'), - translator = require('../public/src/modules/translator'), - utils = require('../public/src/utils'), - hotswap = require('./hotswap'), - file = require('./file'), - - controllers = require('./controllers'), - app, middleware; +var fs = require('fs'); +var path = require('path'); +var async = require('async'); +var winston = require('winston'); +var semver = require('semver'); +var express = require('express'); +var nconf = require('nconf'); + +var db = require('./database'); +var emitter = require('./emitter'); +var translator = require('../public/src/modules/translator'); +var utils = require('../public/src/utils'); +var hotswap = require('./hotswap'); +var file = require('./file'); + +var controllers = require('./controllers'); +var app; +var middleware; (function(Plugins) { require('./plugins/install')(Plugins); @@ -183,13 +183,17 @@ var fs = require('fs'), utils.walk(templatesPath, function(err, pluginTemplates) { if (pluginTemplates) { pluginTemplates.forEach(function(pluginTemplate) { - tplName = "/" + pluginTemplate.replace(templatesPath, '').substring(1); + if (pluginTemplate.endsWith('.tpl')) { + tplName = "/" + pluginTemplate.replace(templatesPath, '').substring(1); - if (templates.hasOwnProperty(tplName)) { - winston.verbose('[plugins] ' + tplName + ' replaced by ' + plugin.id); - } + if (templates.hasOwnProperty(tplName)) { + winston.verbose('[plugins] ' + tplName + ' replaced by ' + plugin.id); + } - templates[tplName] = pluginTemplate; + templates[tplName] = pluginTemplate; + } else { + winston.warn('[plugins] Skipping ' + pluginTemplate + ' by plugin ' + plugin.id); + } }); } else { winston.warn('[plugins/' + plugin.id + '] A templates directory was defined for this plugin, but was not found.'); From c9ac1a402796cbd150f9bfb5384ca6207407e2bd Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 16:42:26 +0200 Subject: [PATCH 099/319] https://github.com/akhoury/nodebb-plugin-spam-be-gone/issues/46 --- src/posts/edit.js | 8 ++++---- src/socket.io/index.js | 1 + src/socket.io/posts/edit.js | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/posts/edit.js b/src/posts/edit.js index ea7686fb20..0d4a78a019 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -41,7 +41,7 @@ module.exports = function(Posts) { postData.content = data.content; postData.edited = now; postData.editor = data.uid; - plugins.fireHook('filter:post.edit', {post: postData, uid: data.uid}, next); + plugins.fireHook('filter:post.edit', {req: data.req, post: postData, uid: data.uid}, next); }, function (result, next) { postData = result.post; @@ -128,9 +128,9 @@ module.exports = function(Posts) { data.tags = data.tags || []; async.waterfall([ - async.apply(plugins.fireHook,'filter:topic.edit', topicData), - function(topicData, next) { - db.setObject('topic:' + tid, topicData, next); + async.apply(plugins.fireHook, 'filter:topic.edit', {req: data.req, topic: topicData}), + function(results, next) { + db.setObject('topic:' + tid, results.topicData, next); }, function(next) { topics.updateTags(tid, data.tags, next); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 73c98f34ea..109821f461 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -186,6 +186,7 @@ function authorize(socket, callback) { return next(err); } if (sessionData && sessionData.passport && sessionData.passport.user) { + request.session = sessionData; socket.uid = parseInt(sessionData.passport.user, 10); } else { socket.uid = 0; diff --git a/src/socket.io/posts/edit.js b/src/socket.io/posts/edit.js index bec03451fb..e5ad7a0afb 100644 --- a/src/socket.io/posts/edit.js +++ b/src/socket.io/posts/edit.js @@ -37,7 +37,8 @@ module.exports = function(SocketPosts) { title: data.title, content: data.content, topic_thumb: data.topic_thumb, - tags: data.tags + tags: data.tags, + req: websockets.reqFromSocket(socket) }, function(err, result) { if (err) { return callback(err); From 104d677271d6a6d048e8e3464f352b559870b7a3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 9 Mar 2016 10:45:36 -0500 Subject: [PATCH 100/319] latest translations and fallbacks --- public/language/ar/notifications.json | 1 + public/language/bg/error.json | 26 +++++++++--------- public/language/bg/global.json | 8 +++--- public/language/bg/groups.json | 2 +- public/language/bg/notifications.json | 7 ++--- public/language/bg/pages.json | 4 +-- public/language/bg/topic.json | 6 ++--- public/language/bg/user.json | 6 ++--- public/language/bn/notifications.json | 1 + public/language/cs/notifications.json | 1 + public/language/da/email.json | 6 ++--- public/language/da/error.json | 26 +++++++++--------- public/language/da/global.json | 18 ++++++------- public/language/da/groups.json | 4 +-- public/language/da/modules.json | 14 +++++----- public/language/da/notifications.json | 25 ++++++++--------- public/language/da/pages.json | 14 +++++----- public/language/da/topic.json | 28 ++++++++++---------- public/language/da/user.json | 22 +++++++-------- public/language/da/users.json | 2 +- public/language/de/email.json | 4 +-- public/language/de/error.json | 12 ++++----- public/language/de/global.json | 8 +++--- public/language/de/groups.json | 2 +- public/language/de/notifications.json | 7 ++--- public/language/de/pages.json | 10 +++---- public/language/de/topic.json | 8 +++--- public/language/de/user.json | 6 ++--- public/language/de/users.json | 2 +- public/language/el/notifications.json | 1 + public/language/en@pirate/notifications.json | 1 + public/language/en_US/notifications.json | 1 + public/language/es/notifications.json | 1 + public/language/et/notifications.json | 1 + public/language/fa_IR/email.json | 6 ++--- public/language/fa_IR/error.json | 4 +-- public/language/fa_IR/groups.json | 4 +-- public/language/fa_IR/modules.json | 2 +- public/language/fa_IR/notifications.json | 3 ++- public/language/fi/notifications.json | 1 + public/language/fr/notifications.json | 1 + public/language/gl/notifications.json | 1 + public/language/he/error.json | 6 ++--- public/language/he/global.json | 8 +++--- public/language/he/groups.json | 2 +- public/language/he/notifications.json | 7 ++--- public/language/he/pages.json | 4 +-- public/language/he/topic.json | 6 ++--- public/language/he/user.json | 6 ++--- public/language/hu/notifications.json | 1 + public/language/id/notifications.json | 1 + public/language/it/notifications.json | 1 + public/language/ja/notifications.json | 1 + public/language/ko/error.json | 8 +++--- public/language/ko/global.json | 10 +++---- public/language/ko/groups.json | 2 +- public/language/ko/notifications.json | 9 ++++--- public/language/ko/pages.json | 4 +-- public/language/ko/topic.json | 6 ++--- public/language/ko/user.json | 28 ++++++++++---------- public/language/lt/notifications.json | 1 + public/language/ms/notifications.json | 1 + public/language/nb/notifications.json | 1 + public/language/nl/category.json | 4 +-- public/language/nl/error.json | 26 +++++++++--------- public/language/nl/global.json | 8 +++--- public/language/nl/groups.json | 6 ++--- public/language/nl/notifications.json | 7 ++--- public/language/nl/pages.json | 6 ++--- public/language/nl/reset_password.json | 2 +- public/language/nl/search.json | 2 +- public/language/nl/success.json | 4 +-- public/language/nl/tags.json | 2 +- public/language/nl/topic.json | 6 ++--- public/language/nl/unread.json | 4 +-- public/language/nl/user.json | 6 ++--- public/language/nl/users.json | 2 +- public/language/pl/notifications.json | 1 + public/language/pt_BR/notifications.json | 1 + public/language/ro/notifications.json | 1 + public/language/ru/notifications.json | 1 + public/language/rw/notifications.json | 1 + public/language/sc/notifications.json | 1 + public/language/sk/notifications.json | 1 + public/language/sl/notifications.json | 1 + public/language/sr/notifications.json | 1 + public/language/sv/notifications.json | 1 + public/language/th/notifications.json | 1 + public/language/tr/error.json | 6 ++--- public/language/tr/global.json | 8 +++--- public/language/tr/groups.json | 2 +- public/language/tr/notifications.json | 7 ++--- public/language/tr/pages.json | 2 +- public/language/tr/topic.json | 6 ++--- public/language/tr/user.json | 4 +-- public/language/vi/notifications.json | 1 + public/language/zh_CN/groups.json | 2 +- public/language/zh_CN/notifications.json | 1 + public/language/zh_CN/pages.json | 4 +-- public/language/zh_CN/topic.json | 2 +- public/language/zh_TW/notifications.json | 1 + 101 files changed, 301 insertions(+), 261 deletions(-) diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 52b338e7fa..81733db21e 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "تم التحقق من عنوان البريد الإلكتروني", "email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.", "email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index c23fbe0c12..823de79421 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -3,17 +3,17 @@ "not-logged-in": "Изглежда не сте влезли в системата.", "account-locked": "Вашият акаунт беше заключен временно", "search-requires-login": "Търсенето изисква акаунт – моля, влезте или се регистрирайте.", - "invalid-cid": "Невалиден идентификатор на категория", - "invalid-tid": "Невалиден идентификатор на тема", - "invalid-pid": "Невалиден идентификатор на публикация", - "invalid-uid": "Невалиден идентификатор на потребител", - "invalid-username": "Невалидно потребителско име", - "invalid-email": "Невалидна е-поща", - "invalid-title": "Невалидно заглавие!", - "invalid-user-data": "Невалидни потребителски данни", - "invalid-password": "Невалидна парола", + "invalid-cid": "Грешен идентификатор на категория", + "invalid-tid": "Грешен идентификатор на тема", + "invalid-pid": "Грешен идентификатор на публикация", + "invalid-uid": "Грешен идентификатор на потребител", + "invalid-username": "Грешно потребителско име", + "invalid-email": "Грешна е-поща", + "invalid-title": "Грешно заглавие!", + "invalid-user-data": "Грешни потребителски данни", + "invalid-password": "Грешна парола", "invalid-username-or-password": "Моля, посочете потребителско име и парола", - "invalid-search-term": "Невалиден текст за търсене", + "invalid-search-term": "Грешен текст за търсене", "invalid-pagination-value": "Грешен номер на страница, трябва да бъде между %1 и %2", "username-taken": "Потребителското име е заето", "email-taken": "Е-пощата е заета", @@ -50,8 +50,8 @@ "still-uploading": "Моля, изчакайте качването да приключи.", "file-too-big": "Максималният разрешен размер на файл е %1 КБ – моля, качете по-малък файл", "guest-upload-disabled": "Качването не е разрешено за гости", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Вече имате отметка към тази публикация", + "already-unfavourited": "Вече сте премахнали отметката си към тази публикация", "cant-ban-other-admins": "Не можете да блокирате другите администратори!", "cant-remove-last-admin": "Вие сте единственият администратор. Добавете друг потребител като администратор, преди да премахнете себе си като администратор", "invalid-image-type": "Грешен тип на изображение. Позволените типове са: %1", @@ -97,5 +97,5 @@ "invite-maximum-met": "Вие сте поканили максимално позволения брой хора (%1 от %2).", "no-session-found": "Не е открита сесия за вход!", "not-in-room": "Потребителят не е в стаята", - "no-users-in-room": "No users in this room" + "no-users-in-room": "Няма потребители в тази стая" } \ No newline at end of file diff --git a/public/language/bg/global.json b/public/language/bg/global.json index a1a940c50a..3236a43698 100644 --- a/public/language/bg/global.json +++ b/public/language/bg/global.json @@ -87,8 +87,8 @@ "map": "Карта", "sessions": "Сесии за вход", "ip_address": "IP адрес", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "Въведете номер на страница", + "upload_file": "Качване на файл", + "upload": "Качване", + "allowed-file-types": "Разрешените файлови типове са: %1" } \ No newline at end of file diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index 92ba6a905f..017239f5a0 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -49,5 +49,5 @@ "membership.leave-group": "Напускане на групата", "membership.reject": "Отхвърляне", "new-group.group_name": "Име на групата:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Качване на снимка за показване на групата" } \ No newline at end of file diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index f47c4b8340..4a6228288d 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 и %2 други гласуваха положително за Ваша публикация в %3.", "moved_your_post": "%1 премести публикацията Ви в %2", "moved_your_topic": "%1 премести %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 си запази отметка към Ваша публикация в %2.", + "favourited_your_post_in_dual": "%1 и %2 си запазиха отметки към Ваша публикация в %3.", + "favourited_your_post_in_multiple": "%1 и %2 други си запазиха отметки към Ваша публикация в %3.", "user_flagged_post_in": "%1 докладва Ваша публикация в %2", "user_flagged_post_in_dual": "%1 и %2 докладваха Ваша публикация в %3", "user_flagged_post_in_multiple": "%1 и %2 други докладваха Ваша публикация в %3", @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 и %2 започнаха да Ви следват.", "user_started_following_you_multiple": "%1 и %2 започнаха да Ви следват.", "new_register": "%1 изпрати заявка за регистрация.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Е-пощата беше потвърдена", "email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.", "email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.", diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index 3403d7f897..45e2861bdd 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -33,13 +33,13 @@ "account/posts": "Публикации от %1", "account/topics": "Теми, създадени от %1", "account/groups": "Групите на %1", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "Отметнатите публикации на %1", "account/settings": "Потребителски настройки", "account/watched": "Теми, следени от %1", "account/upvoted": "Публикации, получили положителен глас от %1", "account/downvoted": "Публикации, получили отрицателен глас от %1", "account/best": "Най-добрите публикации от %1", - "confirm": "Email Confirmed", + "confirm": "Е-пощата е потвърдена", "maintenance.text": "%1 в момента е в профилактика. Моля, върнете се по-късно.", "maintenance.messageIntro": "В допълнение, администраторът е оставил това съобщение:", "throttled.text": "%1 в момента е недостъпен, поради прекомерно натоварване. Моля, върнете се отново по-късно." diff --git a/public/language/bg/topic.json b/public/language/bg/topic.json index b59e34c52b..dbe44a1541 100644 --- a/public/language/bg/topic.json +++ b/public/language/bg/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Изключените категории са засивени", "confirm_move": "Преместване", "confirm_fork": "Разделяне", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Отметка", + "favourites": "Отметки", + "favourites.has_no_favourites": "Все още не сте си запазвали отметки към никакви публикации.", "loading_more_posts": "Зареждане на още публикации", "move_topic": "Преместване на темата", "move_topics": "Преместване на темите", diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 53e2eebda7..ea9e5c7961 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -22,7 +22,7 @@ "profile": "Профил", "profile_views": "Преглеждания на профила", "reputation": "Репутация", - "favourites": "Bookmarks", + "favourites": "Отметки", "watched": "Наблюдавани", "followers": "Последователи", "following": "Следва", @@ -55,11 +55,11 @@ "password": "Парола", "username_taken_workaround": "Потребителското име, което искате, е заето и затова ние го променихме малко. Вие ще се наричате %1", "password_same_as_username": "Паролата е същата като потребителското Ви име. Моля, изберете друга парола.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "Паролата е същата като е-пощата Ви. Моля, изберете друга парола.", "upload_picture": "Качване на снимка", "upload_a_picture": "Качване на снимка", "remove_uploaded_picture": "Премахване на качената снимка", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Качване на снимка за показване", "settings": "Настройки", "show_email": "Да се показва е-пощата ми", "show_fullname": "Да се показва цялото ми име", diff --git a/public/language/bn/notifications.json b/public/language/bn/notifications.json index 591abc3c4d..497492e0db 100644 --- a/public/language/bn/notifications.json +++ b/public/language/bn/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে", "email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।", "email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।", diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 4e29676790..0137a973e3 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/da/email.json b/public/language/da/email.json index 19fb7776d2..0ed8b77a53 100644 --- a/public/language/da/email.json +++ b/public/language/da/email.json @@ -21,9 +21,9 @@ "digest.cta": "Klik her for at gå til %1", "digest.unsub.info": "Du har fået tilsendt dette sammendrag pga. indstillingerne i dit abonnement.", "digest.no_topics": "Der har ikke været nogen aktive emner de/den sidste %1", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "dag", + "digest.week": "uge", + "digest.month": "måned", "notif.chat.subject": "Ny chat besked modtaget fra %1", "notif.chat.cta": "Klik her for at forsætte med samtalen", "notif.chat.unsub.info": "Denne chat notifikation blev sendt til dig pga. indstillingerne i dit abonnement.", diff --git a/public/language/da/error.json b/public/language/da/error.json index 4041a7fc2b..da51315fd6 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -14,7 +14,7 @@ "invalid-password": "Ugyldig Adgangskode", "invalid-username-or-password": "Venligst angiv både brugernavn og adgangskode", "invalid-search-term": "Ugyldig søgeterm", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Ugyldig side værdi, skal mindst være %1 og maks. %2", "username-taken": "Brugernavn optaget", "email-taken": "Emailadresse allerede i brug", "email-not-confirmed": "Din email adresse er ikke blevet bekræftet endnu, venligst klik her for at bekrætige den.", @@ -24,7 +24,7 @@ "confirm-email-already-sent": "Bekræftelses email er allerede afsendt, vent venligt %1 minut(ter) for at sende endnu en.", "username-too-short": "Brugernavn er for kort", "username-too-long": "Brugernavn er for langt", - "password-too-long": "Password too long", + "password-too-long": "Kodeord er for langt", "user-banned": "Bruger er bortvist", "user-too-new": "Beklager, du er nødt til at vente %1 sekund(er) før du opretter dit indlæg", "no-category": "Kategorien eksisterer ikke", @@ -49,9 +49,9 @@ "too-many-tags": "For mange tags. Tråde kan ikke have mere end %1 tag(s)", "still-uploading": "Venligst vent til overførslen er færdig", "file-too-big": "Maksimum filstørrelse er %1 kB - venligst overfør en mindre fil", - "guest-upload-disabled": "Guest uploading has been disabled", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "guest-upload-disabled": "Gæsteupload er deaktiveret", + "already-favourited": "Du har allerede bogmærket dette indlæg", + "already-unfavourited": "Du har allerede fjernet dette indlæg fra bogmærker", "cant-ban-other-admins": "Du kan ikke udlukke andre administatrorer!", "cant-remove-last-admin": "Du er den eneste administrator. Tilføj en anden bruger som administrator før du fjerner dig selv som administrator", "invalid-image-type": "Invalid billed type. De tilladte typer er: %1", @@ -77,13 +77,13 @@ "about-me-too-long": "Beklager, men din om mig side kan ikke være længere end %1 karakter(er).", "cant-chat-with-yourself": "Du kan ikke chatte med dig selv!", "chat-restricted": "Denne bruger har spæret adgangen til chat beskeder. Brugeren må følge dig før du kan chatte med ham/hende", - "chat-disabled": "Chat system disabled", + "chat-disabled": "Chat system er deaktiveret", "too-many-messages": "Du har sendt for mange beskeder, vent venligt lidt.", "invalid-chat-message": "Ugyldig chat besked", "chat-message-too-long": "Chat beskeden er for lang", - "cant-edit-chat-message": "You are not allowed to edit this message", - "cant-remove-last-user": "You can't remove the last user", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-edit-chat-message": "Du har ikke tilladelse til at redigere denne besked", + "cant-remove-last-user": "Du kan ikke fjerne den sidste bruger", + "cant-delete-chat-message": "Du har ikke tilladelse til at slette denne besked", "reputation-system-disabled": "Vurderingssystem er slået fra.", "downvoting-disabled": "Nedvurdering er slået fra", "not-enough-reputation-to-downvote": "Du har ikke nok omdømme til at nedstemme dette indlæg", @@ -94,8 +94,8 @@ "parse-error": "Noget gik galt under fortolknings er serverens respons", "wrong-login-type-email": "Brug venligt din email til login", "wrong-login-type-username": "Brug venligt dit brugernavn til login", - "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", - "no-session-found": "No login session found!", - "not-in-room": "User not in room", - "no-users-in-room": "No users in this room" + "invite-maximum-met": "Du har inviteret det maksimale antal personer (%1 ud af %2)", + "no-session-found": "Ingen login session kan findes!", + "not-in-room": "Bruger er ikke i rummet", + "no-users-in-room": "Ingen brugere i rummet" } \ No newline at end of file diff --git a/public/language/da/global.json b/public/language/da/global.json index ef47f75ec9..5990eb4da5 100644 --- a/public/language/da/global.json +++ b/public/language/da/global.json @@ -49,9 +49,9 @@ "users": "Bruger", "topics": "Emner", "posts": "Indlæg", - "best": "Best", - "upvoted": "Upvoted", - "downvoted": "Downvoted", + "best": "Bedste", + "upvoted": "Syntes godt om", + "downvoted": "Syntes ikke godt om", "views": "Visninger", "reputation": "Omdømme", "read_more": "læs mere", @@ -65,7 +65,7 @@ "posted_in_ago_by": "skrevet i %1 %2 af %3", "user_posted_ago": "%1 skrev for %2", "guest_posted_ago": "Gæst skrev for %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "sidst redigeret af %1", "norecentposts": "Ingen seneste indlæg", "norecenttopics": "Ingen seneste tråde", "recentposts": "Seneste indlæg", @@ -85,10 +85,10 @@ "unfollow": "Følg ikke længere", "delete_all": "Slet alt", "map": "Kort", - "sessions": "Login Sessions", - "ip_address": "IP Address", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", + "sessions": "Login Sessioner", + "ip_address": "IP-adresse", + "enter_page_number": "Indsæt sideantal", + "upload_file": "Upload fil", "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "allowed-file-types": "Tilladte filtyper er %1" } \ No newline at end of file diff --git a/public/language/da/groups.json b/public/language/da/groups.json index 6e97812359..4e6340ab6e 100644 --- a/public/language/da/groups.json +++ b/public/language/da/groups.json @@ -24,7 +24,7 @@ "details.has_no_posts": "Medlemmer af denne gruppe har ikke oprettet indlæg.", "details.latest_posts": "seneste indlæg", "details.private": "Privat", - "details.disableJoinRequests": "Disable join requests", + "details.disableJoinRequests": "Deaktiver Anmodninger", "details.grant": "Giv/ophæv ejerskab", "details.kick": "Spark", "details.owner_options": "Gruppe administration", @@ -49,5 +49,5 @@ "membership.leave-group": "Forlad Gruppe", "membership.reject": "Afvis", "new-group.group_name": "Gruppe Navn:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Upload Gruppe coverbillede" } \ No newline at end of file diff --git a/public/language/da/modules.json b/public/language/da/modules.json index 114d1cd386..e8e62c7d66 100644 --- a/public/language/da/modules.json +++ b/public/language/da/modules.json @@ -7,7 +7,7 @@ "chat.user_has_messaged_you": "1% har skrevet til dig.", "chat.see_all": "Se alle chats", "chat.no-messages": "Vælg en modtager for at se beskedhistorikken", - "chat.no-users-in-room": "No users in this room", + "chat.no-users-in-room": "Ingen brugere i rummet", "chat.recent-chats": "Seneste chats", "chat.contacts": "Kontakter", "chat.message-history": "Beskedhistorik", @@ -16,9 +16,9 @@ "chat.seven_days": "7 dage", "chat.thirty_days": "30 dage", "chat.three_months": "3 måneder", - "chat.delete_message_confirm": "Are you sure you wish to delete this message?", - "chat.roomname": "Chat Room %1", - "chat.add-users-to-room": "Add users to room", + "chat.delete_message_confirm": "Er du sikker på at du vil slette denne besked?", + "chat.roomname": "Chatrum %1", + "chat.add-users-to-room": "Tilføj brugere til chatrum", "composer.compose": "Skriv", "composer.show_preview": "Vis forhåndsvisning", "composer.hide_preview": "Fjern forhåndsvisning", @@ -31,7 +31,7 @@ "bootbox.ok": "OK", "bootbox.cancel": "Annuller", "bootbox.confirm": "Bekræft", - "cover.dragging_title": "Cover Photo Positioning", - "cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"", - "cover.saved": "Cover photo image and position saved" + "cover.dragging_title": "Coverbillede positionering ", + "cover.dragging_message": "Træk coverbilledet til den ønskede position og klik \"Gem\"", + "cover.saved": "Coverbillede og position gemt " } \ No newline at end of file diff --git a/public/language/da/notifications.json b/public/language/da/notifications.json index 7a7d49655f..0e36cb2149 100644 --- a/public/language/da/notifications.json +++ b/public/language/da/notifications.json @@ -5,31 +5,32 @@ "mark_all_read": "Marker alle notifikationer læst", "back_to_home": "Tilbage til %1", "outgoing_link": "Udgående link", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "Du forlader nu %1", "continue_to": "Fortsæt til %1", "return_to": "Returnere til %t", "new_notification": "Ny notifikation", "you_have_unread_notifications": "Du har ulæste notifikationer.", "new_message_from": "Ny besked fra %1", "upvoted_your_post_in": "%1 har upvotet dit indlæg i %2.", - "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", + "upvoted_your_post_in_dual": "%1 og %2 har syntes godt om dit indlæg i %3.", + "upvoted_your_post_in_multiple": "%1 og %2 andre har syntes godt om dit indlæg i%3.", "moved_your_post": "%1 har flyttet dit indlæg til %2", "moved_your_topic": "%1 har flyttet %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 har bogmærket dit indlæg i %2.", + "favourited_your_post_in_dual": "%1 og %2 har bogmærket dit indlæg i %3.", + "favourited_your_post_in_multiple": "%1 og %2 andre har bogmærket dit indlæg i %3.", "user_flagged_post_in": "%1 har anmeldt et indlæg i %2", - "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", - "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", + "user_flagged_post_in_dual": "%1 og %2 har anmeldt et indlæg i %3", + "user_flagged_post_in_multiple": "%1 og %2 andre har anmeldt et indlæg i %3", "user_posted_to": "%1 har skrevet et svar til: %2", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", + "user_posted_to_dual": "%1 og %2 har skrevet svar til: %3", + "user_posted_to_multiple": "%1 og %2 andre har skrevet svar til: %3", "user_posted_topic": "%1 har oprettet en ny tråd: %2", "user_started_following_you": "%1 har valgt at følge dig.", - "user_started_following_you_dual": "%1 and %2 started following you.", - "user_started_following_you_multiple": "%1 and %2 others started following you.", + "user_started_following_you_dual": "%1 og %2 har valgt at følge dig.", + "user_started_following_you_multiple": "%1 og %2 har valgt at følge dig.", "new_register": "%1 har sendt en registrerings anmodning.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email bekræftet", "email-confirmed-message": "Tak fordi du validerede din email. Din konto er nu fuldt ud aktiveret.", "email-confirm-error-message": "Der var et problem med valideringen af din emailadresse. Bekræftelses koden var muligvis forkert eller udløbet.", diff --git a/public/language/da/pages.json b/public/language/da/pages.json index 076ff501d2..cfc7678ce8 100644 --- a/public/language/da/pages.json +++ b/public/language/da/pages.json @@ -6,12 +6,12 @@ "popular-month": "Populære tråde denne måned", "popular-alltime": "Top populære tråde", "recent": "Seneste tråde", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Anmeldte Indlæg", "users/online": "Online brugere", "users/latest": "Seneste brugere", "users/sort-posts": "Brugere med de fleste indlæg", "users/sort-reputation": "Brugere med mest omdømme", - "users/banned": "Banned Users", + "users/banned": "Banlyste Brugere", "users/search": "Bruger søgning", "notifications": "Notifikationer", "tags": "Tags", @@ -33,13 +33,13 @@ "account/posts": "Indlæg oprettet af %1", "account/topics": "Tråde lavet af %1", "account/groups": "%1s grupper", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "%1's Bogmærkede Indlæg", "account/settings": "Bruger instillinger", "account/watched": "Tråde fulgt af %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", - "confirm": "Email Confirmed", + "account/upvoted": "Indlæg syntes godt om af %1", + "account/downvoted": "Indlæg syntes ikke godt om af %1", + "account/best": "Bedste indlæg skrevet af %1", + "confirm": "Email Bekræftet", "maintenance.text": "%1 er under vedligeholdelse. Kom venligst tilbage senere.", "maintenance.messageIntro": "Administratoren har yderligere vedlagt denne besked:", "throttled.text": "%1 er ikke tilgængelig på grund af overbelastning. Venligst kom tilbage senere." diff --git a/public/language/da/topic.json b/public/language/da/topic.json index a19e01b272..888384ced3 100644 --- a/public/language/da/topic.json +++ b/public/language/da/topic.json @@ -13,7 +13,7 @@ "notify_me": "Bliv notificeret ved nye svar i dette emne", "quote": "Citer", "reply": "Svar", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "Svar som emne", "guest-login-reply": "Login for at svare", "edit": "Rediger", "delete": "Slet", @@ -34,8 +34,8 @@ "not_following_topic.message": "Du vil ikke længere modtage notifikationer fra dette emne.", "login_to_subscribe": "Venligt registrer eller login for at abbonere på dette emne.", "markAsUnreadForAll.success": "Emnet er market ulæst for alle.", - "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread": "Marker ulæste", + "mark_unread.success": "Emne markeret som ulæst.", "watch": "Overvåg", "unwatch": "Fjern overvågning", "watch.title": "Bliv notificeret ved nye indlæg i dette emne", @@ -51,7 +51,7 @@ "thread_tools.move_all": "Flyt alt", "thread_tools.fork": "Fraskil tråd", "thread_tools.delete": "Slet tråd", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "Slet Indlæg", "thread_tools.delete_confirm": "Er du sikker på at du vil slette dette emne?", "thread_tools.restore": "Gendan tråd", "thread_tools.restore_confirm": "Er du sikker på at du ønsker at genoprette denne tråd?", @@ -65,9 +65,9 @@ "disabled_categories_note": "Deaktiverede kategorier er nedtonede", "confirm_move": "Flyt", "confirm_fork": "Fraskil", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Bogmærke", + "favourites": "Bogmærker", + "favourites.has_no_favourites": "Du har ikke tilføjet nogle indlæg til dine bogmærker endnu.", "loading_more_posts": "Indlæser flere indlæg", "move_topic": "Flyt tråd", "move_topics": "Flyt tråde", @@ -78,7 +78,7 @@ "fork_topic_instruction": "Klik på indlæg du ønsker at fraskille", "fork_no_pids": "Ingen indlæg valgt", "fork_success": "Tråden blev fraskilt! Klik her for at gå til den fraskilte tråd.", - "delete_posts_instruction": "Click the posts you want to delete/purge", + "delete_posts_instruction": "Klik på de indlæg du vil slette/rense", "composer.title_placeholder": "Angiv din trådtittel her ...", "composer.handle_placeholder": "Navn", "composer.discard": "Fortryd", @@ -101,12 +101,12 @@ "newest_to_oldest": "Nyeste til ældste", "most_votes": "Flest stemmer", "most_posts": "Flest indlæg", - "stale.title": "Create new topic instead?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", - "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", + "stale.title": "Opret nyt emne istedet?", + "stale.warning": "Emnet du svarer på er ret gammelt. Vil du oprette et nyt emne istedet og referere dette indlæg i dit svar?", + "stale.create": "Opret nyt emne", + "stale.reply_anyway": "Svar dette emne alligevel", + "link_back": "Svar: [%1](%2)", "spam": "Spam", "offensive": "Stødende", - "custom-flag-reason": "Enter a flagging reason" + "custom-flag-reason": "Indsæt en markeringsgrund" } \ No newline at end of file diff --git a/public/language/da/user.json b/public/language/da/user.json index 04f90e9066..1488fbf056 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profil visninger", "reputation": "Omdømme", - "favourites": "Bookmarks", + "favourites": "Bogmærker", "watched": "Set", "followers": "Followers", "following": "Følger", @@ -55,11 +55,11 @@ "password": "Kodeord", "username_taken_workaround": "Det valgte brugernavn er allerede taget, så vi har ændret det en smule. Du hedder nu %1", "password_same_as_username": "Din adgangskode er det samme som dit brugernavn, vælg venligst en anden adgangskode.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "Dit kodeord er det samme som din email, venligst vælg et andet kodeord", "upload_picture": "Upload billede", "upload_a_picture": "Upload et billede", "remove_uploaded_picture": "Fjern uploaded billede", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Upload coverbillede", "settings": "Indstillinger", "show_email": "Vis min emailaddresse", "show_fullname": "Vis mit fulde navn", @@ -78,9 +78,9 @@ "has_no_posts": "Denne bruger har ikke skrevet noget endnu.", "has_no_topics": "Denne bruger har ikke skrævet nogle tråde endnu.", "has_no_watched_topics": "Denne bruger har ikke fulgt nogle tråde endnu.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_upvoted_posts": "Denne bruger har ikke syntes godt om nogle indlæg endnu.", + "has_no_downvoted_posts": "Denne bruger har ikke, syntes ikke godt om nogle indlæg endnu.", + "has_no_voted_posts": "Denne bruger har ingen stemte indlæg", "email_hidden": "Email Skjult", "hidden": "skjult", "paginate_description": "Sideinddel emner og indlæg istedet for uendeligt rul", @@ -99,9 +99,9 @@ "select-homepage": "Vælg en hjemmeside", "homepage": "Hjemmeside", "homepage_description": "Vælg en side som forummets hjemmeside, eller 'Ingen' for at bruge standard hjemmesiden.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", - "sso.not-associated": "Click here to associate with" + "custom_route": "Brugerdefinerede hjemme rute", + "custom_route_help": "Indtast et rute navn her, uden nogle foregående skråstreg (f.eks. \"nyligt\" eller \"populært\")", + "sso.title": "Enkeltgangs Sign-on Servicer", + "sso.associated": "Forbundet med", + "sso.not-associated": "Klik her for at forbinde med" } \ No newline at end of file diff --git a/public/language/da/users.json b/public/language/da/users.json index 8ec326f45f..71e4aef9f7 100644 --- a/public/language/da/users.json +++ b/public/language/da/users.json @@ -16,5 +16,5 @@ "unread_topics": "Ulæste Tråde", "categories": "Kategorier", "tags": "Tags", - "no-users-found": "No users found!" + "no-users-found": "Ingen brugere fundet!" } \ No newline at end of file diff --git a/public/language/de/email.json b/public/language/de/email.json index 3df33a6702..d96a0b7b38 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -14,8 +14,8 @@ "reset.text2": "Klicke bitte auf den folgenden Link, um mit der Zurücksetzung deines Passworts fortzufahren:", "reset.cta": "Klicke hier, um dein Passwort zurückzusetzen", "reset.notify.subject": "Passwort erfolgreich geändert", - "reset.notify.text1": "Wir benachrichtigen dich das am %1, dein Passwort erfolgreich geändert wurde.", - "reset.notify.text2": "Wenn du das nicht autorisiert hast, bitte benachrichtige umgehend einen Administrator.", + "reset.notify.text1": "Wir benachrichtigen dich, dass dein Passwort am %1 erfolgreich geändert wurde.", + "reset.notify.text2": "Bitte benachrichtige umgehend einen Administrator, wenn du dies nicht autorisiert hast.", "digest.notifications": "Du hast ungelesene Benachrichtigungen von %1:", "digest.latest_topics": "Neueste Themen vom %1", "digest.cta": "Klicke hier, um %1 zu besuchen", diff --git a/public/language/de/error.json b/public/language/de/error.json index 6f053540f2..5e8e785fd6 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -14,7 +14,7 @@ "invalid-password": "Ungültiges Passwort", "invalid-username-or-password": "Bitte gebe einen Benutzernamen und ein Passwort an", "invalid-search-term": "Ungültige Suchanfrage", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Ungültige Seitennummerierung, muss mindestens %1 und maximal %2 sein", "username-taken": "Der Benutzername ist bereits vergeben", "email-taken": "Die E-Mail-Adresse ist bereits vergeben", "email-not-confirmed": "Deine E-Mail wurde noch nicht bestätigt, bitte klicke hier, um deine E-Mail zu bestätigen.", @@ -50,8 +50,8 @@ "still-uploading": "Bitte warte bis der Vorgang abgeschlossen ist.", "file-too-big": "Die maximale Dateigröße ist %1 kB, bitte lade eine kleinere Datei hoch.", "guest-upload-disabled": "Uploads für Gäste wurden deaktiviert.", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Du hast diesen Beitrag bereits als Lesezeichen gespeichert", + "already-unfavourited": "Du hast diesen Beitrag bereits aus deinen Lesezeichen entfernt", "cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!", "cant-remove-last-admin": "Du bist der einzige Administrator. Füge zuerst einen anderen Administrator hinzu, bevor du dich selbst als Administrator entfernst", "invalid-image-type": "Falsche Bildart. Erlaubte Arten sind: %1", @@ -83,7 +83,7 @@ "chat-message-too-long": "Die Nachricht ist zu lang", "cant-edit-chat-message": "Du darfst diese Nachricht nicht ändern", "cant-remove-last-user": "Du kannst den letzten Benutzer nicht entfernen", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "Du darfst diese Nachricht nicht löschen", "reputation-system-disabled": "Das Reputationssystem ist deaktiviert.", "downvoting-disabled": "Downvotes sind deaktiviert.", "not-enough-reputation-to-downvote": "Dein Ansehen ist zu niedrig, um diesen Beitrag negativ zu bewerten.", @@ -96,6 +96,6 @@ "wrong-login-type-username": "Bitte nutze deinen Benutzernamen zum einloggen", "invite-maximum-met": "Du hast bereits die maximale Anzahl an Personen eingeladen (%1 von %2).", "no-session-found": "Keine Login-Sitzung gefunden!", - "not-in-room": "User not in room", - "no-users-in-room": "No users in this room" + "not-in-room": "Benutzer nicht in Raum", + "no-users-in-room": "In diesem Raum befinden sich keine Benutzer." } \ No newline at end of file diff --git a/public/language/de/global.json b/public/language/de/global.json index b46bf4fcbe..82179436b4 100644 --- a/public/language/de/global.json +++ b/public/language/de/global.json @@ -87,8 +87,8 @@ "map": "Karte", "sessions": "Login-Sitzungen", "ip_address": "IP-Adresse", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "Seitennummer eingeben", + "upload_file": "Datei hochladen", + "upload": "Hochladen", + "allowed-file-types": "Erlaubte Dateitypen sind %1" } \ No newline at end of file diff --git a/public/language/de/groups.json b/public/language/de/groups.json index db26671315..18d0489284 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -49,5 +49,5 @@ "membership.leave-group": "Gruppe verlassen", "membership.reject": "Ablehnen", "new-group.group_name": "Gruppenname:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Gruppentitelbild hochladen" } \ No newline at end of file diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 438d6abadc..faaeb28215 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 und %2 andere Nutzer haben deinen Beitrag in %3 positiv bewertet.", "moved_your_post": "%1 hat deinen Beitrag nach %2 verschoben.", "moved_your_topic": "%1 hat %2 verschoben.", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 hat deinen Beitrag in %2 als Lesezeichen gespeichert.", + "favourited_your_post_in_dual": "%1 und %2 haben deinen Beitrag in %3 als Lesezeichen gespeichert.", + "favourited_your_post_in_multiple": "%1 und %2 andere Nutzer haben deinen Beitrag in %3 als Lesezeichen gespeichert.", "user_flagged_post_in": "%1 hat einen Beitrag in %2 gemeldet", "user_flagged_post_in_dual": "%1 und %2 haben einen Beitrag in %3 gemeldet", "user_flagged_post_in_multiple": "%1 und %2 andere Nutzer haben einen Beitrag in %3 gemeldet", @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 und %2 folgen dir jetzt.", "user_started_following_you_multiple": "%1 und %2 andere Nutzer folgen dir jetzt.", "new_register": "%1 hat eine Registrationsanfrage geschickt.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "E-Mail bestätigt", "email-confirmed-message": "Vielen Dank für Ihre E-Mail-Validierung. Ihr Konto ist nun vollständig aktiviert.", "email-confirm-error-message": "Es gab ein Problem bei der Validierung Ihrer E-Mail-Adresse. Möglicherweise ist der Code ungültig oder abgelaufen.", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 0844e4d18d..743f286bd4 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -6,12 +6,12 @@ "popular-month": "Beliebte Themen dieses Monats", "popular-alltime": "Beliebteste Themen", "recent": "Neueste Themen", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Gemeldete Beiträge", "users/online": "Benutzer online", "users/latest": "Neuste Benutzer", "users/sort-posts": "Benutzer mit den meisten Beiträgen", "users/sort-reputation": "Benutzer mit dem höchsten Ansehen", - "users/banned": "Banned Users", + "users/banned": "Gesperrte Benutzer", "users/search": "Benutzer Suche", "notifications": "Benachrichtigungen", "tags": "Markierungen", @@ -31,15 +31,15 @@ "account/following": "Nutzer, denen %1 folgt", "account/followers": "Nutzer, die %1 folgen", "account/posts": "Beiträge von %1", - "account/topics": "Themen verfasst von %1", + "account/topics": "Von %1 verfasste Themen", "account/groups": "Gruppen von %1", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "Lesezeichen von %1", "account/settings": "Benutzer-Einstellungen", "account/watched": "Von %1 beobachtete Themen", "account/upvoted": "Von %1 positiv bewertete Beiträge", "account/downvoted": "Von %1 negativ bewertete Beiträge", "account/best": "Bestbewertete Beiträge von %1", - "confirm": "Email Confirmed", + "confirm": "E-Mail bestätigt", "maintenance.text": "%1 befindet sich derzeit in der Wartung. Bitte komme später wieder.", "maintenance.messageIntro": "Zusätzlich hat der Administrator diese Nachricht hinterlassen:", "throttled.text": "%1 ist momentan aufgrund von Überlastung nicht verfügbar. Bitte komm später wieder." diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 7ab5299cc8..2b34c42911 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "Bitte registrieren oder einloggen um dieses Thema zu abonnieren", "markAsUnreadForAll.success": "Thema für Alle als ungelesen markiert.", "mark_unread": "Als ungelesen markieren", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Thema als ungelesen markiert.", "watch": "Beobachten", "unwatch": "Nicht mehr beobachten", "watch.title": "Bei neuen Antworten benachrichtigen", @@ -65,9 +65,9 @@ "disabled_categories_note": "Deaktivierte Kategorien sind ausgegraut.", "confirm_move": "Verschieben", "confirm_fork": "Aufspalten", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Lesezeichen", + "favourites": "Lesezeichen", + "favourites.has_no_favourites": "Du hast noch keine Beiträge als Lesezeichen gespeichert.", "loading_more_posts": "Lade mehr Beiträge", "move_topic": "Thema verschieben", "move_topics": "Themen verschieben", diff --git a/public/language/de/user.json b/public/language/de/user.json index 3efc474489..e2cf854439 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profilaufrufe", "reputation": "Ansehen", - "favourites": "Bookmarks", + "favourites": "Lesezeichen", "watched": "Beobachtet", "followers": "Follower", "following": "Folge ich", @@ -55,11 +55,11 @@ "password": "Passwort", "username_taken_workaround": "Der gewünschte Benutzername ist bereits vergeben, deshalb haben wir ihn ein wenig verändert. Du bist jetzt unter dem Namen %1 bekannt.", "password_same_as_username": "Dein Passwort entspricht deinem Benutzernamen, bitte wähle ein anderes Passwort.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "Dein Passwort entspricht deiner E-Mail-Adresse, bitte wähle ein anderes Passwort.", "upload_picture": "Bild hochladen", "upload_a_picture": "Ein Bild hochladen", "remove_uploaded_picture": "Hochgeladenes Bild entfernen", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Titelbild hochladen", "settings": "Einstellungen", "show_email": "Zeige meine E-Mail Adresse an.", "show_fullname": "Zeige meinen kompletten Namen an", diff --git a/public/language/de/users.json b/public/language/de/users.json index 3dc0d1e78b..9a25653e0d 100644 --- a/public/language/de/users.json +++ b/public/language/de/users.json @@ -16,5 +16,5 @@ "unread_topics": "Ungelesen Themen", "categories": "Kategorien", "tags": "Schlagworte", - "no-users-found": "No users found!" + "no-users-found": "Keine Benutzer gefunden!" } \ No newline at end of file diff --git a/public/language/el/notifications.json b/public/language/el/notifications.json index eefd1ccc03..53cc1e7fce 100644 --- a/public/language/el/notifications.json +++ b/public/language/el/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Το Εmail Επιβεβαιώθηκε", "email-confirmed-message": "Ευχαριστούμε που επιβεβαίωσες το email σου. Ο λογαριασμός σου είναι πλέον πλήρως ενεργοποιημένος.", "email-confirm-error-message": "Υπήρξε κάποιο πρόβλημα με την επιβεβαίωση της διεύθυνσής email σου. Ίσως ο κώδικας να είναι άκυρος ή να έχει λήξει.", diff --git a/public/language/en@pirate/notifications.json b/public/language/en@pirate/notifications.json index b22456f660..cee3aa994b 100644 --- a/public/language/en@pirate/notifications.json +++ b/public/language/en@pirate/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/en_US/notifications.json b/public/language/en_US/notifications.json index 0b1d9931a5..28d35e65fa 100644 --- a/public/language/en_US/notifications.json +++ b/public/language/en_US/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 3bee47fd1a..78dae1fc51 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 y %2 comenzaron a seguirte.", "user_started_following_you_multiple": "%1 y otras %2 personas comenzaron a seguirte.", "new_register": "%1 envió una solicitud de registro.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Correo electrónico confirmado", "email-confirmed-message": "Gracias por validar tu correo electrónico. Tu cuenta ya está completamente activa.", "email-confirm-error-message": "Hubo un problema al validar tu cuenta de correo electrónico. Quizá el código era erróneo o expiró...", diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index d4d28fb48a..11e2823a75 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 ja %2 hakkasid sind jälgima.", "user_started_following_you_multiple": "%1 ja %2 hakkasid sind jälgima.", "new_register": "%1 saatis registreerimistaotluse.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Emaili aadress kinnitatud", "email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja on nüüd täielikult aktiveeritud.", "email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.", diff --git a/public/language/fa_IR/email.json b/public/language/fa_IR/email.json index a4216ef881..1ec13b4a26 100644 --- a/public/language/fa_IR/email.json +++ b/public/language/fa_IR/email.json @@ -21,9 +21,9 @@ "digest.cta": "برای دیدن %1 اینجا کلیک کنید", "digest.unsub.info": "این اعداد که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", "digest.no_topics": "در %1 گذشته هیچ موضوعی فعال نبوده است", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "روز", + "digest.week": "هفته", + "digest.month": "ماه", "notif.chat.subject": "پیام چتی جدیدی از %1 دریافت شد", "notif.chat.cta": "برای ادامه‌ی چت اینجا کلیک کنید", "notif.chat.unsub.info": "این اطلاعیه ی چتیی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index a038b8fe03..cce6eb95dd 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -24,7 +24,7 @@ "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری بفرستید.", "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", - "password-too-long": "Password too long", + "password-too-long": "کلمه عبور بسیار طولانیست", "user-banned": "کاربر محروم شد.", "user-too-new": "با عرض پوزش، شما باید %1 ثانیه پیش از فرستادن پست نخست خود صبر کنید", "no-category": "دسته بندی وجود ندارد", @@ -97,5 +97,5 @@ "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", "not-in-room": "User not in room", - "no-users-in-room": "No users in this room" + "no-users-in-room": "هیچ کاربری در این گفتگو نیست" } \ No newline at end of file diff --git a/public/language/fa_IR/groups.json b/public/language/fa_IR/groups.json index 9f4805e44a..9de831f470 100644 --- a/public/language/fa_IR/groups.json +++ b/public/language/fa_IR/groups.json @@ -24,7 +24,7 @@ "details.has_no_posts": "اعضای این گروه هیچ پستی ایجاد نکرده اند", "details.latest_posts": "آخرین پست ها", "details.private": "خصوصی", - "details.disableJoinRequests": "Disable join requests", + "details.disableJoinRequests": "غیر فعال کردن درخواستهای عضویت", "details.grant": "اعطاء/خلع مالکیت", "details.kick": "بیرون انداختن", "details.owner_options": "مدیر گروه", @@ -49,5 +49,5 @@ "membership.leave-group": "خروج از گروه", "membership.reject": "رد", "new-group.group_name": "نام گروه", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "آپلود کاور گروه" } \ No newline at end of file diff --git a/public/language/fa_IR/modules.json b/public/language/fa_IR/modules.json index c588350c40..6d9d92806b 100644 --- a/public/language/fa_IR/modules.json +++ b/public/language/fa_IR/modules.json @@ -7,7 +7,7 @@ "chat.user_has_messaged_you": "%1 به شما پیام داده است.", "chat.see_all": "دیدن همه ی چت ها", "chat.no-messages": "مشخص کنید تاریخچه چتهایتان با چه کاربری را می‌خواهید ببینید", - "chat.no-users-in-room": "No users in this room", + "chat.no-users-in-room": "هیچ کاربری در این گفتگو نیست", "chat.recent-chats": "چتهای اخیر", "chat.contacts": "تماس‌ها", "chat.message-history": "تاریخچه پیام‌ها", diff --git a/public/language/fa_IR/notifications.json b/public/language/fa_IR/notifications.json index ec7c0dfd54..ee4641d006 100644 --- a/public/language/fa_IR/notifications.json +++ b/public/language/fa_IR/notifications.json @@ -27,9 +27,10 @@ "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", "user_posted_topic": "%1 یک موضوع جدید ارسال کرده: %2", "user_started_following_you": "%1 شروع به دنبال کردن شما کرده", - "user_started_following_you_dual": "%1 and %2 started following you.", + "user_started_following_you_dual": "%1 و %2 شروع به دنبال کردن شما کرده.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 یک درخواست ثبت نام ارسال کرده است", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "ایمیل تایید شد", "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", "email-confirm-error-message": "خطایی در تایید آدرس ایمیل شما پیش آمده است. ممکن است کد نا‌معتبر و یا منقضی شده باشد.", diff --git a/public/language/fi/notifications.json b/public/language/fi/notifications.json index 2c7ee53a9b..68fa97b695 100644 --- a/public/language/fi/notifications.json +++ b/public/language/fi/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Sähköpostiosoite vahvistettu", "email-confirmed-message": "Kiitos sähköpostiosoitteesi vahvistamisesta. Käyttäjätilisi on nyt täysin aktivoitu.", "email-confirm-error-message": "Ongelma sähköpostiosoitteen vahvistamisessa. Ehkäpä koodi oli virheellinen tai vanhentunut.", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index 5a24d4c9eb..7ce8c30d06 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 et %2 vous suivent.", "user_started_following_you_multiple": "%1 et %2 autres vous suivent.", "new_register": "%1 a envoyé une demande d'incription.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email vérifié", "email-confirmed-message": "Merci pour la validation de votre adresse email. Votre compte est désormais activé.", "email-confirm-error-message": "Il y a un un problème dans la vérification de votre adresse email. Le code est peut être invalide ou a expiré.", diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 34829191b3..2796d782a0 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 e %2 comezaron a seguirte.", "user_started_following_you_multiple": "%1 e %2 máis comezaron a seguirte.", "new_register": "%1 enviou unha petición de rexistro.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Correo confirmado", "email-confirmed-message": "Grazas por validar o teu correo. A túa conta agora está activada.", "email-confirm-error-message": "Houbo un problema validando o teu correo. Poida que o código fose inválido ou expirase. ", diff --git a/public/language/he/error.json b/public/language/he/error.json index d4a969d21a..a5edc06abe 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -50,8 +50,8 @@ "still-uploading": "אנא המתן לסיום ההעלאות", "file-too-big": "הגודל המקסימלי של הקובץ הוא %1 קילובייט - אנא העלה קובץ קטן יותר", "guest-upload-disabled": "העלאת אורחים אינה מאופשרת", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "כבר סימנת את הפוסט הזה", + "already-unfavourited": "כבר הסרת את הסימון מפוסט זה", "cant-ban-other-admins": "אינך יכול לחסום מנהלים אחרים!", "cant-remove-last-admin": "אתה המנהל היחיד. הוסף משתמש אחר לניהול לפני שאתה מוריד את עצמך מניהול", "invalid-image-type": "פורמט תמונה לא תקין. הפורמטים המורשים הם: %1", @@ -97,5 +97,5 @@ "invite-maximum-met": "הזמנת את הכמות המירבית של אנשים (%1 מתוך %2).", "no-session-found": "לא נמצאו סשני התחברות!", "not-in-room": "משתמש זה לא בצ'אט", - "no-users-in-room": "No users in this room" + "no-users-in-room": "אין משתמש בחדר הזה" } \ No newline at end of file diff --git a/public/language/he/global.json b/public/language/he/global.json index b1ada66688..f4b966429e 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -87,8 +87,8 @@ "map": "מפה", "sessions": "סשני התחברות", "ip_address": "כתובת IP", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "הכנס מספר עמוד", + "upload_file": "העלה קובץ", + "upload": "העלה", + "allowed-file-types": "פורמטי הקבצים המורשים הם %1" } \ No newline at end of file diff --git a/public/language/he/groups.json b/public/language/he/groups.json index 30ffe57467..abd3ef14d8 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -49,5 +49,5 @@ "membership.leave-group": "עזוב קבוצה", "membership.reject": "דחה", "new-group.group_name": "שם קבוצה", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "העלה תמונת נושא לקבוצה" } \ No newline at end of file diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index d6cddc6d7e..30255302fc 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 ו%2 אחרים הצביעו לפוסט שלך ב%3.", "moved_your_post": "%1 העביר את הפוסט שלך ל%2", "moved_your_topic": "%1 הוזז ל%2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 סימן את הפוסט שלך ב%2.", + "favourited_your_post_in_dual": "%1 ו%2 סימנו את הפוסט שלך ב%3.", + "favourited_your_post_in_multiple": "%1 ו-%2 אחרים סימנו את הפוסט שלך ב%3.", "user_flagged_post_in": "%1 דיווח על פוסט ב %2", "user_flagged_post_in_dual": "%1 ו%2 סימנו פוסט ב%3", "user_flagged_post_in_multiple": "%1 ו%2 נוספים סימנו פוסט ב%3", @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 ו%1 התחילו לעקוב אחריך.", "user_started_following_you_multiple": "%1 ו%2 התחילו לעקוב אחריך.", "new_register": "%1 שלח בקשת הרשמה.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "כתובת המייל אושרה", "email-confirmed-message": "תודה שאישרת את כתובת המייל שלך. החשבון שלך פעיל כעת.", "email-confirm-error-message": "אירעה שגיאה בעת אישור המייל שלך. ייתכן כי הקוד היה שגוי או פג תוקף.", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index de5b360411..0a36793f6a 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -33,13 +33,13 @@ "account/posts": "הודעות שפורסמו על ידי %1", "account/topics": "נושאים שנוצרו על ידי %1", "account/groups": "הקבוצות של %1", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "הפוסטים שסומנו על ידי %1", "account/settings": "הגדרות משתמש", "account/watched": "נושאים שנצפו על ידי %1", "account/upvoted": "פוסטים שהוצבעו לטובה על ידי %1", "account/downvoted": "פוסטים שהוצבעו לרעה על ידי %1", "account/best": "הפוסטים הטובים ביותר שנוצרו על ידי %1", - "confirm": "Email Confirmed", + "confirm": "כתובת המייל אושרה", "maintenance.text": "%1 כרגע תחת עבודות תחזוקה. אנא חזור בזמן מאוחר יותר.", "maintenance.messageIntro": "בנוסף, המנהל השאיר את ההודעה הזו:", "throttled.text": "%1 לא זמן כעת עקב טעינת יתר. אנא חזור מאוחר יותר." diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 84200d1908..49ca0e5bba 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "קטגוריות מבוטלות צבועות באפור", "confirm_move": "הזז", "confirm_fork": "שכפל", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "סימניה", + "favourites": "סימניות", + "favourites.has_no_favourites": "עוד לא סימנת שום פוסט.", "loading_more_posts": "טוען פוסטים נוספים", "move_topic": "הזז נושא", "move_topics": "הזז נושאים", diff --git a/public/language/he/user.json b/public/language/he/user.json index ea8a1aaffd..e830f21f58 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -22,7 +22,7 @@ "profile": "פרופיל", "profile_views": "צפיות בפרופיל", "reputation": "מוניטין", - "favourites": "Bookmarks", + "favourites": "סימניות", "watched": "נצפה", "followers": "עוקבים", "following": "עוקב אחרי", @@ -55,11 +55,11 @@ "password": "סיסמה", "username_taken_workaround": "שם המשתמש שבחרת כבר תפוס, אז שינינו אותו מעט. שם המשתמש שלך כעת הוא %1", "password_same_as_username": "הסיסמה שלך זהה לשם המשתמש, אנא בחר סיסמה שונה.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "הסיסמה שלך זהה לכתובת המייל שלך, אנא בחר סיסמה שונה.", "upload_picture": "העלה תמונה", "upload_a_picture": "העלה תמונה", "remove_uploaded_picture": "מחק את התמונה שהועלתה", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "העלה תמונת נושא", "settings": "הגדרות", "show_email": "פרסם את כתובת האימייל שלי", "show_fullname": "הצג את שמי המלא", diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index 33f71e2c35..b1b09a5dd7 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/id/notifications.json b/public/language/id/notifications.json index aeb0f894a7..e4290a117d 100644 --- a/public/language/id/notifications.json +++ b/public/language/id/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 mengirim permintaan registrasi.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email telah Dikonfirmasi", "email-confirmed-message": "Terimakasih telah melakukan validasi email. Akunmu saat ini telah aktif sepenuhnya.", "email-confirm-error-message": "Terjadi masalah saat melakukan validasi emailmu. Mungkin terjadi kesalahan kode atau waktu habis.", diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 3addf77765..fc8f3bccc8 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 ha inviato una richiesta di registrazione.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confermata", "email-confirmed-message": "Grazie per aver validato la tua email. Il tuo account è ora completamente attivato.", "email-confirm-error-message": "C'è stato un problema nella validazione del tuo indirizzo email. Potrebbe essere il codice non valido o scaduto.", diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index 9d0ca95f07..5fff05542b 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 0bd26d9348..e921dba067 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -50,8 +50,8 @@ "still-uploading": "업로드가 끝날 때까지 기다려주세요.", "file-too-big": "업로드 가능한 파일크기는 최대 %1 KB 입니다 - 파일의 용량을 줄이거나 압축을 활용하세요.", "guest-upload-disabled": "손님의 파일 업로드는 제한되어 있습니다.", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "이미 이 게시물을 북마크 했습니다.", + "already-unfavourited": "이미 이 게시물을 북마크 해제했습니다.", "cant-ban-other-admins": "다른 관리자를 차단할 수 없습니다.", "cant-remove-last-admin": "귀하는 유일한 관리자입니다. 관리자를 그만두시기 전에 다른 사용자를 관리자로 선임하세요.", "invalid-image-type": "올바르지 않은 이미지입니다. 사용가능한 유형: %1", @@ -96,6 +96,6 @@ "wrong-login-type-username": "사용자명을 통해 로그인하세요.", "invite-maximum-met": "초대가능한 사용자를 모두 초대했습니다. (%2명 중 %1을 초대)", "no-session-found": "로그인 세션을 찾을 수 없습니다.", - "not-in-room": "없는 유저입니다.", - "no-users-in-room": "No users in this room" + "not-in-room": "없는 사용자입니다.", + "no-users-in-room": "사용자가 없습니다." } \ No newline at end of file diff --git a/public/language/ko/global.json b/public/language/ko/global.json index 4457d09311..9669750309 100644 --- a/public/language/ko/global.json +++ b/public/language/ko/global.json @@ -51,7 +51,7 @@ "posts": "게시물", "best": "베스트", "upvoted": "Upvoted", - "downvoted": "Downvoted", + "downvoted": "비추됨", "views": "조회 수", "reputation": "인기도", "read_more": "전체 보기", @@ -87,8 +87,8 @@ "map": "맵", "sessions": "로그인 세션", "ip_address": "아이피 주소", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "페이지 번호를 입력하세요", + "upload_file": "파일 업로드", + "upload": "업로드", + "allowed-file-types": "사용가능한 파일 유형: %1" } \ No newline at end of file diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index bea6c7d39c..e1f5fa65d0 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -49,5 +49,5 @@ "membership.leave-group": "그룹 나가기", "membership.reject": "거절", "new-group.group_name": "그룹명:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "그룹 커버 업로드" } \ No newline at end of file diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 910681d2fb..40a4b6af0b 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -13,12 +13,12 @@ "new_message_from": "%1님이 메시지를 보냈습니다.", "upvoted_your_post_in": "%1님이 %2의 내 게시물을 추천했습니다.", "upvoted_your_post_in_dual": "%1님과 %2님이 %3의 내 게시물을 추천했습니다.", - "upvoted_your_post_in_multiple": "%1 님과 다른 %2 명이 %3 안의 당신의 게시물을 upvote 했습니다.", + "upvoted_your_post_in_multiple": "%1 님과 다른 %2 명이 %3의 내 게시물을 추천했습니다.", "moved_your_post": "%1님이 귀하의 게시물을 %2로 옮겼습니다.", "moved_your_topic": "%1%2 로 옮겨졌습니다.", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1님이 %2의 내 게시물을 북마크 했습니다.", + "favourited_your_post_in_dual": "%1 님과 %2 님이 %3의 내 게시물을 북마크 했습니다.", + "favourited_your_post_in_multiple": "%1 님과 다른 %2 명이 %3의 내 게시물을 북마크 했습니다.", "user_flagged_post_in": "%1님이 %2의 게시물을 신고했습니다.", "user_flagged_post_in_dual": "%1 님과 %2 님이 %3 안의 게시물에 플래그를 세웠습니다.", "user_flagged_post_in_multiple": "%1 님과 %2 명의 다른 유저들이 %3 안의 게시물에 플래그를 세웠습니다.", @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1님과 %2님이 당신을 팔로우 시작했습니다.", "user_started_following_you_multiple": "%1님외 %2명이 당신을 팔로우 시작했습니다.", "new_register": "%1님이 가입요청을 했습니다.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "확인된 이메일", "email-confirmed-message": "이메일을 확인해주셔서 감사합니다. 계정이 완전히 활성화되었습니다.", "email-confirm-error-message": "이메일 주소를 검증하지 못했습니다. 코드가 올바르지 않거나 만료되었을 수 있습니다.", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index 242c610438..65130b5b29 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -33,13 +33,13 @@ "account/posts": "%1 님이 작성한 게시물", "account/topics": "%1 님이 생성한 주제", "account/groups": "%1님의 그룹", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "%1님의 북마크된 게시물", "account/settings": "사용자 설정", "account/watched": "%1님이 지켜보는 주제", "account/upvoted": "%1 님이 upvote한 게시물", "account/downvoted": "%1 님에 의해 Downvote된 게시물", "account/best": "%1 님 최고의 게시물", - "confirm": "Email Confirmed", + "confirm": "확인된 이메일", "maintenance.text": "%1 사이트는 현재 점검 중입니다. 나중에 다시 방문해주세요.", "maintenance.messageIntro": "다음은 관리자가 전하는 메시지입니다.", "throttled.text": "과도한 부하로 %1 를 로드할 수 없습니다. 잠시후에 다시 시도해주세요." diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 59b1ae0e47..056ccb5a8f 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "비활성화된 카테고리는 회색으로 표시됩니다.", "confirm_move": "이동", "confirm_fork": "분리", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "북마크", + "favourites": "북마크", + "favourites.has_no_favourites": "북마크한 게시글이 없습니다.", "loading_more_posts": "게시물을 로딩 중", "move_topic": "주제 이동", "move_topics": "주제 이동", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 592af0f1ce..afb32ac984 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -22,7 +22,7 @@ "profile": "프로필", "profile_views": "프로필 조회 수", "reputation": "인기도", - "favourites": "Bookmarks", + "favourites": "북마크", "watched": "읽음", "followers": "이 사용자를 팔로우", "following": "이 사용자가 팔로우", @@ -43,23 +43,23 @@ "uploaded_picture": "사진 업로드", "upload_new_picture": "새 사진 업로드", "upload_new_picture_from_url": "URL을 통해 새 사진 업로드", - "current_password": "현재 패스워드", - "change_password": "패스워드 변경", - "change_password_error": "올바르지 않은 패스워드", - "change_password_error_wrong_current": "현재 패스워드가 올바르지 않습니다.", - "change_password_error_length": "패스워드가 너무 짧습니다.", - "change_password_error_match": "재입력한 패스워드가 새 패스워드와 일치하지 않습니다!", - "change_password_error_privileges": "패스워드를 바꿀 권한이 없습니다.", - "change_password_success": "패스워드를 변경했습니다.", - "confirm_password": "패스워드 재입력", - "password": "패스워드", + "current_password": "현재 비밀번호", + "change_password": "비밀번호 변경", + "change_password_error": "올바르지 않은 비밀번호", + "change_password_error_wrong_current": "현재 비밀번호가 올바르지 않습니다.", + "change_password_error_length": "비밀번호가 너무 짧습니다.", + "change_password_error_match": "재입력한 비밀번호가 새 비밀번호와 일치하지 않습니다!", + "change_password_error_privileges": "비밀번호를 바꿀 권한이 없습니다.", + "change_password_success": "비밀번호를 변경했습니다.", + "confirm_password": "비밀번호 재입력", + "password": "비밀번호", "username_taken_workaround": "새 사용자 이름이 이미 존재하여 %1로 저장되었습니다.", - "password_same_as_username": "패스워드가 사용자명과 동일합니다. 다시 입력하세요.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_username": "비밀번호가 사용자명과 동일합니다. 다른 비밀번호를 입력하세요.", + "password_same_as_email": "비밀번호가 이메일 주소와 동일합니다. 다른 비밀번호를 입력하세요.", "upload_picture": "사진 업로드", "upload_a_picture": "사진 업로드", "remove_uploaded_picture": "등록된 사진을 삭제", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "커버 사진 업로드", "settings": "설정", "show_email": "이메일 공개", "show_fullname": "실명 공개", diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 079591f953..640f9bde08 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 atsiuntė registracijos prašymą", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "El. paštas patvirtintas", "email-confirmed-message": "Dėkojame už el. pašto patvirtinimą. Jūsų paskyra pilnai aktyvuota.", "email-confirm-error-message": "Įvyko klaida mėginant patvirtinti Jūsų el. pašto adresą. Galbūt kodas yra neteisingas, arba nebegalioajantis.", diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index 2700d7d248..dab972b82d 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 dan %2 mula mengikuti anda.", "user_started_following_you_multiple": "%1 dan %2 lagi mula mengikuti anda.", "new_register": "%1 menghantar jemputan pendaftaran.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Emel Disahkan", "email-confirmed-message": "Terima kasih kerana mengesahkan emel anda. Akaun anda telah diaktifkan sepenuhnya.", "email-confirm-error-message": "Berlaku masalah semasa mengesahkan emel anda. Mungkin kod tidak sah atau tamat tempoh.", diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index 927f144414..f532425c00 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sendte en forespørsel om registrering", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "E-post bekreftet", "email-confirmed-message": "Takk for at du har validert din e-post. Kontoen din er nå fullstendig aktivert.", "email-confirm-error-message": "Det oppsto et problem under valdiering av din e-post. Koden kan ha vært ugyldig eller ha utløpt.", diff --git a/public/language/nl/category.json b/public/language/nl/category.json index 78037189b3..c65576b9dd 100644 --- a/public/language/nl/category.json +++ b/public/language/nl/category.json @@ -1,12 +1,12 @@ { "category": "Categorie", - "subcategories": "subcategorie", + "subcategories": "Subcategorieën", "new_topic_button": "Nieuw onderwerp", "guest-login-post": "Log in om een reactie te plaatsen", "no_topics": "Er zijn geen onderwerpen in deze categorie.
Waarom maak je er niet een aan?", "browsing": "browsing", "no_replies": "Niemand heeft gereageerd", - "no_new_posts": "Geen nieuwe berichten", + "no_new_posts": "Geen nieuwe berichten.", "share_this_category": "Deel deze categorie", "watch": "Volgen", "ignore": "Negeren", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 936903cf0f..b23072f895 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -1,30 +1,30 @@ { "invalid-data": "Ongeldige Data", - "not-logged-in": "Dit account lijkt op dit moment niet ingelogd te zijn.", + "not-logged-in": "Het lijkt erop dat je niet ingelogd bent.", "account-locked": "Dit account is tijdelijk vergrendeld", - "search-requires-login": "Zoeken vereist een account - gelieve aan te melden of te registreren.", + "search-requires-login": "Zoeken vereist een account - meld je aan of registreer je om te zoeken.", "invalid-cid": "Ongeldige categoriesleutel", "invalid-tid": "Ongeldig id voor onderwerp", "invalid-pid": "Ongeldig berichtkenmerk", "invalid-uid": "Ongeldig gebruikerskenmerk", "invalid-username": "Ongeldige gebruikersnaam", "invalid-email": "Ongeldig e-mailadres", - "invalid-title": "Ongeldige titel", + "invalid-title": "Ongeldige titel!", "invalid-user-data": "Ongeldige gebruikersgegevens", "invalid-password": "Ongeldig wachtwoord", "invalid-username-or-password": "Geef zowel een gebruikersnaam als wachtwoord op", - "invalid-search-term": "Ongeldig zoekopdracht, een of meerdere termen", + "invalid-search-term": "Ongeldig zoekterm", "invalid-pagination-value": "Invalide paginering waarde. De waarde moet op z'n minst %1 zijn en niet hoger dan %2 zijn.", "username-taken": "Gebruikersnaam is al in gebruik ", - "email-taken": "E-mailadres is al eens eerder gebruikt", - "email-not-confirmed": "Het e-mailadres van dit account is nog niet bevestigd. Klik hier om het e-mailadres te bevestigen en de registratie af te ronden.", + "email-taken": "E-mailadres is al in gebruik", + "email-not-confirmed": "Het e-mailadres van dit account is nog niet bevestigd, klik hier om je e-mailadres te bevestigen.", "email-not-confirmed-chat": "Het gebruik van chatfunctionaliteit is pas toegestaan na validatie van het e-mailadres.", "no-email-to-confirm": "Dit berichtenforum vereist bevestiging per e-mail, klik hier om een e-mailadres te registreren", "email-confirm-failed": "Helaas kon het e-mailadres niet bevestigd worden, probeer het later nog eens.", - "confirm-email-already-sent": "Bevestigingsbericht per e-mail al zojuist verzonden, wacht even een %1 tal minuutjes voordat opnieuw een bericht verzonden wordt.", - "username-too-short": "Gebruikersnaam bevat niet voldoende tekens", - "username-too-long": "Gebruikersnaam bevat meer dan het toegestane aantal tekens", - "password-too-long": "Wachtwoord te lang", + "confirm-email-already-sent": "Bevestigingsmail is zojuist al verzonden, wacht alsjeblieft %1 minuut (minuten) voordat je opnieuw een bevestigingsmail aanvraagt.", + "username-too-short": "Gebruikersnaam is te kort", + "username-too-long": "Gebruikersnaam is te lang", + "password-too-long": "Wachtwoord is te lang", "user-banned": "Gebruiker verbannen", "user-too-new": "Helaas, het is een vereiste om %1 seconde(n) te wachten voordat het eerste bericht geplaatst kan worden.", "no-category": "Categorie bestaat niet", @@ -50,8 +50,8 @@ "still-uploading": "Een moment geduld tot alle bestanden overgebracht zijn...", "file-too-big": "Maximum toegestane bestandsgrootte is %1 kB - probeer een kleiner bestand te verzenden", "guest-upload-disabled": "Uploads voor gasten zijn uitgeschaleld ", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Je hebt dit bericht al als favoriet toegevoegd", + "already-unfavourited": "Je hebt dit bericht al verwijderd uit de favorieten", "cant-ban-other-admins": "Het is niet toegestaan andere beheerders te verbannen!", "cant-remove-last-admin": "U bent de enige administrator. Voeg een andere gebruiker toe als administrator voordat u uw zelf verwijderd als admin", "invalid-image-type": "Ongeldig bestandstype afbeelding. Deze afbeelding is van een bestandstype dat niet ondersteund wordt. Toegestane bestandstypes voor afbeeldingsbestanden zijn: %1", @@ -97,5 +97,5 @@ "invite-maximum-met": "Je heb het maximum aantal mensen uitgenodigd (%1 van de %2).", "no-session-found": "Geen login sessie gevonden!", "not-in-room": "Geen gebruiker in deze chat room", - "no-users-in-room": "No users in this room" + "no-users-in-room": "Er zijn geen gebruikers in deze chat" } \ No newline at end of file diff --git a/public/language/nl/global.json b/public/language/nl/global.json index 3a3d7afe18..65ff6ff8f4 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -2,7 +2,7 @@ "home": "Home", "search": "Zoeken", "buttons.close": "Sluiten", - "403.title": "Geen toegang", + "403.title": "Toegang Geweigerd", "403.message": "Deze account heeft onvoldoende systeemrechten om toegang tot de pagina te krijgen.", "403.login": "Wellicht proberen aan te melden?", "404.title": "Niet gevonden", @@ -87,8 +87,8 @@ "map": "Kaart", "sessions": "Login Sessies", "ip_address": "IP Adres", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", + "enter_page_number": "Voer paginanummer in", + "upload_file": "Upload bestand", "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "allowed-file-types": "Toegestane bestandstypen zijn %1" } \ No newline at end of file diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 82100e579f..72702a3fe4 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -1,8 +1,8 @@ { "groups": "Groepen", - "view_group": "Weergeven groep", + "view_group": "Bekijk Groep", "owner": "Groepseigenaar", - "new_group": "Nieuwe groep", + "new_group": "Nieuwe groep aanmaken", "no_groups_found": "Geen groepen voor weergave", "pending.accept": "Accepteer", "pending.reject": "Afwijzen", @@ -49,5 +49,5 @@ "membership.leave-group": "Verlaat groep", "membership.reject": "Afwijzen", "new-group.group_name": "Groepsnaam:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Upload groepscover" } \ No newline at end of file diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index ba06d7ce93..984c39b4be 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 en %2 andere hebben in gestemd in %3.", "moved_your_post": "%1 heeft je bericht verplaatst naar %2", "moved_your_topic": "%1 heeft %2 verplaatst", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 heeft je bericht in %2 aan zijn/haar favorieten toegevoegd.", + "favourited_your_post_in_dual": "%1 en %2 hebben je bericht in %3 aan hun favorieten toegevoegd.", + "favourited_your_post_in_multiple": "%1 en %2 anderen hebben je bericht in %3 aan hun favorieten toegevoegd.", "user_flagged_post_in": "%1 rapporteerde een bericht in %2", "user_flagged_post_in_dual": "%1 en %2 rapporteerde een bericht in %3", "user_flagged_post_in_multiple": "%1 en %2 andere rapporteede een bericht in %3", @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 en %2 volgen jou nu.", "user_started_following_you_multiple": "%1 en %2 andere volgen jou nu.", "new_register": "%1 heeft een registratie verzoek aangevraagd.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "E-mailadres bevestigd", "email-confirmed-message": "Bedankt voor het bevestigen van je e-mailadres. Dit account is nu volledig geactiveerd.", "email-confirm-error-message": "Er was een probleem met het bevestigen van dit e-mailadres. Misschien is de code niet goed ingevoerd of was de beschikbare tijd inmiddels verstreken.", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 131dccb6e4..96f5f11a38 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -1,7 +1,7 @@ { "home": "Home", "unread": "Ongelezen onderwerpen", - "popular-day": "De populaire onderwerpen van vandaag", + "popular-day": "Populaire onderwerpen vandaag", "popular-week": "De populaire onderwerpen van deze week", "popular-month": "De populaire onderwerpen van deze maand", "popular-alltime": "De populaire onderwerpen", @@ -33,13 +33,13 @@ "account/posts": "Berichten geplaatst door %1", "account/topics": "Onderwerpen begonnen door %1", "account/groups": "%1's groepen", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "%1's Favoriete Berichten", "account/settings": "Gebruikersinstellingen", "account/watched": "Berichten die door %1 bekeken worden", "account/upvoted": "Berichten omhoog gestemd door %1", "account/downvoted": "Berichten omlaag gestemd door %1", "account/best": "Beste berichten geplaast door %1", - "confirm": "Email Confirmed", + "confirm": "Email Bevestigd", "maintenance.text": "%1 is momenteel in onderhoud. Excuses voor het ongemak en probeer het later nog eens.", "maintenance.messageIntro": "Daarnaast heeft de beheerder het volgende bericht achtergelaten:", "throttled.text": "%1 is momenteel niet beschikbaar door overmatig gebruikt. Excuses voor het ongemak en probeer het later nog eens." diff --git a/public/language/nl/reset_password.json b/public/language/nl/reset_password.json index 9849338c56..a156d0bf1c 100644 --- a/public/language/nl/reset_password.json +++ b/public/language/nl/reset_password.json @@ -2,7 +2,7 @@ "reset_password": "Wachtwoord opnieuw instellen", "update_password": "Wachtwoord bijwerken", "password_changed.title": "Wachtwoord gewijzigd", - "password_changed.message": "

Wachtwoord met succes hersteld. Log nu eerst opnieuw in.", + "password_changed.message": "

Wachtwoord is met succes hersteld. Opnieuw inloggen.", "wrong_reset_code.title": "Onjuiste herstelcode", "wrong_reset_code.message": "Opgegeven code voor wachtwoordherstel is niet juist. Probeer het opnieuw of vraag een andere code aan.", "new_password": "Nieuw wachtwoord", diff --git a/public/language/nl/search.json b/public/language/nl/search.json index da9e793e8b..5e5e7224f0 100644 --- a/public/language/nl/search.json +++ b/public/language/nl/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 overeenkomstige resultaten \"%2\", (%3 seconds)", "no-matches": "Geen overeenkomstige resultaten gevonden", - "advanced-search": "Geavanceerde zoekfunctie", + "advanced-search": "Geavanceerde Zoeken", "in": "in", "titles": "Titels", "titles-posts": "Titels en berichten", diff --git a/public/language/nl/success.json b/public/language/nl/success.json index be632b25e4..e418f7e610 100644 --- a/public/language/nl/success.json +++ b/public/language/nl/success.json @@ -1,6 +1,6 @@ { "success": "Geslaagd", - "topic-post": "Bericht succesvol geplaatst", - "authentication-successful": "Aanmelden geslaagd", + "topic-post": "Je bericht is met succes geplaatst.", + "authentication-successful": "Authenticatie Geslaagd", "settings-saved": "Instellingen opgeslagen!" } \ No newline at end of file diff --git a/public/language/nl/tags.json b/public/language/nl/tags.json index f4665e87c3..318f1870e1 100644 --- a/public/language/nl/tags.json +++ b/public/language/nl/tags.json @@ -1,5 +1,5 @@ { - "no_tag_topics": "Er zijn geen onderwerpen met deze tag", + "no_tag_topics": "Er zijn geen onderwerpen met deze tag.", "tags": "Tags", "enter_tags_here": "Voeg hier tags toe, tussen de %1 en %2 tekens per stuk.", "enter_tags_here_short": "Voer tags in...", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index d597851e73..c1bcd0f1ca 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Uitgeschakelde Categorieën zijn grijs", "confirm_move": "Verplaatsen", "confirm_fork": "Splits", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Favoriet", + "favourites": "Favorieten", + "favourites.has_no_favourites": "Je hebt nog geen berichten aan je favorieten toegevoegd.", "loading_more_posts": "Meer berichten...", "move_topic": "Onderwerp verplaatsen", "move_topics": "Verplaats onderwerpen", diff --git a/public/language/nl/unread.json b/public/language/nl/unread.json index 3624cddce6..4a5fc11558 100644 --- a/public/language/nl/unread.json +++ b/public/language/nl/unread.json @@ -1,7 +1,7 @@ { "title": "Ongelezen", - "no_unread_topics": "Er zijn geen ongelezen onderwerpen", - "load_more": "Meer laden...", + "no_unread_topics": "Er zijn geen ongelezen onderwerpen.", + "load_more": "Meer laden", "mark_as_read": "Markeer als gelezen", "selected": "Geselecteerd", "all": "Alles", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 036e69dd6d..d3a5a4546f 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -22,7 +22,7 @@ "profile": "Profiel", "profile_views": "Bekeken", "reputation": "Reputatie", - "favourites": "Bookmarks", + "favourites": "Favorieten", "watched": "Bekeken", "followers": "Volgers", "following": "Volgend", @@ -55,11 +55,11 @@ "password": "Wachtwoord", "username_taken_workaround": "Helaas, de gewenste gebruikersnaam is al door iemand in gebruik genomen dus vandaar een kleine aanpassing naar %1 doorgevoerd", "password_same_as_username": "Je wachtwoord is hetzelfde als je gebruikersnaam. Kies een ander wachtwoord.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "Je wachtwoord is hetzelfde als je email, kies alsjeblieft een ander wachtwoord.", "upload_picture": "Upload afbeelding", "upload_a_picture": "Upload een afbeelding", "remove_uploaded_picture": "Verwijder gëuploade foto", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Upload je coverafbeelding", "settings": "Instellingen", "show_email": "Inschakelen weergave van e-mailadres op profielpagina", "show_fullname": "Laat mijn volledige naam zien", diff --git a/public/language/nl/users.json b/public/language/nl/users.json index 2330e1b0e6..f282c53f6c 100644 --- a/public/language/nl/users.json +++ b/public/language/nl/users.json @@ -1,5 +1,5 @@ { - "latest_users": "Meest recente gebruikers", + "latest_users": "Recenste Gebruikers", "top_posters": "Meest actieve leden", "most_reputation": "Meeste reputatie", "search": "Zoeken", diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 4bafa8c8e7..5873b93a47 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 wysłał żądanie rejestracji.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "E-mail potwierdzony", "email-confirmed-message": "Dziękujemy za potwierdzenie maila. Twoje konto zostało aktywowane.", "email-confirm-error-message": "Wystąpił problem przy aktywacji, - kod jest błędny lub przestarzały", diff --git a/public/language/pt_BR/notifications.json b/public/language/pt_BR/notifications.json index a50d8a3f4f..0f099da10b 100644 --- a/public/language/pt_BR/notifications.json +++ b/public/language/pt_BR/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 e %2 começaram a lhe acompanhar.", "user_started_following_you_multiple": "%1 e %2 outros começaram a lhe acompanhar.", "new_register": "%1 lhe enviou um pedido de cadastro.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmado", "email-confirmed-message": "Obrigado por validar o seu email. Agora sua conta está plenamente ativada.", "email-confirm-error-message": "Houve um problema ao validar o seu endereço de email. Talvez o código era invalido ou tenha expirado.", diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index 1c01843b8a..9684a7d9cc 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email confirmat", "email-confirmed-message": "Îți mulțumim pentru validarea emailului. Contul tău este acuma activat.", "email-confirm-error-message": "A fost o problemă cu activarea adresei tale de email. Poate codul de activare a fost invalid sau expirat.", diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index 4a40bdc5c3..21c0a3b46c 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 и %2 подписались на вас.", "user_started_following_you_multiple": "%1 и %2 подписались на вас.", "new_register": "%1 отправил запрос на регистрацию.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email подтвержден", "email-confirmed-message": "Спасибо за подтверждение Вашего Email-адреса. Ваш аккаунт активирован.", "email-confirm-error-message": "Ошибка проверки Email-адреса. Возможно, код неверен, либо у него истек срок действия.", diff --git a/public/language/rw/notifications.json b/public/language/rw/notifications.json index 83a7b7eb4e..60fa3be43d 100644 --- a/public/language/rw/notifications.json +++ b/public/language/rw/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 yasabye kwandikwa.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Yemejwe", "email-confirmed-message": "Urakoze kugaragaza ko email yawe ikora. Ubu ngubu konte yawe irakora nta kabuza. ", "email-confirm-error-message": "Havutse ikibazo mu gushaka kumenya niba email yawe ikora. Ushobora kuba wakoresheje kode itari yo cyangwa se yarengeje igihe. ", diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index fc3ba602f5..5f7fd03816 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index fbb3535f62..160a4d9e86 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email bol potvrdený", "email-confirmed-message": "Ďakujeme za potvrdenie tvojho emailu. Účet je plne aktivovaný.", "email-confirm-error-message": "Vyskytla sa chyba pri overení tvojej emailovej adresy. ", diff --git a/public/language/sl/notifications.json b/public/language/sl/notifications.json index f5d94351e4..37711ea13d 100644 --- a/public/language/sl/notifications.json +++ b/public/language/sl/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 je poslal prošnjo za registracijo.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "E-mail naslov potrjen", "email-confirmed-message": "Hvala ker ste potrdili svoj naslov. Račun je sedaj aktiviran.", "email-confirm-error-message": "Prišlo je do napake pri preverjanju vašega e-mail naslova. Morda je bila koda napačna ali pa je potekla.", diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index d919bc82e7..52a2b2d949 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 и %2 су почели да вас прате.", "user_started_following_you_multiple": "%1 и %2 других су почели да вас прате.", "new_register": "%1 вам је послао захтев за регистрацију.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Е-пошта је је отврђена.", "email-confirmed-message": "Хвала на овери ваше е-поште. Ваш налог је сада у потпуности активан.", "email-confirm-error-message": "Дошло је до проблема са овером ваше е-поште. Можда је код неисправан или истекао.", diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index 0db2dee665..743451971a 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 skickade en registreringsförfrågan.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Epost bekräftad", "email-confirmed-message": "Tack för att du bekräftat din epostadress. Ditt konto är nu fullt ut aktiverat.", "email-confirm-error-message": "Det uppstod ett fel med att bekräfta din epostadress. Kanske var koden ogiltig eller har gått ut.", diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index a00e594a93..dd81dfdb7e 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Email ได้รับการยืนยันแล้ว", "email-confirmed-message": "ขอบคุณที่ยืนยัน Email ของคุณ บัญชีของคุณสามารถใช้งานได้แล้ว", "email-confirm-error-message": "มีปัญหาในการยืนยัน Email ของคุณ บางทีรหัสไม่ถูกต้องหรือหมดอายุแล้ว", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index f086d8dcbe..e8796fbdd0 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -50,8 +50,8 @@ "still-uploading": "Lütfen yüklemelerin bitmesini bekleyin.", "file-too-big": "İzin verilen en büyük dosya boyutu %1 kb - lütfen daha küçük bir dosya yükleyin", "guest-upload-disabled": "Ziyaretçilerin yükleme yapması devre dışı bırakıldı", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Bu iletiyi zaten yer imlerinize eklediniz", + "already-unfavourited": "Bu iletiyi zaten yer imlerinizden çıkardınız", "cant-ban-other-admins": "Başka yöneticileri yasaklayamazsınız!", "cant-remove-last-admin": "Tek yönetici sizsiniz. Kendinizi adminlikten çıkarmadan önce başka bir kullanıcıyı admin olarak ekleyiniz", "invalid-image-type": "Geçersiz resim uzantısı. Izin verilen uzantılar: %1", @@ -97,5 +97,5 @@ "invite-maximum-met": "Sen maksimum miktarda insanı davet ettin (%2 üzerinden %1).", "no-session-found": "Giriş yapılmış bir oturum bulunamadı!", "not-in-room": "Odada kullanıcı yok", - "no-users-in-room": "No users in this room" + "no-users-in-room": "Bu odada kullanıcı yok" } \ No newline at end of file diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 72455cc80f..2cf32930e5 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -87,8 +87,8 @@ "map": "Harita", "sessions": "Giriş Oturumları", "ip_address": "IP Adresleri", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "Sayfa numarasını girin", + "upload_file": "Dosya yükle", + "upload": "Yükle", + "allowed-file-types": "İzin verilen dosya tipleri %1" } \ No newline at end of file diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 1618633a48..234f0a36be 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -49,5 +49,5 @@ "membership.leave-group": "Gruptan Ayrıl", "membership.reject": "Reddet", "new-group.group_name": "Grup İsmi:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Grup kapağı yükle" } \ No newline at end of file diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index dfd4849065..eddd9194ea 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 ve %2 iki kişi daha %3 içindeki gönderini beğendi.", "moved_your_post": "%1 senin iletin %2 taşındı", "moved_your_topic": "%1 taşındı %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 %2 içindeki gönderini yer imlerine ekledi.", + "favourited_your_post_in_dual": "%1 ve %2 %3 gönderini yer imlerine ekledi.", + "favourited_your_post_in_multiple": "%1 ve %2 kişi daha %3 gönderini yer imlerine ekledi.", "user_flagged_post_in": "%1 bir iletiyi bayrakladı. %2", "user_flagged_post_in_dual": " %1 ve %2 %3 gönderini bayrakladı", "user_flagged_post_in_multiple": "%1 ve %2 kişi daha %3 gönderini bayrakladı", @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 ve %2 seni takip etmeye başladı.\n", "user_started_following_you_multiple": "%1 ve %2 kişi daha seni takip etmeye başladı.", "new_register": "%1 kayıt olma isteği gönderdi.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "E-posta onaylandı", "email-confirmed-message": "E-postanızı onaylandığınız için teşekkürler. Hesabınız tamamen aktive edildi.", "email-confirm-error-message": "E-posta adresinizi onaylarken bir hata oluştu. Kodunuz geçersiz ya da eski olabilir.", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 77d821ad43..b076bf11d9 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -33,7 +33,7 @@ "account/posts": "%1 tarafından gönderilen iletiler", "account/topics": "%1 tarafından gönderilen başlıklar", "account/groups": "%1 Kişisine Ait Gruplar", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "%1'in Yer imleri", "account/settings": "Kullanıcı Ayarları", "account/watched": "%1 tarafından izlenen konular", "account/upvoted": "%1 tarafından artılanan gönderiler", diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index ea140fc028..e12c92f005 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -65,9 +65,9 @@ "disabled_categories_note": "Etkin Olmayan Kategoriler soluklaştırılır", "confirm_move": "Taşı", "confirm_fork": "Ayır", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Yer imi", + "favourites": "Yer imleri", + "favourites.has_no_favourites": "Yer imlerine eklenmiş hiçbir ileti yok.", "loading_more_posts": "Daha fazla ileti ", "move_topic": "Başlığı Taş", "move_topics": "Konuları Taşı", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index e793dd7b0e..2dbac92881 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -22,7 +22,7 @@ "profile": "Profil", "profile_views": "Profil Görüntülemeleri", "reputation": "Saygınlık", - "favourites": "Bookmarks", + "favourites": "Yer imleri", "watched": "İzlendi", "followers": "Takipçiler", "following": "Takip Ediyor", @@ -59,7 +59,7 @@ "upload_picture": "Resim Yükle", "upload_a_picture": "Bir Resim Yükle", "remove_uploaded_picture": "Yüklenmiş fotoğrafı kaldır", - "upload_cover_picture": "Upload cover picture", + "upload_cover_picture": "Kapak fotoğrafı yükle", "settings": "Ayarlar", "show_email": "E-postamı göster", "show_fullname": "Tam ismimi göster", diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index 8780782f08..1520437ea9 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1%2 đã bắt đầu theo dõi bạn.", "user_started_following_you_multiple": "%1 và %2 người khác đã bắt đầu theo dõi bạn.", "new_register": "%1 đã gửi một yêu cầu tham gia.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "Đã xác nhận email", "email-confirmed-message": "Cảm ơn bạn đã xác nhận địa chỉ email của bạn. Tài khoản của bạn đã được kích hoạt đầy đủ.", "email-confirm-error-message": "Đã có lỗi khi xác nhận địa chỉ email. Có thể đoạn mã không đúng hoặc đã hết hạn.", diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index 45964d8d2b..ae95b86cd1 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -49,5 +49,5 @@ "membership.leave-group": "退出小组", "membership.reject": "拒绝", "new-group.group_name": "组名: ", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "上传组封面" } \ No newline at end of file diff --git a/public/language/zh_CN/notifications.json b/public/language/zh_CN/notifications.json index 9d22253112..8449a4a853 100644 --- a/public/language/zh_CN/notifications.json +++ b/public/language/zh_CN/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1%2 关注了您。", "user_started_following_you_multiple": "%1 和 %2 个其他人关注了您。", "new_register": "%1 发出了注册请求", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "电子邮箱已确认", "email-confirmed-message": "感谢您验证您的电子邮箱。您的帐户现已全面激活。", "email-confirm-error-message": "验证您电子邮箱地址时出现了问题。可能是因为验证码无效或已过期。", diff --git a/public/language/zh_CN/pages.json b/public/language/zh_CN/pages.json index bc9f7f1fa5..66e705c543 100644 --- a/public/language/zh_CN/pages.json +++ b/public/language/zh_CN/pages.json @@ -11,7 +11,7 @@ "users/latest": "最新会员", "users/sort-posts": "最多发帖的会员", "users/sort-reputation": "最多积分的会员", - "users/banned": "Banned Users", + "users/banned": "被封禁的用户", "users/search": "会员搜索", "notifications": "提醒", "tags": "话题", @@ -39,7 +39,7 @@ "account/upvoted": "帖子被 %1 顶过", "account/downvoted": "帖子被 %1 踩过", "account/best": "%1 发布的最佳帖子", - "confirm": "Email Confirmed", + "confirm": "电子邮箱已确认", "maintenance.text": "%1 正在进行维护。请稍后再来。", "maintenance.messageIntro": "此外,管理员留下的消息:", "throttled.text": "%1 因负荷超载暂不可用。请稍后再来。" diff --git a/public/language/zh_CN/topic.json b/public/language/zh_CN/topic.json index 7b1a9d98f0..6464255b13 100644 --- a/public/language/zh_CN/topic.json +++ b/public/language/zh_CN/topic.json @@ -35,7 +35,7 @@ "login_to_subscribe": "请注册或登录后,再订阅此主题。", "markAsUnreadForAll.success": "将全部主题标为未读。", "mark_unread": "标记为未读", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "未读话题", "watch": "关注", "unwatch": "取消关注", "watch.title": "当此主题有新回复时,通知我", diff --git a/public/language/zh_TW/notifications.json b/public/language/zh_TW/notifications.json index 477d2e91ab..3174feb38e 100644 --- a/public/language/zh_TW/notifications.json +++ b/public/language/zh_TW/notifications.json @@ -30,6 +30,7 @@ "user_started_following_you_dual": "%1 and %2 started following you.", "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", + "new_register_multiple": "There are %1 registration requests awaiting review.", "email-confirmed": "已確認電郵", "email-confirmed-message": "感謝您驗證您的電郵。您的帳戶現已全面啟用。", "email-confirm-error-message": "驗證您的電郵地址時出現問題。也許啟動碼無效或已過期。", From 00d5303e339b1077b0ebc5ab3a4aea0e80dc98e9 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 18:06:05 +0200 Subject: [PATCH 101/319] fix typo --- src/posts/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posts/edit.js b/src/posts/edit.js index 0d4a78a019..d4c3a3c732 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -130,7 +130,7 @@ module.exports = function(Posts) { async.waterfall([ async.apply(plugins.fireHook, 'filter:topic.edit', {req: data.req, topic: topicData}), function(results, next) { - db.setObject('topic:' + tid, results.topicData, next); + db.setObject('topic:' + tid, results.topic, next); }, function(next) { topics.updateTags(tid, data.tags, next); From f7aa44d1bf3b3437aaf34ff7640c27c671345e13 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 19:13:36 +0200 Subject: [PATCH 102/319] added some missing callbacks --- src/socket.io/admin.js | 18 ++++++---- src/socket.io/notifications.js | 6 ++-- src/socket.io/plugins.js | 2 +- src/socket.io/topics/tools.js | 4 +-- src/socket.io/user.js | 64 +++++++++++++++++++--------------- src/socket.io/user/picture.js | 4 +-- 6 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 853d3f1536..6dd22134ba 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -8,7 +8,7 @@ var async = require('async'), plugins = require('../plugins'), widgets = require('../widgets'), user = require('../user'), - posts = require('../posts'), + logger = require('../logger'), events = require('../events'), emailer = require('../emailer'), @@ -60,6 +60,7 @@ SocketAdmin.reload = function(socket, data, callback) { process.send({ action: 'reload' }); + callback(); } else { meta.reload(callback); } @@ -72,10 +73,12 @@ SocketAdmin.restart = function(socket, data, callback) { ip: socket.ip }); meta.restart(); + callback(); }; SocketAdmin.fireEvent = function(socket, data, callback) { index.server.emit(data.name, data.payload || {}); + callback(); }; SocketAdmin.themes.getInstalled = function(socket, data, callback) { @@ -83,7 +86,7 @@ SocketAdmin.themes.getInstalled = function(socket, data, callback) { }; SocketAdmin.themes.set = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } @@ -134,16 +137,16 @@ SocketAdmin.widgets.set = function(socket, data, callback) { }; SocketAdmin.config.set = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } meta.configs.set(data.key, data.value, function(err) { - if(err) { + if (err) { return callback(err); } - callback(null); + callback(); plugins.fireHook('action:config.set', { key: data.key, @@ -155,7 +158,7 @@ SocketAdmin.config.set = function(socket, data, callback) { }; SocketAdmin.config.setMultiple = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } @@ -179,8 +182,9 @@ SocketAdmin.config.setMultiple = function(socket, data, callback) { }); }; -SocketAdmin.config.remove = function(socket, key) { +SocketAdmin.config.remove = function(socket, key, callback) { meta.configs.remove(key); + callback(); }; SocketAdmin.settings.get = function(socket, data, callback) { diff --git a/src/socket.io/notifications.js b/src/socket.io/notifications.js index 7fc25141bb..e2d7cf3084 100644 --- a/src/socket.io/notifications.js +++ b/src/socket.io/notifications.js @@ -19,7 +19,7 @@ SocketNotifs.loadMore = function(socket, data, callback) { return callback(new Error('[[error:invalid-data]]')); } if (!socket.uid) { - return; + return callback(new Error('[[error:no-privileges]]')); } var start = parseInt(data.after, 10); var stop = start + 20; @@ -37,7 +37,7 @@ SocketNotifs.getCount = function(socket, data, callback) { SocketNotifs.deleteAll = function(socket, data, callback) { if (!socket.uid) { - return; + return callback(new Error('[[error:no-privileges]]')); } user.notifications.deleteAll(socket.uid, callback); @@ -57,7 +57,7 @@ SocketNotifs.markAllRead = function(socket, data, callback) { SocketNotifs.generatePath = function(socket, nid, callback) { if (!socket.uid) { - return; + return callback(new Error('[[error:no-privileges]]'));; } async.waterfall([ function (next) { diff --git a/src/socket.io/plugins.js b/src/socket.io/plugins.js index aad0bb2841..32f1e7f00f 100644 --- a/src/socket.io/plugins.js +++ b/src/socket.io/plugins.js @@ -9,7 +9,7 @@ var SocketPlugins = {}; var SocketPlugins = require.main.require('./src/socket.io/plugins'); SocketPlugins.myPlugin = {}; - SocketPlugins.myPlugin.myMethod = function() { ... }; + SocketPlugins.myPlugin.myMethod = function(socket, data, callback) { ... }; Be a good lad and namespace your methods. */ diff --git a/src/socket.io/topics/tools.js b/src/socket.io/topics/tools.js index 35e1118986..f3d9ad4688 100644 --- a/src/socket.io/topics/tools.js +++ b/src/socket.io/topics/tools.js @@ -11,7 +11,7 @@ module.exports = function(SocketTopics) { SocketTopics.loadTopicTools = function(socket, data, callback) { if (!socket.uid) { - return; + return callback(new Error('[[error:no-privileges]]')); } if (!data) { return callback(new Error('[[error:invalid-data]]')); @@ -74,7 +74,7 @@ module.exports = function(SocketTopics) { SocketTopics.doTopicAction = function(action, event, socket, data, callback) { callback = callback || function() {}; if (!socket.uid) { - return; + return callback(new Error('[[error:no-privileges]]')); } if (!data || !Array.isArray(data.tids) || !data.cid) { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 2f33ef9f87..06acacd520 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -23,14 +23,15 @@ require('./user/picture')(SocketUser); require('./user/ban')(SocketUser); SocketUser.exists = function(socket, data, callback) { - if (data && data.username) { - meta.userOrGroupExists(data.username, callback); + if (!data || !data.username) { + return callback(new Error('[[error:invalid-data]]')); } + meta.userOrGroupExists(data.username, callback); }; SocketUser.deleteAccount = function(socket, data, callback) { if (!socket.uid) { - return; + return callback(new Error('[[error:no-privileges]]')); } async.waterfall([ @@ -58,25 +59,27 @@ SocketUser.deleteAccount = function(socket, data, callback) { }; SocketUser.emailExists = function(socket, data, callback) { - if (data && data.email) { - user.email.exists(data.email, callback); + if (!data || !data.email) { + return callback(new Error('[[error:invalid-data]]')); } + user.email.exists(data.email, callback); }; SocketUser.emailConfirm = function(socket, data, callback) { - if (socket.uid && parseInt(meta.config.requireEmailConfirmation, 10) === 1) { - user.getUserField(socket.uid, 'email', function(err, email) { - if (err) { - return callback(err); - } - - if (!email) { - return; - } + if (!socket.uid) { + return callback(new Error('[[error:no-privileges]]')); + } - user.email.sendValidationEmail(socket.uid, email, callback); - }); + if (parseInt(meta.config.requireEmailConfirmation, 10) !== 1) { + callback(); } + user.getUserField(socket.uid, 'email', function(err, email) { + if (err || !email) { + return callback(err); + } + + user.email.sendValidationEmail(socket.uid, email, callback); + }); }; @@ -84,9 +87,11 @@ SocketUser.emailConfirm = function(socket, data, callback) { SocketUser.reset = {}; SocketUser.reset.send = function(socket, email, callback) { - if (email) { - user.reset.send(email, callback); + if (!email) { + return callback(new Error('[[error:invalid-data]]')); } + + user.reset.send(email, callback); }; SocketUser.reset.commit = function(socket, data, callback) { @@ -102,9 +107,9 @@ SocketUser.reset.commit = function(socket, data, callback) { return callback(err); } - var uid = results.uid, - now = new Date(), - parsedDate = now.getFullYear() + '/' + (now.getMonth()+1) + '/' + now.getDate(); + var uid = results.uid; + var now = new Date(); + var parsedDate = now.getFullYear() + '/' + (now.getMonth()+1) + '/' + now.getDate(); user.getUserField(uid, 'username', function(err, username) { emailer.send('reset_notify', uid, { @@ -134,7 +139,7 @@ SocketUser.isFollowing = function(socket, data, callback) { SocketUser.follow = function(socket, data, callback) { if (!socket.uid || !data) { - return; + return callback(new Error('[[error:invalid-data]]')); } var userData; async.waterfall([ @@ -165,9 +170,10 @@ SocketUser.follow = function(socket, data, callback) { }; SocketUser.unfollow = function(socket, data, callback) { - if (socket.uid && data) { - toggleFollow('unfollow', socket.uid, data.uid, callback); + if (!socket.uid || !data) { + return callback(new Error('[[error:invalid-data]]')); } + toggleFollow('unfollow', socket.uid, data.uid, callback); }; function toggleFollow(method, uid, theiruid, callback) { @@ -206,15 +212,17 @@ SocketUser.saveSettings = function(socket, data, callback) { }; SocketUser.setTopicSort = function(socket, sort, callback) { - if (socket.uid) { - user.setSetting(socket.uid, 'topicPostSort', sort, callback); + if (!socket.uid) { + return callback(); } + user.setSetting(socket.uid, 'topicPostSort', sort, callback); }; SocketUser.setCategorySort = function(socket, sort, callback) { - if (socket.uid) { - user.setSetting(socket.uid, 'categoryTopicSort', sort, callback); + if (!socket.uid) { + return callback(); } + user.setSetting(socket.uid, 'categoryTopicSort', sort, callback); }; SocketUser.getUnreadCount = function(socket, data, callback) { diff --git a/src/socket.io/user/picture.js b/src/socket.io/user/picture.js index 55caa37857..cf886b1d48 100644 --- a/src/socket.io/user/picture.js +++ b/src/socket.io/user/picture.js @@ -51,7 +51,7 @@ module.exports = function(SocketUser) { SocketUser.uploadProfileImageFromUrl = function(socket, data, callback) { if (!socket.uid || !data.url || !data.uid) { - return; + return callback(new Error('[[error:invalid-data]]')); } user.isAdminOrSelf(socket.uid, data.uid, function(err) { @@ -66,7 +66,7 @@ module.exports = function(SocketUser) { SocketUser.removeUploadedPicture = function(socket, data, callback) { if (!socket.uid || !data.uid) { - return; + return callback(new Error('[[error:invalid-data]]')); } async.waterfall([ From d067943773e6a3f704ee9d091fc8cf5cadbce8f6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 9 Mar 2016 19:49:36 +0200 Subject: [PATCH 103/319] fix double escaping in title and og:title --- src/controllers/topics.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 5c3728a428..7f9842ba03 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -183,7 +183,7 @@ topicsController.get = function(req, res, callback) { res.locals.metaTags = [ { name: "title", - content: topicData.title + content: topicData.titleRaw }, { name: "description", @@ -191,7 +191,7 @@ topicsController.get = function(req, res, callback) { }, { property: 'og:title', - content: topicData.title + content: topicData.titleRaw }, { property: 'og:description', From dff947b32524ebb29d8e541df1d38b554d2826a6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 9 Mar 2016 13:29:37 -0500 Subject: [PATCH 104/319] Plugin updates via command line (closes #4336) Squashed commit of the following: commit 9e0d6438dadf645d0d82210631731786f35daf25 Author: Julian Lam Date: Wed Mar 9 13:29:27 2016 -0500 completed integration for plugin upgrade functionality via command line commit 5a27a64a24bdf640bb5c7aaa47cc1d4932ce791c Author: Julian Lam Date: Mon Mar 7 14:47:57 2016 -0500 WIP plugin upgrades for nodebb executable commit 00d5303e339b1077b0ebc5ab3a4aea0e80dc98e9 Author: barisusakli Date: Wed Mar 9 18:06:05 2016 +0200 fix typo --- nodebb | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 192 insertions(+), 9 deletions(-) diff --git a/nodebb b/nodebb index 233dbd350f..d162668344 100755 --- a/nodebb +++ b/nodebb @@ -4,6 +4,10 @@ var colors = require('colors'), cproc = require('child_process'), argv = require('minimist')(process.argv.slice(2)), fs = require('fs'), + path = require('path'), + request = require('request'), + semver = require('semver'), + prompt = require('prompt'), async = require('async'); var getRunningPid = function(callback) { @@ -21,14 +25,185 @@ var getRunningPid = function(callback) { callback(e); } }); - }; + }, + getCurrentVersion = function(callback) { + fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function(err, pkg) { + try { + pkg = JSON.parse(pkg); + return callback(null, pkg.version); + } catch(err) { + return callback(err); + } + }) + }, + fork = function (args) { + cproc.fork('app.js', args, { + cwd: __dirname, + silent: false + }); + }, + getInstalledPlugins = function(callback) { + async.parallel({ + files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')), + deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }) + }, function(err, payload) { + try { + var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/, + moduleName; -function fork(args) { - cproc.fork('app.js', args, { - cwd: __dirname, - silent: false - }); -} + payload.files = payload.files.filter(function(file) { + return isNbbModule.test(file); + }); + + payload.deps = JSON.parse(payload.deps).dependencies; + payload.bundled = []; + payload.installed = []; + + for (moduleName in payload.deps) { + if (isNbbModule.test(moduleName)) { + payload.bundled.push(moduleName); + } + } + + // Whittle down deps to send back only extraneously installed plugins/themes/etc + payload.files.forEach(function(moduleName) { + if ( + payload.files.indexOf(moduleName) !== -1 // found in `node_modules/` + && payload.bundled.indexOf(moduleName) === -1 // not found in `package.json` + && !fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() // is not a symlink + ) { + payload.installed.push(moduleName); + } + }); + + getModuleVersions(payload.installed, callback); + } catch (err) { + callback(err); + } + }); + }, + getModuleVersions = function(modules, callback) { + var versionHash = {}; + + async.eachLimit(modules, 50, function(module, next) { + fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function(err, pkg) { + try { + pkg = JSON.parse(pkg); + versionHash[module] = pkg.version; + next(); + } catch (err) { + next(err); + } + }); + }, function(err) { + callback(err, versionHash); + }); + }, + checkPlugins = function(standalone, callback) { + if (standalone) { + process.stdout.write('Checking installed plugins and themes for updates... '); + } + + async.waterfall([ + async.apply(async.parallel, { + plugins: async.apply(getInstalledPlugins), + version: async.apply(getCurrentVersion) + }), + function(payload, next) { + var toCheck = Object.keys(payload.plugins); + + request({ + method: 'GET', + url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), + json: true + }, function(err, res, body) { + if (err) { + process.stdout.write('error'.red + '\n'.reset); + return next(err); + } + process.stdout.write('OK'.green + '\n'.reset); + + if (!Array.isArray(body) && toCheck.length === 1) { + body = [body]; + } + + var current, suggested, + upgradable = body.map(function(suggestObj) { + current = payload.plugins[suggestObj.package]; + suggested = suggestObj.version; + + if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { + return { + name: suggestObj.package, + current: current, + suggested: suggested + } + } else { + return null; + } + }).filter(Boolean); + + next(null, upgradable); + }) + } + ], callback); + }, + upgradePlugins = function(callback) { + var standalone = false; + if (typeof callback !== 'function') { + callback = function() {}; + standalone = true; + }; + + checkPlugins(standalone, function(err, found) { + if (err) { + process.stdout.write('\Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); + return callback(err); + } + + if (found && found.length) { + process.stdout.write('\nA total of ' + new String(found.length).bold + ' package(s) can be upgraded:\n'); + found.forEach(function(suggestObj) { + process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); + }); + process.stdout.write('\n'); + } else { + if (standalone) { + process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset); + } + return callback(); + } + + prompt.message = ''; + prompt.delimiter = ''; + + prompt.start(); + prompt.get({ + name: 'upgrade', + description: 'Proceed with upgrade (y|n)?'.reset, + type: 'string' + }, function(err, result) { + if (result.upgrade === 'y' || result.upgrade === 'yes') { + process.stdout.write('\nUpgrading packages...'); + var args = ['npm', 'i']; + found.forEach(function(suggestObj) { + args.push(suggestObj.name + '@' + suggestObj.suggested); + }); + + require('child_process').execFile('/usr/bin/env', args, { stdio: 'ignore' }, function(err) { + if (!err) { + process.stdout.write(' OK\n'.green); + } + + callback(err); + }); + } else { + process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset); + callback(); + } + }) + }); + }; switch(process.argv[2]) { case 'status': @@ -130,15 +305,23 @@ switch(process.argv[2]) { fork(args); break; + case 'upgrade-plugins': + upgradePlugins(); + break; + case 'upgrade': async.series([ function(next) { process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... '.yellow); - require('child_process').execFile('/usr/bin/env', ['npm', 'i', '--production'], next); + require('child_process').execFile('/usr/bin/env', ['npm', 'i', '--production'], { stdio: 'ignore' }, next); }, function(next) { process.stdout.write('OK\n'.green); - process.stdout.write('2. '.bold + 'Updating NodeBB data store schema.\n'.yellow); + process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow); + upgradePlugins(next); + }, + function(next) { + process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow); var upgradeProc = cproc.fork('app.js', ['--upgrade'], { cwd: __dirname, silent: false From de1dd3a5df74dc704214ea75833f75eea3a654e0 Mon Sep 17 00:00:00 2001 From: acardinale Date: Wed, 9 Mar 2016 19:38:56 +0100 Subject: [PATCH 105/319] Fix filter:category.build error (double next) --- src/controllers/category.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/category.js b/src/controllers/category.js index 9a31f8d916..f4b939f60a 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -196,7 +196,6 @@ categoryController.get = function(req, res, callback) { }); plugins.fireHook('filter:category.build', {req: req, res: res, templateData: categoryData}, next); - next(null, categoryData); } ], function (err, data) { if (err) { From 72a05c1d072836218f62fc0529cc36ad1264af86 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 9 Mar 2016 13:58:08 -0500 Subject: [PATCH 106/319] disabling graph animation on mobile devices --- public/src/admin/general/dashboard.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 930e996cdc..553503e700 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -158,6 +158,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { if (isMobile) { Chart.defaults.global.showTooltips = false; + Chart.defaults.global.animation = false; } var data = { @@ -186,7 +187,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { ] }; - trafficCanvas.width = $(trafficCanvas).parent().width(); // is this necessary + trafficCanvas.width = $(trafficCanvas).parent().width(); graphs.traffic = new Chart(trafficCtx).Line(data, { responsive: true }); From 3f912e2c6a884bb04cf59f0c243eafea178df5a3 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 9 Mar 2016 14:30:54 -0500 Subject: [PATCH 107/319] closes #4334 --- public/src/admin/extend/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/admin/extend/plugins.js b/public/src/admin/extend/plugins.js index 6062cd8695..9a130723bf 100644 --- a/public/src/admin/extend/plugins.js +++ b/public/src/admin/extend/plugins.js @@ -230,7 +230,7 @@ define('admin/extend/plugins', function() { function populateUpgradeablePlugins() { $('#installed ul li').each(function() { if ($(this).children('[data-action="upgrade"]').length) { - $('#upgrade ul').append($(this)); + $('#upgrade ul').append($(this).clone(true)); } }); } From bd6d44aeaa52e425e496377a294051af9bde2098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 9 Mar 2016 21:36:20 +0200 Subject: [PATCH 108/319] closes #4327 --- public/src/admin/general/dashboard.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 553503e700..6fa7084319 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -22,7 +22,17 @@ define('admin/general/dashboard', ['semver'], function(semver) { graphInterval: 15000, realtimeInterval: 1500 }; + + $(window).on('action:ajaxify.start', function(ev, data) { + clearInterval(intervals.rooms); + clearInterval(intervals.graphs); + intervals.rooms = null; + intervals.graphs = null; + graphData.rooms = null; + graphData.traffic = null; + usedTopicColors.length = 0; + }); Admin.init = function() { app.enterRoom('admin'); @@ -30,17 +40,6 @@ define('admin/general/dashboard', ['semver'], function(semver) { isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); - $(window).on('action:ajaxify.start', function(ev, data) { - clearInterval(intervals.rooms); - clearInterval(intervals.graphs); - - intervals.rooms = null; - intervals.graphs = null; - graphData.rooms = null; - graphData.traffic = null; - usedTopicColors.length = 0; - }); - $.get('https://api.github.com/repos/NodeBB/NodeBB/tags', function(releases) { // Re-sort the releases, as they do not follow Semver (wrt pre-releases) releases = releases.sort(function(a, b) { From 9cf06917a79b706ca09f2dce6b7a8b04919da3b8 Mon Sep 17 00:00:00 2001 From: pichalite Date: Wed, 9 Mar 2016 19:53:09 +0000 Subject: [PATCH 109/319] add argument to theme reset to specify theme --- src/reset.js | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/reset.js b/src/reset.js index eae981ba5f..8eb1361b20 100644 --- a/src/reset.js +++ b/src/reset.js @@ -16,7 +16,11 @@ Reset.reset = function() { } if (nconf.get('t')) { - resetThemes(); + if(nconf.get('t') === true) { + resetThemes(); + } else { + resetTheme(nconf.get('t')); + } } else if (nconf.get('p')) { if (nconf.get('p') === true) { resetPlugins(); @@ -46,8 +50,8 @@ Reset.reset = function() { process.stdout.write(' -s\tsettings\n'); process.stdout.write(' -a\tall of the above\n'); - process.stdout.write('\nPlugin reset flag (-p) can take a single argument\n'); - process.stdout.write(' e.g. ./nodebb reset -p nodebb-plugin-mentions\n'); + process.stdout.write('\nPlugin and theme reset flags (-p & -t) can take a single argument\n'); + process.stdout.write(' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona\n'); process.exit(); } }); @@ -65,6 +69,26 @@ function resetSettings(callback) { }); } +function resetTheme(themeId) { + var meta = require('./meta'); + var fs = require('fs'); + + fs.open('node_modules/' + themeId + '/package.json', 'r', function(err, fd) { + if (err) { + winston.warn('[reset] Theme `%s` is not installed on this forum', themeId); + process.exit(); + } else { + meta.themes.set({ + type: 'local', + id: themeId + }, function(err) { + winston.info('[reset] Theme reset to ' + themeId); + process.exit(); + }); + } + }); +} + function resetThemes(callback) { var meta = require('./meta'); From e1e92b3c61f48c4446d3f9ffd9446b9d0019832b Mon Sep 17 00:00:00 2001 From: pichalite Date: Wed, 9 Mar 2016 20:03:21 +0000 Subject: [PATCH 110/319] use fs.access --- src/reset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reset.js b/src/reset.js index 8eb1361b20..f1e27738e8 100644 --- a/src/reset.js +++ b/src/reset.js @@ -73,7 +73,7 @@ function resetTheme(themeId) { var meta = require('./meta'); var fs = require('fs'); - fs.open('node_modules/' + themeId + '/package.json', 'r', function(err, fd) { + fs.access('node_modules/' + themeId + '/package.json', function(err, fd) { if (err) { winston.warn('[reset] Theme `%s` is not installed on this forum', themeId); process.exit(); From 53249de7990f5a8856b53014da4ea768bada9eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 9 Mar 2016 22:15:03 +0200 Subject: [PATCH 111/319] fix performance issue with acp --- src/controllers/admin/dashboard.js | 6 +++--- src/controllers/admin/users.js | 2 +- src/controllers/users.js | 2 +- src/user.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index 565d23e563..24a65983f1 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -81,13 +81,13 @@ function getStatsForSet(set, field, callback) { var now = Date.now(); async.parallel({ day: function(next) { - db.sortedSetCount(set, now - terms.day, now, next); + db.sortedSetCount(set, now - terms.day, '+inf', next); }, week: function(next) { - db.sortedSetCount(set, now - terms.week, now, next); + db.sortedSetCount(set, now - terms.week, '+inf', next); }, month: function(next) { - db.sortedSetCount(set, now - terms.month, now, next); + db.sortedSetCount(set, now - terms.month, '+inf', next); }, alltime: function(next) { getGlobalField(field, next); diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index c68fbb8d09..3651767153 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -31,7 +31,7 @@ usersController.noPosts = function(req, res, next) { usersController.inactive = function(req, res, next) { var timeRange = 1000 * 60 * 60 * 24 * 30 * (parseInt(req.query.months, 10) || 3); var cutoff = Date.now() - timeRange; - getUsersByScore('users:online', 'inactive', 0, cutoff, req, res, next); + getUsersByScore('users:online', 'inactive', '-inf', cutoff, req, res, next); }; function getUsersByScore(set, section, min, max, req, res, callback) { diff --git a/src/controllers/users.js b/src/controllers/users.js index cefa6b6cc7..1eb5989c1c 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -145,7 +145,7 @@ usersController.getUsersAndCount = function(set, uid, start, stop, callback) { count: function(next) { if (set === 'users:online') { var now = Date.now(); - db.sortedSetCount('users:online', now - 300000, now, next); + db.sortedSetCount('users:online', now - 300000, '+inf', next); } else if (set === 'users:banned') { db.sortedSetCard('users:banned', next); } else { diff --git a/src/user.js b/src/user.js index 582686f774..19c60fc1fd 100644 --- a/src/user.js +++ b/src/user.js @@ -69,7 +69,7 @@ var async = require('async'), if (set === 'users:online') { var count = parseInt(stop, 10) === -1 ? stop : stop - start + 1; var now = Date.now(); - db.getSortedSetRevRangeByScore(set, start, count, now, now - 300000, callback); + db.getSortedSetRevRangeByScore(set, start, count, '+inf', now - 300000, callback); } else { db.getSortedSetRevRange(set, start, stop, callback); } From 09b93ac6ff270c0a3b744df129850f7380dd82d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 9 Mar 2016 22:45:28 +0200 Subject: [PATCH 112/319] closes #4339 --- src/install.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/install.js b/src/install.js index 129c50c548..846f6f9050 100644 --- a/src/install.js +++ b/src/install.js @@ -339,7 +339,7 @@ function createGlobalModeratorsGroup(next) { function (exists, next) { if (exists) { winston.info('Global Moderators group found, skipping creation!'); - return next(); + return next(null, null); } groups.create({ name: 'Global Moderators', From e11140b7efd3a0b83dee639f8ef34d290cb24950 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 10 Mar 2016 19:07:42 +0200 Subject: [PATCH 113/319] retry once --- public/src/ajaxify.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 98efc424f1..608e0a6cda 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -4,13 +4,14 @@ var ajaxify = ajaxify || {}; $(document).ready(function() { - /*global app, templates, utils, socket, config, RELATIVE_PATH*/ + /*global app, templates, socket, config, RELATIVE_PATH*/ - var location = document.location || window.location, - rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), - apiXHR = null, + var location = document.location || window.location; + var rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''); + var apiXHR = null; - translator; + var translator; + var retry = true; // Dumb hack to fool ajaxify into thinking translator is still a global // When ajaxify is migrated to a require.js module, then this can be merged into the "define" call @@ -63,7 +64,7 @@ $(document).ready(function() { if (err) { return onAjaxError(err, url, callback, quiet); } - + retry = true; app.template = data.template.name; require(['translator'], function(translator) { @@ -107,19 +108,23 @@ $(document).ready(function() { }; function onAjaxError(err, url, callback, quiet) { - var data = err.data, - textStatus = err.textStatus; + var data = err.data; + var textStatus = err.textStatus; if (data) { var status = parseInt(data.status, 10); if (status === 403 || status === 404 || status === 500 || status === 502 || status === 503) { + if (status === 502 && retry) { + retry = false; + return ajaxify.go(url, callback, quiet); + } if (status === 502) { status = 500; } if (data.responseJSON) { data.responseJSON.config = config; } - + $('#footer, #content').removeClass('hide').addClass('ajaxifying'); return renderTemplate(url, status.toString(), data.responseJSON || {}, callback); } else if (status === 401) { From f1047cfdbcb27968477936b113f0f3aa615bfaec Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 10 Mar 2016 19:35:37 +0200 Subject: [PATCH 114/319] up to 200ms --- src/controllers/admin/info.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index 4f2c878db2..0bed7fa72b 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -18,7 +18,7 @@ infoController.get = function(req, res, next) { pubsub.publish('sync:node:info:start'); setTimeout(function() { res.render('admin/development/info', {info: info, infoJSON: JSON.stringify(info, null, 4), host: os.hostname(), port: nconf.get('port')}); - }, 100); + }, 200); }; pubsub.on('sync:node:info:start', function() { From 596e5676ffdd9d0a3c50c383eb26aa27a0987779 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 10 Mar 2016 19:43:39 +0200 Subject: [PATCH 115/319] remove status change --- src/socket.io/index.js | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 109821f461..032c4b9c68 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -8,7 +8,6 @@ var cookieParser = require('cookie-parser')(nconf.get('secret')); var winston = require('winston'); var db = require('../database'); -var user = require('../user'); var logger = require('../logger'); var ratelimit = require('../middleware/ratelimit'); @@ -45,10 +44,6 @@ function onConnection(socket) { onConnect(socket); - socket.on('disconnect', function(data) { - onDisconnect(socket, data); - }); - socket.on('*', function(payload) { onMessage(socket, payload); }); @@ -58,32 +53,11 @@ function onConnect(socket) { if (socket.uid) { socket.join('uid_' + socket.uid); socket.join('online_users'); - - if (Sockets.getUserSocketCount(socket.uid) > 1) { - return; - } - user.getUserFields(socket.uid, ['status'], function(err, userData) { - if (err || !userData) { - return; - } - - if (userData.status !== 'offline') { - socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: userData.status || 'online'}); - } - }); } else { socket.join('online_guests'); } } -function onDisconnect(socket) { - if (socket.uid) { - var socketCount = Sockets.getUserSocketCount(socket.uid); - if (socketCount <= 1) { - socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); - } - } -} function onMessage(socket, payload) { if (!payload.data.length) { From 16dec24b6ce6c3493ed5de872fbd5b0ac8eece7c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 10 Mar 2016 19:55:33 +0200 Subject: [PATCH 116/319] sort by hostname --- src/controllers/admin/info.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index 0bed7fa72b..a5c914f112 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -17,6 +17,9 @@ infoController.get = function(req, res, next) { info = []; pubsub.publish('sync:node:info:start'); setTimeout(function() { + info.sort(function(a, b) { + return (a.os.hostname < b.os.hostname) ? -1 : (a.os.hostname > b.os.hostname) ? 1 : 0; + }); res.render('admin/development/info', {info: info, infoJSON: JSON.stringify(info, null, 4), host: os.hostname(), port: nconf.get('port')}); }, 200); }; From 237ff37db54c6bbadd14cdd77feb526781fc146e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 10 Mar 2016 20:24:48 +0200 Subject: [PATCH 117/319] 300ms --- src/controllers/admin/info.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index a5c914f112..f0e6efd091 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -21,7 +21,7 @@ infoController.get = function(req, res, next) { return (a.os.hostname < b.os.hostname) ? -1 : (a.os.hostname > b.os.hostname) ? 1 : 0; }); res.render('admin/development/info', {info: info, infoJSON: JSON.stringify(info, null, 4), host: os.hostname(), port: nconf.get('port')}); - }, 200); + }, 300); }; pubsub.on('sync:node:info:start', function() { From c1c5db4b771cd74fdab23dc5b51fd626d30ea096 Mon Sep 17 00:00:00 2001 From: pichalite Date: Thu, 10 Mar 2016 18:59:49 +0000 Subject: [PATCH 118/319] check for last owner on user kick from group --- public/language/en_GB/error.json | 3 ++- src/groups/membership.js | 20 ++++++++++++++++++++ src/socket.io/groups.js | 10 ++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index 2921a55a35..b60c8a2cde 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -125,5 +125,6 @@ "no-session-found": "No login session found!", "not-in-room": "User not in room", - "no-users-in-room": "No users in this room" + "no-users-in-room": "No users in this room", + "cant-kick-self": "You can't kick yourself from the group" } diff --git a/src/groups/membership.js b/src/groups/membership.js index cb37121a40..1b13022300 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -413,4 +413,24 @@ module.exports = function(Groups) { } db.getSetMembers('group:' + groupName + ':pending', callback); }; + + Groups.kick = function(uid, groupName, isOwner, callback) { + if (isOwner) { + // If the owners set only contains one member, error out! + async.waterfall([ + function (next) { + db.setCount('group:' + groupName + ':owners', next); + }, + function (numOwners, next) { + if (numOwners <= 1) { + return next(new Error('[[error:group-needs-owner]]')); + } + Groups.leave(groupName, uid, callback); + next(); + } + ], callback); + } else { + Groups.leave(groupName, uid, callback); + } + }; }; diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index dc8ec8c51a..0135852f00 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -155,9 +155,15 @@ SocketGroups.kick = isOwner(function(socket, data, callback) { if (socket.uid === parseInt(data.uid, 10)) { return callback(new Error('[[error:cant-kick-self]]')); } - groups.leave(data.groupName, data.uid, callback); -}); + + groups.ownership.isOwner(data.uid, data.groupName, function(err, isOwner) { + if (err) { + callback(err); + } + groups.kick(data.uid, data.groupName, isOwner, callback); + }); +}); SocketGroups.create = function(socket, data, callback) { if (!socket.uid) { From 2f287f11b13a3fd059f901b02783d7ff60b3ac78 Mon Sep 17 00:00:00 2001 From: pichalite Date: Thu, 10 Mar 2016 19:46:15 +0000 Subject: [PATCH 119/319] cleanup --- src/groups/membership.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/groups/membership.js b/src/groups/membership.js index 1b13022300..18327579e5 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -425,8 +425,7 @@ module.exports = function(Groups) { if (numOwners <= 1) { return next(new Error('[[error:group-needs-owner]]')); } - Groups.leave(groupName, uid, callback); - next(); + Groups.leave(groupName, uid, next); } ], callback); } else { From 96a5d88314ef834c7ca6ba7be0faac52018b8e6d Mon Sep 17 00:00:00 2001 From: pichalite Date: Thu, 10 Mar 2016 19:46:50 +0000 Subject: [PATCH 120/319] cleanup --- src/socket.io/groups.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 0135852f00..8e35d74bca 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -158,7 +158,7 @@ SocketGroups.kick = isOwner(function(socket, data, callback) { groups.ownership.isOwner(data.uid, data.groupName, function(err, isOwner) { if (err) { - callback(err); + return callback(err); } groups.kick(data.uid, data.groupName, isOwner, callback); }); From e878b324441e7c9274cae9ede15fc7109e954b90 Mon Sep 17 00:00:00 2001 From: pichalite Date: Thu, 10 Mar 2016 21:24:15 +0000 Subject: [PATCH 121/319] closes #4258 --- public/language/en_GB/groups.json | 1 + src/controllers/admin/groups.js | 2 +- src/controllers/groups.js | 1 + src/views/admin/manage/group.tpl | 5 +++++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/public/language/en_GB/groups.json b/public/language/en_GB/groups.json index 5bade84eea..8d129fe376 100644 --- a/public/language/en_GB/groups.json +++ b/public/language/en_GB/groups.json @@ -47,6 +47,7 @@ "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", "details.delete_group": "Delete Group", + "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted", diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js index dc8bf6ff82..03b3514327 100644 --- a/src/controllers/admin/groups.js +++ b/src/controllers/admin/groups.js @@ -66,7 +66,7 @@ groupsController.get = function(req, res, callback) { return callback(err); } group.isOwner = true; - res.render('admin/manage/group', {group: group}); + res.render('admin/manage/group', {group: group, allowPrivateGroups: parseInt(meta.config.allowPrivateGroups, 10) === 1}); }); }; diff --git a/src/controllers/groups.js b/src/controllers/groups.js index c77c2c61ee..a67700c0d9 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -90,6 +90,7 @@ groupsController.details = function(req, res, callback) { } results.title = '[[pages:group, ' + results.group.displayName + ']]'; results.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[pages:groups]]', url: '/groups' }, {text: results.group.displayName}]); + results.allowPrivateGroups = parseInt(meta.config.allowPrivateGroups, 10) === 1; plugins.fireHook('filter:group.build', {req: req, res: res, templateData: results}, next); } ], function(err, results) { diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index 28cd6c006e..f117af85ab 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -40,6 +40,11 @@

+
+ +
- +

diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index 28cd6c006e..f39b9210e5 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -31,7 +31,7 @@
@@ -39,9 +39,9 @@
@@ -50,7 +50,7 @@
@@ -58,9 +58,9 @@
@@ -76,7 +76,7 @@
-

[[groups:details.members]]

+

Member List

diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index cf5360d5fb..08ae01fe68 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -178,40 +178,40 @@
- + - [[user:send_chat_notifications]] + Send an email if a new chat message arrives and I am not online
From b0151502c24f9a2ddbd248c65b26a4655f523e58 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 11 Mar 2016 14:20:23 +0200 Subject: [PATCH 129/319] use '-inf'/'+inf' --- src/categories/recentreplies.js | 2 +- src/database/mongo/sorted.js | 11 ++++++++++- src/notifications.js | 6 +++--- src/user/notifications.js | 5 ++--- src/user/reset.js | 4 ++-- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index c85bd5a69a..7d42f053ff 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -86,7 +86,7 @@ module.exports = function(Categories) { db.getSortedSetRevRangeByScore('cid:' + category.cid + ':tids', 0, -1, '+inf', Date.now(), next); }, tids: function(next) { - db.getSortedSetRevRangeByScore('cid:' + category.cid + ':tids', 0, Math.max(1, count), Date.now(), 0, next); + db.getSortedSetRevRangeByScore('cid:' + category.cid + ':tids', 0, Math.max(1, count), Date.now(), '-inf', next); } }, function(err, results) { if (err) { diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index db1c698e0b..d209f3f491 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -95,7 +95,16 @@ module.exports = function(db, module) { if (!Array.isArray(keys) || !keys.length) { return callback(); } - db.collection('objects').remove({_key: {$in: keys}, score: {$lte: max, $gte: min}}, function(err) { + + var scoreQuery = {}; + if (min !== '-inf') { + scoreQuery.$gte = min; + } + if (max !== '+inf') { + scoreQuery.$lte = max; + } + + db.collection('objects').remove({_key: {$in: keys}, score: scoreQuery}, function(err) { callback(err); }); }; diff --git a/src/notifications.js b/src/notifications.js index 0e73b34723..af88fd7b5b 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -214,10 +214,10 @@ var async = require('async'), db.sortedSetsRemove(readKeys, notification.nid, next); }, function(next) { - db.sortedSetsRemoveRangeByScore(unreadKeys, 0, oneWeekAgo, next); + db.sortedSetsRemoveRangeByScore(unreadKeys, '-inf', oneWeekAgo, next); }, function(next) { - db.sortedSetsRemoveRangeByScore(readKeys, 0, oneWeekAgo, next); + db.sortedSetsRemoveRangeByScore(readKeys, '-inf', oneWeekAgo, next); } ], function(err) { if (err) { @@ -358,7 +358,7 @@ var async = require('async'), var cutoffTime = Date.now() - week; - db.getSortedSetRangeByScore('notifications', 0, 500, 0, cutoffTime, function(err, nids) { + db.getSortedSetRangeByScore('notifications', 0, 500, '-inf', cutoffTime, function(err, nids) { if (err) { return winston.error(err.message); } diff --git a/src/user/notifications.js b/src/user/notifications.js index b04cd8ba75..9ad100db2b 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -188,10 +188,9 @@ var async = require('async'), } UserNotifications.getDailyUnread = function(uid, callback) { - var now = Date.now(), - yesterday = now - (1000*60*60*24); // Approximate, can be more or less depending on time changes, makes no difference really. + var yesterday = Date.now() - (1000 * 60 * 60 * 24); // Approximate, can be more or less depending on time changes, makes no difference really. - db.getSortedSetRevRangeByScore('uid:' + uid + ':notifications:unread', 0, 20, now, yesterday, function(err, nids) { + db.getSortedSetRevRangeByScore('uid:' + uid + ':notifications:unread', 0, 20, '+inf', yesterday, function(err, nids) { if (err) { return callback(err); } diff --git a/src/user/reset.js b/src/user/reset.js index 808e7d1f41..222e988de6 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -144,10 +144,10 @@ var async = require('async'), function(next) { async.parallel({ tokens: function(next) { - db.getSortedSetRangeByScore('reset:issueDate', 0, -1, 0, Date.now() - twoHours, next); + db.getSortedSetRangeByScore('reset:issueDate', 0, -1, '-inf', Date.now() - twoHours, next); }, uids: function(next) { - db.getSortedSetRangeByScore('reset:issueDate:uid', 0, -1, 0, Date.now() - twoHours, next); + db.getSortedSetRangeByScore('reset:issueDate:uid', 0, -1, '-inf', Date.now() - twoHours, next); } }, next); }, From 3981e230c4249f2c637ade76010277f394b14962 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 11 Mar 2016 16:15:43 +0200 Subject: [PATCH 130/319] category children helper --- public/src/modules/helpers.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index cd5c27734d..bdc4176d52 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -100,6 +100,23 @@ return style.join('; ') + ';'; }; + helpers.generateChildrenCategories = function(category, relative_path) { + var html = ''; + category.children.forEach(function(child) { + if (!child) { + return; + } + var link = child.link ? child.link : ('/category/' + child.slug); + html += '' + + '' + + '' + + '' + + '' + child.name + ' '; + }); + html = html ? ('
' + html + '') : html; + return html; + }; + helpers.generateTopicClass = function(topic) { var style = []; @@ -244,7 +261,7 @@ } return icons; - } + }; exports.register = function() { var templates; From 921d29773213021a70356514396ea238ea77fc60 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 11 Mar 2016 16:17:44 +0200 Subject: [PATCH 131/319] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d05ea6b41..ca74385d02 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.91", + "nodebb-theme-persona": "4.0.92", "nodebb-theme-vanilla": "5.0.54", "nodebb-widget-essentials": "2.0.7", "nodemailer": "2.0.0", From de421d5f8cc85cc2090c92fa721976996691e76a Mon Sep 17 00:00:00 2001 From: pichalite Date: Fri, 11 Mar 2016 06:41:21 -0800 Subject: [PATCH 132/319] remove language string in ACP --- src/views/admin/manage/group.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index f117af85ab..f1e14335ea 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -42,7 +42,7 @@ checked> [[groups:details.private]]

- [[groups:details.private_system_help]] + Private groups is disabled at system level, this option does not do anything

From 8b98718685b7ef2a782aa289c5d77c3dd92d59c5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 11 Mar 2016 16:53:29 +0200 Subject: [PATCH 133/319] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca74385d02..b035c2fbb2 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.92", + "nodebb-theme-persona": "4.0.93", "nodebb-theme-vanilla": "5.0.54", "nodebb-widget-essentials": "2.0.7", "nodemailer": "2.0.0", From 4f84ec31f6a7f11c92e76e40a595e8534051f5eb Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 11 Mar 2016 11:12:20 -0500 Subject: [PATCH 134/319] fixes #4352 --- nodebb | 56 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/nodebb b/nodebb index d162668344..5f6f2a77c5 100755 --- a/nodebb +++ b/nodebb @@ -47,39 +47,47 @@ var getRunningPid = function(callback) { files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')), deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }) }, function(err, payload) { - try { - var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/, - moduleName; + var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/, + moduleName, isGitRepo; - payload.files = payload.files.filter(function(file) { - return isNbbModule.test(file); - }); + payload.files = payload.files.filter(function(file) { + return isNbbModule.test(file); + }); + try { payload.deps = JSON.parse(payload.deps).dependencies; payload.bundled = []; payload.installed = []; + } catch (err) { + return callback(err); + } - for (moduleName in payload.deps) { - if (isNbbModule.test(moduleName)) { - payload.bundled.push(moduleName); - } + for (moduleName in payload.deps) { + if (isNbbModule.test(moduleName)) { + payload.bundled.push(moduleName); + } + } + + // Whittle down deps to send back only extraneously installed plugins/themes/etc + payload.files.forEach(function(moduleName) { + try { + fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git')); + isGitRepo = true; + } catch(e) { + isGitRepo = false; } - // Whittle down deps to send back only extraneously installed plugins/themes/etc - payload.files.forEach(function(moduleName) { - if ( - payload.files.indexOf(moduleName) !== -1 // found in `node_modules/` - && payload.bundled.indexOf(moduleName) === -1 // not found in `package.json` - && !fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() // is not a symlink - ) { - payload.installed.push(moduleName); - } - }); + if ( + payload.files.indexOf(moduleName) !== -1 // found in `node_modules/` + && payload.bundled.indexOf(moduleName) === -1 // not found in `package.json` + && !fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() // is not a symlink + && !isGitRepo // .git/ does not exist, so it is not a git repository + ) { + payload.installed.push(moduleName); + } + }); - getModuleVersions(payload.installed, callback); - } catch (err) { - callback(err); - } + getModuleVersions(payload.installed, callback); }); }, getModuleVersions = function(modules, callback) { From a6429af6c7ca8df9e8afedbfec13eedee81c3c96 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 11 Mar 2016 14:06:39 -0500 Subject: [PATCH 135/319] added cache buster to favicon --- src/meta/tags.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meta/tags.js b/src/meta/tags.js index 8495b827a6..3747db61da 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -46,7 +46,7 @@ module.exports = function(Meta) { var defaultLinks = [{ rel: "icon", type: "image/x-icon", - href: nconf.get('relative_path') + '/favicon.ico' + href: nconf.get('relative_path') + '/favicon.ico?' + Meta.config['cache-buster'] }, { rel: "manifest", href: nconf.get('relative_path') + '/manifest.json' From 944509406a1f918db1a073278cab42aa817779a3 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 11 Mar 2016 22:10:25 +0100 Subject: [PATCH 136/319] Create jquery.timeago.de-short.js --- .../locales/jquery.timeago.de-short.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 public/vendor/jquery/timeago/locales/jquery.timeago.de-short.js diff --git a/public/vendor/jquery/timeago/locales/jquery.timeago.de-short.js b/public/vendor/jquery/timeago/locales/jquery.timeago.de-short.js new file mode 100644 index 0000000000..10f158de08 --- /dev/null +++ b/public/vendor/jquery/timeago/locales/jquery.timeago.de-short.js @@ -0,0 +1,20 @@ +// German shortened +jQuery.timeago.settings.strings = { + prefixAgo: null, + prefixFromNow: null, + suffixAgo: "", + suffixFromNow: "", + seconds: "sec", + minute: "1min", + minutes: "%dmin", + hour: "1h", + hours: "%dh", + day: "1d", + days: "%dd", + month: "1Mon", + months: "%dMon", + year: "1Jhr", + years: "%dJhr", + wordSeparator: " ", + numbers: [] +}; From 2869b3c0685bb32541b7cda55be8e7ed77a570eb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 12 Mar 2016 17:29:33 +0200 Subject: [PATCH 137/319] closes #4354 --- src/socket.io/admin/user.js | 2 +- src/topics/delete.js | 8 ++++---- src/topics/tools.js | 2 +- src/user/delete.js | 28 +++++++++++++++------------- tests/topics.js | 4 ++-- tests/user.js | 2 +- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index c46e01a99c..2633425dc4 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -156,7 +156,7 @@ User.deleteUsers = function(socket, uids, callback) { return next(new Error('[[error:cant-delete-other-admins]]')); } - user.delete(uid, next); + user.delete(socket.uid, uid, next); }, function (next) { events.log({ diff --git a/src/topics/delete.js b/src/topics/delete.js index 8f2794fa17..97d617d878 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -11,7 +11,7 @@ var async = require('async'), module.exports = function(Topics) { - Topics.delete = function(tid, callback) { + Topics.delete = function(tid, uid, callback) { Topics.getTopicFields(tid, ['cid'], function(err, topicData) { if (err) { return callback(err); @@ -38,7 +38,7 @@ module.exports = function(Topics) { }); }; - Topics.restore = function(tid, callback) { + Topics.restore = function(tid, uid, callback) { Topics.getTopicFields(tid, ['cid', 'lastposttime', 'postcount', 'viewcount'], function(err, topicData) { if (err) { return callback(err); @@ -103,12 +103,12 @@ module.exports = function(Topics) { posts.purge(mainPid, uid, next); }, function (next) { - Topics.purge(tid, next); + Topics.purge(tid, uid, next); } ], callback); }; - Topics.purge = function(tid, callback) { + Topics.purge = function(tid, uid, callback) { async.parallel([ function(next) { db.deleteAll([ diff --git a/src/topics/tools.js b/src/topics/tools.js index 3deea91b46..1cb02ae514 100644 --- a/src/topics/tools.js +++ b/src/topics/tools.js @@ -49,7 +49,7 @@ module.exports = function(Topics) { return callback(new Error('[[error:topic-already-restored]]')); } - Topics[isDelete ? 'delete' : 'restore'](tid, next); + Topics[isDelete ? 'delete' : 'restore'](tid, uid, next); }, function (next) { topicData.deleted = isDelete ? 1 : 0; diff --git a/src/user/delete.js b/src/user/delete.js index 921bb62d32..3ab5176725 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -11,16 +11,16 @@ var async = require('async'), module.exports = function(User) { - User.delete = function(uid, callback) { + User.delete = function(callerUid, uid, callback) { if (!parseInt(uid, 10)) { return callback(new Error('[[error:invalid-uid]]')); } async.waterfall([ function(next) { - deletePosts(uid, next); + deletePosts(callerUid, uid, next); }, function(next) { - deleteTopics(uid, next); + deleteTopics(callerUid, uid, next); }, function(next) { User.deleteAccount(uid, next); @@ -28,17 +28,19 @@ module.exports = function(User) { ], callback); }; - function deletePosts(uid, callback) { - deleteSortedSetElements('uid:' + uid + ':posts', posts.purge, callback); - } - - function deleteTopics(uid, callback) { - deleteSortedSetElements('uid:' + uid + ':topics', topics.purge, callback); + function deletePosts(callerUid, uid, callback) { + batch.processSortedSet('uid:' + uid + ':posts', function(ids, next) { + async.eachSeries(ids, function(pid, netx) { + posts.purge(pid, callerUid, next); + }, next); + }, {alwaysStartAt: 0}, callback); } - function deleteSortedSetElements(set, deleteMethod, callback) { - batch.processSortedSet(set, function(ids, next) { - async.eachLimit(ids, 10, deleteMethod, next); + function deleteTopics(callerUid, uid, callback) { + batch.processSortedSet('uid:' + uid + ':topics', function(ids, next) { + async.eachSeries(ids, function(tid, next) { + topics.purge(tid, callerUid, next); + }, next); }, {alwaysStartAt: 0}, callback); } @@ -145,7 +147,7 @@ module.exports = function(User) { return pid && array.indexOf(pid) === index; }); - async.eachLimit(pids, 50, function(pid, next) { + async.eachSeries(pids, function(pid, next) { favourites.unvote(pid, uid, next); }, next); } diff --git a/tests/topics.js b/tests/topics.js index bf30147573..fe00db7646 100644 --- a/tests/topics.js +++ b/tests/topics.js @@ -173,14 +173,14 @@ describe('Topic\'s', function() { }); it('should delete the topic', function(done) { - topics.delete(newTopic.tid, function(err) { + topics.delete(newTopic.tid, 1, function(err) { assert.ifError(err); done(); }); }); it('should purge the topic', function(done) { - topics.purge(newTopic.tid, function(err) { + topics.purge(newTopic.tid, 1, function(err) { assert.ifError(err); done(); }); diff --git a/tests/user.js b/tests/user.js index f9423a62aa..570b002808 100644 --- a/tests/user.js +++ b/tests/user.js @@ -184,7 +184,7 @@ describe('User', function() { }); it('should delete a user account', function(done) { - User.delete(uid, function(err) { + User.delete(1, uid, function(err) { assert.ifError(err); User.existsBySlug('usertodelete', function(err, exists) { assert.ifError(err); From d87676384679956396ee486b30d9b9246f643b96 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 12 Mar 2016 11:27:07 -0500 Subject: [PATCH 138/319] added logic to filter out prerelease versions of NodeBB from the update checker --- public/src/admin/general/dashboard.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 6fa7084319..8595ac3b81 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -8,6 +8,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { graphs: false }, isMobile = false, + isPrerelease = /^v?\d+\.\d+\.\d+-.+$/, graphData = { rooms: {}, traffic: {} @@ -46,20 +47,28 @@ define('admin/general/dashboard', ['semver'], function(semver) { a = a.name.replace(/^v/, ''); b = b.name.replace(/^v/, ''); return semver.lt(a, b) ? 1 : -1; + }).filter(function(version) { + return !isPrerelease.test(version.name); // filter out automated prerelease versions }); var version = $('#version').html(), latestVersion = releases[0].name.slice(1), checkEl = $('.version-check'); - checkEl.html($('.version-check').html().replace('', 'v' + latestVersion)); // Alter box colour accordingly if (semver.eq(latestVersion, version)) { checkEl.removeClass('alert-info').addClass('alert-success'); checkEl.append('

You are up-to-date

'); } else if (semver.gt(latestVersion, version)) { - checkEl.removeClass('alert-info').addClass('alert-danger'); - checkEl.append('

A new version (v' + latestVersion + ') has been released. Consider upgrading your NodeBB.

'); + checkEl.removeClass('alert-info').addClass('alert-warning'); + if (!isPrerelease.test(version)) { + checkEl.append('

A new version (v' + latestVersion + ') has been released. Consider upgrading your NodeBB.

'); + } else { + checkEl.append('

This is an outdated pre-release version of NodeBB. A new version (v' + latestVersion + ') has been released. Consider upgrading your NodeBB.

'); + } + } else if (isPrerelease.test(version)) { + checkEl.removeClass('alert-info').addClass('alert-info'); + checkEl.append('

This is a pre-release version of NodeBB. Unintended bugs may occur. .

'); } }); From 263b09f11a9496b7ad498a5d698186b9d774ae23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 12 Mar 2016 19:49:51 +0200 Subject: [PATCH 139/319] fix typo in group cover upload --- public/src/client/groups/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 05375476dd..49f1d221f6 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -33,7 +33,7 @@ define('forum/groups/details', [ uploader.show({ title: '[[groups:upload-group-cover]]', route: config.relative_path + '/api/groups/uploadpicture', - params: {groupname: groupName} + params: {groupName: groupName} }, function(imageUrlOnServer) { components.get('groups/cover').css('background-image', 'url(' + imageUrlOnServer + ')'); }); From a402e29f2962cc6d7fc05da0162b07e7b7b75a44 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sun, 13 Mar 2016 11:05:59 +0200 Subject: [PATCH 140/319] up widget essentials --- package.json | 2 +- src/socket.io/admin/rooms.js | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b035c2fbb2..d6599232e5 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "nodebb-theme-lavender": "3.0.9", "nodebb-theme-persona": "4.0.93", "nodebb-theme-vanilla": "5.0.54", - "nodebb-widget-essentials": "2.0.7", + "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", "nodemailer-smtp-transport": "^2.4.1", diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js index 6d8843b8ca..50ba4661de 100644 --- a/src/socket.io/admin/rooms.js +++ b/src/socket.io/admin/rooms.js @@ -29,15 +29,16 @@ pubsub.on('sync:stats:end', function(data) { stats[data.id] = data.stats; }); +pubsub.on('sync:stats:guests', function() { + var io = require('../index').server; + + var roomClients = io.sockets.adapter.rooms; + var guestCount = roomClients.online_guests ? roomClients.online_guests.length : 0; + pubsub.publish('sync:stats:guests:end', guestCount); +}); + SocketRooms.getTotalGuestCount = function(callback) { var count = 0; - pubsub.once('sync:stats:guests', function() { - var io = require('../index').server; - - var roomClients = io.sockets.adapter.rooms; - var guestCount = roomClients.online_guests ? roomClients.online_guests.length : 0; - pubsub.publish('sync:stats:guests:end', guestCount); - }); pubsub.on('sync:stats:guests:end', function(guestCount) { count += guestCount; From 147e36a7a5e586da1726ab9ae84124a8a4694c2c Mon Sep 17 00:00:00 2001 From: kingjan1999 Date: Mon, 14 Mar 2016 10:27:24 +0100 Subject: [PATCH 141/319] update fontawesome.tpl to FA 4.5 --- src/views/partials/fontawesome.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/partials/fontawesome.tpl b/src/views/partials/fontawesome.tpl index 6ede4e70d3..a179bfdd49 100644 --- a/src/views/partials/fontawesome.tpl +++ b/src/views/partials/fontawesome.tpl @@ -4,7 +4,7 @@
- +

For a full list of icons, please consult: From 0f917635c646cae317b71e53d5b22af68319f85d Mon Sep 17 00:00:00 2001 From: accalia Date: Mon, 14 Mar 2016 10:40:24 -0400 Subject: [PATCH 142/319] allow loadMore Calls to fetch page 0 --- src/socket.io/notifications.js | 3 ++- src/socket.io/topics/infinitescroll.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/socket.io/notifications.js b/src/socket.io/notifications.js index e2d7cf3084..121ede2a96 100644 --- a/src/socket.io/notifications.js +++ b/src/socket.io/notifications.js @@ -3,6 +3,7 @@ var async = require('async'); var user = require('../user'); var notifications = require('../notifications'); +var utils = require('../../public/src/utils'); var SocketNotifs = {}; @@ -15,7 +16,7 @@ SocketNotifs.get = function(socket, data, callback) { }; SocketNotifs.loadMore = function(socket, data, callback) { - if (!data || !parseInt(data.after, 10)) { + if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) { return callback(new Error('[[error:invalid-data]]')); } if (!socket.uid) { diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js index 8cb975c15e..3ffe1c65c8 100644 --- a/src/socket.io/topics/infinitescroll.js +++ b/src/socket.io/topics/infinitescroll.js @@ -88,7 +88,7 @@ module.exports = function(SocketTopics) { }; SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) { - if (!data || !data.after) { + if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) { return callback(new Error('[[error:invalid-data]]')); } @@ -99,7 +99,7 @@ module.exports = function(SocketTopics) { }; SocketTopics.loadMoreFromSet = function(socket, data, callback) { - if (!data || !data.after || !data.set) { + if (!data || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0 || !data.set) { return callback(new Error('[[error:invalid-data]]')); } From a275aaeaf50a46590e157c183f51333f321b5b7e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 14 Mar 2016 12:57:45 -0400 Subject: [PATCH 143/319] fixes #4361 --- public/src/admin/manage/categories.js | 55 ++++++++++++++++++--------- public/src/admin/manage/category.js | 6 +++ src/categories/update.js | 5 ++- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index a57fc06701..b4a5f19601 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -152,28 +152,45 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri * @param parentId {number} parent category identifier */ function renderList(categories, container, parentId){ - templates.parse('admin/partials/categories/category-rows', { - cid: parentId, - categories: categories - }, function(html) { - container.append(html); - - // Handle and children categories in this level have - for(var x=0,numCategories=categories.length;x Date: Mon, 14 Mar 2016 13:03:33 -0400 Subject: [PATCH 144/319] Updated topic and category controller to not redirect on incorrect slug if the call is made via API route. Cold load? Anything goes. --- src/controllers/category.js | 2 +- src/controllers/topics.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/category.js b/src/controllers/category.js index f4b939f60a..e3adde496f 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -51,7 +51,7 @@ categoryController.get = function(req, res, callback) { return helpers.notAllowed(req, res); } - if ((!req.params.slug || results.categoryData.slug !== cid + '/' + req.params.slug) && (results.categoryData.slug && results.categoryData.slug !== cid + '/')) { + if (!res.locals.isAPI && (!req.params.slug || results.categoryData.slug !== cid + '/' + req.params.slug) && (results.categoryData.slug && results.categoryData.slug !== cid + '/')) { return helpers.redirect(res, '/category/' + encodeURI(results.categoryData.slug)); } diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 7a222dd09c..68a3b18415 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -54,7 +54,7 @@ topicsController.get = function(req, res, callback) { return helpers.notAllowed(req, res); } - if ((!req.params.slug || results.topic.slug !== tid + '/' + req.params.slug) && (results.topic.slug && results.topic.slug !== tid + '/')) { + if (!res.locals.isAPI && (!req.params.slug || results.topic.slug !== tid + '/' + req.params.slug) && (results.topic.slug && results.topic.slug !== tid + '/')) { var url = '/topic/' + encodeURI(results.topic.slug); if (req.params.post_index){ url += '/'+req.params.post_index; From 50b0bcca0ca6fdcf2f21b3e7831ef0cd4d7ea1f0 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 14 Mar 2016 15:30:27 -0400 Subject: [PATCH 145/319] closes #4291 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d6599232e5..7ee2d14430 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "mongodb": "~2.1.3", "morgan": "^1.3.2", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.7", + "nodebb-plugin-composer-default": "3.0.8", "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", From 71c697037d7dc41b06cda6a63db97b0cd09acd84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 14 Mar 2016 22:10:02 +0200 Subject: [PATCH 146/319] return the ips of the account we are looking at --- src/controllers/accounts/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 7028972491..0b180be686 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -42,7 +42,7 @@ settingsController.get = function(req, res, callback) { getHomePageRoutes(next); }, ips: function (next) { - user.getIPs(req.uid, 4, next); + user.getIPs(userData.uid, 4, next); }, sessions: async.apply(user.auth.getSessions, userData.uid, req.sessionID) }, next); From 184a2c4540c95be87ba787aff2dab59a5f7522c0 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 14 Mar 2016 17:31:36 -0400 Subject: [PATCH 147/319] IP blacklist functionality -- re: #4367 Squashed commit of the following: commit 5c42fd732d091fa66cf5b45a2af5e1697cc1efcd Author: Julian Lam Date: Mon Mar 14 17:29:45 2016 -0400 allowing blacklist.test to be called synchronously commit 979faf2dba5e6f6e2ae1bd07341e63678438daf1 Author: Julian Lam Date: Mon Mar 14 17:01:14 2016 -0400 added plain ipv6 support and finished middleware logic commit d4b72fc1aadff34df3ed7dec52ca8d3c3728a078 Author: Julian Lam Date: Fri Mar 11 16:05:31 2016 -0500 WIP IP Banning logic middleware commit f08b2553890c5522b6a1eaf521fe4e94df40574a Author: Julian Lam Date: Fri Mar 11 15:26:27 2016 -0500 tweaks to ACP, rule validator commit 868abacaa494e6b8a88bd4ea429b1b066a9ecb2e Author: Julian Lam Date: Fri Mar 11 13:50:05 2016 -0500 IP Banning ACP page, styling, save&load functionality --- package.json | 1 + public/language/en_GB/error.json | 1 + public/less/admin/admin.less | 1 + public/less/admin/manage/blacklist.less | 5 + public/src/admin/manage/ip-blacklist.js | 41 +++++++ src/controllers/admin.js | 1 + src/controllers/admin/blacklist.js | 9 ++ src/meta.js | 1 + src/meta/blacklist.js | 106 ++++++++++++++++++ src/middleware/middleware.js | 7 ++ src/routes/admin.js | 2 +- src/routes/authentication.js | 4 +- src/routes/index.js | 11 +- src/socket.io/admin.js | 6 +- src/views/admin/manage/ip-blacklist.tpl | 31 +++++ .../admin/partials/blacklist-validate.tpl | 14 +++ src/views/admin/partials/menu.tpl | 2 + src/webserver.js | 3 +- 18 files changed, 238 insertions(+), 8 deletions(-) create mode 100644 public/less/admin/manage/blacklist.less create mode 100644 public/src/admin/manage/ip-blacklist.js create mode 100644 src/controllers/admin/blacklist.js create mode 100644 src/meta/blacklist.js create mode 100644 src/views/admin/manage/ip-blacklist.tpl create mode 100644 src/views/admin/partials/blacklist-validate.tpl diff --git a/package.json b/package.json index 7ee2d14430..37f7911604 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "express-session": "^1.8.2", "express-useragent": "0.2.4", "html-to-text": "2.0.0", + "ip": "1.1.2", "jimp": "0.2.21", "less": "^2.0.0", "logrotate-stream": "^0.2.3", diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index b60c8a2cde..e9a4cbea7d 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -34,6 +34,7 @@ "user-banned": "User banned", "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", + "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", "no-category": "Category does not exist", "no-topic": "Topic does not exist", diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index 930e518412..182b0afccf 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -12,6 +12,7 @@ @import "./manage/tags"; @import "./manage/groups"; @import "./manage/users"; +@import "./manage/blacklist"; @import "./appearance/customise"; @import "./appearance/themes"; @import "./extend/plugins"; diff --git a/public/less/admin/manage/blacklist.less b/public/less/admin/manage/blacklist.less new file mode 100644 index 0000000000..4e0dcb7c27 --- /dev/null +++ b/public/less/admin/manage/blacklist.less @@ -0,0 +1,5 @@ +#blacklist-rules { + width: 100%; + height: 450px; + display: block; +} \ No newline at end of file diff --git a/public/src/admin/manage/ip-blacklist.js b/public/src/admin/manage/ip-blacklist.js new file mode 100644 index 0000000000..daba34ec3d --- /dev/null +++ b/public/src/admin/manage/ip-blacklist.js @@ -0,0 +1,41 @@ +'use strict'; +/* globals $, app, socket, templates */ + +define('admin/manage/ip-blacklist', ['settings'], function(Settings) { + + var Blacklist = {}; + + Blacklist.init = function() { + var blacklist = ace.edit("blacklist-rules"); + + blacklist.on('change', function(e) { + $('#blacklist-rules-holder').val(blacklist.getValue()); + }); + + Settings.load('blacklist', $('.blacklist-settings'), function(err, settings) { + blacklist.setValue(settings.rules); + }); + + $('[data-action="apply"]').on('click', function() { + Settings.save('blacklist', $('.blacklist-settings'), function() { + app.alert({ + type: 'success', + alert_id: 'blacklist-saved', + title: 'Blacklist Applied', + }); + }); + }); + + $('[data-action="test"]').on('click', function() { + socket.emit('admin.blacklist.validate', { + rules: blacklist.getValue() + }, function(err, data) { + templates.parse('admin/partials/blacklist-validate', data, function(html) { + bootbox.alert(html); + }); + }); + }); + }; + + return Blacklist; +}); \ No newline at end of file diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 8b9b1cafc7..2bba60cae6 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -5,6 +5,7 @@ var adminController = { categories: require('./admin/categories'), tags: require('./admin/tags'), flags: require('./admin/flags'), + blacklist: require('./admin/blacklist'), groups: require('./admin/groups'), appearance: require('./admin/appearance'), extend: { diff --git a/src/controllers/admin/blacklist.js b/src/controllers/admin/blacklist.js new file mode 100644 index 0000000000..60c3940e44 --- /dev/null +++ b/src/controllers/admin/blacklist.js @@ -0,0 +1,9 @@ +"use strict"; + +var blacklistController = {}; + +blacklistController.get = function(req, res, next) { + res.render('admin/manage/ip-blacklist', {}); +}; + +module.exports = blacklistController; diff --git a/src/meta.js b/src/meta.js index 7a054b1836..716d90e9cb 100644 --- a/src/meta.js +++ b/src/meta.js @@ -26,6 +26,7 @@ var async = require('async'), require('./meta/tags')(Meta); require('./meta/dependencies')(Meta); Meta.templates = require('./meta/templates'); + Meta.blacklist = require('./meta/blacklist'); /* Assorted */ Meta.userOrGroupExists = function(slug, callback) { diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js new file mode 100644 index 0000000000..2029b406f2 --- /dev/null +++ b/src/meta/blacklist.js @@ -0,0 +1,106 @@ +'use strict'; + +var ip = require('ip'), + winston = require('winston'), + async = require('async'); + +var meta = module.parent.exports; + +var Blacklist = { + _rules: [] + }; + +Blacklist.load = function(callback) { + async.waterfall([ + async.apply(meta.settings.getOne, 'blacklist', 'rules'), + async.apply(Blacklist.validate) + ], function(err, rules) { + if (err) { + return callback(err); + } + + winston.verbose('[meta/blacklist] Loading ' + rules.valid.length + ' blacklist rules'); + if (rules.invalid.length) { + winston.warn('[meta/blacklist] ' + rules.invalid.length + ' invalid blacklist rule(s) were ignored.'); + } + + Blacklist._rules = { + ipv4: rules.ipv4, + ipv6: rules.ipv6, + cidr: rules.cidr + }; + + callback(); + }); +}; + +Blacklist.test = function(clientIp, callback) { + if ( + Blacklist._rules.ipv4.indexOf(clientIp) === -1 // not explicitly specified in ipv4 list + && Blacklist._rules.ipv6.indexOf(clientIp) === -1 // not explicitly specified in ipv6 list + && !Blacklist._rules.cidr.some(function(subnet) { + return ip.cidrSubnet(subnet).contains(clientIp); + }) // not in a blacklisted cidr range + ) { + if (typeof callback === 'function') { + callback(); + } else { + return false; + } + } else { + var err = new Error('[[error:blacklisted-ip]]'); + err.code = 'blacklisted-ip'; + + if (typeof callback === 'function') { + callback(err); + } else { + return true; + } + } +}; + +Blacklist.validate = function(rules, callback) { + var rules = (rules || '').split('\n'), + ipv4 = [], + ipv6 = [], + cidr = [], + invalid = []; + + var isCidrSubnet = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/; + + // Filter out blank lines and lines starting with the hash character (comments) + rules = rules.map(function(rule) { + rule = rule.trim(); + return rule.length && !rule.startsWith('#') ? rule : null; + }).filter(Boolean); + + // Filter out invalid rules + rules = rules.filter(function(rule) { + if (ip.isV4Format(rule)) { + ipv4.push(rule); + return true; + } else if (ip.isV6Format(rule)) { + ipv6.push(rule); + return true; + } else if (isCidrSubnet.test(rule)) { + cidr.push(rule); + return true; + } else { + invalid.push(rule); + return false; + } + + return true; + }); + + callback(null, { + numRules: rules.length + invalid.length, + ipv4: ipv4, + ipv6: ipv6, + cidr: cidr, + valid: rules, + invalid: invalid + }); +}; + +module.exports = Blacklist; \ No newline at end of file diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index d5e1d93388..52adf21ab4 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -257,6 +257,13 @@ middleware.busyCheck = function(req, res, next) { } }; +middleware.applyBlacklist = function(req, res, next) { + meta.blacklist.test(req.ip, function(err) { + console.log('blacklist returned:', err); + next(err); + }); +}; + module.exports = function(webserver) { app = webserver; middleware.admin = require('./admin')(webserver); diff --git a/src/routes/admin.js b/src/routes/admin.js index f5d4d039a1..56c97ff1f2 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -54,8 +54,8 @@ function addRoutes(router, middleware, controllers) { router.get('/manage/categories/:category_id', middlewares, controllers.admin.categories.get); router.get('/manage/tags', middlewares, controllers.admin.tags.get); - router.get('/manage/flags', middlewares, controllers.admin.flags.get); + router.get('/manage/ip-blacklist', middlewares, controllers.admin.blacklist.get); router.get('/manage/users', middlewares, controllers.admin.users.sortByJoinDate); router.get('/manage/users/search', middlewares, controllers.admin.users.search); diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 37439ba523..8e1824cad6 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -62,8 +62,8 @@ })); }); - router.post('/register', Auth.middleware.applyCSRF, controllers.authentication.register); - router.post('/login', Auth.middleware.applyCSRF, controllers.authentication.login); + router.post('/register', Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist, controllers.authentication.register); + router.post('/login', Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist, controllers.authentication.login); router.post('/logout', Auth.middleware.applyCSRF, controllers.authentication.logout); hotswap.replace('auth', router); diff --git a/src/routes/index.js b/src/routes/index.js index 7e84f29af1..e49256f933 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -187,9 +187,14 @@ function handle404(app, middleware) { function handleErrors(app, middleware) { app.use(function(err, req, res, next) { - if (err.code === 'EBADCSRFTOKEN') { - winston.error(req.path + '\n', err.message); - return res.sendStatus(403); + switch (err.code) { + case 'EBADCSRFTOKEN': + winston.error(req.path + '\n', err.message); + return res.sendStatus(403); + break; + case 'blacklisted-ip': + return res.status(403).type('text/plain').send(err.message); + break; } if (parseInt(err.status, 10) === 302 && err.path) { diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 6dd22134ba..f3504a920d 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -33,7 +33,8 @@ var async = require('async'), settings: {}, email: {}, analytics: {}, - logs: {} + logs: {}, + blacklist: {} }; SocketAdmin.before = function(socket, method, data, next) { @@ -273,5 +274,8 @@ SocketAdmin.deleteAllEvents = function(socket, data, callback) { events.deleteAll(callback); }; +SocketAdmin.blacklist.validate = function(socket, data, callback) { + meta.blacklist.validate(data.rules, callback); +}; module.exports = SocketAdmin; diff --git a/src/views/admin/manage/ip-blacklist.tpl b/src/views/admin/manage/ip-blacklist.tpl new file mode 100644 index 0000000000..13e43a84d7 --- /dev/null +++ b/src/views/admin/manage/ip-blacklist.tpl @@ -0,0 +1,31 @@ +

+
+

+ Configure your IP blacklist here. +

+

+ Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs + is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and + they will be prevented from logging in to or registering a new account. +

+ +
+
+
+
+ +
+
+
+
+
Active Rules
+
+ + +
+
+
+
+
+ +
\ No newline at end of file diff --git a/src/views/admin/partials/blacklist-validate.tpl b/src/views/admin/partials/blacklist-validate.tpl new file mode 100644 index 0000000000..4a642a23a3 --- /dev/null +++ b/src/views/admin/partials/blacklist-validate.tpl @@ -0,0 +1,14 @@ +

+ {valid.length} out of {numRules} rule(s) valid. +

+ + +

+ The following {invalid.length} rules are invalid: +

+
    + +
  • @value
  • + +
+ \ No newline at end of file diff --git a/src/views/admin/partials/menu.tpl b/src/views/admin/partials/menu.tpl index a0027c0621..8d0f0f853d 100644 --- a/src/views/admin/partials/menu.tpl +++ b/src/views/admin/partials/menu.tpl @@ -20,6 +20,7 @@
  • Registration Queue
  • Groups
  • Flags
  • +
  • IP Blacklist
  • @@ -173,6 +174,7 @@
  • Registration Queue
  • Groups
  • Flags
  • +
  • IP Blacklist
  • From 86bc7e3eff2c5b58b043ab30b5366f2d6dfb3ea6 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 16 Mar 2016 12:55:29 -0400 Subject: [PATCH 157/319] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ceb23a3262..a8eefa085e 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.95", + "nodebb-theme-persona": "4.0.96", "nodebb-theme-vanilla": "5.0.54", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", From c8b179e492fdff1dd86cb4ecd815ed1385c52b7c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 16 Mar 2016 15:39:43 -0400 Subject: [PATCH 158/319] better settings for birthday datepicker --- public/src/client/account/edit.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 0c22e33d56..de5b01e809 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -17,7 +17,8 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], $('#inputBirthday').datepicker({ changeMonth: true, changeYear: true, - yearRange: '1900:+0' + yearRange: '1900:-5y', + defaultDate: '-13y' }); }); From 54e36f7c548a47450b069da20deb3d6063f5fa9d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 16 Mar 2016 17:47:12 -0400 Subject: [PATCH 159/319] Update ajaxify logic w/ returnPath support If returnPath is defined, and url is null, then ajaxify will execute a replaceState instead of an ajaxification. Used in cases where a separate route is pushed but you'll want to return to the page you were on previously. (see: #4371) --- public/src/ajaxify.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 608e0a6cda..ecd8276c69 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -22,10 +22,16 @@ $(document).ready(function() { $(window).on('popstate', function (ev) { ev = ev.originalEvent; - if (ev !== null && ev.state && ev.state.url !== undefined) { - ajaxify.go(ev.state.url, function() { - $(window).trigger('action:popstate', {url: ev.state.url}); - }, true); + if (ev !== null && ev.state) { + if (ev.state.url === null && ev.state.returnPath !== undefined) { + window.history.replaceState({ + url: ev.state.returnPath + }, ev.state.returnPath, config.relative_path + '/' + ev.state.returnPath); + } else if (ev.state.url !== undefined) { + ajaxify.go(ev.state.url, function() { + $(window).trigger('action:popstate', {url: ev.state.url}); + }, true); + } } }); From 232cbde8775e721e8c277a7461168bd517008b38 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 16 Mar 2016 17:53:11 -0400 Subject: [PATCH 160/319] upped composer, #4371 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8eefa085e..fb03387329 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "mongodb": "~2.1.3", "morgan": "^1.3.2", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.8", + "nodebb-plugin-composer-default": "3.0.9", "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", From ceb3b6ebe7cfa3958c74e4a1c1d4b2a4e4e02f8b Mon Sep 17 00:00:00 2001 From: boomzillawtf Date: Wed, 16 Mar 2016 17:55:58 -0400 Subject: [PATCH 161/319] Add setting to avoid showing a post after it is submitted to keep the user's place on the page to address issue #4363 --- public/language/en_GB/user.json | 2 ++ public/src/client/topic/posts.js | 2 +- src/user/settings.js | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/public/language/en_GB/user.json b/public/language/en_GB/user.json index 2de2819dad..d76e82b5b3 100644 --- a/public/language/en_GB/user.json +++ b/public/language/en_GB/user.json @@ -103,6 +103,8 @@ "enable_topic_searching": "Enable In-Topic Searching", "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", + "scroll_to_my_post": "After posting a reply, show the new post", + "follow_topics_you_reply_to": "Follow topics that you reply to", "follow_topics_you_create": "Follow topics you create", diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 8f8bf4ca7d..2eada17c17 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -79,7 +79,7 @@ define('forum/topic/posts', [ } function scrollToPostIfSelf(post) { - var isSelfPost = parseInt(post.uid, 10) === parseInt(app.user.uid, 10); + var isSelfPost = config.scrollToMyPost && parseInt(post.uid, 10) === parseInt(app.user.uid, 10); if (isSelfPost) { navigator.scrollBottom(post.index); } diff --git a/src/user/settings.js b/src/user/settings.js index f1c4081b50..fc72342bf9 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -76,6 +76,7 @@ module.exports = function(User) { settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1; settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1; settings.bootswatchSkin = settings.bootswatchSkin || 'default'; + settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) ===1; callback(null, settings); }); @@ -120,7 +121,8 @@ module.exports = function(User) { restrictChat: data.restrictChat, topicSearchEnabled: data.topicSearchEnabled, groupTitle: data.groupTitle, - homePageRoute: data.homePageCustom || data.homePageRoute + homePageRoute: data.homePageCustom || data.homePageRoute, + scrollToMyPost: data.scrollToMyPost }; if (data.bootswatchSkin) { From eb7c2d5872b12d5b67b26d38cb5585780608c207 Mon Sep 17 00:00:00 2001 From: boomzillawtf Date: Wed, 16 Mar 2016 20:19:02 -0400 Subject: [PATCH 162/319] Use scrollToMyPost setting with both pagination and infinite scroll --- public/src/client/topic/posts.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 2eada17c17..3eff5a03b5 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -33,10 +33,12 @@ define('forum/topic/posts', [ ajaxify.data.postcount ++; postTools.updatePostCount(ajaxify.data.postcount); - if (config.usePagination) { - onNewPostPagination(data); - } else { - onNewPostInfiniteScroll(data); + if (config.scrollToMyPost) { + if (config.usePagination) { + onNewPostPagination(data); + } else { + onNewPostInfiniteScroll(data); + } } }; @@ -79,7 +81,7 @@ define('forum/topic/posts', [ } function scrollToPostIfSelf(post) { - var isSelfPost = config.scrollToMyPost && parseInt(post.uid, 10) === parseInt(app.user.uid, 10); + var isSelfPost = parseInt(post.uid, 10) === parseInt(app.user.uid, 10); if (isSelfPost) { navigator.scrollBottom(post.index); } From 677b97d8bbf7f213bcef567c1111da090a012cfb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 17 Mar 2016 11:00:01 +0200 Subject: [PATCH 163/319] closes #2873 --- src/views/admin/manage/group.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index 414f51133e..f579065df5 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -9,12 +9,12 @@
    -
    +
    -
    +
    From 838023f91e858611bd900e5b42f51a7e47d58ad8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 17 Mar 2016 11:03:23 +0200 Subject: [PATCH 164/319] up themes --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fb03387329..36ebb75f87 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.96", - "nodebb-theme-vanilla": "5.0.54", + "nodebb-theme-persona": "4.0.97", + "nodebb-theme-vanilla": "5.0.55", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", From c71ffed69c1efe7ca7a9c329e05f32ebcee59c30 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 17 Mar 2016 11:38:21 +0200 Subject: [PATCH 165/319] closes #4362 --- public/src/ajaxify.js | 1 + public/src/app.js | 2 ++ public/src/client/topic/events.js | 4 ++-- src/middleware/render.js | 1 + src/posts/parse.js | 3 +++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index ecd8276c69..8450f1c2ab 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -154,6 +154,7 @@ $(document).ready(function() { templates.parse(tpl_url, data, function(template) { translator.translate(template, function(translatedTemplate) { + translatedTemplate = translator.unescape(translatedTemplate); $('body').addClass(data.bodyClass); $('#content').html(translatedTemplate); diff --git a/public/src/app.js b/public/src/app.js index 4f7b009a30..65276bc798 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -521,6 +521,7 @@ app.cacheBuster = null; if (typeof blockName === 'string') { templates.parse(template, blockName, data, function(html) { translator.translate(html, function(translatedHTML) { + translatedHTML = translator.unescape(translatedHTML); callback($(translatedHTML)); }); }); @@ -528,6 +529,7 @@ app.cacheBuster = null; callback = data, data = blockName; templates.parse(template, data, function(html) { translator.translate(html, function(translatedHTML) { + translatedHTML = translator.unescape(translatedHTML); callback($(translatedHTML)); }); }); diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index ba8c77598e..d65a1c7c47 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -114,7 +114,7 @@ define('forum/topic/events', [ } editedPostEl.fadeOut(250, function() { - editedPostEl.html(data.post.content); + editedPostEl.html(translator.unescape(data.post.content)); editedPostEl.find('img:not(.not-responsive)').addClass('img-responsive'); app.replaceSelfLinks(editedPostEl.find('a')); posts.wrapImagesInLinks(editedPostEl.parent()); @@ -186,7 +186,7 @@ define('forum/topic/events', [ if (isDeleted) { postEl.find('[component="post/content"]').translateHtml('[[topic:post_is_deleted]]'); } else { - postEl.find('[component="post/content"]').html(data.content); + postEl.find('[component="post/content"]').html(translator.unescape(data.content)); } } } diff --git a/src/middleware/render.js b/src/middleware/render.js index 9ae7a50253..2a9d0ba5d2 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -72,6 +72,7 @@ module.exports = function(middleware) { var language = res.locals.config ? res.locals.config.userLang || 'en_GB' : 'en_GB'; language = req.query.lang || language; translator.translate(str, language, function(translated) { + translated = translator.unescape(translated); translated = translated + ''; fn(err, translated); }); diff --git a/src/posts/parse.js b/src/posts/parse.js index efa5667ccc..1af374305d 100644 --- a/src/posts/parse.js +++ b/src/posts/parse.js @@ -3,6 +3,7 @@ var cache = require('./cache'); var plugins = require('../plugins'); +var translator = require('../../public/src/modules/translator'); module.exports = function(Posts) { @@ -24,6 +25,8 @@ module.exports = function(Posts) { return callback(err); } + data.postData.content = translator.escape(data.postData.content); + if (global.env === 'production' && data.postData.pid) { cache.set(data.postData.pid, data.postData.content); } From 6076bbbed4263ed0e610e6f9c42134588b280925 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 17 Mar 2016 11:54:31 +0200 Subject: [PATCH 166/319] added title --- src/controllers/admin/blacklist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/admin/blacklist.js b/src/controllers/admin/blacklist.js index 3561ba0f76..2c0104f742 100644 --- a/src/controllers/admin/blacklist.js +++ b/src/controllers/admin/blacklist.js @@ -9,7 +9,7 @@ blacklistController.get = function(req, res, next) { if (err) { return next(err); } - res.render('admin/manage/ip-blacklist', {rules: rules}); + res.render('admin/manage/ip-blacklist', {rules: rules, title: 'IP Blacklist'}); }); }; From 3f9c838c30304fd8e3872e6667fd58db0c43ab30 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 17 Mar 2016 14:57:41 -0400 Subject: [PATCH 167/319] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 36ebb75f87..e0e8bf8b71 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.97", + "nodebb-theme-persona": "4.0.98", "nodebb-theme-vanilla": "5.0.55", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", From 9e44bd3d219849267e4f2b6514fc388cd0f6c286 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 18 Mar 2016 10:33:10 +0200 Subject: [PATCH 168/319] up themes --- package.json | 4 ++-- public/src/client/topic/posts.js | 14 +++++++------- src/controllers/topics.js | 5 +++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index e0e8bf8b71..7eb551e233 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.98", - "nodebb-theme-vanilla": "5.0.55", + "nodebb-theme-persona": "4.0.99", + "nodebb-theme-vanilla": "5.0.56", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 3eff5a03b5..f534aefad5 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -33,12 +33,12 @@ define('forum/topic/posts', [ ajaxify.data.postcount ++; postTools.updatePostCount(ajaxify.data.postcount); - if (config.scrollToMyPost) { - if (config.usePagination) { - onNewPostPagination(data); - } else { - onNewPostInfiniteScroll(data); - } + if (ajaxify.data.scrollToMyPost) { + if (config.usePagination) { + onNewPostPagination(data); + } else { + onNewPostInfiniteScroll(data); + } } }; @@ -142,7 +142,7 @@ define('forum/topic/posts', [ } data.slug = ajaxify.data.slug; - + $(window).trigger('action:posts.loading', {posts: data.posts, after: after, before: before}); app.parseAndTranslate('topic', 'posts', data, function(html) { diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 68a3b18415..27c0ed5b81 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -4,7 +4,6 @@ var async = require('async'); var S = require('string'); var nconf = require('nconf'); -var validator = require('validator'); var user = require('../user'); var meta = require('../meta'); @@ -24,6 +23,7 @@ topicsController.get = function(req, res, callback) { var currentPage = parseInt(req.query.page, 10) || 1; var pageCount = 1; var userPrivileges; + var settings; if ((req.params.post_index && !utils.isNumber(req.params.post_index)) || !utils.isNumber(tid)) { return callback(); @@ -62,7 +62,7 @@ topicsController.get = function(req, res, callback) { return helpers.redirect(res, url); } - var settings = results.settings; + settings = results.settings; var postCount = parseInt(results.topic.postcount, 10); pageCount = Math.max(1, Math.ceil((postCount - 1) / settings.postsPerPage)); @@ -261,6 +261,7 @@ topicsController.get = function(req, res, callback) { data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; data['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; + data.scrollToMyPost = settings.scrollToMyPost; data.rssFeedUrl = nconf.get('relative_path') + '/topic/' + data.tid + '.rss'; data.pagination = pagination.create(currentPage, pageCount); data.pagination.rel.forEach(function(rel) { From 1e651aed3570383ec1492e87af0fa592cbf300f3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 18 Mar 2016 12:13:29 -0400 Subject: [PATCH 169/319] #4377 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7eb551e233..fb4e717bf0 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "mongodb": "~2.1.3", "morgan": "^1.3.2", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.9", + "nodebb-plugin-composer-default": "3.0.10", "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", From f7e43877482f6efc276ea71e61d7c7524a8f5a44 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 18 Mar 2016 12:24:51 -0400 Subject: [PATCH 170/319] closes #4380 --- src/meta/blacklist.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js index b0269a1f0c..47381e487b 100644 --- a/src/meta/blacklist.js +++ b/src/meta/blacklist.js @@ -78,16 +78,24 @@ Blacklist.validate = function(rules, callback) { var cidr = []; var invalid = []; - var isCidrSubnet = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/; + var isCidrSubnet = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$/, + inlineCommentMatch = /#.*$/, + whitelist = ['127.0.0.1', '::1', '::ffff:0:127.0.0.1']; // Filter out blank lines and lines starting with the hash character (comments) + // Also trim inputs and remove inline comments rules = rules.map(function(rule) { - rule = rule.trim(); + rule = rule.replace(inlineCommentMatch, '').trim(); return rule.length && !rule.startsWith('#') ? rule : null; }).filter(Boolean); // Filter out invalid rules rules = rules.filter(function(rule) { + if (whitelist.indexOf(rule) !== -1) { + invalid.push(rule); + return false; + } + if (ip.isV4Format(rule)) { ipv4.push(rule); return true; From c9f285a883104cb87802fae8c5d321dea8154680 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Fri, 18 Mar 2016 13:46:58 -0400 Subject: [PATCH 171/319] bumped up version Conflicts: package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fb4e717bf0..594892df75 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.0.0", + "version": "1.0.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From b9b8f2320fe0ea7d28d6292252fc775180e2292e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 19 Mar 2016 10:36:39 +0200 Subject: [PATCH 172/319] up composer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 594892df75..997e4c7399 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "mongodb": "~2.1.3", "morgan": "^1.3.2", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.10", + "nodebb-plugin-composer-default": "3.0.11", "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", From e556ae93ea04ecd77c0b03c583d54a68c9c7511f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 19 Mar 2016 10:47:05 +0200 Subject: [PATCH 173/319] up mentions --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 997e4c7399..75fb36119c 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "nodebb-plugin-dbsearch": "1.0.0", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", - "nodebb-plugin-mentions": "1.0.18", + "nodebb-plugin-mentions": "1.0.19", "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.5", "nodebb-rewards-essentials": "0.0.8", From 3d0012d7301caf45913010992de29e1834124a0a Mon Sep 17 00:00:00 2001 From: boomzillawtf Date: Sun, 20 Mar 2016 14:48:55 -0400 Subject: [PATCH 174/319] Loads posts if appropriate, but doesn't scroll to new post according to the scroll to my post setting. Addresses #4412. --- public/src/client/topic/posts.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index f534aefad5..dbe2eddf16 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -33,12 +33,10 @@ define('forum/topic/posts', [ ajaxify.data.postcount ++; postTools.updatePostCount(ajaxify.data.postcount); - if (ajaxify.data.scrollToMyPost) { - if (config.usePagination) { - onNewPostPagination(data); - } else { - onNewPostInfiniteScroll(data); - } + if (config.usePagination) { + onNewPostPagination(data); + } else { + onNewPostInfiniteScroll(data); } }; @@ -52,7 +50,9 @@ define('forum/topic/posts', [ function onNewPostPagination(data) { function scrollToPost() { - scrollToPostIfSelf(data.posts[0]); + if (config.scrollToMyPost) { + scrollToPostIfSelf(data.posts[0]); + } } var posts = data.posts; @@ -64,7 +64,7 @@ define('forum/topic/posts', [ if (isPostVisible) { createNewPosts(data, components.get('post').not('[data-index=0]'), direction, scrollToPost); - } else if (parseInt(posts[0].uid, 10) === parseInt(app.user.uid, 10)) { + } else if (config.scrollToMyPost && parseInt(posts[0].uid, 10) === parseInt(app.user.uid, 10)) { pagination.loadPage(ajaxify.data.pagination.pageCount, scrollToPost); } } @@ -81,6 +81,9 @@ define('forum/topic/posts', [ } function scrollToPostIfSelf(post) { + if (!config.scrollToMyPost) { + return; + } var isSelfPost = parseInt(post.uid, 10) === parseInt(app.user.uid, 10); if (isSelfPost) { navigator.scrollBottom(post.index); From d6549785080a2874c17de5cfc02db063e2b25b5c Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sun, 20 Mar 2016 15:07:11 -0500 Subject: [PATCH 175/319] show the crossed-out eye icon for users who want their email private for staff, not just the user --- src/controllers/accounts/helpers.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index 0a35315854..1cb7bb3c77 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -64,12 +64,14 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { userData.lastonlineISO = utils.toISOString(userData.lastonline || userData.joindate); userData.age = Math.max(0, userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : 0); + userData.emailClass = 'hide'; + if (!(isAdmin || isGlobalModerator || self || (userData.email && userSettings.showemail))) { userData.email = ''; + } else if (!userSettings.showemail) { + userData.emailClass = ''; } - userData.emailClass = (self && !userSettings.showemail) ? '' : 'hide'; - if (!isAdmin && !isGlobalModerator && !self && !userSettings.showfullname) { userData.fullname = ''; } @@ -172,4 +174,4 @@ function filterLinks(links, self) { }); } -module.exports = helpers; \ No newline at end of file +module.exports = helpers; From 3c607f2612d66000ae993c60d3f97df63f4d715e Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sun, 20 Mar 2016 15:11:32 -0500 Subject: [PATCH 176/319] fix two crashes --- src/controllers/helpers.js | 4 ++-- src/middleware/render.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 94dfe022c2..3962e2036b 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -41,7 +41,7 @@ helpers.redirect = function(res, url) { if (res.locals.isAPI) { res.status(308).json(url); } else { - res.redirect(nconf.get('relative_path') + url); + res.redirect(nconf.get('relative_path') + encodeURI(url)); } }; @@ -109,4 +109,4 @@ helpers.buildTitle = function(pageTitle) { return title; }; -module.exports = helpers; \ No newline at end of file +module.exports = helpers; diff --git a/src/middleware/render.js b/src/middleware/render.js index 2a9d0ba5d2..79911f71bd 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -13,7 +13,7 @@ module.exports = function(middleware) { req = this.req, defaultFn = function(err, str){ if (err) { - return req.next(err); + return next(err); } self.send(str); @@ -96,4 +96,4 @@ module.exports = function(middleware) { return parts.join(' '); } -}; \ No newline at end of file +}; From bb88c82ffd08c14133be349e085706e80a2d2ed6 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sun, 20 Mar 2016 15:59:38 -0500 Subject: [PATCH 177/319] fix post tools not showing up for other users on new posts (src/topics/posts.js has this condition already) --- public/src/client/topic/posts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index f534aefad5..d479196c24 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -26,7 +26,7 @@ define('forum/topic/posts', [ post.selfPost = !!app.user.uid && parseInt(post.uid, 10) === parseInt(app.user.uid, 10); post.display_moderator_tools = post.selfPost || ajaxify.data.privileges.isAdminOrMod; post.display_move_tools = ajaxify.data.privileges.isAdminOrMod; - post.display_post_menu = post.selfPost || ajaxify.data.privileges.isAdminOrMod; + post.display_post_menu = post.selfPost || ajaxify.data.privileges.isAdminOrMod || !post.deleted; }); updatePostCounts(data.posts); @@ -262,4 +262,4 @@ define('forum/topic/posts', [ return Posts; -}); \ No newline at end of file +}); From 44431f8410ed6233fc82be5f76b1140d6330a22e Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Sun, 20 Mar 2016 16:26:13 -0500 Subject: [PATCH 178/319] fix notifications that contain topic titles with commas in them --- src/notifications.js | 7 +++++-- src/socket.io/helpers.js | 13 ++++++++++--- src/socket.io/posts/flag.js | 8 ++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index af88fd7b5b..f32ca031d3 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -450,10 +450,13 @@ var async = require('async'), }); var numUsers = usernames.length; + var title = S(notifications[modifyIndex].topicTitle).decodeHTMLEntities().s; + var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); + if (numUsers === 2) { - notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + ', ' + notifications[modifyIndex].topicTitle + ']]'; + notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + ', ' + titleEscaped + ']]'; } else if (numUsers > 2) { - notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers-1) + ', ' + notifications[modifyIndex].topicTitle + ']]'; + notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers-1) + ', ' + titleEscaped + ']]'; } break; diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 3aeaaf0bf3..5524faf156 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -2,6 +2,7 @@ var async = require('async'); var winston = require('winston'); +var S = require('string'); var nconf = require('nconf'); var websockets = require('./index'); @@ -62,8 +63,11 @@ SocketHelpers.sendNotificationToPostOwner = function(pid, fromuid, notification) return; } + var title = S(results.topicTitle).decodeHTMLEntities().s; + var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); + notifications.create({ - bodyShort: '[[' + notification + ', ' + results.username + ', ' + results.topicTitle + ']]', + bodyShort: '[[' + notification + ', ' + results.username + ', ' + titleEscaped + ']]', bodyLong: results.postObj.content, pid: pid, nid: 'post:' + pid + ':uid:' + fromuid, @@ -93,8 +97,11 @@ SocketHelpers.sendNotificationToTopicOwner = function(tid, fromuid, notification return; } + var title = S(results.topicData.title).decodeHTMLEntities().s; + var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); + notifications.create({ - bodyShort: '[[' + notification + ', ' + results.username + ', ' + results.topicData.title + ']]', + bodyShort: '[[' + notification + ', ' + results.username + ', ' + titleEscaped + ']]', path: nconf.get('relative_path') + '/topic/' + results.topicData.slug, nid: 'tid:' + tid + ':uid:' + fromuid, from: fromuid @@ -111,4 +118,4 @@ SocketHelpers.emitToTopicAndCategory = function(event, data) { websockets.in('category_' + data.cid).emit(event, data); }; -module.exports = SocketHelpers; \ No newline at end of file +module.exports = SocketHelpers; diff --git a/src/socket.io/posts/flag.js b/src/socket.io/posts/flag.js index eaefcea1e2..bbf7a4721c 100644 --- a/src/socket.io/posts/flag.js +++ b/src/socket.io/posts/flag.js @@ -1,6 +1,7 @@ 'use strict'; var async = require('async'); +var S = require('string'); var user = require('../../user'); var groups = require('../../groups'); @@ -82,8 +83,11 @@ module.exports = function(SocketPosts) { }, next); }, function (results, next) { + var title = S(post.topic.title).decodeHTMLEntities().s; + var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ','); + notifications.create({ - bodyShort: '[[notifications:user_flagged_post_in, ' + flaggingUser.username + ', ' + post.topic.title + ']]', + bodyShort: '[[notifications:user_flagged_post_in, ' + flaggingUser.username + ', ' + titleEscaped + ']]', bodyLong: post.content, pid: data.pid, nid: 'post_flag:' + data.pid + ':uid:' + socket.uid, @@ -163,4 +167,4 @@ module.exports = function(SocketPosts) { }, ], callback); }; -}; \ No newline at end of file +}; From 497592965f64996e902c7dd35f513b79fd2abe66 Mon Sep 17 00:00:00 2001 From: pichalite Date: Sun, 20 Mar 2016 22:09:10 +0000 Subject: [PATCH 179/319] fixes issue-4386 --- public/src/admin/manage/group.js | 2 +- src/views/admin/manage/group.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index 58c5017540..5cc5eb2048 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -98,7 +98,7 @@ define('admin/manage/group', [ templates.parse('partials/groups/memberlist', 'members', {group: {isOwner: ajaxify.data.group.isOwner, members: [member]}}, function(html) { translator.translate(html, function(html) { - $('[component="groups/members"] tr').first().before(html); + $('[component="groups/members"]').prepend(html); }); }); }); diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index f579065df5..a50fdba51b 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -63,7 +63,7 @@
    diff --git a/src/views/admin/partials/categories/category-rows.tpl b/src/views/admin/partials/categories/category-rows.tpl index a48ec5a327..13e902fb99 100644 --- a/src/views/admin/partials/categories/category-rows.tpl +++ b/src/views/admin/partials/categories/category-rows.tpl @@ -19,6 +19,7 @@ + Edit From 87bd0c69d7733ecd7d03f7f3d7c1c36f25266a62 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Fri, 25 Mar 2016 16:56:05 -0400 Subject: [PATCH 263/319] Latest translations and fallbacks --- public/language/bg/error.json | 4 ++-- public/language/bg/groups.json | 2 +- public/language/bg/modules.json | 2 +- public/language/bg/user.json | 4 ++-- public/language/de/error.json | 6 +++--- public/language/de/groups.json | 2 +- public/language/de/modules.json | 2 +- public/language/de/user.json | 4 ++-- public/language/es/error.json | 6 +++--- public/language/es/modules.json | 2 +- public/language/es/notifications.json | 8 ++++---- public/language/es/pages.json | 8 ++++---- public/language/pt_BR/error.json | 4 ++-- public/language/pt_BR/groups.json | 2 +- public/language/pt_BR/modules.json | 2 +- public/language/pt_BR/user.json | 4 ++-- public/language/tr/error.json | 4 ++-- public/language/tr/groups.json | 2 +- public/language/tr/modules.json | 2 +- public/language/tr/notifications.json | 2 +- public/language/tr/user.json | 6 +++--- 21 files changed, 39 insertions(+), 39 deletions(-) diff --git a/public/language/bg/error.json b/public/language/bg/error.json index e7f49c6baf..0eaeb842d2 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -27,7 +27,7 @@ "password-too-long": "Паролата е твърде дълга", "user-banned": "Потребителят е блокиран", "user-too-new": "Съжаляваме, но трябва да изчакате поне %1 секунда/и, преди да направите първата си публикация", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Съжаляваме, но Вашият IP адрес е забранен за ползване в тази общност. Ако смятате, че това е грешка, моля, свържете се с администратор.", "no-category": "Категорията не съществува", "no-topic": "Темата не съществува", "no-post": "Публикацията не съществува", @@ -99,5 +99,5 @@ "no-session-found": "Не е открита сесия за вход!", "not-in-room": "Потребителят не е в стаята", "no-users-in-room": "Няма потребители в тази стая", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Не можете да изритате себе си от групата" } \ No newline at end of file diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index 48df626a17..f5ab2262ce 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Скрита", "details.hidden_help": "Ако е включено, тази група няма да бъде извеждана в списъка от групи и потребителите ще трябва да бъдат поканени лично", "details.delete_group": "Изтриване на групата", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Частните групи са забранени на системно ниво; тази възможност не върши нищо", "event.updated": "Подробностите за групата бяха обновени", "event.deleted": "Групата „%1“ беше изтрита", "membership.accept-invitation": "Приемане на поканата", diff --git a/public/language/bg/modules.json b/public/language/bg/modules.json index 1be800b077..f3afdaaa4a 100644 --- a/public/language/bg/modules.json +++ b/public/language/bg/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 пише...", "chat.user_has_messaged_you": "%1 Ви написа съобщение.", "chat.see_all": "Вижте всички разговори", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Отбелязване на всички разговори като прочетени", "chat.no-messages": "Моля, изберете получател, за да видите историята на съобщенията", "chat.no-users-in-room": "Няма потребители в тази стая", "chat.recent-chats": "Скорошни разговори", diff --git a/public/language/bg/user.json b/public/language/bg/user.json index ed8eab5261..6e16e70603 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -39,7 +39,7 @@ "change_username": "Промяна на потребителското име", "change_email": "Промяна на е-пощата", "edit": "Редактиране", - "edit-profile": "Edit Profile", + "edit-profile": "Редактиране на профила", "default_picture": "Иконка по подразбиране", "uploaded_picture": "Качена снимка", "upload_new_picture": "Качване на нова снимка", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Отваряне на външните връзки в нов подпрозорец", "enable_topic_searching": "Включване на търсенето в темите", "topic_search_help": "Ако е включено, търсенето в темата ще замени стандартното поведение на браузъра при търсене в страницата и ще Ви позволи да претърсвате цялата тема, а не само това, което се вижда на екрана", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "След публикуване на отговор, да се показва новата публикация", "follow_topics_you_reply_to": "Следване на темите, на които отговаряте", "follow_topics_you_create": "Следване на темите, които създавате", "grouptitle": "Изберете заглавието на групата, което искате да се показва", diff --git a/public/language/de/error.json b/public/language/de/error.json index 6c4af25efe..40615e0e2e 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -27,7 +27,7 @@ "password-too-long": "Passwort ist zu lang", "user-banned": "Benutzer ist gesperrt", "user-too-new": "Entschuldigung, du musst %1 Sekunde(n) warten, bevor du deinen ersten Beitrag schreiben kannst.", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Deine IP-Adresse ist für diese Plattform gesperrt. Sollte dies ein Irrtum sein, dann kontaktiere bitte einen Administrator.", "no-category": "Die Kategorie existiert nicht", "no-topic": "Das Thema existiert nicht", "no-post": "Der Beitrag existiert nicht", @@ -97,7 +97,7 @@ "wrong-login-type-username": "Bitte nutze deinen Benutzernamen zum einloggen", "invite-maximum-met": "Du hast bereits die maximale Anzahl an Personen eingeladen (%1 von %2).", "no-session-found": "Keine Login-Sitzung gefunden!", - "not-in-room": "Benutzer nicht in Raum", + "not-in-room": "Benutzer nicht im Raum", "no-users-in-room": "In diesem Raum befinden sich keine Benutzer.", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Du kannst dich nicht selber aus der Gruppe entfernen." } \ No newline at end of file diff --git a/public/language/de/groups.json b/public/language/de/groups.json index d2d12b2813..5d328ac70d 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Versteckt", "details.hidden_help": "Wenn aktiviert, wird diese Gruppe in der Gruppenliste nicht zu finden sein, und Benutzer werden manuell eingeladen werden müssen.", "details.delete_group": "Gruppe löschen", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Private Gruppen wurden systemweit deaktiviert. Diese Einstellung hat keine Funktion.", "event.updated": "Gruppendetails wurden aktualisiert", "event.deleted": "Die Gruppe \"%1\" wurde gelöscht.", "membership.accept-invitation": "Einladung akzeptieren", diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 6640d8d546..2210c035fd 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 tippt gerade ...", "chat.user_has_messaged_you": "%1 hat dir geschrieben.", "chat.see_all": "Alle Chats anzeigen", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Alle als gelesen markieren", "chat.no-messages": "Bitte wähle einen Empfänger, um den jeweiligen Nachrichtenverlauf anzuzeigen.", "chat.no-users-in-room": "In diesem Raum befinden sich keine Benutzer.", "chat.recent-chats": "Aktuelle Chats", diff --git a/public/language/de/user.json b/public/language/de/user.json index 9af4a45399..addf47ab8f 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -39,7 +39,7 @@ "change_username": "Benutzernamen ändern", "change_email": "E-Mail ändern", "edit": "Ändern", - "edit-profile": "Edit Profile", + "edit-profile": "Profil ändern", "default_picture": "Standardsymbol", "uploaded_picture": "Hochgeladene Bilder", "upload_new_picture": "Neues Bild hochladen", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Ausgehende Links in neuem Tab öffnen", "enable_topic_searching": "Suchen innerhalb von Themen aktivieren", "topic_search_help": "Wenn aktiviert, ersetzt die im-Thema-Suche die Standardsuche des Browsers. Dadurch kannst du im ganzen Thema suchen, nicht nur im sichtbaren Abschnitt.", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Zeige eigene Antwort nach dem Erstellen im Thema an", "follow_topics_you_reply_to": "Themen folgen, in denen auf dich geantwortet wird", "follow_topics_you_create": "Themen folgen, die du erstellst", "grouptitle": "Wähle den anzuzeigenden Gruppen Titel aus", diff --git a/public/language/es/error.json b/public/language/es/error.json index 14620522d4..44a95c2cd6 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -27,7 +27,7 @@ "password-too-long": "Contraseña muy corta", "user-banned": "Usuario baneado", "user-too-new": "Lo sentimos, es necesario que esperes %1 segundo(s) antes poder hacer tu primera publicación", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Lo sentimos, tu dirección IP ha sido baneada de esta comunidad. Si crees que debe de haber un error, por favor contacte con un administrador.", "no-category": "La categoría no existe", "no-topic": "El tema no existe", "no-post": "La publicación no existe", @@ -51,8 +51,8 @@ "still-uploading": "Por favor, espera a que terminen las subidas.", "file-too-big": "El tamaño de fichero máximo es de %1 kB - por favor, suba un fichero más pequeño", "guest-upload-disabled": "Las subidas están deshabilitadas para los invitados", - "already-favourited": "You have already bookmarked this post", - "already-unfavourited": "You have already unbookmarked this post", + "already-favourited": "Ya habías guardado este post.", + "already-unfavourited": "Ya habías desguardado este post.", "cant-ban-other-admins": "¡No puedes expulsar a otros administradores!", "cant-remove-last-admin": "Tu eres el unico administrador. Añade otro usuario como administrador antes de eliminarte a ti mismo.", "invalid-image-type": "Tipo de imagen inválido. Los tipos permitidos son: %1", diff --git a/public/language/es/modules.json b/public/language/es/modules.json index 41d57a8fa9..f0e34b04a1 100644 --- a/public/language/es/modules.json +++ b/public/language/es/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 está escribiendo...", "chat.user_has_messaged_you": "%1 te ha enviado un mensaje.", "chat.see_all": "Ver todos los chats", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Marcar todos los chats como leídos", "chat.no-messages": "Por favor, selecciona un contacto para ver el historial de mensajes", "chat.no-users-in-room": "No hay usuarios en esta sala", "chat.recent-chats": "Chats recientes", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 78dae1fc51..1effb38fee 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -16,9 +16,9 @@ "upvoted_your_post_in_multiple": "%1 y otras %2 personas han votado positivamente tu respuesta en %3.", "moved_your_post": "%1 su tema ha sido movido a %2", "moved_your_topic": "%1 se ha movido %2", - "favourited_your_post_in": "%1 has bookmarked your post in %2.", - "favourited_your_post_in_dual": "%1 and %2 have bookmarked your post in %3.", - "favourited_your_post_in_multiple": "%1 and %2 others have bookmarked your post in %3.", + "favourited_your_post_in": "%1 se ha guardado su post en %2.", + "favourited_your_post_in_dual": "%1 y %2 se han guardado su post en %3.", + "favourited_your_post_in_multiple": "%1 y otros %2 usuarios se han guardado su post en %3.", "user_flagged_post_in": "%1 ha reportado una respuesta en %2", "user_flagged_post_in_dual": "%1 y %2 han reportado un post en %3", "user_flagged_post_in_multiple": "%1 y otras %2 personas han reportado un post en %3", @@ -30,7 +30,7 @@ "user_started_following_you_dual": "%1 y %2 comenzaron a seguirte.", "user_started_following_you_multiple": "%1 y otras %2 personas comenzaron a seguirte.", "new_register": "%1 envió una solicitud de registro.", - "new_register_multiple": "There are %1 registration requests awaiting review.", + "new_register_multiple": "Hay %1 peticiones de registros pendientes de revisión", "email-confirmed": "Correo electrónico confirmado", "email-confirmed-message": "Gracias por validar tu correo electrónico. Tu cuenta ya está completamente activa.", "email-confirm-error-message": "Hubo un problema al validar tu cuenta de correo electrónico. Quizá el código era erróneo o expiró...", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index b151e4cb21..4a79f28222 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -6,12 +6,12 @@ "popular-month": "Temas populares del mes", "popular-alltime": "Temas populares de siempre", "recent": "Temas recientes", - "flagged-posts": "Flagged Posts", + "flagged-posts": "Posts reportados", "users/online": "Conectados", "users/latest": "Últimos usuarios", "users/sort-posts": "Top por mensajes", "users/sort-reputation": "Más reputados", - "users/banned": "Banned Users", + "users/banned": "Usuarios baneados", "users/search": "Buscar", "notifications": "Notificaciones", "tags": "Etiquetas", @@ -33,13 +33,13 @@ "account/posts": "Publicados por %1", "account/topics": "Temas creados por %1", "account/groups": "Grupos de %1", - "account/favourites": "%1's Bookmarked Posts", + "account/favourites": "Publicaciones favoritas de %1 ", "account/settings": "Preferencias", "account/watched": "Temas seguidos por %1", "account/upvoted": "Publicaciones votadas positivamente %1", "account/downvoted": "Publicaciones votadas negativamente %1", "account/best": "Mejores publicaciones hechas por %1", - "confirm": "Email Confirmed", + "confirm": "Correo electrónico confirmado", "maintenance.text": "%1 está en mantenimiento actualmente. Por favor vuelva en otro momento.", "maintenance.messageIntro": "Además, la administración ha dejado este mensaje:", "throttled.text": "%1 no está disponible debido a una carga excesiva. Por favor vuelva en otro momento" diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index 0701d351c6..e681f5664f 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -27,7 +27,7 @@ "password-too-long": "A senha é muito grande", "user-banned": "Usuário banido", "user-too-new": "Desculpe, é necessário que você aguarde %1 segundo(s) antes de fazer o seu primeiro post.", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Desculpe, o seu endereço IP foi banido desta comunidade. Se você acha que isso é um engano, por favor contate um administrador.", "no-category": "A categoria não existe", "no-topic": "O tópico não existe", "no-post": "O post não existe", @@ -99,5 +99,5 @@ "no-session-found": "Nenhuma sessão de login encontrada!", "not-in-room": "O usuário não está na sala", "no-users-in-room": "Nenhum usuário nesta sala", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Você não pode kickar a si mesmo do grupo" } \ No newline at end of file diff --git a/public/language/pt_BR/groups.json b/public/language/pt_BR/groups.json index bf499dfd29..ed5727555f 100644 --- a/public/language/pt_BR/groups.json +++ b/public/language/pt_BR/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Oculto", "details.hidden_help": "Se habilitado, este grupo não se encontrará na listagem de grupos e os usuários terão de ser convivados manualmente", "details.delete_group": "Deletar Grupo", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Grupos particulares estão desabilitados em escala de sistema, esta opção não é válida", "event.updated": "Os detalhes do grupo foram atualizados", "event.deleted": "O grupo \"%1\" foi deletado", "membership.accept-invitation": "Aceitar Convite", diff --git a/public/language/pt_BR/modules.json b/public/language/pt_BR/modules.json index 08768bf900..597e750246 100644 --- a/public/language/pt_BR/modules.json +++ b/public/language/pt_BR/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 está digitando ...", "chat.user_has_messaged_you": "%1 te enviou uma mensagem.", "chat.see_all": "Ver todos os chats", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Marcar todas as conversas como lidas", "chat.no-messages": "Por favor, escolha um destinatário para visualizar o histórico de conversas", "chat.no-users-in-room": "Nenhum usuário nesta sala", "chat.recent-chats": "Conversas Recentes", diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index f087c1fa2f..21df201b80 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -39,7 +39,7 @@ "change_username": "Mudar nome de usuário", "change_email": "Mudar email", "edit": "Editar", - "edit-profile": "Edit Profile", + "edit-profile": "Editar Perfil", "default_picture": "Ícone Padrão", "uploaded_picture": "Foto Carregada", "upload_new_picture": "Carregar Nova Foto", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Abrir links externos em nova aba", "enable_topic_searching": "Habilitar Pesquisa dentro de Tópico", "topic_search_help": "Se habilitado, a pesquisa dentro do tópico irá substituir a pesquisa padrão do seu navegador. Assim, você poderá pesquisar pelo tópico inteiro, e não apenas pelo o que está sendo exibido na tela.", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Após postar uma réplica, mostre o novo post", "follow_topics_you_reply_to": "Seguir tópicos que você responde", "follow_topics_you_create": "Seguir tópicos que você cria", "grouptitle": "Escolha o título do grupo que você deseja exibir", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index d661f5a2df..bb03c66177 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -27,7 +27,7 @@ "password-too-long": "Parola çok uzun", "user-banned": "Kullanıcı Yasaklı", "user-too-new": "Özür dileriz, ilk iletinizi yapmadan önce %1 saniye beklemeniz gerekiyor", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Üzgünüz, IP adresiniz, bu toplulukta yasaklandı. Bunun bir hata olduğunu düşünüyorsanız, bir yönetici ile irtibata geçiniz.", "no-category": "Kategori Yok", "no-topic": "Başlık Yok", "no-post": "İleti Yok", @@ -99,5 +99,5 @@ "no-session-found": "Giriş yapılmış bir oturum bulunamadı!", "not-in-room": "Odada kullanıcı yok", "no-users-in-room": "Bu odada kullanıcı yok", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Kendinizi gruptan atamazsınız." } \ No newline at end of file diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 88512b5cb4..a67cd1b2cb 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Gizli", "details.hidden_help": "Bu grup eğer etkinse grup listelerinde bulunmaz, ve kullanıcılar bizzat davet eder", "details.delete_group": "Grubu Sil", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Özel gruplar sistem seviyesinde devre dışı bırakıldı. Bu seçenek hiçbir şeyi değiştirmeyecek.", "event.updated": "Grup detayları güncellenmiştir", "event.deleted": "\"%1\" grubu silinmiş", "membership.accept-invitation": "Daveti Kabul Et", diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index 3c02428014..b896b442a0 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 yazıyor ...", "chat.user_has_messaged_you": "%1 size bir mesaj gönderdi.", "chat.see_all": "Bütün sohbetleri gör", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Bütün sohbetleri okundu işaretle", "chat.no-messages": "Lütfen sohbet geçmişini görmek için bir kontak seçin", "chat.no-users-in-room": "Bu odada hiç kullanıcı yok", "chat.recent-chats": "Güncel Sohbetler", diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index eddd9194ea..c4e7a2276b 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -30,7 +30,7 @@ "user_started_following_you_dual": "%1 ve %2 seni takip etmeye başladı.\n", "user_started_following_you_multiple": "%1 ve %2 kişi daha seni takip etmeye başladı.", "new_register": "%1 kayıt olma isteği gönderdi.", - "new_register_multiple": "There are %1 registration requests awaiting review.", + "new_register_multiple": "Beklemede %1 kayıt olma isteği bulunmaktadır.", "email-confirmed": "E-posta onaylandı", "email-confirmed-message": "E-postanızı onaylandığınız için teşekkürler. Hesabınız tamamen aktive edildi.", "email-confirm-error-message": "E-posta adresinizi onaylarken bir hata oluştu. Kodunuz geçersiz ya da eski olabilir.", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 2229f9b6ce..1664a6ec81 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -39,7 +39,7 @@ "change_username": "Kullanıcı Adı Değiştir", "change_email": "Email Değiştir", "edit": "Düzenle", - "edit-profile": "Edit Profile", + "edit-profile": "Profil Düzenle", "default_picture": "Varsayılan İkon", "uploaded_picture": "Yüklenmiş Fotoğraflar", "upload_new_picture": "Yeni bir resim Yükle", @@ -56,7 +56,7 @@ "password": "Şifre", "username_taken_workaround": "İstediğiniz kullanıcı ismi zaten alınmış, bu yüzden biraz degiştirdik. Şimdiki kullanıcı isminiz %1", "password_same_as_username": "Parolanız kullanıcı adınız ile aynı, lütfen başka bir parola seçiniz.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_email": "Şifreniz mail adresiniz ile aynı lütfen başka bir şifre seçin.", "upload_picture": "Resim Yükle", "upload_a_picture": "Bir Resim Yükle", "remove_uploaded_picture": "Yüklenmiş fotoğrafı kaldır", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Dışarı giden bağlantıları yeni sekmede aç", "enable_topic_searching": "Konu içi aramayı aktive et", "topic_search_help": "Aktive edilirse, konu içi arama tarayıcının normal arama davranışını değiştirerek tüm konuyu aramanızı sağlar", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Cevap yazdıktan sonra yeni gönderiyi göster", "follow_topics_you_reply_to": "Cevap verdiğim konuları takip et", "follow_topics_you_create": "Kendi konularımı takip et", "grouptitle": "Göstermek istediğiniz gurup başlığını seçin", From c50f228accc3485fcee74e875b9316f8e65e9261 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Fri, 25 Mar 2016 17:59:12 -0500 Subject: [PATCH 264/319] when clicking the reply button, limit the selection to the post's content. --- public/src/client/topic/postTools.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 3fa13e22e6..37f5e5d9cf 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -199,13 +199,23 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator if (!proceed) { var selectionText = ''; var selection = window.getSelection ? window.getSelection() : document.selection.createRange(); - var selectionNode = $(selection.baseNode || selection.anchorNode); - - if (selectionNode.parents('[component="post/content"]').length > 0) { - selectionText = selection.toString(); + var content = button.parents('[component="post"]').find('[component="post/content"]').get(0); + + if (selection.containsNode(content, true)) { + var bounds = document.createRange(); + bounds.selectNodeContents(content); + var range = selection.getRangeAt(0).cloneRange(); + if (range.compareBoundaryPoints(Range.START_TO_START, bounds) < 0) { + range.setStart(bounds.startContainer, bounds.startOffset); + } + if (range.compareBoundaryPoints(Range.END_TO_END, bounds) > 0) { + range.setEnd(bounds.endContainer, bounds.endOffset); + } + bounds.detach(); + selectionText = range.toString(); + range.detach(); } - button = selectionText ? selectionNode : button; var username = getUserName(button); if (getData(button, 'data-uid') === '0' || !getData(button, 'data-userslug')) { username = ''; From 395e71feee34b5049cfa5cba657647dbeec9ae3a Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Fri, 25 Mar 2016 18:17:19 -0500 Subject: [PATCH 265/319] fix topic reply button --- public/src/client/topic/postTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 37f5e5d9cf..d1961a29a6 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -201,7 +201,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator var selection = window.getSelection ? window.getSelection() : document.selection.createRange(); var content = button.parents('[component="post"]').find('[component="post/content"]').get(0); - if (selection.containsNode(content, true)) { + if (content && selection.containsNode(content, true)) { var bounds = document.createRange(); bounds.selectNodeContents(content); var range = selection.getRangeAt(0).cloneRange(); From 97e440f990c30842d53647fe30ba838f47f2ca76 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 25 Mar 2016 19:40:06 -0400 Subject: [PATCH 266/319] Upped theme versions, closes #4464 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d9771ca51e..ef3d95c520 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.111", - "nodebb-theme-vanilla": "5.0.58", + "nodebb-theme-persona": "4.0.112", + "nodebb-theme-vanilla": "5.0.59", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", From 8013f124da19d614acc08c7dd854e34dc4357326 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 25 Mar 2016 19:54:22 -0400 Subject: [PATCH 267/319] fixes #4471 --- .../textcomplete/jquery.textcomplete.css | 33 - .../textcomplete/jquery.textcomplete.js | 1381 +++++++++++++++++ .../textcomplete/jquery.textcomplete.min.js | 1 - src/meta/css.js | 1 - src/meta/js.js | 2 +- 5 files changed, 1382 insertions(+), 36 deletions(-) delete mode 100644 public/vendor/jquery/textcomplete/jquery.textcomplete.css create mode 100644 public/vendor/jquery/textcomplete/jquery.textcomplete.js delete mode 100644 public/vendor/jquery/textcomplete/jquery.textcomplete.min.js diff --git a/public/vendor/jquery/textcomplete/jquery.textcomplete.css b/public/vendor/jquery/textcomplete/jquery.textcomplete.css deleted file mode 100644 index d33f066c5a..0000000000 --- a/public/vendor/jquery/textcomplete/jquery.textcomplete.css +++ /dev/null @@ -1,33 +0,0 @@ -/* Sample */ - -/*.dropdown-menu { - border: 1px solid #ddd; - background-color: white; -} - -.dropdown-menu li { - border-top: 1px solid #ddd; - padding: 2px 5px; -} - -.dropdown-menu li:first-child { - border-top: none; -} - -.dropdown-menu li:hover, -.dropdown-menu .active { - background-color: rgb(110, 183, 219); -}*/ - - -/* SHOULD not modify */ - -/*.dropdown-menu { - list-style: none; - padding: 0; - margin: 0; -} - -.dropdown-menu a:hover { - cursor: pointer; -}*/ \ No newline at end of file diff --git a/public/vendor/jquery/textcomplete/jquery.textcomplete.js b/public/vendor/jquery/textcomplete/jquery.textcomplete.js new file mode 100644 index 0000000000..ad1d508450 --- /dev/null +++ b/public/vendor/jquery/textcomplete/jquery.textcomplete.js @@ -0,0 +1,1381 @@ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === "object" && module.exports) { + var $ = require('jquery'); + module.exports = factory($); + } else { + // Browser globals + factory(jQuery); + } +}(function (jQuery) { + +/*! + * jQuery.textcomplete + * + * Repository: https://github.com/yuku-t/jquery-textcomplete + * License: MIT (https://github.com/yuku-t/jquery-textcomplete/blob/master/LICENSE) + * Author: Yuku Takahashi + * Version: 1.3.1 + */ + +if (typeof jQuery === 'undefined') { + throw new Error('jQuery.textcomplete requires jQuery'); +} + ++function ($) { + 'use strict'; + + var warn = function (message) { + if (console.warn) { console.warn(message); } + }; + + var id = 1; + + $.fn.textcomplete = function (strategies, option) { + var args = Array.prototype.slice.call(arguments); + return this.each(function () { + var self = this; + var $this = $(this); + var completer = $this.data('textComplete'); + if (!completer) { + option || (option = {}); + option._oid = id++; // unique object id + completer = new $.fn.textcomplete.Completer(this, option); + $this.data('textComplete', completer); + } + if (typeof strategies === 'string') { + if (!completer) return; + args.shift() + completer[strategies].apply(completer, args); + if (strategies === 'destroy') { + $this.removeData('textComplete'); + } + } else { + // For backward compatibility. + // TODO: Remove at v0.4 + $.each(strategies, function (obj) { + $.each(['header', 'footer', 'placement', 'maxCount'], function (name) { + if (obj[name]) { + completer.option[name] = obj[name]; + warn(name + 'as a strategy param is deprecated. Use option.'); + delete obj[name]; + } + }); + }); + completer.register($.fn.textcomplete.Strategy.parse(strategies, { + el: self, + $el: $this + })); + } + }); + }; + +}(jQuery); + ++function ($) { + 'use strict'; + + // Exclusive execution control utility. + // + // func - The function to be locked. It is executed with a function named + // `free` as the first argument. Once it is called, additional + // execution are ignored until the free is invoked. Then the last + // ignored execution will be replayed immediately. + // + // Examples + // + // var lockedFunc = lock(function (free) { + // setTimeout(function { free(); }, 1000); // It will be free in 1 sec. + // console.log('Hello, world'); + // }); + // lockedFunc(); // => 'Hello, world' + // lockedFunc(); // none + // lockedFunc(); // none + // // 1 sec past then + // // => 'Hello, world' + // lockedFunc(); // => 'Hello, world' + // lockedFunc(); // none + // + // Returns a wrapped function. + var lock = function (func) { + var locked, queuedArgsToReplay; + + return function () { + // Convert arguments into a real array. + var args = Array.prototype.slice.call(arguments); + if (locked) { + // Keep a copy of this argument list to replay later. + // OK to overwrite a previous value because we only replay + // the last one. + queuedArgsToReplay = args; + return; + } + locked = true; + var self = this; + args.unshift(function replayOrFree() { + if (queuedArgsToReplay) { + // Other request(s) arrived while we were locked. + // Now that the lock is becoming available, replay + // the latest such request, then call back here to + // unlock (or replay another request that arrived + // while this one was in flight). + var replayArgs = queuedArgsToReplay; + queuedArgsToReplay = undefined; + replayArgs.unshift(replayOrFree); + func.apply(self, replayArgs); + } else { + locked = false; + } + }); + func.apply(this, args); + }; + }; + + var isString = function (obj) { + return Object.prototype.toString.call(obj) === '[object String]'; + }; + + var isFunction = function (obj) { + return Object.prototype.toString.call(obj) === '[object Function]'; + }; + + var uniqueId = 0; + + function Completer(element, option) { + this.$el = $(element); + this.id = 'textcomplete' + uniqueId++; + this.strategies = []; + this.views = []; + this.option = $.extend({}, Completer._getDefaults(), option); + + if (!this.$el.is('input[type=text]') && !this.$el.is('input[type=search]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') { + throw new Error('textcomplete must be called on a Textarea or a ContentEditable.'); + } + + if (element === document.activeElement) { + // element has already been focused. Initialize view objects immediately. + this.initialize() + } else { + // Initialize view objects lazily. + var self = this; + this.$el.one('focus.' + this.id, function () { self.initialize(); }); + } + } + + Completer._getDefaults = function () { + if (!Completer.DEFAULTS) { + Completer.DEFAULTS = { + appendTo: $('body'), + zIndex: '100' + }; + } + + return Completer.DEFAULTS; + } + + $.extend(Completer.prototype, { + // Public properties + // ----------------- + + id: null, + option: null, + strategies: null, + adapter: null, + dropdown: null, + $el: null, + + // Public methods + // -------------- + + initialize: function () { + var element = this.$el.get(0); + // Initialize view objects. + this.dropdown = new $.fn.textcomplete.Dropdown(element, this, this.option); + var Adapter, viewName; + if (this.option.adapter) { + Adapter = this.option.adapter; + } else { + if (this.$el.is('textarea') || this.$el.is('input[type=text]') || this.$el.is('input[type=search]')) { + viewName = typeof element.selectionEnd === 'number' ? 'Textarea' : 'IETextarea'; + } else { + viewName = 'ContentEditable'; + } + Adapter = $.fn.textcomplete[viewName]; + } + this.adapter = new Adapter(element, this, this.option); + }, + + destroy: function () { + this.$el.off('.' + this.id); + if (this.adapter) { + this.adapter.destroy(); + } + if (this.dropdown) { + this.dropdown.destroy(); + } + this.$el = this.adapter = this.dropdown = null; + }, + + deactivate: function () { + if (this.dropdown) { + this.dropdown.deactivate(); + } + }, + + // Invoke textcomplete. + trigger: function (text, skipUnchangedTerm) { + if (!this.dropdown) { this.initialize(); } + text != null || (text = this.adapter.getTextFromHeadToCaret()); + var searchQuery = this._extractSearchQuery(text); + if (searchQuery.length) { + var term = searchQuery[1]; + // Ignore shift-key, ctrl-key and so on. + if (skipUnchangedTerm && this._term === term && term !== "") { return; } + this._term = term; + this._search.apply(this, searchQuery); + } else { + this._term = null; + this.dropdown.deactivate(); + } + }, + + fire: function (eventName) { + var args = Array.prototype.slice.call(arguments, 1); + this.$el.trigger(eventName, args); + return this; + }, + + register: function (strategies) { + Array.prototype.push.apply(this.strategies, strategies); + }, + + // Insert the value into adapter view. It is called when the dropdown is clicked + // or selected. + // + // value - The selected element of the array callbacked from search func. + // strategy - The Strategy object. + // e - Click or keydown event object. + select: function (value, strategy, e) { + this._term = null; + this.adapter.select(value, strategy, e); + this.fire('change').fire('textComplete:select', value, strategy); + this.adapter.focus(); + }, + + // Private properties + // ------------------ + + _clearAtNext: true, + _term: null, + + // Private methods + // --------------- + + // Parse the given text and extract the first matching strategy. + // + // Returns an array including the strategy, the query term and the match + // object if the text matches an strategy; otherwise returns an empty array. + _extractSearchQuery: function (text) { + for (var i = 0; i < this.strategies.length; i++) { + var strategy = this.strategies[i]; + var context = strategy.context(text); + if (context || context === '') { + var matchRegexp = isFunction(strategy.match) ? strategy.match(text) : strategy.match; + if (isString(context)) { text = context; } + var match = text.match(matchRegexp); + if (match) { return [strategy, match[strategy.index], match]; } + } + } + return [] + }, + + // Call the search method of selected strategy.. + _search: lock(function (free, strategy, term, match) { + var self = this; + strategy.search(term, function (data, stillSearching) { + if (!self.dropdown.shown) { + self.dropdown.activate(); + } + if (self._clearAtNext) { + // The first callback in the current lock. + self.dropdown.clear(); + self._clearAtNext = false; + } + self.dropdown.setPosition(self.adapter.getCaretPosition()); + self.dropdown.render(self._zip(data, strategy, term)); + if (!stillSearching) { + // The last callback in the current lock. + free(); + self._clearAtNext = true; // Call dropdown.clear at the next time. + } + }, match); + }), + + // Build a parameter for Dropdown#render. + // + // Examples + // + // this._zip(['a', 'b'], 's'); + // //=> [{ value: 'a', strategy: 's' }, { value: 'b', strategy: 's' }] + _zip: function (data, strategy, term) { + return $.map(data, function (value) { + return { value: value, strategy: strategy, term: term }; + }); + } + }); + + $.fn.textcomplete.Completer = Completer; +}(jQuery); + ++function ($) { + 'use strict'; + + var $window = $(window); + + var include = function (zippedData, datum) { + var i, elem; + var idProperty = datum.strategy.idProperty + for (i = 0; i < zippedData.length; i++) { + elem = zippedData[i]; + if (elem.strategy !== datum.strategy) continue; + if (idProperty) { + if (elem.value[idProperty] === datum.value[idProperty]) return true; + } else { + if (elem.value === datum.value) return true; + } + } + return false; + }; + + var dropdownViews = {}; + $(document).on('click', function (e) { + var id = e.originalEvent && e.originalEvent.keepTextCompleteDropdown; + $.each(dropdownViews, function (key, view) { + if (key !== id) { view.deactivate(); } + }); + }); + + var commands = { + SKIP_DEFAULT: 0, + KEY_UP: 1, + KEY_DOWN: 2, + KEY_ENTER: 3, + KEY_PAGEUP: 4, + KEY_PAGEDOWN: 5, + KEY_ESCAPE: 6 + }; + + // Dropdown view + // ============= + + // Construct Dropdown object. + // + // element - Textarea or contenteditable element. + function Dropdown(element, completer, option) { + this.$el = Dropdown.createElement(option); + this.completer = completer; + this.id = completer.id + 'dropdown'; + this._data = []; // zipped data. + this.$inputEl = $(element); + this.option = option; + + // Override setPosition method. + if (option.listPosition) { this.setPosition = option.listPosition; } + if (option.height) { this.$el.height(option.height); } + var self = this; + $.each(['maxCount', 'placement', 'footer', 'header', 'noResultsMessage', 'className'], function (_i, name) { + if (option[name] != null) { self[name] = option[name]; } + }); + this._bindEvents(element); + dropdownViews[this.id] = this; + } + + $.extend(Dropdown, { + // Class methods + // ------------- + + createElement: function (option) { + var $parent = option.appendTo; + if (!($parent instanceof $)) { $parent = $($parent); } + var $el = $('
      ') + .addClass('dropdown-menu textcomplete-dropdown') + .attr('id', 'textcomplete-dropdown-' + option._oid) + .css({ + display: 'none', + left: 0, + position: 'absolute', + zIndex: option.zIndex + }) + .appendTo($parent); + return $el; + } + }); + + $.extend(Dropdown.prototype, { + // Public properties + // ----------------- + + $el: null, // jQuery object of ul.dropdown-menu element. + $inputEl: null, // jQuery object of target textarea. + completer: null, + footer: null, + header: null, + id: null, + maxCount: 10, + placement: '', + shown: false, + data: [], // Shown zipped data. + className: '', + + // Public methods + // -------------- + + destroy: function () { + // Don't remove $el because it may be shared by several textcompletes. + this.deactivate(); + + this.$el.off('.' + this.id); + this.$inputEl.off('.' + this.id); + this.clear(); + this.$el.remove(); + this.$el = this.$inputEl = this.completer = null; + delete dropdownViews[this.id] + }, + + render: function (zippedData) { + var contentsHtml = this._buildContents(zippedData); + var unzippedData = $.map(this.data, function (d) { return d.value; }); + if (this.data.length) { + var strategy = zippedData[0].strategy; + if (strategy.id) { + this.$el.attr('data-strategy', strategy.id); + } else { + this.$el.removeAttr('data-strategy'); + } + this._renderHeader(unzippedData); + this._renderFooter(unzippedData); + if (contentsHtml) { + this._renderContents(contentsHtml); + this._fitToBottom(); + this._fitToRight(); + this._activateIndexedItem(); + } + this._setScroll(); + } else if (this.noResultsMessage) { + this._renderNoResultsMessage(unzippedData); + } else if (this.shown) { + this.deactivate(); + } + }, + + setPosition: function (pos) { + // Make the dropdown fixed if the input is also fixed + // This can't be done during init, as textcomplete may be used on multiple elements on the same page + // Because the same dropdown is reused behind the scenes, we need to recheck every time the dropdown is showed + var position = 'absolute'; + // Check if input or one of its parents has positioning we need to care about + this.$inputEl.add(this.$inputEl.parents()).each(function() { + if($(this).css('position') === 'absolute') // The element has absolute positioning, so it's all OK + return false; + if($(this).css('position') === 'fixed') { + pos.top -= $window.scrollTop(); + pos.left -= $window.scrollLeft(); + position = 'fixed'; + return false; + } + }); + this.$el.css(this._applyPlacement(pos)); + this.$el.css({ position: position }); // Update positioning + + return this; + }, + + clear: function () { + this.$el.html(''); + this.data = []; + this._index = 0; + this._$header = this._$footer = this._$noResultsMessage = null; + }, + + activate: function () { + if (!this.shown) { + this.clear(); + this.$el.show(); + if (this.className) { this.$el.addClass(this.className); } + this.completer.fire('textComplete:show'); + this.shown = true; + } + return this; + }, + + deactivate: function () { + if (this.shown) { + this.$el.hide(); + if (this.className) { this.$el.removeClass(this.className); } + this.completer.fire('textComplete:hide'); + this.shown = false; + } + return this; + }, + + isUp: function (e) { + return e.keyCode === 38 || (e.ctrlKey && e.keyCode === 80); // UP, Ctrl-P + }, + + isDown: function (e) { + return e.keyCode === 40 || (e.ctrlKey && e.keyCode === 78); // DOWN, Ctrl-N + }, + + isEnter: function (e) { + var modifiers = e.ctrlKey || e.altKey || e.metaKey || e.shiftKey; + return !modifiers && (e.keyCode === 13 || e.keyCode === 9 || (this.option.completeOnSpace === true && e.keyCode === 32)) // ENTER, TAB + }, + + isPageup: function (e) { + return e.keyCode === 33; // PAGEUP + }, + + isPagedown: function (e) { + return e.keyCode === 34; // PAGEDOWN + }, + + isEscape: function (e) { + return e.keyCode === 27; // ESCAPE + }, + + // Private properties + // ------------------ + + _data: null, // Currently shown zipped data. + _index: null, + _$header: null, + _$noResultsMessage: null, + _$footer: null, + + // Private methods + // --------------- + + _bindEvents: function () { + this.$el.on('mousedown.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this)); + this.$el.on('touchstart.' + this.id, '.textcomplete-item', $.proxy(this._onClick, this)); + this.$el.on('mouseover.' + this.id, '.textcomplete-item', $.proxy(this._onMouseover, this)); + this.$inputEl.on('keydown.' + this.id, $.proxy(this._onKeydown, this)); + }, + + _onClick: function (e) { + var $el = $(e.target); + e.preventDefault(); + e.originalEvent.keepTextCompleteDropdown = this.id; + if (!$el.hasClass('textcomplete-item')) { + $el = $el.closest('.textcomplete-item'); + } + var datum = this.data[parseInt($el.data('index'), 10)]; + this.completer.select(datum.value, datum.strategy, e); + var self = this; + // Deactive at next tick to allow other event handlers to know whether + // the dropdown has been shown or not. + setTimeout(function () { + self.deactivate(); + if (e.type === 'touchstart') { + self.$inputEl.focus(); + } + }, 0); + }, + + // Activate hovered item. + _onMouseover: function (e) { + var $el = $(e.target); + e.preventDefault(); + if (!$el.hasClass('textcomplete-item')) { + $el = $el.closest('.textcomplete-item'); + } + this._index = parseInt($el.data('index'), 10); + this._activateIndexedItem(); + }, + + _onKeydown: function (e) { + if (!this.shown) { return; } + + var command; + + if ($.isFunction(this.option.onKeydown)) { + command = this.option.onKeydown(e, commands); + } + + if (command == null) { + command = this._defaultKeydown(e); + } + + switch (command) { + case commands.KEY_UP: + e.preventDefault(); + this._up(); + break; + case commands.KEY_DOWN: + e.preventDefault(); + this._down(); + break; + case commands.KEY_ENTER: + e.preventDefault(); + this._enter(e); + break; + case commands.KEY_PAGEUP: + e.preventDefault(); + this._pageup(); + break; + case commands.KEY_PAGEDOWN: + e.preventDefault(); + this._pagedown(); + break; + case commands.KEY_ESCAPE: + e.preventDefault(); + this.deactivate(); + break; + } + }, + + _defaultKeydown: function (e) { + if (this.isUp(e)) { + return commands.KEY_UP; + } else if (this.isDown(e)) { + return commands.KEY_DOWN; + } else if (this.isEnter(e)) { + return commands.KEY_ENTER; + } else if (this.isPageup(e)) { + return commands.KEY_PAGEUP; + } else if (this.isPagedown(e)) { + return commands.KEY_PAGEDOWN; + } else if (this.isEscape(e)) { + return commands.KEY_ESCAPE; + } + }, + + _up: function () { + if (this._index === 0) { + this._index = this.data.length - 1; + } else { + this._index -= 1; + } + this._activateIndexedItem(); + this._setScroll(); + }, + + _down: function () { + if (this._index === this.data.length - 1) { + this._index = 0; + } else { + this._index += 1; + } + this._activateIndexedItem(); + this._setScroll(); + }, + + _enter: function (e) { + var datum = this.data[parseInt(this._getActiveElement().data('index'), 10)]; + this.completer.select(datum.value, datum.strategy, e); + this.deactivate(); + }, + + _pageup: function () { + var target = 0; + var threshold = this._getActiveElement().position().top - this.$el.innerHeight(); + this.$el.children().each(function (i) { + if ($(this).position().top + $(this).outerHeight() > threshold) { + target = i; + return false; + } + }); + this._index = target; + this._activateIndexedItem(); + this._setScroll(); + }, + + _pagedown: function () { + var target = this.data.length - 1; + var threshold = this._getActiveElement().position().top + this.$el.innerHeight(); + this.$el.children().each(function (i) { + if ($(this).position().top > threshold) { + target = i; + return false + } + }); + this._index = target; + this._activateIndexedItem(); + this._setScroll(); + }, + + _activateIndexedItem: function () { + this.$el.find('.textcomplete-item.active').removeClass('active'); + this._getActiveElement().addClass('active'); + }, + + _getActiveElement: function () { + return this.$el.children('.textcomplete-item:nth(' + this._index + ')'); + }, + + _setScroll: function () { + var $activeEl = this._getActiveElement(); + var itemTop = $activeEl.position().top; + var itemHeight = $activeEl.outerHeight(); + var visibleHeight = this.$el.innerHeight(); + var visibleTop = this.$el.scrollTop(); + if (this._index === 0 || this._index == this.data.length - 1 || itemTop < 0) { + this.$el.scrollTop(itemTop + visibleTop); + } else if (itemTop + itemHeight > visibleHeight) { + this.$el.scrollTop(itemTop + itemHeight + visibleTop - visibleHeight); + } + }, + + _buildContents: function (zippedData) { + var datum, i, index; + var html = ''; + for (i = 0; i < zippedData.length; i++) { + if (this.data.length === this.maxCount) break; + datum = zippedData[i]; + if (include(this.data, datum)) { continue; } + index = this.data.length; + this.data.push(datum); + html += '
    • '; + html += datum.strategy.template(datum.value, datum.term); + html += '
    • '; + } + return html; + }, + + _renderHeader: function (unzippedData) { + if (this.header) { + if (!this._$header) { + this._$header = $('
    • ').prependTo(this.$el); + } + var html = $.isFunction(this.header) ? this.header(unzippedData) : this.header; + this._$header.html(html); + } + }, + + _renderFooter: function (unzippedData) { + if (this.footer) { + if (!this._$footer) { + this._$footer = $('').appendTo(this.$el); + } + var html = $.isFunction(this.footer) ? this.footer(unzippedData) : this.footer; + this._$footer.html(html); + } + }, + + _renderNoResultsMessage: function (unzippedData) { + if (this.noResultsMessage) { + if (!this._$noResultsMessage) { + this._$noResultsMessage = $('
    • ').appendTo(this.$el); + } + var html = $.isFunction(this.noResultsMessage) ? this.noResultsMessage(unzippedData) : this.noResultsMessage; + this._$noResultsMessage.html(html); + } + }, + + _renderContents: function (html) { + if (this._$footer) { + this._$footer.before(html); + } else { + this.$el.append(html); + } + }, + + _fitToBottom: function() { + var windowScrollBottom = $window.scrollTop() + $window.height(); + var height = this.$el.height(); + if ((this.$el.position().top + height) > windowScrollBottom) { + this.$el.offset({top: windowScrollBottom - height}); + } + }, + + _fitToRight: function() { + // We don't know how wide our content is until the browser positions us, and at that point it clips us + // to the document width so we don't know if we would have overrun it. As a heuristic to avoid that clipping + // (which makes our elements wrap onto the next line and corrupt the next item), if we're close to the right + // edge, move left. We don't know how far to move left, so just keep nudging a bit. + var tolerance = 30; // pixels. Make wider than vertical scrollbar because we might not be able to use that space. + while (this.$el.offset().left + this.$el.width() > $window.width() - tolerance) { + this.$el.offset({left: this.$el.offset().left - tolerance}); + } + }, + + _applyPlacement: function (position) { + // If the 'placement' option set to 'top', move the position above the element. + if (this.placement.indexOf('top') !== -1) { + // Overwrite the position object to set the 'bottom' property instead of the top. + position = { + top: 'auto', + bottom: this.$el.parent().height() - position.top + position.lineHeight, + left: position.left + }; + } else { + position.bottom = 'auto'; + delete position.lineHeight; + } + if (this.placement.indexOf('absleft') !== -1) { + position.left = 0; + } else if (this.placement.indexOf('absright') !== -1) { + position.right = 0; + position.left = 'auto'; + } + return position; + } + }); + + $.fn.textcomplete.Dropdown = Dropdown; + $.extend($.fn.textcomplete, commands); +}(jQuery); + ++function ($) { + 'use strict'; + + // Memoize a search function. + var memoize = function (func) { + var memo = {}; + return function (term, callback) { + if (memo[term]) { + callback(memo[term]); + } else { + func.call(this, term, function (data) { + memo[term] = (memo[term] || []).concat(data); + callback.apply(null, arguments); + }); + } + }; + }; + + function Strategy(options) { + $.extend(this, options); + if (this.cache) { this.search = memoize(this.search); } + } + + Strategy.parse = function (strategiesArray, params) { + return $.map(strategiesArray, function (strategy) { + var strategyObj = new Strategy(strategy); + strategyObj.el = params.el; + strategyObj.$el = params.$el; + return strategyObj; + }); + }; + + $.extend(Strategy.prototype, { + // Public properties + // ----------------- + + // Required + match: null, + replace: null, + search: null, + + // Optional + id: null, + cache: false, + context: function () { return true; }, + index: 2, + template: function (obj) { return obj; }, + idProperty: null + }); + + $.fn.textcomplete.Strategy = Strategy; + +}(jQuery); + ++function ($) { + 'use strict'; + + var now = Date.now || function () { return new Date().getTime(); }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // `wait` msec. + // + // This utility function was originally implemented at Underscore.js. + var debounce = function (func, wait) { + var timeout, args, context, timestamp, result; + var later = function () { + var last = now() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + result = func.apply(context, args); + context = args = null; + } + }; + + return function () { + context = this; + args = arguments; + timestamp = now(); + if (!timeout) { + timeout = setTimeout(later, wait); + } + return result; + }; + }; + + function Adapter () {} + + $.extend(Adapter.prototype, { + // Public properties + // ----------------- + + id: null, // Identity. + completer: null, // Completer object which creates it. + el: null, // Textarea element. + $el: null, // jQuery object of the textarea. + option: null, + + // Public methods + // -------------- + + initialize: function (element, completer, option) { + this.el = element; + this.$el = $(element); + this.id = completer.id + this.constructor.name; + this.completer = completer; + this.option = option; + + if (this.option.debounce) { + this._onKeyup = debounce(this._onKeyup, this.option.debounce); + } + + this._bindEvents(); + }, + + destroy: function () { + this.$el.off('.' + this.id); // Remove all event handlers. + this.$el = this.el = this.completer = null; + }, + + // Update the element with the given value and strategy. + // + // value - The selected object. It is one of the item of the array + // which was callbacked from the search function. + // strategy - The Strategy associated with the selected value. + select: function (/* value, strategy */) { + throw new Error('Not implemented'); + }, + + // Returns the caret's relative coordinates from body's left top corner. + getCaretPosition: function () { + var position = this._getCaretRelativePosition(); + var offset = this.$el.offset(); + + // Calculate the left top corner of `this.option.appendTo` element. + var $parent = this.option.appendTo; + if ($parent) { + if (!($parent instanceof $)) { $parent = $($parent); } + var parentOffset = $parent.offsetParent().offset(); + offset.top -= parentOffset.top; + offset.left -= parentOffset.left; + } + + position.top += offset.top; + position.left += offset.left; + return position; + }, + + // Focus on the element. + focus: function () { + this.$el.focus(); + }, + + // Private methods + // --------------- + + _bindEvents: function () { + this.$el.on('keyup.' + this.id, $.proxy(this._onKeyup, this)); + }, + + _onKeyup: function (e) { + if (this._skipSearch(e)) { return; } + this.completer.trigger(this.getTextFromHeadToCaret(), true); + }, + + // Suppress searching if it returns true. + _skipSearch: function (clickEvent) { + switch (clickEvent.keyCode) { + case 9: // TAB + case 13: // ENTER + case 40: // DOWN + case 38: // UP + return true; + } + if (clickEvent.ctrlKey) switch (clickEvent.keyCode) { + case 78: // Ctrl-N + case 80: // Ctrl-P + return true; + } + } + }); + + $.fn.textcomplete.Adapter = Adapter; +}(jQuery); + ++function ($) { + 'use strict'; + + // Textarea adapter + // ================ + // + // Managing a textarea. It doesn't know a Dropdown. + function Textarea(element, completer, option) { + this.initialize(element, completer, option); + } + + $.extend(Textarea.prototype, $.fn.textcomplete.Adapter.prototype, { + // Public methods + // -------------- + + // Update the textarea with the given value and strategy. + select: function (value, strategy, e) { + var pre = this.getTextFromHeadToCaret(); + var post = this.el.value.substring(this.el.selectionEnd); + var newSubstr = strategy.replace(value, e); + if (typeof newSubstr !== 'undefined') { + if ($.isArray(newSubstr)) { + post = newSubstr[1] + post; + newSubstr = newSubstr[0]; + } + pre = pre.replace(strategy.match, newSubstr); + this.$el.val(pre + post); + this.el.selectionStart = this.el.selectionEnd = pre.length; + } + }, + + getTextFromHeadToCaret: function () { + return this.el.value.substring(0, this.el.selectionEnd); + }, + + // Private methods + // --------------- + + _getCaretRelativePosition: function () { + var p = $.fn.textcomplete.getCaretCoordinates(this.el, this.el.selectionStart); + return { + top: p.top + parseInt(this.$el.css('line-height'), 10) - this.$el.scrollTop(), + left: p.left - this.$el.scrollLeft() + }; + } + }); + + $.fn.textcomplete.Textarea = Textarea; +}(jQuery); + ++function ($) { + 'use strict'; + + var sentinelChar = '吶'; + + function IETextarea(element, completer, option) { + this.initialize(element, completer, option); + $('' + sentinelChar + '').css({ + position: 'absolute', + top: -9999, + left: -9999 + }).insertBefore(element); + } + + $.extend(IETextarea.prototype, $.fn.textcomplete.Textarea.prototype, { + // Public methods + // -------------- + + select: function (value, strategy, e) { + var pre = this.getTextFromHeadToCaret(); + var post = this.el.value.substring(pre.length); + var newSubstr = strategy.replace(value, e); + if (typeof newSubstr !== 'undefined') { + if ($.isArray(newSubstr)) { + post = newSubstr[1] + post; + newSubstr = newSubstr[0]; + } + pre = pre.replace(strategy.match, newSubstr); + this.$el.val(pre + post); + this.el.focus(); + var range = this.el.createTextRange(); + range.collapse(true); + range.moveEnd('character', pre.length); + range.moveStart('character', pre.length); + range.select(); + } + }, + + getTextFromHeadToCaret: function () { + this.el.focus(); + var range = document.selection.createRange(); + range.moveStart('character', -this.el.value.length); + var arr = range.text.split(sentinelChar) + return arr.length === 1 ? arr[0] : arr[1]; + } + }); + + $.fn.textcomplete.IETextarea = IETextarea; +}(jQuery); + +// NOTE: TextComplete plugin has contenteditable support but it does not work +// fine especially on old IEs. +// Any pull requests are REALLY welcome. + ++function ($) { + 'use strict'; + + // ContentEditable adapter + // ======================= + // + // Adapter for contenteditable elements. + function ContentEditable (element, completer, option) { + this.initialize(element, completer, option); + } + + $.extend(ContentEditable.prototype, $.fn.textcomplete.Adapter.prototype, { + // Public methods + // -------------- + + // Update the content with the given value and strategy. + // When an dropdown item is selected, it is executed. + select: function (value, strategy, e) { + var pre = this.getTextFromHeadToCaret(); + var sel = window.getSelection() + var range = sel.getRangeAt(0); + var selection = range.cloneRange(); + selection.selectNodeContents(range.startContainer); + var content = selection.toString(); + var post = content.substring(range.startOffset); + var newSubstr = strategy.replace(value, e); + if (typeof newSubstr !== 'undefined') { + if ($.isArray(newSubstr)) { + post = newSubstr[1] + post; + newSubstr = newSubstr[0]; + } + pre = pre.replace(strategy.match, newSubstr); + range.selectNodeContents(range.startContainer); + range.deleteContents(); + + // create temporary elements + var preWrapper = document.createElement("div"); + preWrapper.innerHTML = pre; + var postWrapper = document.createElement("div"); + postWrapper.innerHTML = post; + + // create the fragment thats inserted + var fragment = document.createDocumentFragment(); + var childNode; + var lastOfPre; + while (childNode = preWrapper.firstChild) { + lastOfPre = fragment.appendChild(childNode); + } + while (childNode = postWrapper.firstChild) { + fragment.appendChild(childNode); + } + + // insert the fragment & jump behind the last node in "pre" + range.insertNode(fragment); + range.setStartAfter(lastOfPre); + + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + } + }, + + // Private methods + // --------------- + + // Returns the caret's relative position from the contenteditable's + // left top corner. + // + // Examples + // + // this._getCaretRelativePosition() + // //=> { top: 18, left: 200, lineHeight: 16 } + // + // Dropdown's position will be decided using the result. + _getCaretRelativePosition: function () { + var range = window.getSelection().getRangeAt(0).cloneRange(); + var node = document.createElement('span'); + range.insertNode(node); + range.selectNodeContents(node); + range.deleteContents(); + var $node = $(node); + var position = $node.offset(); + position.left -= this.$el.offset().left; + position.top += $node.height() - this.$el.offset().top; + position.lineHeight = $node.height(); + $node.remove(); + return position; + }, + + // Returns the string between the first character and the caret. + // Completer will be triggered with the result for start autocompleting. + // + // Example + // + // // Suppose the html is 'hello wor|ld' and | is the caret. + // this.getTextFromHeadToCaret() + // // => ' wor' // not 'hello wor' + getTextFromHeadToCaret: function () { + var range = window.getSelection().getRangeAt(0); + var selection = range.cloneRange(); + selection.selectNodeContents(range.startContainer); + return selection.toString().substring(0, range.startOffset); + } + }); + + $.fn.textcomplete.ContentEditable = ContentEditable; +}(jQuery); + +// The MIT License (MIT) +// +// Copyright (c) 2015 Jonathan Ong me@jongleberry.com +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files (the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// https://github.com/component/textarea-caret-position + +(function () { + +// The properties that we copy into a mirrored div. +// Note that some browsers, such as Firefox, +// do not concatenate properties, i.e. padding-top, bottom etc. -> padding, +// so we have to do every single property specifically. +var properties = [ + 'direction', // RTL support + 'boxSizing', + 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does + 'height', + 'overflowX', + 'overflowY', // copy the scrollbar for IE + + 'borderTopWidth', + 'borderRightWidth', + 'borderBottomWidth', + 'borderLeftWidth', + 'borderStyle', + + 'paddingTop', + 'paddingRight', + 'paddingBottom', + 'paddingLeft', + + // https://developer.mozilla.org/en-US/docs/Web/CSS/font + 'fontStyle', + 'fontVariant', + 'fontWeight', + 'fontStretch', + 'fontSize', + 'fontSizeAdjust', + 'lineHeight', + 'fontFamily', + + 'textAlign', + 'textTransform', + 'textIndent', + 'textDecoration', // might not make a difference, but better be safe + + 'letterSpacing', + 'wordSpacing', + + 'tabSize', + 'MozTabSize' + +]; + +var isBrowser = (typeof window !== 'undefined'); +var isFirefox = (isBrowser && window.mozInnerScreenX != null); + +function getCaretCoordinates(element, position, options) { + if(!isBrowser) { + throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser'); + } + + var debug = options && options.debug || false; + if (debug) { + var el = document.querySelector('#input-textarea-caret-position-mirror-div'); + if ( el ) { el.parentNode.removeChild(el); } + } + + // mirrored div + var div = document.createElement('div'); + div.id = 'input-textarea-caret-position-mirror-div'; + document.body.appendChild(div); + + var style = div.style; + var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9 + + // default textarea styles + style.whiteSpace = 'pre-wrap'; + if (element.nodeName !== 'INPUT') + style.wordWrap = 'break-word'; // only for textarea-s + + // position off-screen + style.position = 'absolute'; // required to return coordinates properly + if (!debug) + style.visibility = 'hidden'; // not 'display: none' because we want rendering + + // transfer the element's properties to the div + properties.forEach(function (prop) { + style[prop] = computed[prop]; + }); + + if (isFirefox) { + // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275 + if (element.scrollHeight > parseInt(computed.height)) + style.overflowY = 'scroll'; + } else { + style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll' + } + + div.textContent = element.value.substring(0, position); + // the second special handling for input type="text" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037 + if (element.nodeName === 'INPUT') + div.textContent = div.textContent.replace(/\s/g, '\u00a0'); + + var span = document.createElement('span'); + // Wrapping must be replicated *exactly*, including when a long word gets + // onto the next line, with whitespace at the end of the line before (#7). + // The *only* reliable way to do that is to copy the *entire* rest of the + // textarea's content into the created at the caret position. + // for inputs, just '.' would be enough, but why bother? + span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all + div.appendChild(span); + + var coordinates = { + top: span.offsetTop + parseInt(computed['borderTopWidth']), + left: span.offsetLeft + parseInt(computed['borderLeftWidth']) + }; + + if (debug) { + span.style.backgroundColor = '#aaa'; + } else { + document.body.removeChild(div); + } + + return coordinates; +} + +if (typeof module != 'undefined' && typeof module.exports != 'undefined') { + module.exports = getCaretCoordinates; +} else if(isBrowser){ + window.$.fn.textcomplete.getCaretCoordinates = getCaretCoordinates; +} + +}()); + +return jQuery; +})); \ No newline at end of file diff --git a/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js b/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js deleted file mode 100644 index 5ac596b9a4..0000000000 --- a/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js +++ /dev/null @@ -1 +0,0 @@ -/*! jquery-textcomplete - v0.7.3 - 2015-08-31 */!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+f++,this.strategies=[],this.views=[],this.option=a.extend({},b._getDefaults(),d),!this.$el.is("input[type=text]")&&!this.$el.is("textarea")&&!c.isContentEditable&&"true"!=c.contentEditable)throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===document.activeElement)this.initialize();else{var e=this;this.$el.one("focus."+this.id,function(){e.initialize()})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return c=d,void 0;b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=function(a){return"[object Function]"===Object.prototype.toString.call(a)},f=0;b._getDefaults=function(){return b.DEFAULTS||(b.DEFAULTS={appendTo:a("body"),zIndex:"100"}),b.DEFAULTS},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,initialize:function(){var b=this.$el.get(0);this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var c,d;this.option.adapter?c=this.option.adapter:(d=this.$el.is("textarea")||this.$el.is("input[type=text]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",c=a.fn.textcomplete[d]),this.adapter=new c(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(a){for(var b=0;b").addClass("dropdown-menu textcomplete-dropdown").attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:10,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(this.data,function(a){return a.value});this.data.length?(this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._activateIndexedItem()),this._setScroll()):this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){this.$el.css(this._applyPlacement(b));var c="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(c="fixed",!1):void 0}),this.$el.css({position:c}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c',f+=b.strategy.template(b.value,b.term),f+="");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('
    • ').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('
    • ').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&this.$el.offset({top:a-b})},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var a=this._getCaretRelativePosition(),b=this.$el.offset();return a.top+=b.top,a.left+=b.left,a},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 13:case 40:case 38:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}b.DIV_PROPERTIES={left:-9999,position:"absolute",top:0,whiteSpace:"pre-wrap"},b.COPY_PROPERTIES=["border-width","font-family","font-size","font-style","font-variant","font-weight","height","letter-spacing","word-spacing","line-height","text-decoration","text-align","width","padding-top","padding-right","padding-bottom","padding-left","margin-top","margin-right","margin-bottom","margin-left","border-style","box-sizing","tab-size"],a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(this.el.selectionEnd),g=c.replace(b,d);"undefined"!=typeof g&&(a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.selectionStart=this.el.selectionEnd=e.length)},_getCaretRelativePosition:function(){var b=a("
      ").css(this._copyCss()).text(this.getTextFromHeadToCaret()),c=a("").text(".").appendTo(b);this.$el.before(b);var d=c.position();return d.top+=c.height()-this.$el.scrollTop(),d.lineHeight=c.height(),b.remove(),d},_copyCss:function(){return a.extend({overflow:this.el.scrollHeight>this.el.offsetHeight?"scroll":"auto"},b.DIV_PROPERTIES,this._getStyles())},_getStyles:function(a){var c=a("
      ").css(["color"]).color;return"undefined"!=typeof c?function(){return this.$el.css(b.COPY_PROPERTIES)}:function(){var c=this.$el,d={};return a.each(b.COPY_PROPERTIES,function(a,b){d[b]=c.css(b)}),d}}(a),getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a(""+c+"").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="?";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(e.length),g=c.replace(b,d);if("undefined"!=typeof g){a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.focus();var h=this.el.createTextRange();h.collapse(!0),h.moveEnd("character",e.length),h.moveStart("character",e.length),h.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=window.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i=h.toString(),j=i.substring(g.startOffset),k=c.replace(b,d);if("undefined"!=typeof k){a.isArray(k)&&(j=k[1]+j,k=k[0]),e=e.replace(c.match,k),g.selectNodeContents(g.startContainer),g.deleteContents();var l=document.createTextNode(e+j);g.insertNode(l),g.setStart(l,e.length),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=window.getSelection().getRangeAt(0).cloneRange(),c=document.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();return e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),d.remove(),e},getTextFromHeadToCaret:function(){var a=window.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),a}); \ No newline at end of file diff --git a/src/meta/css.js b/src/meta/css.js index 0b901c6e13..81fa0528c2 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -67,7 +67,6 @@ module.exports = function(Meta) { source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/css/smoothness/jquery-ui-1.10.4.custom.min.css";'; source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";'; - source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/textcomplete/jquery.textcomplete.css";'; source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/colorpicker/colorpicker.css";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/flags.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/blacklist.less";'; diff --git a/src/meta/js.js b/src/meta/js.js index d8e4c04143..f2fabac6ac 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -24,7 +24,7 @@ module.exports = function(Meta) { 'public/vendor/visibility/visibility.min.js', 'public/vendor/bootstrap/js/bootstrap.min.js', 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.min.js', - 'public/vendor/jquery/textcomplete/jquery.textcomplete.min.js', + 'public/vendor/jquery/textcomplete/jquery.textcomplete.js', 'public/vendor/requirejs/require.js', 'public/vendor/bootbox/bootbox.min.js', 'public/vendor/tinycon/tinycon.js', From fa689250e4e7f50c38728ade8ca852d617ea31ff Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Sat, 26 Mar 2016 09:02:20 -0400 Subject: [PATCH 268/319] Latest translations and fallbacks --- public/language/en@pirate/category.json | 6 +-- public/language/en_US/topic.json | 2 +- public/language/ru/user.json | 2 +- public/language/rw/category.json | 2 +- public/language/rw/email.json | 6 +-- public/language/rw/global.json | 30 +++++------ public/language/rw/groups.json | 10 ++-- public/language/rw/pages.json | 72 ++++++++++++------------- public/language/rw/topic.json | 32 +++++------ public/language/rw/user.json | 46 ++++++++-------- public/language/rw/users.json | 2 +- 11 files changed, 105 insertions(+), 105 deletions(-) diff --git a/public/language/en@pirate/category.json b/public/language/en@pirate/category.json index 031dc5efec..631d322e1a 100644 --- a/public/language/en@pirate/category.json +++ b/public/language/en@pirate/category.json @@ -6,11 +6,11 @@ "no_topics": "Thar be no topics in 'tis category.
      Why don't ye give a go' postin' one?", "browsing": "browsin'", "no_replies": "No one has replied to ye message", - "no_new_posts": "No new posts.", + "no_new_posts": "Thar be no new posts.", "share_this_category": "Share this category", "watch": "Watch", "ignore": "Ignore", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category", + "watch.message": "Ye now be watchin' updates from 'tis category", + "ignore.message": "Ye now be ignorin' updates from 'tis category", "watched-categories": "Watched categories" } \ No newline at end of file diff --git a/public/language/en_US/topic.json b/public/language/en_US/topic.json index c7ce76e07b..bdf6d77f91 100644 --- a/public/language/en_US/topic.json +++ b/public/language/en_US/topic.json @@ -26,7 +26,7 @@ "tools": "Tools", "flag": "Flag", "locked": "Locked", - "bookmark_instructions": "Click here to return to the last unread post in this thread.", + "bookmark_instructions": "Click here to return to the last read post in this thread.", "flag_title": "Flag this post for moderation", "flag_success": "This post has been flagged for moderation.", "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 3bd501675a..5e14dc8004 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -39,7 +39,7 @@ "change_username": "Изменить имя пользователя", "change_email": "Изменить Email", "edit": "Редактировать", - "edit-profile": "Edit Profile", + "edit-profile": "Редактировать профиль", "default_picture": "Иконка по умолчанию", "uploaded_picture": "Загруженный аватар", "upload_new_picture": "Загрузить новый", diff --git a/public/language/rw/category.json b/public/language/rw/category.json index e09c8b0787..5bfd9286eb 100644 --- a/public/language/rw/category.json +++ b/public/language/rw/category.json @@ -12,5 +12,5 @@ "ignore": "Ihorere", "watch.message": "Uzajya ubu ukurikirana ibishya byongewe muri iki cyiciro", "ignore.message": "Ubu urekeye aho kuzajya ubona ibishya byongewe muri iki cyiciro", - "watched-categories": "Watched categories" + "watched-categories": "Ibyiciro Bikurikirwa" } \ No newline at end of file diff --git a/public/language/rw/email.json b/public/language/rw/email.json index 138f1f5f14..626f11dec4 100644 --- a/public/language/rw/email.json +++ b/public/language/rw/email.json @@ -21,9 +21,9 @@ "digest.cta": "Kanda hano kugirango usure %1", "digest.unsub.info": "Izi ngingo z'ingenzi zakohererejwe kuko waziyandikishijeho", "digest.no_topics": "Nta biganiro bishyushye byagaragaye mu gihe gishize cya %1", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "umunsi", + "digest.week": "icyumweru", + "digest.month": "ukwezi", "notif.chat.subject": "Ubutumwa bwo mu gikari bwaturutse kuri %1", "notif.chat.cta": "Kanda hano kugirango ukomeze", "notif.chat.unsub.info": "Iri tangazo rijyanye n'ubutumwa bwo mu gikari waryohererejwe kubera ko wabihisemo mu byo uzajya umenyeshwa", diff --git a/public/language/rw/global.json b/public/language/rw/global.json index fa7e6d6ab3..aecc3f305e 100644 --- a/public/language/rw/global.json +++ b/public/language/rw/global.json @@ -33,7 +33,7 @@ "header.notifications": "Amatangazo", "header.search": "Shaka", "header.profile": "Ishusho", - "header.navigation": "Navigation", + "header.navigation": "Ukureba", "notifications.loading": "Amatangazo Araje", "chats.loading": "Ubutumwa Buraje", "motd.welcome": "Urakaza neza kuri NodeBB, urubuga rujyanye n'ibihe bizaza", @@ -49,9 +49,9 @@ "users": "Abantu", "topics": "Ibiganiro", "posts": "Ibyashyizweho", - "best": "Best", - "upvoted": "Upvoted", - "downvoted": "Downvoted", + "best": "Byiza", + "upvoted": "Byakunzwe", + "downvoted": "Byagawe", "views": "Byarebwe", "reputation": "Amanota", "read_more": "komeza usome", @@ -59,19 +59,19 @@ "posted_ago_by_guest": "%1 bishyizweho na Umushyitsi", "posted_ago_by": "%1 bishyizweho na %2", "posted_ago": "%1 biriho", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", + "posted_in": "byashyizwe muri %1", + "posted_in_by": "byashyizwe muri %1 na %2", "posted_in_ago": "%2 bishyizwe muri %1", "posted_in_ago_by": "%2 bishyizwe muri %1 na %3", "user_posted_ago": "%2 %1 ashyizeho", "guest_posted_ago": "%1 Umushyitsi ashyizeho", - "last_edited_by": "last edited by %1", + "last_edited_by": "biheruka guhindurwaho na %1", "norecentposts": "Nta Biherutseho", "norecenttopics": "Nta Biganiro Biherutse", "recentposts": "Ibiherutseho", "recentips": "Aderesi za IP Ziheruka Gusura", "away": "Ahandi", - "dnd": "Do not disturb", + "dnd": "Nta Kurogoya", "invisible": "Nta Kugaragara", "offline": "Nta Murongo", "email": "Email", @@ -84,11 +84,11 @@ "follow": "Kurikira", "unfollow": "Reka Gukurikira", "delete_all": "Siba Byose", - "map": "Map", - "sessions": "Login Sessions", - "ip_address": "IP Address", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "map": "Ikarita", + "sessions": "Ukwinjiramo", + "ip_address": "Aderesi ya IP", + "enter_page_number": "Shyiramo nimero ya paji", + "upload_file": "Pakira ifayilo", + "upload": "Pakira", + "allowed-file-types": "Ubwoko bw'amafayilo bwemewe ni %1" } \ No newline at end of file diff --git a/public/language/rw/groups.json b/public/language/rw/groups.json index f3e7be363f..5b02814cab 100644 --- a/public/language/rw/groups.json +++ b/public/language/rw/groups.json @@ -12,9 +12,9 @@ "invited.none": "Nta banyamuryango batumiwe bahari", "invited.uninvite": "Kuraho Ubutumire", "invited.search": "Shaka umuntu wo gutumira muri iri tsinda", - "invited.notification_title": "You have been invited to join %1", - "request.notification_title": "Group Membership Request from %1", - "request.notification_text": "%1 has requested to become a member of %2", + "invited.notification_title": "Utumiwe kwinjira muri %1", + "request.notification_title": "Ubusabe bwo Kujya mu Itsinda Buturutse %1", + "request.notification_text": "%1 yasabye kuba umunyamuryango w'itsinda rya %2", "cover-save": "Bika", "cover-saving": "Kubika", "details.title": "Ibijyanye n'Itsinda", @@ -41,7 +41,7 @@ "details.hidden": "Ahishe", "details.hidden_help": "Nubyemera, iri tsinda ntabwo rizajya rigaragara ku rutonde rw'andi matsinda kandi abantu bazajya basabwa kuritumirwamo buri wese ku giti cye mbere yo kurijyamo", "details.delete_group": "Senya Itsinda", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Amatsinda aheza ntabwo ari kwemerera aha, hano ntabwo byahahindurirwa", "event.updated": "Amakuru ku itsinda yahinduweho bijyanye n'igihe", "event.deleted": "Itsinda rya \"%1\" ryakuweho", "membership.accept-invitation": "Emera Ubutumire", @@ -50,5 +50,5 @@ "membership.leave-group": "Va mu Itsinda", "membership.reject": "Hakanira", "new-group.group_name": "Izina ry'Itsinda:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Shyiraho ifoto yo hejuru iranga itsinda" } \ No newline at end of file diff --git a/public/language/rw/pages.json b/public/language/rw/pages.json index e4c597f8f0..b59cebf627 100644 --- a/public/language/rw/pages.json +++ b/public/language/rw/pages.json @@ -1,46 +1,46 @@ { "home": "Imbere", "unread": "Ibiganiro Bitarasomwa", - "popular-day": "Popular topics today", - "popular-week": "Popular topics this week", - "popular-month": "Popular topics this month", - "popular-alltime": "All time popular topics", + "popular-day": "Ibiganiro bikunzwe uyu munsi", + "popular-week": "Ibiganiro bikunzwe iki cyumweru", + "popular-month": "Ibiganiro bikunzwe uku kwezi", + "popular-alltime": "Ibiganiro byakunzwe ibihe byose", "recent": "Ibiganiro Biheruka", - "flagged-posts": "Flagged Posts", - "users/online": "Online Users", - "users/latest": "Latest Users", - "users/sort-posts": "Users with the most posts", - "users/sort-reputation": "Users with the most reputation", - "users/banned": "Banned Users", - "users/search": "User Search", + "flagged-posts": "Ibyatambikanywe", + "users/online": "Abariho", + "users/latest": "Abashya", + "users/sort-posts": "Abantu bashyizeho byinshi", + "users/sort-reputation": "Abantu bafite amanota menshi", + "users/banned": "Abantu Bakumiriwe", + "users/search": "Gushaka Abantu", "notifications": "Amatangazo", "tags": "Ibimenyetso", "tag": "Ibiganiro bifite ibimenyetso bya \"%1\"", - "register": "Register an account", - "login": "Login to your account", - "reset": "Reset your account password", - "categories": "Categories", - "groups": "Groups", - "group": "%1 group", - "chats": "Chats", - "chat": "Chatting with %1", - "account/edit": "Editing \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", - "account/following": "People %1 follows", - "account/followers": "People who follow %1", - "account/posts": "Posts made by %1", - "account/topics": "Topics created by %1", - "account/groups": "%1's Groups", - "account/favourites": "%1's Bookmarked Posts", - "account/settings": "User Settings", - "account/watched": "Topics watched by %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", - "confirm": "Email Confirmed", + "register": "Fungura Konte", + "login": "Injira muri konte yawe", + "reset": "Tangiza bundi bushya konte yawe", + "categories": "Ibyiciro", + "groups": "Amatsinda", + "group": "Itsinda %1 ", + "chats": "Mu Gikari", + "chat": "Ukuganira na %1", + "account/edit": "Uguhindura \"%1\"", + "account/edit/password": "Uguhindura ijambobanga rya \"%1\"", + "account/edit/username": "Uguhindura izina rya \"%1\"", + "account/edit/email": "Uguhindura email ya \"%1\"", + "account/following": "Abantu %1 akurikira", + "account/followers": "Abantu bakurikira %1", + "account/posts": "Ibyashyizweho na %1", + "account/topics": "Ibiganiro byatangijwe na %1", + "account/groups": "Amatsinda ya %1", + "account/favourites": "Ibyazigamwe na %1", + "account/settings": "Itunganya", + "account/watched": "Ibiganiro bikurikirwa na %1", + "account/upvoted": "Ibiganiro byakunzwe na %1", + "account/downvoted": "Ibiganiro byanzwe na %1", + "account/best": "Ibihebuje byashyizweho na %1", + "confirm": "Email Yemejwe", "maintenance.text": "%1 ntiboneka kuko ubu iri gutunganywa. Muze kongera kugaruka. ", "maintenance.messageIntro": "Byongeye, kandi, umuyobozi yasize ubu butumwa: ", - "throttled.text": "%1 is currently unavailable due to excessive load. Please come back another time." + "throttled.text": "% ntibonetse kubera ukunanirwa. Uze kugaruka ikindi gihe. " } \ No newline at end of file diff --git a/public/language/rw/topic.json b/public/language/rw/topic.json index 81574d5241..b3ba723ec7 100644 --- a/public/language/rw/topic.json +++ b/public/language/rw/topic.json @@ -13,7 +13,7 @@ "notify_me": "Uzajye umenyeshwa ibisubizo bishya kuri iki kiganiro", "quote": "Terura", "reply": "Subiza", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "Bishyireho nk'ikiganiro", "guest-login-reply": "Injiramo maze usubize", "edit": "Hinduraho", "delete": "Siba", @@ -26,7 +26,7 @@ "tools": "Ibikoresho", "flag": "Tambikana", "locked": "Birafungiranye", - "bookmark_instructions": "Click here to return to the last unread post in this thread.", + "bookmark_instructions": "Kanda hano kugirango usubire ahari ibitarasomwe biheruka muri iki kiganiro.", "flag_title": "Bimenyeshe ubuyobozi", "flag_success": "Bimaze kumenyeshwa ubuyobozi ngo bikurikiranwe. ", "deleted_message": "Iki kiganiro cyamaze gukurwaho. Abantu babifitiye uburenganzira ni bo bonyine bashobora kukibona. ", @@ -34,8 +34,8 @@ "not_following_topic.message": "Ntabwo uzongera kujya umenyeshwa ku bibera muri iki kiganiro. ", "login_to_subscribe": "Ba umunyamuryango cyangwa winjiremo niba ushaka kwiyandikisha kuri iki kiganiro. ", "markAsUnreadForAll.success": "Ikiganiro kigizwe nk'icyasomwe na bose", - "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread": "Garagaza nk'ibyasomwe", + "mark_unread.success": "Ikiganiro cyagaragajwe nk'icyasomwe.", "watch": "Cunga", "unwatch": "Rekeraho Gucunga", "watch.title": "Ujye umenyeshwa ibyongerwaho bishya kuri iki kiganiro", @@ -51,7 +51,7 @@ "thread_tools.move_all": "Byimure Byose", "thread_tools.fork": "Gabanyaho ku Kiganiro", "thread_tools.delete": "Kuraho Ikiganiro", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "Siba Icyashizweho", "thread_tools.delete_confirm": "Wiringiye neza ko ushaka gukuraho iki kiganiro?", "thread_tools.restore": "Subizaho Ikiganiro", "thread_tools.restore_confirm": "Wiringiye neza ko ushaka kugarura iki kiganiro?", @@ -65,9 +65,9 @@ "disabled_categories_note": "Ibyiciro bitagaragazwa birasa n'ibipfutse", "confirm_move": "Imura", "confirm_fork": "Gabanyaho", - "favourite": "Bookmark", - "favourites": "Bookmarks", - "favourites.has_no_favourites": "You haven't bookmarked any posts yet.", + "favourite": "Zigama", + "favourites": "Ibyazigamwe", + "favourites.has_no_favourites": "Ntabwo urazigama ikintu na kimwe.", "loading_more_posts": "Ibindi Biraje", "move_topic": "Imura Ikiganiro", "move_topics": "Imura Ibiganiro", @@ -78,7 +78,7 @@ "fork_topic_instruction": "Kanda ku byashizweho ushaka kugabanyaho", "fork_no_pids": "Nta kintu wahisemo!", "fork_success": "Umaze kugabanyaho ku kiganiro! Kanda hano ugezwe ku kiganiro cyavutse. ", - "delete_posts_instruction": "Click the posts you want to delete/purge", + "delete_posts_instruction": "Kanda ku bintu ushaka guhisha/gusiba", "composer.title_placeholder": "Shyira umutwe w'ikiganiro cyawe aha...", "composer.handle_placeholder": "Izina", "composer.discard": "Byihorere", @@ -101,12 +101,12 @@ "newest_to_oldest": "Ibya Vuba Ujya ku bya Kera", "most_votes": "Amajwi yiganje", "most_posts": "Ibyashyizweho byiganje", - "stale.title": "Create new topic instead?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", - "stale.reply_anyway": "Reply to this topic anyway", - "link_back": "Re: [%1](%2)", + "stale.title": "Urashaka gutangiza ahubwo ikiganiro gishya?", + "stale.warning": "Ikiganiro ushaka kuvugaho cyarashaje. Wahitamo gutangiza ikiganiro gishya ariko wenda ukagaragaza kino mu gisubizo uza gushyiraho?", + "stale.create": "Tangiza ikiganiro gishya", + "stale.reply_anyway": "Vuga kuri iki kiganiro nubundi", + "link_back": "Igisubizo: [%1](%2)", "spam": "Spam", - "offensive": "Offensive", - "custom-flag-reason": "Enter a flagging reason" + "offensive": "Ugukomeretsanya", + "custom-flag-reason": "Shyiramo impamvu yo gutambikana" } \ No newline at end of file diff --git a/public/language/rw/user.json b/public/language/rw/user.json index 937c32576c..9ca89d0160 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -12,7 +12,7 @@ "delete_account": "Siba Konte", "delete_account_confirm": "Wiringiye neza ko ushaka gusiba konte yawe?
      Numara kuyisiba ntabwo urabasha kwisubira kandi nturabasha kugarura ibyo wari ufiteho

      Shyiramo izina ryawe kugirango wemeze ko koko ushaka gusenya iyi konte.", "delete_this_account_confirm": "Wiringiye neza ko ushaka gusiba iyi konte?
      Ntabwo uri bubashe kwisubira kandi ntabwo urabasha gusubirana ibyo wari ufiteho numara kuyisiba

      ", - "account-deleted": "Account deleted", + "account-deleted": "Konte yasibwe", "fullname": "Izina Ryuzuye", "website": "Urubuga", "location": "Ahantu", @@ -22,7 +22,7 @@ "profile": "Ishusho", "profile_views": "Ishusho Yarebwe", "reputation": "Amanota", - "favourites": "Bookmarks", + "favourites": "Ibyazigamwe", "watched": "Ibikurikiranwa", "followers": "Abamukurikira", "following": "Akurikira", @@ -30,17 +30,17 @@ "signature": "Intero", "birthday": "Itariki y'Amavuko", "chat": "Mu Gikari", - "chat_with": "Chat with %1", + "chat_with": "Ganira na %1", "follow": "Kurikira", "unfollow": "Ntukurikire", "more": "Ibindi", "profile_update_success": "Ishusho yashyizwe ku gihe nta ngorane!", "change_picture": "Hindura Ifoto", - "change_username": "Change Username", - "change_email": "Change Email", + "change_username": "Hindura Izina", + "change_email": "Hindura Email", "edit": "Hinduraho", - "edit-profile": "Edit Profile", - "default_picture": "Default Icon", + "edit-profile": "Hinduraho ku Ishusho", + "default_picture": "Akamenyetso Gasanzwe", "uploaded_picture": "Ifoto Yapakiwe", "upload_new_picture": "Pakira Ifoto Nshya", "upload_new_picture_from_url": "Pakira Ifoto Nshya Ukoresheje URL", @@ -55,12 +55,12 @@ "confirm_password": "Emeza Ijambobanga", "password": "Ijambobanga", "username_taken_workaround": "Izina ushaka kujya ukoresha twasanze ryarafashwe. Ntugire impungenge kuko twakuboneye iryo byenda kumera kimwe. Uzaba uzwi ku izina rya %1", - "password_same_as_username": "Your password is the same as your username, please select another password.", - "password_same_as_email": "Your password is the same as your email, please select another password.", + "password_same_as_username": "Ijambobanga ryawe rirasa neza n'izina ukoresha; hitamo irindi jambobanga.", + "password_same_as_email": "Ijambobanga ryawe rirasa neza na email yawe; hitamo irindi jambobanga.", "upload_picture": "Gushyiraho ifoto", "upload_a_picture": "Shyiraho ifoto", - "remove_uploaded_picture": "Remove Uploaded Picture", - "upload_cover_picture": "Upload cover picture", + "remove_uploaded_picture": "Kuraho Ifoto", + "upload_cover_picture": "Pakira ifoto yo hejuru", "settings": "Itunganya", "show_email": "Hagaragazwe Email Yanjye", "show_fullname": "Hagaragazwe Izina Ryuzuye Ryanjye", @@ -79,9 +79,9 @@ "has_no_posts": "Uyu muntu nta kintu arashyiraho. ", "has_no_topics": "Uyu muntu nta kiganiro aratangiza na kimwe. ", "has_no_watched_topics": "Uyu muntu ntabwo arakurikira ikiganiro na kimwe.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", + "has_no_upvoted_posts": "Uyu muntu ntabwo arashima icyashyizweho na kimwe.", + "has_no_downvoted_posts": "Uyu muntu ntabwo aragaya icyashizweho na kimwe. ", + "has_no_voted_posts": "Uyu muntu ntabwo aragira ikintu yashimiwe gushyiraho", "email_hidden": "Email Yahishwe", "hidden": "byahishwe", "paginate_description": "Gabanya ibiganiro n'ibyashyizweho mu ma paji aho kugirango umuntu ajye amanuka ubudahagarara ", @@ -92,18 +92,18 @@ "open_links_in_new_tab": "Fungurira imirongo ijya hanze mu idirishya rishya", "enable_topic_searching": "Emerera Ugushakira mu Kiganiro", "topic_search_help": "Nibyemerwa, ugushakira mu kiganiro bizajya biba ari byo bikorwa maze bitume umuntu abasha gushakira mu kiganiro hose aho gushakira kuri paji igaragarira amaso, imbere yawe gusa", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Nyuma yo gushyiraho igisubizo, hagaragare icyashyizweho gishya", "follow_topics_you_reply_to": "Kurikira ibiganiro ushyiraho ibisubizo", "follow_topics_you_create": "Kurikira ibiganiro uba watangije", "grouptitle": "Hitamo umutwe w'itsinda ushaka ko uzajya ugaragara", "no-group-title": "Nta mutwe w'itsinda", - "select-skin": "Select a Skin", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\", or \"popular\")", - "sso.title": "Single Sign-on Services", - "sso.associated": "Associated with", + "select-skin": "Hitamo Uruhu", + "select-homepage": "Hitamo Paji y'Imbere", + "homepage": "Paji y'Imbere", + "homepage_description": "Hitamo paji yo kugaragaza imbere cyangwa ntuyihitemo kugirango hakoreshwe paji uru rubuga rwagennye", + "custom_route": "Umurongo Wundi wa Paji y'Imbere", + "custom_route_help": "Shyiramo izina ry'inzira, utiriwe ushyiraho akarongo (ni ukuvuga ni nko kwandika gusa \"ibiheruka\" cyangwa \"ibikunzwe\")", + "sso.title": "Kwinjiramo ukoreshe serivisi za SSO", + "sso.associated": "Bisanishijwe na", "sso.not-associated": "Click here to associate with" } \ No newline at end of file diff --git a/public/language/rw/users.json b/public/language/rw/users.json index 67afa61e34..16993f0592 100644 --- a/public/language/rw/users.json +++ b/public/language/rw/users.json @@ -16,5 +16,5 @@ "unread_topics": "Ibiganiro Bitarasomwa", "categories": "Ibyiciro", "tags": "Ibimenyetso", - "no-users-found": "No users found!" + "no-users-found": "Nta muntu wabonetse" } \ No newline at end of file From 5705681aa050115c57a3fed2b35cfd7b5af21626 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 26 Mar 2016 14:03:14 -0400 Subject: [PATCH 269/319] tweaked registration queue logic a bit - encoding inputs during url construction - limiting maximum # of parallel requests to 20 - using map instead of forEach --- src/user/approval.js | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/user/approval.js b/src/user/approval.js index 890d6ee2ca..41237043eb 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -147,13 +147,18 @@ module.exports = function(User) { db.getObjects(keys, next); }, function(users, next) { - users.forEach(function(user, index) { - if (user) { - user.timestampISO = utils.toISOString(data[index].score); + users = users.map(function(user, index) { + if (!user) { + return null; } - }); - async.map(users, function(user, next) { + user.timestampISO = utils.toISOString(data[index].score); + delete user.hashedPassword; + + return user; + }).filter(Boolean); + + async.mapLimit(users, 20, function(user, next) { if (!user) { return next(null, user); } @@ -161,18 +166,25 @@ module.exports = function(User) { // temporary: see http://www.stopforumspam.com/forum/viewtopic.php?id=6392 user.ip = user.ip.replace('::ffff:', ''); - request('http://api.stopforumspam.org/api?ip=' + user.ip + '&email=' + user.email + '&username=' + user.username + '&f=json', function (err, response, body) { + request({ + method: 'get', + url: 'http://api.stopforumspam.org/api' + + '?ip=' + encodeURIComponent(user.ip) + + '&email=' + encodeURIComponent(user.email) + + '&username=' + encodeURIComponent(user.username) + + '&f=json', + json: true + }, function (err, response, body) { if (err) { return next(null, user); } if (response.statusCode === 200) { - var data = JSON.parse(body); - user.spamData = data; - - user.usernameSpam = data.username.frequency > 0 || data.username.appears > 0; - user.emailSpam = data.email.frequency > 0 || data.email.appears > 0; - user.ipSpam = data.ip.frequency > 0 || data.ip.appears > 0; + user.spamData = body; + user.usernameSpam = body.username.frequency > 0 || body.username.appears > 0; + user.emailSpam = body.email.frequency > 0 || body.email.appears > 0; + user.ipSpam = body.ip.frequency > 0 || body.ip.appears > 0; } + next(null, user); }); }, next); From 5ebf22ca49d3f9e47d3a34dedcdeb5cda5251ecc Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 26 Mar 2016 14:17:30 -0400 Subject: [PATCH 270/319] upped composer version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef3d95c520..286e4e712d 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "mongodb": "~2.1.3", "morgan": "^1.3.2", "nconf": "~0.8.2", - "nodebb-plugin-composer-default": "3.0.17", + "nodebb-plugin-composer-default": "3.0.18", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.0.3", "nodebb-plugin-markdown": "4.0.17", From 3b4b832f7570c896d3b64b94832790390fdc404b Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Sun, 27 Mar 2016 09:02:12 -0400 Subject: [PATCH 271/319] Latest translations and fallbacks --- public/language/nl/error.json | 4 ++-- public/language/nl/modules.json | 2 +- public/language/nl/user.json | 4 ++-- public/language/rw/error.json | 2 +- public/language/rw/groups.json | 2 +- public/language/rw/modules.json | 26 +++++++++++++------------- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/public/language/nl/error.json b/public/language/nl/error.json index dba42057dd..9b6c912a23 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -27,7 +27,7 @@ "password-too-long": "Wachtwoord is te lang", "user-banned": "Gebruiker verbannen", "user-too-new": "Helaas, het is een vereiste om %1 seconde(n) te wachten voordat het eerste bericht geplaatst kan worden.", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Sorry, uw IP-adres is verbannen uit deze community. Als u meent dat dit onterecht is, neem dan contact op met een beheerder.", "no-category": "Categorie bestaat niet", "no-topic": "Onderwerp bestaat niet", "no-post": "Bericht bestaat niet", @@ -99,5 +99,5 @@ "no-session-found": "Geen login sessie gevonden!", "not-in-room": "Gebruiker niet in de chat", "no-users-in-room": "Er zijn geen gebruikers in deze chat", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Je kunt jezelf niet uit een groep schoppen" } \ No newline at end of file diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index c04af0d2fe..dd7de3cc62 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 is aan het typen ...", "chat.user_has_messaged_you": "%1 heeft een bericht gestuurd", "chat.see_all": "Laat alle chats zien", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Markeer alle chats als gelezen", "chat.no-messages": "Selecteer een ontvanger om de chatgeschiedenis in te zien", "chat.no-users-in-room": "Geen gebruikers in deze chat room", "chat.recent-chats": "Recent gevoerde gesprekken", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index d2964b0fe3..70d646156b 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -39,7 +39,7 @@ "change_username": "Wijzig gebruikersnaam", "change_email": "Wijzig email", "edit": "Bewerken", - "edit-profile": "Edit Profile", + "edit-profile": "Profiel wijzigen", "default_picture": "Standaard icoon", "uploaded_picture": "Geüploade afbeelding", "upload_new_picture": "Nieuwe afbeelding opsturen", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Open uitgaande links naar een externe site in een nieuw tabblad", "enable_topic_searching": "Inschakelen mogelijkheid op onderwerp te kunnen zoeken", "topic_search_help": "Wanneer ingeschakeld zal de standaard zoekfunctie, met een aangepaste methode voor onderwerpen, overschreven worden", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Toon het nieuwe bericht na het plaatsen van een antwoord", "follow_topics_you_reply_to": "Volg de onderwerpen waarop ik gereageerd heb", "follow_topics_you_create": "Volg de onderwerpen waarvan ik de oorspronkelijke auteur ben", "grouptitle": "Selecteer de groepstitel voor weergave", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index 1a224fbb60..a86168d3ef 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -98,6 +98,6 @@ "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", "no-session-found": "No login session found!", "not-in-room": "User not in room", - "no-users-in-room": "No users in this room", + "no-users-in-room": "Nta muntu uri muri iki gikari", "cant-kick-self": "You can't kick yourself from the group" } \ No newline at end of file diff --git a/public/language/rw/groups.json b/public/language/rw/groups.json index 5b02814cab..12ec0b7193 100644 --- a/public/language/rw/groups.json +++ b/public/language/rw/groups.json @@ -24,7 +24,7 @@ "details.has_no_posts": "Uyu munyamuryango ntabwo arashyiraho ikintu na kimwe", "details.latest_posts": "Ibiheruka Gushyirwaho", "details.private": "Yigenga", - "details.disableJoinRequests": "Disable join requests", + "details.disableJoinRequests": "Guhagarika ubusabe bwo kwinjira", "details.grant": "Tanga/Ambura Ubuyobozi", "details.kick": "Tera", "details.owner_options": "Ubuyobozi bw'Itsinda", diff --git a/public/language/rw/modules.json b/public/language/rw/modules.json index 5c8a93b959..e0aff84e80 100644 --- a/public/language/rw/modules.json +++ b/public/language/rw/modules.json @@ -5,10 +5,10 @@ "chat.no_active": "Nta biganiro byo mu gikari ufite. ", "chat.user_typing": "%1 ari kwandika ...", "chat.user_has_messaged_you": "%1 yagusigiye ubutumwa.", - "chat.see_all": "See all chats", - "chat.mark_all_read": "Mark all chats read", + "chat.see_all": "Reba ubutumwa bwose", + "chat.mark_all_read": "Garagaza ubutumwa nk'ubwasomwe", "chat.no-messages": "Hitamo umuntu ushaka kurebera ibyo mwandikiranye", - "chat.no-users-in-room": "No users in this room", + "chat.no-users-in-room": "Nta muntu uri muri iki gikari", "chat.recent-chats": "Ubutumwa Buheruka", "chat.contacts": "Abo Kuvugisha", "chat.message-history": "Ubutumwa Bwahise", @@ -17,9 +17,9 @@ "chat.seven_days": "Iminsi 7", "chat.thirty_days": "Iminsi 30", "chat.three_months": "Amezi 3", - "chat.delete_message_confirm": "Are you sure you wish to delete this message?", - "chat.roomname": "Chat Room %1", - "chat.add-users-to-room": "Add users to room", + "chat.delete_message_confirm": "Wiringiye neza ko ushaka gusiba ubu butumwa?", + "chat.roomname": "Igikari cya %1", + "chat.add-users-to-room": "Ongera abantu mu gikari", "composer.compose": "Andika", "composer.show_preview": "Bona Uko Biza Gusa", "composer.hide_preview": "Hisha Uko Biza Gusa", @@ -28,11 +28,11 @@ "composer.discard": "Wiringiye neza ko ushaka kureka kubishyiraho?", "composer.submit_and_lock": "Shyiraho kandi Unafungirane", "composer.toggle_dropdown": "Hindura Icyerekezo", - "composer.uploading": "Uploading %1", - "bootbox.ok": "OK", - "bootbox.cancel": "Cancel", - "bootbox.confirm": "Confirm", - "cover.dragging_title": "Cover Photo Positioning", - "cover.dragging_message": "Drag the cover photo to the desired position and click \"Save\"", - "cover.saved": "Cover photo image and position saved" + "composer.uploading": "Ugupakira %1", + "bootbox.ok": "Sawa", + "bootbox.cancel": "Isubire", + "bootbox.confirm": "Emeza", + "cover.dragging_title": "Kuringaniza Ifoto yo Hejuru", + "cover.dragging_message": "Kurura ifoto yo hejuru mu cyerekezo ushaka ubundi ubike ibirangijwe", + "cover.saved": "Ibyatunganyijwe ku ifoto yo hejuru byafashe" } \ No newline at end of file From 5d4f61ec96d4cf6bb75f4d1e74545b749ea09da3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 27 Mar 2016 11:32:29 -0400 Subject: [PATCH 272/319] Tweaked scrollToPostIndex logic The old behaviour would scroll the post anchor to the midline, but this was inferior UX for long posts since the top half of the screen is essentially stuff you didn't want to see. The new logic is as follows: - If the target post is smaller than the browser viewport, it will scroll in such a way that the entire post is vertically centered (post midline matching viewport midline) - If the target post is larger than the browser viewport, it will scroll in such a way that the top of the post is located just under the navbar, maximizing the target post's content. - Updated themes to relocate their anchors to in between posts --- package.json | 4 ++-- public/src/modules/navigator.js | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 286e4e712d..016b488605 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.112", - "nodebb-theme-vanilla": "5.0.59", + "nodebb-theme-persona": "4.0.113", + "nodebb-theme-vanilla": "5.0.60", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 3ac5fc16e2..f6ac8c628a 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -190,7 +190,12 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com }; navigator.scrollToPostIndex = function(postIndex, highlight, duration) { - var scrollTo = components.get('post/anchor', postIndex); + var scrollTo = components.get('post/anchor', postIndex), + postEl = components.get('post', 'index', postIndex), + postHeight = postEl.height(), + viewportHeight = $(window).height(), + navbarHeight = components.get('navbar').height(); + if (!scrollTo.length) { navigator.scrollActive = false; @@ -202,7 +207,12 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com var done = false; function animateScroll() { - var scrollTop = (scrollTo.offset().top - ($(window).height() / 2)) + 'px'; + var scrollTop = 0; + if (postHeight < viewportHeight) { + scrollTop = (scrollTo.offset().top - (viewportHeight / 2) + (postHeight / 2)) + 'px'; + } else { + scrollTop = scrollTo.offset().top - navbarHeight; + } $('html, body').animate({ scrollTop: scrollTop From 3e2231d2cb8860c731649f00ef85364bfcdc8ed1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 27 Mar 2016 15:52:26 -0400 Subject: [PATCH 273/319] Fixing viewport shuffling due to image load Introduced new method ".loadImages()" in posts client side lib to handle viewport height changes when loading images. Requires nodebb-plugin-markdown@5.0.0 @BenLubar @boomzillawtf --- package.json | 2 +- public/less/global.less | 21 +++++++++++ public/src/client/topic.js | 13 ++++--- public/src/client/topic/posts.js | 60 ++++++++++++++++++++++++++++++++ public/src/modules/navigator.js | 25 +++++++++---- public/src/utils.js | 17 +++++++++ src/meta/css.js | 1 + 7 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 public/less/global.less diff --git a/package.json b/package.json index 016b488605..fab53b0d04 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "nodebb-plugin-composer-default": "3.0.18", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.0.3", - "nodebb-plugin-markdown": "4.0.17", + "nodebb-plugin-markdown": "5.0.0", "nodebb-plugin-mentions": "1.0.21", "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.6", diff --git a/public/less/global.less b/public/less/global.less new file mode 100644 index 0000000000..80a5807ee3 --- /dev/null +++ b/public/less/global.less @@ -0,0 +1,21 @@ +/* + This stylesheet is applied to all themes and all pages. + They can be overridden by themes, though their presence (or initial settings) may be depended upon by + client-side logic in core. + + ========== +*/ + +/* Prevent viewport shuffling on image load by restricting image dimensions until viewed by the browser */ +[component="post/content"] img:not(.not-responsive) { + height: 1rem; + opacity: 0; + transition: width 500ms ease; + transition: height 500ms ease; + transition: opacity 500ms ease; + + &[data-state="loaded"] { + height: auto; + opacity: 1; + } +} \ No newline at end of file diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 7a989f96aa..d5920d2118 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -61,12 +61,12 @@ define('forum/topic', [ addParentHandler(); - handleBookmark(tid); - handleKeys(); navigator.init('[component="post/anchor"]', ajaxify.data.postcount, Topic.toTop, Topic.toBottom, Topic.navigatorCallback, Topic.calculateIndex); + handleBookmark(tid); + $(window).on('scroll', updateTopicTitle); handleTopicSearch(); @@ -141,6 +141,7 @@ define('forum/topic', [ return navigator.scrollToPostIndex(postIndex, true); } } else if (bookmark && (!config.usePagination || (config.usePagination && ajaxify.data.pagination.currentPage === 1)) && ajaxify.data.postcount > 5) { + navigator.update(); app.alert({ alert_id: 'bookmark', message: '[[topic:bookmark_instructions]]', @@ -156,6 +157,8 @@ define('forum/topic', [ setTimeout(function() { app.removeAlert('bookmark'); }, 10000); + } else { + navigator.update(); } } @@ -233,7 +236,7 @@ define('forum/topic', [ return index; }; - Topic.navigatorCallback = function(index, elementCount) { + Topic.navigatorCallback = function(index, elementCount, threshold) { var path = ajaxify.removeRelativePath(window.location.pathname.slice(1)); if (!path.startsWith('topic')) { return 1; @@ -248,13 +251,13 @@ define('forum/topic', [ newUrl += '/' + index; } + posts.loadImages(threshold); + if (newUrl !== currentUrl) { if (Topic.replaceURLTimeout) { clearTimeout(Topic.replaceURLTimeout); } - Topic.replaceURLTimeout = setTimeout(function() { - updateUserBookmark(index); Topic.replaceURLTimeout = 0; diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 1020edbf27..655277b704 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -231,6 +231,66 @@ define('forum/topic/posts', [ hidePostToolsForDeletedPosts(posts); }; + Posts.loadImages = function(threshold) { + /* + If threshold is defined, images loaded above this threshold will modify + the user's scroll position so they are not scrolled away from content + they were reading. Images loaded below this threshold will push down content. + + If no threshold is defined, loaded images will push down content, as per + default + */ + + var images = components.get('post/content').find('img[data-state="unloaded"]'), + visible = images.filter(function() { + return utils.isElementInViewport(this); + }), + scrollTop = $(window).scrollTop(), + adjusting = false, + adjustQueue = [], + adjustPosition = function() { + adjusting = true; + oldHeight = document.body.clientHeight; + + // Display the image + $(this).attr('data-state', 'loaded'); + newHeight = document.body.clientHeight; + + var imageRect = this.getBoundingClientRect(); + if (imageRect.top < threshold) { + scrollTop = scrollTop + (newHeight - oldHeight); + $(window).scrollTop(scrollTop); + } + + if (adjustQueue.length) { + adjustQueue.pop()(); + } else { + adjusting = false; + } + }, + oldHeight, newHeight; + + // For each image, reset the source and adjust scrollTop when loaded + visible.attr('data-state', 'loading'); + visible.each(function(index, image) { + image = $(image); + + image.on('load', function() { + if (!adjusting) { + adjustPosition.call(this); + } else { + adjustQueue.push(adjustPosition.bind(this)); + } + }); + + image.attr('src', image.attr('data-src')); + if (image.parent().attr('href')) { + image.parent().attr('href', image.attr('data-src')); + } + image.removeAttr('data-src'); + }); + }; + Posts.wrapImagesInLinks = function(posts) { posts.find('[component="post/content"] img:not(.emoji)').each(function() { var $this = $(this); diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index f6ac8c628a..2f6b2d8613 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -1,7 +1,7 @@ 'use strict'; -/* globals app, define, ajaxify, utils, config */ +/* globals define, ajaxify, utils, config */ define('navigator', ['forum/pagination', 'components'], function(pagination, components) { @@ -56,7 +56,6 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com }); navigator.setCount(count); - navigator.update(); }; function generateUrl(index) { @@ -92,7 +91,13 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com $('.pagination-block').toggleClass('ready', flag); } - navigator.update = function() { + navigator.update = function(threshold) { + threshold = typeof threshold === 'number' ? threshold : undefined; + + /* + The "threshold" is defined as the distance from the top of the page to + a spot where a user is expecting to begin reading. + */ var els = $(navigator.selector); if (els.length) { index = parseInt(els.first().attr('data-index'), 10) + 1; @@ -114,7 +119,7 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com }); if (typeof navigator.callback === 'function') { - navigator.callback(index, count); + navigator.callback(index, count, threshold); } navigator.updateTextAndProgressBar(); @@ -202,6 +207,9 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com return; } + // Temporarily disable navigator update on scroll + $(window).off('scroll', navigator.update); + duration = duration !== undefined ? duration : 400; navigator.scrollActive = true; var done = false; @@ -209,21 +217,24 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com function animateScroll() { var scrollTop = 0; if (postHeight < viewportHeight) { - scrollTop = (scrollTo.offset().top - (viewportHeight / 2) + (postHeight / 2)) + 'px'; + scrollTop = (scrollTo.offset().top - (viewportHeight / 2) + (postHeight / 2)); } else { scrollTop = scrollTo.offset().top - navbarHeight; } $('html, body').animate({ - scrollTop: scrollTop + scrollTop: scrollTop + 'px' }, duration, function() { if (done) { + // Re-enable onScroll behaviour + $(window).on('scroll', navigator.update); + var scrollToRect = scrollTo.get(0).getBoundingClientRect(); + navigator.update(scrollToRect.top); return; } done = true; navigator.scrollActive = false; - navigator.update(); highlightPost(); $('body').scrollTop($('body').scrollTop() - 1); $('html').scrollTop($('html').scrollTop() - 1); diff --git a/public/src/utils.js b/public/src/utils.js index 68de6a3506..78e0013c25 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -309,6 +309,23 @@ return labels; }, + /* Retrieved from http://stackoverflow.com/a/7557433 @ 27 Mar 2016 */ + isElementInViewport: function(el) { + //special bonus for those using jQuery + if (typeof jQuery === "function" && el instanceof jQuery) { + el = el[0]; + } + + var rect = el.getBoundingClientRect(); + + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ + rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ + ); + }, + // get all the url params in a single key/value hash params: function(options) { var a, hash = {}, params; diff --git a/src/meta/css.js b/src/meta/css.js index 81fa0528c2..9dd9849d76 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -72,6 +72,7 @@ module.exports = function(Meta) { source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/blacklist.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/generics.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/mixins.less";'; + source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/global.less";'; var acpSource = '\n@import "..' + path.sep + 'public/less/admin/admin";\n' + source; acpSource += '\n@import "..' + path.sep + 'public/less/generics.less";'; From 2caae05f4b4fc4d14fed2e250bc5f3ab2bd5c719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 28 Mar 2016 00:19:25 +0300 Subject: [PATCH 274/319] up themes --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fab53b0d04..49219add30 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.113", - "nodebb-theme-vanilla": "5.0.60", + "nodebb-theme-persona": "4.0.114", + "nodebb-theme-vanilla": "5.0.61", "nodebb-widget-essentials": "2.0.8", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", From 28db642050932f83b0300e21d7763c4fb877eced Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 27 Mar 2016 18:56:21 -0400 Subject: [PATCH 275/319] Fixing regression from 3e2231d2cb8860c731649f00ef85364bfcdc8ed1 @BenLubar --- package.json | 2 +- public/js-enabled.css | 7 ++ public/less/global.less | 11 +++- public/src/app.js | 106 +++++++++++++++++-------------- public/src/client/topic/posts.js | 10 +++ 5 files changed, 83 insertions(+), 53 deletions(-) create mode 100644 public/js-enabled.css diff --git a/package.json b/package.json index 49219add30..9adf788c69 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "nodebb-plugin-composer-default": "3.0.18", "nodebb-plugin-dbsearch": "1.0.1", "nodebb-plugin-emoji-extended": "1.0.3", - "nodebb-plugin-markdown": "5.0.0", + "nodebb-plugin-markdown": "5.0.1", "nodebb-plugin-mentions": "1.0.21", "nodebb-plugin-soundpack-default": "0.1.6", "nodebb-plugin-spam-be-gone": "0.4.6", diff --git a/public/js-enabled.css b/public/js-enabled.css new file mode 100644 index 0000000000..f59881974e --- /dev/null +++ b/public/js-enabled.css @@ -0,0 +1,7 @@ +/* + The following stylesheet is only included on pages that can execute javascript +*/ + +[component="post/content"] img:not(.not-responsive):not([data-state]) { + display: none !important; +} \ No newline at end of file diff --git a/public/less/global.less b/public/less/global.less index 80a5807ee3..d9f16c74e8 100644 --- a/public/less/global.less +++ b/public/less/global.less @@ -7,14 +7,19 @@ */ /* Prevent viewport shuffling on image load by restricting image dimensions until viewed by the browser */ -[component="post/content"] img:not(.not-responsive) { - height: 1rem; - opacity: 0; +[component="post/content"] img { transition: width 500ms ease; transition: height 500ms ease; transition: opacity 500ms ease; + &[data-state="unloaded"], &[data-state="loading"] { + display: inherit; + height: 1rem; + opacity: 0; + } + &[data-state="loaded"] { + display: inherit; height: auto; opacity: 1; } diff --git a/public/src/app.js b/public/src/app.js index 2d37b53a41..791aabd628 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -24,65 +24,65 @@ app.cacheBuster = null; }); app.load = function() { - $('document').ready(function () { - var url = ajaxify.start(window.location.pathname.slice(1) + window.location.search + window.location.hash, true); - ajaxify.end(url, app.template); + app.loadProgressiveStylesheet(); - handleStatusChange(); + var url = ajaxify.start(window.location.pathname.slice(1) + window.location.search + window.location.hash, true); + ajaxify.end(url, app.template); - if (config.searchEnabled) { - app.handleSearch(); - } + handleStatusChange(); - $('#content').on('click', '#new_topic', function(){ - app.newTopic(); - }); + if (config.searchEnabled) { + app.handleSearch(); + } - require(['components'], function(components) { - components.get('user/logout').on('click', app.logout); - }); + $('#content').on('click', '#new_topic', function(){ + app.newTopic(); + }); - Visibility.change(function(e, state){ - if (state === 'visible') { - app.isFocused = true; - app.alternatingTitle(''); - } else if (state === 'hidden') { - app.isFocused = false; - } - }); + require(['components'], function(components) { + components.get('user/logout').on('click', app.logout); + }); - overrides.overrideBootbox(); - overrides.overrideTimeago(); - createHeaderTooltips(); - app.showEmailConfirmWarning(); - - socket.removeAllListeners('event:nodebb.ready'); - socket.on('event:nodebb.ready', function(data) { - if (!app.cacheBusters || app.cacheBusters['cache-buster'] !== data['cache-buster']) { - app.cacheBusters = data; - - app.alert({ - alert_id: 'forum_updated', - title: '[[global:updated.title]]', - message: '[[global:updated.message]]', - clickfn: function() { - window.location.reload(); - }, - type: 'warning' - }); - } - }); + Visibility.change(function(e, state){ + if (state === 'visible') { + app.isFocused = true; + app.alternatingTitle(''); + } else if (state === 'hidden') { + app.isFocused = false; + } + }); - require(['taskbar', 'helpers', 'forum/pagination'], function(taskbar, helpers, pagination) { - taskbar.init(); + overrides.overrideBootbox(); + overrides.overrideTimeago(); + createHeaderTooltips(); + app.showEmailConfirmWarning(); - // templates.js helpers - helpers.register(); + socket.removeAllListeners('event:nodebb.ready'); + socket.on('event:nodebb.ready', function(data) { + if (!app.cacheBusters || app.cacheBusters['cache-buster'] !== data['cache-buster']) { + app.cacheBusters = data; - pagination.init(); + app.alert({ + alert_id: 'forum_updated', + title: '[[global:updated.title]]', + message: '[[global:updated.message]]', + clickfn: function() { + window.location.reload(); + }, + type: 'warning' + }); + } + }); - $(window).trigger('action:app.load'); - }); + require(['taskbar', 'helpers', 'forum/pagination'], function(taskbar, helpers, pagination) { + taskbar.init(); + + // templates.js helpers + helpers.register(); + + pagination.init(); + + $(window).trigger('action:app.load'); }); }; @@ -539,4 +539,12 @@ app.cacheBuster = null; } }); }; + + app.loadProgressiveStylesheet = function() { + var linkEl = document.createElement('link'); + linkEl.rel = 'stylesheet'; + linkEl.href = config.relative_path + '/js-enabled.css'; + + document.head.appendChild(linkEl); + } }()); diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 655277b704..63241fc370 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -218,6 +218,7 @@ define('forum/topic/posts', [ }; Posts.processPage = function(posts) { + Posts.unloadImages(); Posts.showBottomPostBar(); posts.find('[component="post/content"] img:not(.not-responsive)').addClass('img-responsive'); app.createUserTooltips(posts); @@ -231,6 +232,15 @@ define('forum/topic/posts', [ hidePostToolsForDeletedPosts(posts); }; + Posts.unloadImages = function() { + var images = components.get('post/content').find('img:not(.not-responsive)'); + images.each(function() { + $(this).attr('data-src', $(this).attr('src')); + $(this).attr('data-state', 'unloaded'); + $(this).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'); + }); + }; + Posts.loadImages = function(threshold) { /* If threshold is defined, images loaded above this threshold will modify From add82ba6c905ac6f5863708986e6153208d783d7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 01:53:36 -0400 Subject: [PATCH 276/319] Added threshold detection when scrolling upwards ... for less jolty upwards scrolling. --- public/src/client/topic.js | 4 ++-- public/src/client/topic/posts.js | 6 +++--- public/src/modules/navigator.js | 13 +++++++++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index d5920d2118..848c0f35be 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -141,7 +141,7 @@ define('forum/topic', [ return navigator.scrollToPostIndex(postIndex, true); } } else if (bookmark && (!config.usePagination || (config.usePagination && ajaxify.data.pagination.currentPage === 1)) && ajaxify.data.postcount > 5) { - navigator.update(); + navigator.update(0); app.alert({ alert_id: 'bookmark', message: '[[topic:bookmark_instructions]]', @@ -158,7 +158,7 @@ define('forum/topic', [ app.removeAlert('bookmark'); }, 10000); } else { - navigator.update(); + navigator.update(0); } } diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 63241fc370..e00bf2d617 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -218,7 +218,7 @@ define('forum/topic/posts', [ }; Posts.processPage = function(posts) { - Posts.unloadImages(); + Posts.unloadImages(posts); Posts.showBottomPostBar(); posts.find('[component="post/content"] img:not(.not-responsive)').addClass('img-responsive'); app.createUserTooltips(posts); @@ -232,8 +232,8 @@ define('forum/topic/posts', [ hidePostToolsForDeletedPosts(posts); }; - Posts.unloadImages = function() { - var images = components.get('post/content').find('img:not(.not-responsive)'); + Posts.unloadImages = function(posts) { + var images = posts.find('[component="post/content"] img:not(.not-responsive)'); images.each(function() { $(this).attr('data-src', $(this).attr('src')); $(this).attr('data-state', 'unloaded'); diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 2f6b2d8613..cb553962a7 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -92,12 +92,12 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com } navigator.update = function(threshold) { - threshold = typeof threshold === 'number' ? threshold : undefined; - /* The "threshold" is defined as the distance from the top of the page to a spot where a user is expecting to begin reading. */ + threshold = typeof threshold === 'number' ? threshold : undefined; + var els = $(navigator.selector); if (els.length) { index = parseInt(els.first().attr('data-index'), 10) + 1; @@ -118,6 +118,15 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com } }); + // If a threshold is undefined, try to determine one based on new index + if (threshold === undefined) { + var anchorEl = components.get('post/anchor', index - 1), + anchorRect = anchorEl.get(0).getBoundingClientRect(); + + threshold = anchorRect.top; + console.log('new index', index, anchorEl, threshold); + } + if (typeof navigator.callback === 'function') { navigator.callback(index, count, threshold); } From cc60767eb02baa4f39d55eb84fe2887cb58f9f9c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 02:06:24 -0400 Subject: [PATCH 277/319] removed console logging :dog: --- public/src/modules/navigator.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index cb553962a7..7127f1f15c 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -124,7 +124,6 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com anchorRect = anchorEl.get(0).getBoundingClientRect(); threshold = anchorRect.top; - console.log('new index', index, anchorEl, threshold); } if (typeof navigator.callback === 'function') { From 6df78f8ad005ce8b92b7245d081d5389f6ba9269 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 03:06:35 -0400 Subject: [PATCH 278/319] fixing some more jitteriness when scrolling upwards --- public/src/client/topic/posts.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index e00bf2d617..5823d81b65 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -233,12 +233,17 @@ define('forum/topic/posts', [ }; Posts.unloadImages = function(posts) { - var images = posts.find('[component="post/content"] img:not(.not-responsive)'); + var images = posts.find('[component="post/content"] img:not(.not-responsive)'), + scrollTop = $(window).scrollTop(), + height = $(document).height(); + images.each(function() { $(this).attr('data-src', $(this).attr('src')); $(this).attr('data-state', 'unloaded'); $(this).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'); }); + + $(window).scrollTop(scrollTop + $(document).height() - height); }; Posts.loadImages = function(threshold) { @@ -313,10 +318,13 @@ define('forum/topic/posts', [ Posts.showBottomPostBar = function() { var mainPost = components.get('post', 'index', 0); var posts = $('[component="post"]'); + var height = $(document).height(); if (!!mainPost.length && posts.length > 1 && $('.post-bar').length < 2) { $('.post-bar').clone().appendTo(mainPost); + $(window).scrollTop($(window).scrollTop() + $(document).height() - height); } else if (mainPost.length && posts.length < 2) { mainPost.find('.post-bar').remove(); + $(window).scrollTop($(window).scrollTop() - $(document).height() - height); } }; From 3b9120cd385216b2c395643c52182a02eb3ee2cf Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 28 Mar 2016 11:28:41 +0300 Subject: [PATCH 279/319] closes #4476 --- public/src/client/topic.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 848c0f35be..cd0464e9aa 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -82,6 +82,9 @@ define('forum/topic', [ function onKeyDown(ev) { if (ev.target.nodeName === 'BODY') { + if (ev.shiftKey || ev.ctrlKey || ev.altKey) { + return; + } if (ev.which === 36) { // home key Topic.toTop(); return false; From e0f6b4edf09c0ef68abcf4b65bc5e713c491fcad Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Mon, 28 Mar 2016 09:02:18 -0400 Subject: [PATCH 280/319] Latest translations and fallbacks --- public/language/fr/error.json | 4 ++-- public/language/fr/global.json | 4 ++-- public/language/fr/groups.json | 2 +- public/language/fr/modules.json | 8 ++++---- public/language/fr/user.json | 4 ++-- public/language/fr/users.json | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/language/fr/error.json b/public/language/fr/error.json index b34f0c58c6..d80c43277e 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -27,7 +27,7 @@ "password-too-long": "Mot de passe trop long", "user-banned": "Utilisateur banni", "user-too-new": "Désolé, vous devez attendre encore %1 seconde(s) avant d'envoyer votre premier message", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Désolé, votre adresse IP a été bannie de cette communauté. Si vous pensez que c'est une erreur, veuillez contacter un administrateur.", "no-category": "Cette catégorie n'existe pas", "no-topic": "Ce sujet n'existe pas", "no-post": "Ce message n'existe pas", @@ -99,5 +99,5 @@ "no-session-found": "Pas de session de connexion trouvé!", "not-in-room": "L'utilisateur n'est pas dans cette salle", "no-users-in-room": "Aucun utilisateur dans cette salle", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Vous ne pouvez pas vous exclure vous-même du groupe" } \ No newline at end of file diff --git a/public/language/fr/global.json b/public/language/fr/global.json index f7bd29a1b6..7096b63f7c 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -29,13 +29,13 @@ "header.popular": "Populaire", "header.users": "Utilisateurs", "header.groups": "Groupes", - "header.chats": "Chats", + "header.chats": "Discussions", "header.notifications": "Notifications", "header.search": "Recherche", "header.profile": "Profil", "header.navigation": "Navigation", "notifications.loading": "Chargement des notifications", - "chats.loading": "Chargement des chats", + "chats.loading": "Chargement des discussions", "motd.welcome": "Bienvenue sur NodeBB, la plate-forme de discussion du futur.", "previouspage": "Page précédente", "nextpage": "Page suivante", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 05f17fbd59..65a5274979 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Masqué", "details.hidden_help": "Si cette case est cochée, ce groupe n'est pas affiché dans la liste des groupes, et les utilisateurs devront être invités manuellement.", "details.delete_group": "Supprimer le groupe", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Les groupes privés sont désactivés au niveau du système, cette option ne déclenche rien", "event.updated": "Les détails du groupe ont été mis à jour", "event.deleted": "Le groupe \"%1\" a été supprimé", "membership.accept-invitation": "Accepter l'invitation", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index 27ee80e92f..33fd5fe494 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -1,14 +1,14 @@ { "chat.chatting_with": "Discuter avec ", - "chat.placeholder": "Tapez votre message ici, appuyez sur Entrer pour envoyer", + "chat.placeholder": "Tapez votre message ici, appuyez sur Entrée pour envoyer", "chat.send": "Envoyer", "chat.no_active": "Vous n'avez aucune discussion en cours.", "chat.user_typing": "%1 est en train d'écrire ...", "chat.user_has_messaged_you": "%1 vous a envoyé un message.", "chat.see_all": "Voir toutes les discussions", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Marquer toutes les discussions comme lues", "chat.no-messages": "Veuillez sélectionner un destinataire pour voir l'historique des discussions", - "chat.no-users-in-room": "Aucun utilisateur dans cette salle", + "chat.no-users-in-room": "Aucun participant à cette discussion", "chat.recent-chats": "Discussions récentes", "chat.contacts": "Contacts", "chat.message-history": "Historique des messages", @@ -19,7 +19,7 @@ "chat.three_months": "3 Mois", "chat.delete_message_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?", "chat.roomname": "Salle de discussion %1", - "chat.add-users-to-room": "Ajouter des utilisateurs à la salle", + "chat.add-users-to-room": "Ajouter des participants", "composer.compose": "Écrire", "composer.show_preview": "Afficher l'aperçu", "composer.hide_preview": "Masquer l'aperçu", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 34c1026e7e..0a6450fdd3 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -39,7 +39,7 @@ "change_username": "Changer le nom d'utilisateur", "change_email": "Changer l'e-mail", "edit": "Éditer", - "edit-profile": "Edit Profile", + "edit-profile": "Éditer le profil", "default_picture": "Icône par défaut", "uploaded_picture": "Image envoyée", "upload_new_picture": "Envoyer une nouvelle image", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet", "enable_topic_searching": "Activer la recherche dans les sujets", "topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts affichés à l'écran.", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Après avoir répondu, montrer le nouveau message", "follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez", "follow_topics_you_create": "Suivre les sujets que vous créez", "grouptitle": "Sélectionnez le titre de groupe que vous souhaitez afficher", diff --git a/public/language/fr/users.json b/public/language/fr/users.json index d70a54698e..fad9536811 100644 --- a/public/language/fr/users.json +++ b/public/language/fr/users.json @@ -3,7 +3,7 @@ "top_posters": "Actifs", "most_reputation": "Réputés", "search": "Rechercher", - "enter_username": "Entrer un nom d'utilisateur pour rechercher", + "enter_username": "Entrez le nom d'un utilisateur", "load_more": "Charger la suite", "users-found-search-took": "%1 utilisateur(s) trouvé(s)! La recherche a pris %2 secondes.", "filter-by": "Filtrer par", From 31e70ac5a8ef053ce3f44f0ef2207fb79cec98e6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 14:02:56 -0400 Subject: [PATCH 281/319] applying threshold detection only to topics re: #4477 --- public/src/modules/navigator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 7127f1f15c..73ea9b8946 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -119,7 +119,7 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com }); // If a threshold is undefined, try to determine one based on new index - if (threshold === undefined) { + if (threshold === undefined && ajaxify.currentPage.startsWith('topic')) { var anchorEl = components.get('post/anchor', index - 1), anchorRect = anchorEl.get(0).getBoundingClientRect(); From 1783a07067dff9303ba92e753b40b46d3eb81114 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 14:50:02 -0400 Subject: [PATCH 282/319] more tweaks to threshold --- public/less/global.less | 2 +- public/src/client/topic/posts.js | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/less/global.less b/public/less/global.less index d9f16c74e8..458fa4b8e6 100644 --- a/public/less/global.less +++ b/public/less/global.less @@ -14,7 +14,7 @@ &[data-state="unloaded"], &[data-state="loading"] { display: inherit; - height: 1rem; + height: 2rem; opacity: 0; } diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 5823d81b65..35e7ec5d29 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -10,7 +10,9 @@ define('forum/topic/posts', [ 'components' ], function(pagination, infinitescroll, postTools, navigator, components) { - var Posts = {}; + var Posts = { + _threshold: 0 + }; Posts.onNewPost = function(data) { if (!data || !data.posts || !data.posts.length) { @@ -255,6 +257,7 @@ define('forum/topic/posts', [ If no threshold is defined, loaded images will push down content, as per default */ + Posts._threshold = threshold; var images = components.get('post/content').find('img[data-state="unloaded"]'), visible = images.filter(function() { @@ -272,7 +275,7 @@ define('forum/topic/posts', [ newHeight = document.body.clientHeight; var imageRect = this.getBoundingClientRect(); - if (imageRect.top < threshold) { + if (imageRect.top < Posts._threshold) { scrollTop = scrollTop + (newHeight - oldHeight); $(window).scrollTop(scrollTop); } From 5e3a114b17b3fe738efc9c841e5905a5e740552e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 19:55:40 -0400 Subject: [PATCH 283/319] added LRU cache to registration queue data --- package.json | 1 + src/user/approval.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/package.json b/package.json index 9adf788c69..5289968835 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "autoprefixer": "^6.2.3", "bcryptjs": "~2.3.0", "body-parser": "^1.9.0", + "checksum": "^0.1.1", "colors": "^1.1.0", "compression": "^1.1.0", "connect-ensure-login": "^0.1.1", diff --git a/src/user/approval.js b/src/user/approval.js index 41237043eb..273ad3a3a2 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -3,6 +3,8 @@ var async = require('async'); var request = require('request'); +var LRU = require('lru-cache'); +var checksum = require('checksum'); var db = require('../database'); var meta = require('../meta'); @@ -12,6 +14,11 @@ var groups = require('../groups'); var translator = require('../../public/src/modules/translator'); var utils = require('../../public/src/utils'); +var sfsCache = LRU({ + max: 500, + maxAge: 1000*60*60*24 // one day +}); + module.exports = function(User) { @@ -163,6 +170,17 @@ module.exports = function(User) { return next(null, user); } + var sum = checksum(user.ip+user.email+user.username); + if (sfsCache.has(sum)) { + var cached = sfsCache.get(sum); + user.spamData = cached; + user.usernameSpam = cached.username.frequency > 0 || cached.username.appears > 0; + user.emailSpam = cached.email.frequency > 0 || cached.email.appears > 0; + user.ipSpam = cached.ip.frequency > 0 || cached.ip.appears > 0; + + return next(null, user); + } + // temporary: see http://www.stopforumspam.com/forum/viewtopic.php?id=6392 user.ip = user.ip.replace('::ffff:', ''); @@ -179,6 +197,7 @@ module.exports = function(User) { return next(null, user); } if (response.statusCode === 200) { + sfsCache.set(sum, body); user.spamData = body; user.usernameSpam = body.username.frequency > 0 || body.username.appears > 0; user.emailSpam = body.email.frequency > 0 || body.email.appears > 0; From 879a8ba55020b2b417306c1e8c9c0edb5b0ef837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 29 Mar 2016 11:00:21 +0300 Subject: [PATCH 284/319] up widget-essentials --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5289968835..f6b5639d22 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "nodebb-theme-lavender": "3.0.9", "nodebb-theme-persona": "4.0.114", "nodebb-theme-vanilla": "5.0.61", - "nodebb-widget-essentials": "2.0.8", + "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", "nodemailer-smtp-transport": "^2.4.1", From 99ae0eb378c3ea240e2e0ade0e5cdbd0b4f44b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 29 Mar 2016 11:26:28 +0300 Subject: [PATCH 285/319] closes #4468 --- package.json | 1 - src/controllers/admin/users.js | 13 +++++++++++-- src/user/approval.js | 21 +-------------------- src/views/admin/manage/registration.tpl | 2 ++ 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index f6b5639d22..f3855046fc 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "autoprefixer": "^6.2.3", "bcryptjs": "~2.3.0", "body-parser": "^1.9.0", - "checksum": "^0.1.1", "colors": "^1.1.0", "compression": "^1.1.0", "connect-ensure-login": "^0.1.1", diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 3651767153..7e5bd530d6 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -77,10 +77,17 @@ usersController.banned = function(req, res, next) { }; usersController.registrationQueue = function(req, res, next) { + var page = parseInt(req.query.page, 10) || 1; + var itemsPerPage = 20; + var start = (page - 1) * 20; + var stop = start + itemsPerPage - 1; var invitations; async.parallel({ + registrationQueueCount: function(next) { + db.sortedSetCard('registration:queue', next); + }, users: function(next) { - user.getRegistrationQueue(0, -1, next); + user.getRegistrationQueue(start, stop, next); }, invites: function(next) { async.waterfall([ @@ -118,6 +125,8 @@ usersController.registrationQueue = function(req, res, next) { if (err) { return next(err); } + var pageCount = Math.max(1, Math.ceil(data.registrationQueueCount / itemsPerPage)); + data.pagination = pagination.create(page, pageCount); res.render('admin/manage/registration', data); }); }; @@ -146,7 +155,7 @@ function getUsers(set, section, req, res, next) { var data = { users: results.users, page: page, - pageCount: Math.ceil(results.count / resultsPerPage) + pageCount: Math.max(1, Math.ceil(results.count / resultsPerPage)) }; data[section] = true; render(req, res, data); diff --git a/src/user/approval.js b/src/user/approval.js index 273ad3a3a2..94e0f097e5 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -3,8 +3,6 @@ var async = require('async'); var request = require('request'); -var LRU = require('lru-cache'); -var checksum = require('checksum'); var db = require('../database'); var meta = require('../meta'); @@ -14,11 +12,6 @@ var groups = require('../groups'); var translator = require('../../public/src/modules/translator'); var utils = require('../../public/src/utils'); -var sfsCache = LRU({ - max: 500, - maxAge: 1000*60*60*24 // one day -}); - module.exports = function(User) { @@ -165,22 +158,11 @@ module.exports = function(User) { return user; }).filter(Boolean); - async.mapLimit(users, 20, function(user, next) { + async.map(users, function(user, next) { if (!user) { return next(null, user); } - var sum = checksum(user.ip+user.email+user.username); - if (sfsCache.has(sum)) { - var cached = sfsCache.get(sum); - user.spamData = cached; - user.usernameSpam = cached.username.frequency > 0 || cached.username.appears > 0; - user.emailSpam = cached.email.frequency > 0 || cached.email.appears > 0; - user.ipSpam = cached.ip.frequency > 0 || cached.ip.appears > 0; - - return next(null, user); - } - // temporary: see http://www.stopforumspam.com/forum/viewtopic.php?id=6392 user.ip = user.ip.replace('::ffff:', ''); @@ -197,7 +179,6 @@ module.exports = function(User) { return next(null, user); } if (response.statusCode === 200) { - sfsCache.set(sum, body); user.spamData = body; user.usernameSpam = body.username.frequency > 0 || body.username.appears > 0; user.emailSpam = body.email.frequency > 0 || body.email.appears > 0; diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index f4dbe697ef..d293d8cfa4 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -55,6 +55,8 @@
      + +
      From ff09789812fabaf8c306be2e345951dc6356123a Mon Sep 17 00:00:00 2001 From: Raphael Beer Date: Tue, 29 Mar 2016 09:59:47 +0200 Subject: [PATCH 286/319] Check file size locally. --- public/src/modules/uploader.js | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index 575508b2b9..65e1a481e3 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -16,9 +16,10 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { }; module.show = function(data, callback) { + var fileSize = data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false; parseModal({ showHelp: data.hasOwnProperty('showHelp') && data.showHelp !== undefined ? data.showHelp : true, - fileSize: data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false, + fileSize: fileSize, title: data.title || '[[global:upload_file]]', description: data.description || '', button: data.button || '[[global:upload]]', @@ -40,13 +41,17 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { }); uploadForm.submit(function() { - onSubmit(uploadModal, callback); + onSubmit(uploadModal, fileSize, callback); return false; }); }); }; - function onSubmit(uploadModal, callback) { + module.hideAlerts = function(modal) { + $(modal).find('#alert-status, #alert-success, #alert-error, #upload-progress-box').addClass('hide'); + }; + + function onSubmit(uploadModal, fileSize, callback) { function showAlert(type, message) { module.hideAlerts(uploadModal); uploadModal.find('#alert-' + type).translateText(message).removeClass('hide'); @@ -57,9 +62,13 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { uploadModal.find('#upload-progress-bar').css('width', '0%'); uploadModal.find('#upload-progress-box').show().removeClass('hide'); - if (!uploadModal.find('#fileInput').val()) { + var fileInput = uploadModal.find('#fileInput'); + if (!fileInput.val()) { return showAlert('error', '[[uploads:select-file-to-upload]]'); } + if (hasValidFileSize(fileInput[0], fileSize) === false) { + return showAlert('error', '[[error:file-too-big, ' + fileSize + ']]'); + } uploadModal.find('#uploadForm').ajaxSubmit({ headers: { @@ -107,9 +116,11 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { return response; } - module.hideAlerts = function(modal) { - $(modal).find('#alert-status, #alert-success, #alert-error, #upload-progress-box').addClass('hide'); - }; + function hasValidFileSize(fileElement, maxSize) { + if (window.FileReader && maxSize) { + return fileElement.files[0].size <= maxSize * 1000; + } + } return module; }); From 3a27e7b0ea527dfe8bfbb84e8899e50016205910 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 29 Mar 2016 12:39:41 +0300 Subject: [PATCH 287/319] closes #4405 --- public/src/client/topic.js | 8 ++++---- public/src/modules/navigator.js | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index cd0464e9aa..9d52262676 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -222,10 +222,10 @@ define('forum/topic', [ function updateTopicTitle() { var span = components.get('navbar/title').find('span'); - if ($(window).scrollTop() > 50) { - span.html(ajaxify.data.title).show(); - } else { - span.html('').hide(); + if ($(window).scrollTop() > 50 && span.hasClass('hidden')) { + span.html(ajaxify.data.title).removeClass('hidden'); + } else if ($(window).scrollTop() <= 50 && !span.hasClass('hidden')) { + span.html('').addClass('hidden'); } if ($(window).scrollTop() > 300) { app.removeAlert('bookmark'); diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 7127f1f15c..89bfc737ee 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -103,7 +103,10 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com index = parseInt(els.first().attr('data-index'), 10) + 1; } - var middleOfViewport = $(window).scrollTop() + $(window).height() / 2; + var scrollTop = $(window).scrollTop(); + var windowHeight = $(window).height(); + var documentHeight = $(document).height(); + var middleOfViewport = scrollTop + windowHeight / 2; var previousDistance = Number.MAX_VALUE; els.each(function() { var distanceToMiddle = Math.abs(middleOfViewport - $(this).offset().top); @@ -118,10 +121,19 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com } }); + + // check if we are at the top + if (scrollTop === 0 && parseInt(els.first().attr('data-index'), 10) === 0) { + index = 1; + // check if we are near the bottom + } else if (scrollTop + windowHeight > documentHeight - 100 && parseInt(els.last().attr('data-index'), 10) === count - 1) { + index = count; + } + // If a threshold is undefined, try to determine one based on new index if (threshold === undefined) { - var anchorEl = components.get('post/anchor', index - 1), - anchorRect = anchorEl.get(0).getBoundingClientRect(); + var anchorEl = components.get('post/anchor', index - 1); + var anchorRect = anchorEl.get(0).getBoundingClientRect(); threshold = anchorRect.top; } From 32c18a1cd8124ed6123d058d2d6750dc7ec1b559 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 29 Mar 2016 13:19:01 -0400 Subject: [PATCH 288/319] updated gruntfile to not watch subdependencies --- Gruntfile.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index fa4ceed1e9..c2fccca2b6 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -57,19 +57,32 @@ module.exports = function(grunt) { grunt.initConfig({ watch: { lessUpdated_Client: { - files: ['public/*.less', 'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/*/*.less', 'node_modules/nodebb-*/*/*/*.less', 'node_modules/nodebb-*/*/*/*/*.less'] + files: [ + 'public/*.less', + 'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/**/*.less', + '!node_modules/nodebb-*/node_modules/**' + ] }, lessUpdated_Admin: { files: ['public/**/*.less'] }, clientUpdated: { - files: ['public/src/**/*.js', 'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/*/*.js', 'node_modules/nodebb-*/*/*/*.js', 'node_modules/nodebb-*/*/*/*/*.js', 'node_modules/templates.js/lib/templates.js'] + files: [ + 'public/src/**/*.js', + 'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/**/*.js', + '!node_modules/nodebb-*/node_modules/**', + 'node_modules/templates.js/lib/templates.js' + ] }, serverUpdated: { files: ['*.js', 'install/*.js', 'src/**/*.js'] }, templatesUpdated: { - files: ['src/views/**/*.tpl', 'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/*/*.tpl', 'node_modules/nodebb-*/*/*/*.tpl', 'node_modules/nodebb-*/*/*/*/*.tpl', 'node_modules/nodebb-*/*/*/*/*/*.tpl'] + files: [ + 'src/views/**/*.tpl', + 'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/**/*.tpl', + '!node_modules/nodebb-*/node_modules/**' + ] } } }); From f12903a3fe9827192bd5833ed34d0ff2d151fea5 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 29 Mar 2016 14:37:40 -0400 Subject: [PATCH 289/319] grunt watch: ignore .git folders --- Gruntfile.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index c2fccca2b6..a6aca2083a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -60,7 +60,8 @@ module.exports = function(grunt) { files: [ 'public/*.less', 'node_modules/nodebb-*/*.less', 'node_modules/nodebb-*/**/*.less', - '!node_modules/nodebb-*/node_modules/**' + '!node_modules/nodebb-*/node_modules/**', + '!node_modules/nodebb-*/.git/**' ] }, lessUpdated_Admin: { @@ -71,7 +72,8 @@ module.exports = function(grunt) { 'public/src/**/*.js', 'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/**/*.js', '!node_modules/nodebb-*/node_modules/**', - 'node_modules/templates.js/lib/templates.js' + 'node_modules/templates.js/lib/templates.js', + '!node_modules/nodebb-*/.git/**' ] }, serverUpdated: { @@ -81,7 +83,8 @@ module.exports = function(grunt) { files: [ 'src/views/**/*.tpl', 'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/**/*.tpl', - '!node_modules/nodebb-*/node_modules/**' + '!node_modules/nodebb-*/node_modules/**', + '!node_modules/nodebb-*/.git/**' ] } } From 29b336ad9fa3806662123dac17c4b1a09ae870ab Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 29 Mar 2016 14:57:55 -0400 Subject: [PATCH 290/319] closes #4480 --- public/src/admin/admin.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index 22258d4f66..bed154107a 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -16,21 +16,21 @@ }); } - $(window).on('action:ajaxify.contentLoaded', function(ev, data) { - var url = data.url; - - selectMenuItem(data.url); - setupRestartLinks(); - - componentHandler.upgradeDom(); - }); - $('[component="logout"]').on('click', app.logout); app.alert = launchSnackbar; configureSlidemenu(); }); + $(window).on('action:ajaxify.contentLoaded', function(ev, data) { + var url = data.url; + + selectMenuItem(data.url); + setupRestartLinks(); + + componentHandler.upgradeDom(); + }); + function setupKeybindings() { Mousetrap.bind('ctrl+shift+a r', function() { require(['admin/modules/instance'], function(instance) { From b15e5a8d174beefc014611e032cbeacfba5853bd Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 29 Mar 2016 15:02:32 -0400 Subject: [PATCH 291/319] closes #4475 --- public/src/client/search.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/public/src/client/search.js b/public/src/client/search.js index c6bc30e44f..6ca5b8dc41 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -118,25 +118,25 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco return; } - try { - var regexStr = searchQuery.replace(/^"/, '').replace(/"$/, '').trim().split(' ').join('|'); - var regex = new RegExp('(' + regexStr + ')', 'gi'); - - $('.search-result-text').each(function() { - var result = $(this); + var regexStr = searchQuery.replace(/^"/, '').replace(/"$/, '').trim().split(' ').join('|'); + var regex = new RegExp('(' + regexStr + ')', 'gi'); - var text = result.html().replace(regex, '$1'); - result.html(text).find('img:not(.not-responsive)').addClass('img-responsive').each(function() { - $(this).attr('src', $(this).attr('src').replace(/([\s\S]*?)<\/strong>/gi, '$1')); - }); + $('.search-result-text p, .search-result-text h4').each(function() { + var result = $(this), nested = []; - result.find('a').each(function() { - $(this).attr('href', $(this).attr('href').replace(/([\s\S]*?)<\/strong>/gi, '$1')); - }); + result.find('*').each(function() { + $(this).after(''); + nested.push($('
      ').append($(this))); }); - } catch(e) { - return; - } + + result.html(result.html().replace(regex, '$1')); + + for (var i = 0, ii = nested.length; i < ii; i++) { + result.html(result.html().replace('', nested[i].html())); + } + }); + + $('.search-result-text').find('img:not(.not-responsive)').addClass('img-responsive'); } function handleSavePreferences() { From e99d95251d08a40c54d9e4279c2dbe686a967afd Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 29 Mar 2016 15:14:19 -0400 Subject: [PATCH 292/319] up persona --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f3855046fc..e675f0d17f 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "nodebb-plugin-spam-be-gone": "0.4.6", "nodebb-rewards-essentials": "0.0.8", "nodebb-theme-lavender": "3.0.9", - "nodebb-theme-persona": "4.0.114", + "nodebb-theme-persona": "4.0.115", "nodebb-theme-vanilla": "5.0.61", "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", From 6a74589e31d274e7e1df983ad73a082c12549d50 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 29 Mar 2016 16:55:30 -0400 Subject: [PATCH 293/319] closes https://github.com/NodeBB/nodebb-theme-persona/issues/250 --- public/src/modules/helpers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index dd15d0dab6..3c964b819c 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -100,13 +100,13 @@ return style.join('; ') + ';'; }; - helpers.generateChildrenCategories = function(category, relative_path) { + helpers.generateChildrenCategories = function(category) { var html = ''; category.children.forEach(function(child) { if (!child) { return; } - var link = child.link ? child.link : ('/category/' + child.slug); + var link = child.link ? child.link : (config.relative_path + '/category/' + child.slug); html += '' + '' + '' + From 3d0db5b397cbb5eddeeb6cfc3cd631db4b57adf6 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 29 Mar 2016 17:52:50 -0400 Subject: [PATCH 294/319] closes #4481 --- src/groups/membership.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/groups/membership.js b/src/groups/membership.js index 18327579e5..747fa9d3d7 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -93,7 +93,8 @@ module.exports = function(Groups) { bodyShort: '[[groups:request.notification_title, ' + username + ']]', bodyLong: '[[groups:request.notification_text, ' + username + ', ' + groupName + ']]', nid: 'group:' + groupName + ':uid:' + uid + ':request', - path: '/groups/' + utils.slugify(groupName) + path: '/groups/' + utils.slugify(groupName), + from: uid }, next); }, owners: function(next) { From b534ba8cc1c5aefc6fbaa7e8bdea68a66eec6cf5 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Wed, 30 Mar 2016 09:02:21 -0400 Subject: [PATCH 295/319] Latest translations and fallbacks --- public/language/ko/error.json | 4 ++-- public/language/ko/groups.json | 2 +- public/language/ko/modules.json | 2 +- public/language/ko/user.json | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 026ba3dfb1..edb0a3a88d 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -27,7 +27,7 @@ "password-too-long": "패스워드가 너무 깁니다.", "user-banned": "차단된 사용자입니다.", "user-too-new": "죄송합니다, 첫 번째 게시물은 %1 초 후에 작성할 수 있습니다.", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "죄송하지만, 당신의 IP는 이 커뮤니티로부터 차단되었습니다. 만약 에러라는 생각이 드신다면 관리자에게 연락해주세요.", "no-category": "존재하지 않는 카테고리입니다.", "no-topic": "존재하지 않는 주제입니다.", "no-post": "존재하지 않는 게시물입니다.", @@ -99,5 +99,5 @@ "no-session-found": "로그인 세션을 찾을 수 없습니다.", "not-in-room": "없는 사용자입니다.", "no-users-in-room": "사용자가 없습니다.", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "스스로 이 그룹을 탈퇴할 수 없습니다." } \ No newline at end of file diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index aaba4f6565..18eb6a0b07 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -41,7 +41,7 @@ "details.hidden": "숨김", "details.hidden_help": "활성 시 그룹 목록에 노출되지 않습니다. 또한 구성원은 초대를 통해서만 가입이 가능합니다.", "details.delete_group": "그룹 삭제", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "비공개 그룹은 시스템에 의해 비활성화 되었으며, 이 옵션은 아무 기능도 하지 않습니다", "event.updated": "그룹 정보가 업데이트 되었습니다.", "event.deleted": "%1 그룹이 삭제되었습니다.", "membership.accept-invitation": "초대 수락", diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index f815b89ef4..99aea82699 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1님이 입력 중입니다.", "chat.user_has_messaged_you": "%1님이 메시지를 보냈습니다.", "chat.see_all": "모든 대화 보기", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "읽은 채팅 읽음으로 표시", "chat.no-messages": "대화 기록을 보려면 대화 상대를 선택하세요.", "chat.no-users-in-room": "사용자가 없습니다.", "chat.recent-chats": "최근 대화 내용", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 3ff7c3244e..b86ed76b19 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -39,7 +39,7 @@ "change_username": "사용자명 변경", "change_email": "이메일 변경", "edit": "프로필 수정", - "edit-profile": "Edit Profile", + "edit-profile": "프로필 수정하기", "default_picture": "기본 아이콘", "uploaded_picture": "사진 업로드", "upload_new_picture": "새 사진 업로드", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "외부 링크를 새로운 탭을 사용하여 열람", "enable_topic_searching": "주제 내 검색 허용", "topic_search_help": "활성화 된후 브라우저의 기본 페이지 검색 기능을 연관 주제 검색 기능으로 대신하고 화면에 보여지는 것 뿐만 아니라 주제와 연관된 모든것을 검색합니다.", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "답글 게시 후 새 포스트 보여주기", "follow_topics_you_reply_to": "답글 단 게시물을 팔로우 합니다.", "follow_topics_you_create": "생성한 주제를 팔로우 합니다.", "grouptitle": "표시할 그룹 이름을 선택하세요.", From cb2ea163a05d1311196bb66197f9a1903959f25f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 30 Mar 2016 18:13:25 +0300 Subject: [PATCH 296/319] closes #4486 --- src/controllers/accounts/settings.js | 6 ++++-- src/groups.js | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 0b180be686..36d62d882b 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -33,7 +33,7 @@ settingsController.get = function(req, res, callback) { user.getSettings(userData.uid, next); }, userGroups: function(next) { - groups.getUserGroups([userData.uid], next); + groups.getUserGroupsFromSet('groups:createtime', [userData.uid], next); }, languages: function(next) { languages.list(next); @@ -49,7 +49,9 @@ settingsController.get = function(req, res, callback) { }, function(results, next) { userData.settings = results.settings; - userData.userGroups = results.userGroups[0]; + userData.userGroups = results.userGroups[0].filter(function(group) { + return group && group.userTitleEnabled && !groups.isPrivilegeGroup(group.name); + }); userData.languages = results.languages; userData.homePageRoutes = results.homePageRoutes; userData.ips = results.ips; diff --git a/src/groups.js b/src/groups.js index 10d9137b8c..2df5dc3ce2 100644 --- a/src/groups.js +++ b/src/groups.js @@ -425,9 +425,13 @@ var utils = require('../public/src/utils'); }; Groups.getUserGroups = function(uids, callback) { + Groups.getUserGroupsFromSet('groups:visible:createtime', uids, callback); + }; + + Groups.getUserGroupsFromSet = function (set, uids, callback) { async.waterfall([ function(next) { - db.getSortedSetRevRange('groups:visible:createtime', 0, -1, next); + db.getSortedSetRevRange(set, 0, -1, next); }, function(groupNames, next) { var groupSets = groupNames.map(function(name) { From d92fde982448270b6a78e90f3f57e9c2e218843b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 30 Mar 2016 18:19:15 +0300 Subject: [PATCH 297/319] filter out registered users --- src/controllers/accounts/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 36d62d882b..b5b020c118 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -50,7 +50,7 @@ settingsController.get = function(req, res, callback) { function(results, next) { userData.settings = results.settings; userData.userGroups = results.userGroups[0].filter(function(group) { - return group && group.userTitleEnabled && !groups.isPrivilegeGroup(group.name); + return group && group.userTitleEnabled && !groups.isPrivilegeGroup(group.name) && group.name !== 'registered-users'; }); userData.languages = results.languages; userData.homePageRoutes = results.homePageRoutes; From a978f763e3bfebab54768f874a01da8700fdf8b5 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 11:44:42 -0400 Subject: [PATCH 298/319] fixes crash https://github.com/NodeBB/nodebb-theme-persona/issues/250 --- public/src/modules/helpers.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 3c964b819c..fda87711fb 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -1,6 +1,6 @@ ;(function(exports) { "use strict"; - /* globals define, utils */ + /* globals define, utils, config */ // export the class if we are in a Node-like system. if (typeof module === 'object' && module.exports === exports) { @@ -102,11 +102,13 @@ helpers.generateChildrenCategories = function(category) { var html = ''; + var relative_path = (typeof config !== 'undefined' ? config.relative_path : require('nconf').get('relative_path')); + category.children.forEach(function(child) { if (!child) { return; } - var link = child.link ? child.link : (config.relative_path + '/category/' + child.slug); + var link = child.link ? child.link : (relative_path + '/category/' + child.slug); html += '' + '' + '' + From 81fae681ab7c67c927f08672870f3df5507852e2 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 30 Mar 2016 13:05:30 -0400 Subject: [PATCH 299/319] added uploads.json as source file for translations --- .tx/config | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/.tx/config b/.tx/config index a7f7e2f98b..65d891131e 100644 --- a/.tx/config +++ b/.tx/config @@ -919,4 +919,50 @@ trans.tr = public/language/tr/groups.json trans.vi = public/language/vi/groups.json trans.zh_CN = public/language/zh_CN/groups.json trans.zh_TW = public/language/zh_TW/groups.json +type = KEYVALUEJSON + +[nodebb.uploads] +file_filter = public/language//uploads.json +source_file = public/language/en_GB/uploads.json +source_lang = en_GB +trans.ar = public/language/ar/uploads.json +trans.bn = public/language/bn/uploads.json +trans.bg = public/language/bg/uploads.json +trans.cs = public/language/cs/uploads.json +trans.da = public/language/da/uploads.json +trans.de = public/language/de/uploads.json +trans.el = public/language/el/uploads.json +trans.en_US = public/language/en_US/uploads.json +trans.en@pirate = public/language/en@pirate/uploads.json +trans.es = public/language/es/uploads.json +trans.et = public/language/et/uploads.json +trans.fa_IR = public/language/fa_IR/uploads.json +trans.fi = public/language/fi/uploads.json +trans.fr = public/language/fr/uploads.json +trans.gl = public/language/gl/uploads.json +trans.he = public/language/he/uploads.json +trans.hu = public/language/hu/uploads.json +trans.id = public/language/id/uploads.json +trans.it = public/language/it/uploads.json +trans.ja = public/language/ja/uploads.json +trans.ko = public/language/ko/uploads.json +trans.lt = public/language/lt/uploads.json +trans.ms = public/language/ms/uploads.json +trans.nb = public/language/nb/uploads.json +trans.nl = public/language/nl/uploads.json +trans.pl = public/language/pl/uploads.json +trans.pt_BR = public/language/pt_BR/uploads.json +trans.ru = public/language/ru/uploads.json +trans.ro = public/language/ro/uploads.json +trans.rw = public/language/rw/uploads.json +trans.sc = public/language/sc/uploads.json +trans.sk = public/language/sk/uploads.json +trans.sl = public/language/sl/uploads.json +trans.sr = public/language/sr/uploads.json +trans.sv = public/language/sv/uploads.json +trans.th = public/language/th/uploads.json +trans.tr = public/language/tr/uploads.json +trans.vi = public/language/vi/uploads.json +trans.zh_CN = public/language/zh_CN/uploads.json +trans.zh_TW = public/language/zh_TW/uploads.json type = KEYVALUEJSON \ No newline at end of file From 7fe5346fe46ffb8518455576e186bea8b17b3a26 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 30 Mar 2016 13:06:48 -0400 Subject: [PATCH 300/319] latest fallbacks for uploads resource @rbeer --- public/language/ar/uploads.json | 6 ++++++ public/language/bg/uploads.json | 6 ++++++ public/language/bn/uploads.json | 6 ++++++ public/language/cs/uploads.json | 6 ++++++ public/language/da/uploads.json | 6 ++++++ public/language/de/uploads.json | 6 ++++++ public/language/el/uploads.json | 6 ++++++ public/language/en@pirate/uploads.json | 6 ++++++ public/language/en_US/uploads.json | 6 ++++++ public/language/es/uploads.json | 6 ++++++ public/language/et/uploads.json | 6 ++++++ public/language/fa_IR/uploads.json | 6 ++++++ public/language/fi/uploads.json | 6 ++++++ public/language/fr/uploads.json | 6 ++++++ public/language/gl/uploads.json | 6 ++++++ public/language/he/uploads.json | 6 ++++++ public/language/hu/uploads.json | 6 ++++++ public/language/id/uploads.json | 6 ++++++ public/language/it/uploads.json | 6 ++++++ public/language/ja/uploads.json | 6 ++++++ public/language/ko/uploads.json | 6 ++++++ public/language/lt/uploads.json | 6 ++++++ public/language/ms/uploads.json | 6 ++++++ public/language/nb/uploads.json | 6 ++++++ public/language/nl/uploads.json | 6 ++++++ public/language/pl/uploads.json | 6 ++++++ public/language/pt_BR/uploads.json | 6 ++++++ public/language/ro/uploads.json | 6 ++++++ public/language/ru/uploads.json | 6 ++++++ public/language/rw/uploads.json | 6 ++++++ public/language/sc/uploads.json | 6 ++++++ public/language/sk/uploads.json | 6 ++++++ public/language/sl/uploads.json | 6 ++++++ public/language/sr/uploads.json | 6 ++++++ public/language/sv/uploads.json | 6 ++++++ public/language/th/uploads.json | 6 ++++++ public/language/tr/uploads.json | 6 ++++++ public/language/vi/uploads.json | 6 ++++++ public/language/zh_CN/uploads.json | 6 ++++++ public/language/zh_TW/uploads.json | 6 ++++++ 40 files changed, 240 insertions(+) create mode 100644 public/language/ar/uploads.json create mode 100644 public/language/bg/uploads.json create mode 100644 public/language/bn/uploads.json create mode 100644 public/language/cs/uploads.json create mode 100644 public/language/da/uploads.json create mode 100644 public/language/de/uploads.json create mode 100644 public/language/el/uploads.json create mode 100644 public/language/en@pirate/uploads.json create mode 100644 public/language/en_US/uploads.json create mode 100644 public/language/es/uploads.json create mode 100644 public/language/et/uploads.json create mode 100644 public/language/fa_IR/uploads.json create mode 100644 public/language/fi/uploads.json create mode 100644 public/language/fr/uploads.json create mode 100644 public/language/gl/uploads.json create mode 100644 public/language/he/uploads.json create mode 100644 public/language/hu/uploads.json create mode 100644 public/language/id/uploads.json create mode 100644 public/language/it/uploads.json create mode 100644 public/language/ja/uploads.json create mode 100644 public/language/ko/uploads.json create mode 100644 public/language/lt/uploads.json create mode 100644 public/language/ms/uploads.json create mode 100644 public/language/nb/uploads.json create mode 100644 public/language/nl/uploads.json create mode 100644 public/language/pl/uploads.json create mode 100644 public/language/pt_BR/uploads.json create mode 100644 public/language/ro/uploads.json create mode 100644 public/language/ru/uploads.json create mode 100644 public/language/rw/uploads.json create mode 100644 public/language/sc/uploads.json create mode 100644 public/language/sk/uploads.json create mode 100644 public/language/sl/uploads.json create mode 100644 public/language/sr/uploads.json create mode 100644 public/language/sv/uploads.json create mode 100644 public/language/th/uploads.json create mode 100644 public/language/tr/uploads.json create mode 100644 public/language/vi/uploads.json create mode 100644 public/language/zh_CN/uploads.json create mode 100644 public/language/zh_TW/uploads.json diff --git a/public/language/ar/uploads.json b/public/language/ar/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/ar/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/bg/uploads.json b/public/language/bg/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/bg/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/bn/uploads.json b/public/language/bn/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/bn/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/cs/uploads.json b/public/language/cs/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/cs/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/da/uploads.json b/public/language/da/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/da/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/de/uploads.json b/public/language/de/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/de/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/el/uploads.json b/public/language/el/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/el/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/en@pirate/uploads.json b/public/language/en@pirate/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/en@pirate/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/en_US/uploads.json b/public/language/en_US/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/en_US/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/es/uploads.json b/public/language/es/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/es/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/et/uploads.json b/public/language/et/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/et/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/fa_IR/uploads.json b/public/language/fa_IR/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/fa_IR/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/fi/uploads.json b/public/language/fi/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/fi/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/fr/uploads.json b/public/language/fr/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/fr/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/gl/uploads.json b/public/language/gl/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/gl/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/he/uploads.json b/public/language/he/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/he/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/hu/uploads.json b/public/language/hu/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/hu/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/id/uploads.json b/public/language/id/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/id/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/it/uploads.json b/public/language/it/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/it/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/ja/uploads.json b/public/language/ja/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/ja/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/ko/uploads.json b/public/language/ko/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/ko/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/lt/uploads.json b/public/language/lt/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/lt/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/ms/uploads.json b/public/language/ms/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/ms/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/nb/uploads.json b/public/language/nb/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/nb/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/nl/uploads.json b/public/language/nl/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/nl/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/pl/uploads.json b/public/language/pl/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/pl/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/pt_BR/uploads.json b/public/language/pt_BR/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/pt_BR/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/ro/uploads.json b/public/language/ro/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/ro/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/ru/uploads.json b/public/language/ru/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/ru/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/rw/uploads.json b/public/language/rw/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/rw/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/sc/uploads.json b/public/language/sc/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/sc/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/sk/uploads.json b/public/language/sk/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/sk/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/sl/uploads.json b/public/language/sl/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/sl/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/sr/uploads.json b/public/language/sr/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/sr/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/sv/uploads.json b/public/language/sv/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/sv/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/th/uploads.json b/public/language/th/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/th/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/tr/uploads.json b/public/language/tr/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/tr/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/vi/uploads.json b/public/language/vi/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/vi/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/zh_CN/uploads.json b/public/language/zh_CN/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/zh_CN/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file diff --git a/public/language/zh_TW/uploads.json b/public/language/zh_TW/uploads.json new file mode 100644 index 0000000000..1622cb5693 --- /dev/null +++ b/public/language/zh_TW/uploads.json @@ -0,0 +1,6 @@ +{ + "uploading-file": "Uploading the file...", + "select-file-to-upload": "Select a file to upload!", + "upload-success": "File uploaded successfully!", + "maximum-file-size": "Maximum %1 kb" +} \ No newline at end of file From fc65b144b17c2916c53b5db8adecdac9578527c1 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 13:25:12 -0400 Subject: [PATCH 301/319] running less compilation in series --- src/meta/css.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meta/css.js b/src/meta/css.js index 9dd9849d76..36e5f52417 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -81,7 +81,7 @@ module.exports = function(Meta) { source = '@import "./theme";\n' + source; var fromFile = nconf.get('from-file') || ''; - async.parallel([ + async.series([ function(next) { if (fromFile.match('clientLess')) { winston.info('[minifier] Compiling front-end LESS files skipped'); From 07ddcb03f94f21ab798a0fd541598ad4aa1582e4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 30 Mar 2016 14:00:49 -0400 Subject: [PATCH 302/319] fixes #3902 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e675f0d17f..1b1a5794ac 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "devDependencies": { "mocha": "~1.13.0", "grunt": "~0.4.5", - "grunt-contrib-watch": "^0.6.1" + "grunt-contrib-watch": "^1.0.0" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" From e13468932409f916ca8094c0f2ae435b20f5586e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 14:18:47 -0400 Subject: [PATCH 303/319] we were accidentally including client-side LESS on the ACP --- src/meta/css.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/meta/css.js b/src/meta/css.js index 36e5f52417..9688f880c9 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -43,7 +43,8 @@ module.exports = function(Meta) { path.join(__dirname, '../../public/vendor/fontawesome/less'), path.join(__dirname, '../../public/vendor/bootstrap/less') ], - source = '@import "font-awesome";'; + source = '@import "font-awesome";', + acpSource = '@import "font-awesome";'; plugins.lessFiles = filterMissingFiles(plugins.lessFiles); plugins.cssFiles = filterMissingFiles(plugins.cssFiles); @@ -67,20 +68,20 @@ module.exports = function(Meta) { source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/css/smoothness/jquery-ui-1.10.4.custom.min.css";'; source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";'; - source += '\n@import (inline) "..' + path.sep + '..' + path.sep + 'public/vendor/colorpicker/colorpicker.css";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/flags.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/blacklist.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/generics.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/mixins.less";'; source += '\n@import "..' + path.sep + '..' + path.sep + 'public/less/global.less";'; + source = '@import "./theme";\n' + source; - var acpSource = '\n@import "..' + path.sep + 'public/less/admin/admin";\n' + source; + acpSource += '\n@import "..' + path.sep + 'public/less/admin/admin";\n'; acpSource += '\n@import "..' + path.sep + 'public/less/generics.less";'; acpSource += '\n@import (inline) "..' + path.sep + 'public/vendor/colorpicker/colorpicker.css";'; - source = '@import "./theme";\n' + source; var fromFile = nconf.get('from-file') || ''; + async.series([ function(next) { if (fromFile.match('clientLess')) { From acd24d856f7bc9a18433185c48051c224916c204 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 14:37:00 -0400 Subject: [PATCH 304/319] run tasks in series to speed up startup time --- src/meta.js | 22 +++++++++------------- src/meta/css.js | 10 ++++++++-- src/meta/js.js | 14 +++++++++----- src/webserver.js | 2 +- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/meta.js b/src/meta.js index 716d90e9cb..ffc85c98bf 100644 --- a/src/meta.js +++ b/src/meta.js @@ -61,20 +61,16 @@ var async = require('async'), async.apply(plugins.clearRequireCache), async.apply(plugins.reload), async.apply(plugins.reloadRoutes), + async.apply(Meta.css.minify), + async.apply(Meta.js.minify, 'nodebb.min.js'), + async.apply(Meta.js.minify, 'acp.min.js'), + async.apply(Meta.sounds.init), + async.apply(Meta.templates.compile), + async.apply(auth.reloadRoutes), function(next) { - async.parallel([ - async.apply(Meta.js.minify, 'nodebb.min.js'), - async.apply(Meta.js.minify, 'acp.min.js'), - async.apply(Meta.css.minify), - async.apply(Meta.sounds.init), - async.apply(Meta.templates.compile), - async.apply(auth.reloadRoutes), - function(next) { - Meta.config['cache-buster'] = utils.generateUUID(); - templates.flush(); - next(); - } - ], next); + Meta.config['cache-buster'] = utils.generateUUID(); + templates.flush(); + next(); } ], function(err) { if (!err) { diff --git a/src/meta/css.js b/src/meta/css.js index 9688f880c9..9307389b3b 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -150,7 +150,7 @@ module.exports = function(Meta) { }); } - Meta.css.commitToFile = function(filename) { + Meta.css.commitToFile = function(filename, callback) { var file = (filename === 'acpCache' ? 'admin' : 'stylesheet') + '.css'; fs.writeFile(path.join(__dirname, '../../public/' + file), Meta.css[filename], function(err) { @@ -160,6 +160,8 @@ module.exports = function(Meta) { winston.error('[meta/css] ' + err.message); process.exit(0); } + + callback(); }); }; @@ -195,7 +197,11 @@ module.exports = function(Meta) { // Save the compiled CSS in public/ so things like nginx can serve it if (nconf.get('isPrimary') === 'true') { - Meta.css.commitToFile(destination); + return Meta.css.commitToFile(destination, function() { + if (typeof callback === 'function') { + callback(null, result.css); + } + }); } if (typeof callback === 'function') { diff --git a/src/meta/js.js b/src/meta/js.js index f2fabac6ac..7ee5f0eb17 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -89,6 +89,8 @@ module.exports = function(Meta) { return; } + winston.verbose('[meta/js] Minifying ' + target); + var forkProcessParams = setupDebugging(); var minifier = Meta.js.minifierProc = fork('minifier.js', [], forkProcessParams); @@ -119,11 +121,12 @@ module.exports = function(Meta) { }); } - Meta.js.commitToFile(target); + Meta.js.commitToFile(target, function() { + if (typeof callback === 'function') { + callback(); + } + }); - if (typeof callback === 'function') { - callback(); - } break; case 'error': winston.error('[meta/js] Could not compile ' + target + ': ' + message.message); @@ -185,7 +188,7 @@ module.exports = function(Meta) { } }; - Meta.js.commitToFile = function(target) { + Meta.js.commitToFile = function(target, callback) { fs.writeFile(path.join(__dirname, '../../public/' + target), Meta.js.target[target].cache, function (err) { if (err) { winston.error('[meta/js] ' + err.message); @@ -194,6 +197,7 @@ module.exports = function(Meta) { winston.verbose('[meta/js] ' + target + ' committed to disk.'); emitter.emit('meta:js.compiled'); + callback(); }); }; diff --git a/src/webserver.js b/src/webserver.js index 1db202e520..057c9a5e8a 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -85,7 +85,7 @@ function initializeNodeBB(callback) { plugins.init(app, middleware, next); }, function(next) { - async.parallel([ + async.series([ async.apply(meta.templates.compile), async.apply(!skipJS ? meta.js.minify : meta.js.getFromFile, 'nodebb.min.js'), async.apply(!skipJS ? meta.js.minify : meta.js.getFromFile, 'acp.min.js'), From e2bc5f241a91115d464659ac92dd5a4692de53be Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 15:54:45 -0400 Subject: [PATCH 305/319] optimizing process.send for js minification --- loader.js | 8 ++------ src/meta/js.js | 6 ++---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/loader.js b/loader.js index 5676a02bbd..7672ebf6dd 100644 --- a/loader.js +++ b/loader.js @@ -122,15 +122,11 @@ Loader.addWorkerEvents = function(worker) { Loader.reload(); break; case 'js-propagate': - Loader.js.target[message.target] = Loader.js.target[message.target] || {}; - Loader.js.target[message.target].cache = message.cache; - Loader.js.target[message.target].map = message.map; + Loader.js.target = message.data; Loader.notifyWorkers({ action: 'js-propagate', - cache: message.cache, - map: message.map, - target: message.target + data: message.data }, worker.pid); break; case 'css-propagate': diff --git a/src/meta/js.js b/src/meta/js.js index 7ee5f0eb17..5da279ed01 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -112,12 +112,10 @@ module.exports = function(Meta) { winston.verbose('[meta/js] ' + target + ' minification complete'); minifier.kill(); - if (process.send) { + if (process.send && Meta.js.target.length > 1) { process.send({ action: 'js-propagate', - cache: Meta.js.target[target].cache, - map: Meta.js.target[target].map, - target: target + data: Meta.js.target }); } From 359b1fbe1a455a5665659ec20f5e9ab2c7aabc6a Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 16:05:11 -0400 Subject: [PATCH 306/319] cleanup --- src/meta/js.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/meta/js.js b/src/meta/js.js index 5da279ed01..740b5e08ee 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -112,7 +112,7 @@ module.exports = function(Meta) { winston.verbose('[meta/js] ' + target + ' minification complete'); minifier.kill(); - if (process.send && Meta.js.target.length > 1) { + if (process.send && Meta.js.target['nodebb.min.js'] && Meta.js.target['acp.min.js']) { process.send({ action: 'js-propagate', data: Meta.js.target @@ -193,7 +193,6 @@ module.exports = function(Meta) { process.exit(0); } - winston.verbose('[meta/js] ' + target + ' committed to disk.'); emitter.emit('meta:js.compiled'); callback(); }); From 12ed4d2af55808c81b5b9d12d9ff77c51c916e61 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 30 Mar 2016 16:55:54 -0400 Subject: [PATCH 307/319] remove PostCSS log --- src/meta/css.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/meta/css.js b/src/meta/css.js index 9307389b3b..12c5d49c20 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -187,7 +187,6 @@ module.exports = function(Meta) { return; } - winston.verbose('[meta/css] Running PostCSS Plugins'); postcss([ autoprefixer ]).process(lessOutput.css).then(function (result) { result.warnings().forEach(function (warn) { winston.verbose(warn.toString()); From 8ae2afff0575d0968cb504523f4e6d160151a38c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 29 Mar 2016 22:49:10 -0400 Subject: [PATCH 308/319] Revert "more tweaks to threshold" This reverts commit 1783a07067dff9303ba92e753b40b46d3eb81114. --- public/less/global.less | 2 +- public/src/client/topic/posts.js | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/public/less/global.less b/public/less/global.less index 458fa4b8e6..d9f16c74e8 100644 --- a/public/less/global.less +++ b/public/less/global.less @@ -14,7 +14,7 @@ &[data-state="unloaded"], &[data-state="loading"] { display: inherit; - height: 2rem; + height: 1rem; opacity: 0; } diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 35e7ec5d29..5823d81b65 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -10,9 +10,7 @@ define('forum/topic/posts', [ 'components' ], function(pagination, infinitescroll, postTools, navigator, components) { - var Posts = { - _threshold: 0 - }; + var Posts = {}; Posts.onNewPost = function(data) { if (!data || !data.posts || !data.posts.length) { @@ -257,7 +255,6 @@ define('forum/topic/posts', [ If no threshold is defined, loaded images will push down content, as per default */ - Posts._threshold = threshold; var images = components.get('post/content').find('img[data-state="unloaded"]'), visible = images.filter(function() { @@ -275,7 +272,7 @@ define('forum/topic/posts', [ newHeight = document.body.clientHeight; var imageRect = this.getBoundingClientRect(); - if (imageRect.top < Posts._threshold) { + if (imageRect.top < threshold) { scrollTop = scrollTop + (newHeight - oldHeight); $(window).scrollTop(scrollTop); } From 1385d19f64ec03f9e08d4621e609cd6dbfa72ac9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 30 Mar 2016 18:10:03 -0400 Subject: [PATCH 309/319] Further tweaks to viewport shuffling and dynamic image loading @BenLubar --- public/less/global.less | 2 +- public/src/client/topic/posts.js | 125 ++++++++++++++++--------------- public/src/modules/navigator.js | 18 +++-- 3 files changed, 76 insertions(+), 69 deletions(-) diff --git a/public/less/global.less b/public/less/global.less index d9f16c74e8..d606b8221c 100644 --- a/public/less/global.less +++ b/public/less/global.less @@ -14,7 +14,7 @@ &[data-state="unloaded"], &[data-state="loading"] { display: inherit; - height: 1rem; + height: 0; opacity: 0; } diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 5823d81b65..2cbe2a0d2a 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -10,7 +10,9 @@ define('forum/topic/posts', [ 'components' ], function(pagination, infinitescroll, postTools, navigator, components) { - var Posts = {}; + var Posts = { + _imageLoaderTimeout: undefined + }; Posts.onNewPost = function(data) { if (!data || !data.posts || !data.posts.length) { @@ -240,70 +242,74 @@ define('forum/topic/posts', [ images.each(function() { $(this).attr('data-src', $(this).attr('src')); $(this).attr('data-state', 'unloaded'); - $(this).attr('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'); + $(this).attr('src', 'about:blank'); }); - - $(window).scrollTop(scrollTop + $(document).height() - height); }; Posts.loadImages = function(threshold) { - /* - If threshold is defined, images loaded above this threshold will modify - the user's scroll position so they are not scrolled away from content - they were reading. Images loaded below this threshold will push down content. - - If no threshold is defined, loaded images will push down content, as per - default - */ - - var images = components.get('post/content').find('img[data-state="unloaded"]'), - visible = images.filter(function() { - return utils.isElementInViewport(this); - }), - scrollTop = $(window).scrollTop(), - adjusting = false, - adjustQueue = [], - adjustPosition = function() { - adjusting = true; - oldHeight = document.body.clientHeight; - - // Display the image - $(this).attr('data-state', 'loaded'); - newHeight = document.body.clientHeight; - - var imageRect = this.getBoundingClientRect(); - if (imageRect.top < threshold) { - scrollTop = scrollTop + (newHeight - oldHeight); - $(window).scrollTop(scrollTop); - } + if (Posts._imageLoaderTimeout) { + clearTimeout(Posts._imageLoaderTimeout); + } - if (adjustQueue.length) { - adjustQueue.pop()(); - } else { - adjusting = false; - } - }, - oldHeight, newHeight; - - // For each image, reset the source and adjust scrollTop when loaded - visible.attr('data-state', 'loading'); - visible.each(function(index, image) { - image = $(image); - - image.on('load', function() { - if (!adjusting) { - adjustPosition.call(this); - } else { - adjustQueue.push(adjustPosition.bind(this)); + Posts._imageLoaderTimeout = setTimeout(function() { + /* + If threshold is defined, images loaded above this threshold will modify + the user's scroll position so they are not scrolled away from content + they were reading. Images loaded below this threshold will push down content. + + If no threshold is defined, loaded images will push down content, as per + default + */ + + var images = components.get('post/content').find('img[data-state="unloaded"]'), + visible = images.filter(function() { + return utils.isElementInViewport(this); + }), + scrollTop = $(window).scrollTop(), + adjusting = false, + adjustQueue = [], + adjustPosition = function() { + adjusting = true; + oldHeight = document.body.clientHeight; + + // Display the image + $(this).attr('data-state', 'loaded'); + newHeight = document.body.clientHeight; + + var imageRect = this.getBoundingClientRect(); + if (imageRect.top < threshold) { + scrollTop = scrollTop + (newHeight - oldHeight); + $(window).scrollTop(scrollTop); + } + + if (adjustQueue.length) { + adjustQueue.pop()(); + } else { + adjusting = false; + } + }, + oldHeight, newHeight; + + // For each image, reset the source and adjust scrollTop when loaded + visible.attr('data-state', 'loading'); + visible.each(function(index, image) { + image = $(image); + + image.on('load', function() { + if (!adjusting) { + adjustPosition.call(this); + } else { + adjustQueue.push(adjustPosition.bind(this)); + } + }); + + image.attr('src', image.attr('data-src')); + if (image.parent().attr('href')) { + image.parent().attr('href', image.attr('data-src')); } + image.removeAttr('data-src'); }); - - image.attr('src', image.attr('data-src')); - if (image.parent().attr('href')) { - image.parent().attr('href', image.attr('data-src')); - } - image.removeAttr('data-src'); - }); + }, 250); }; Posts.wrapImagesInLinks = function(posts) { @@ -318,13 +324,10 @@ define('forum/topic/posts', [ Posts.showBottomPostBar = function() { var mainPost = components.get('post', 'index', 0); var posts = $('[component="post"]'); - var height = $(document).height(); if (!!mainPost.length && posts.length > 1 && $('.post-bar').length < 2) { $('.post-bar').clone().appendTo(mainPost); - $(window).scrollTop($(window).scrollTop() + $(document).height() - height); } else if (mainPost.length && posts.length < 2) { mainPost.find('.post-bar').remove(); - $(window).scrollTop($(window).scrollTop() - $(document).height() - height); } }; diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 6877abe8db..3d65f6b8a0 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -121,20 +121,24 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com } }); + var atTop = scrollTop === 0 && parseInt(els.first().attr('data-index'), 10) === 0, + nearBottom = scrollTop + windowHeight > documentHeight - 100 && parseInt(els.last().attr('data-index'), 10) === count - 1; - // check if we are at the top - if (scrollTop === 0 && parseInt(els.first().attr('data-index'), 10) === 0) { + if (atTop) { index = 1; - // check if we are near the bottom - } else if (scrollTop + windowHeight > documentHeight - 100 && parseInt(els.last().attr('data-index'), 10) === count - 1) { + } else if (nearBottom) { index = count; } // If a threshold is undefined, try to determine one based on new index if (threshold === undefined) { - var anchorEl = components.get('post/anchor', index - 1); - var anchorRect = anchorEl.get(0).getBoundingClientRect(); - threshold = anchorRect.top; + if (atTop) { + threshold = 0; + } else { + var anchorEl = components.get('post/anchor', index - 1); + var anchorRect = anchorEl.get(0).getBoundingClientRect(); + threshold = anchorRect.top; + } } if (typeof navigator.callback === 'function') { From 58cc25e38573ab9c3e2771e24d02b86c9536727f Mon Sep 17 00:00:00 2001 From: Raphael Beer Date: Thu, 31 Mar 2016 14:26:53 +0200 Subject: [PATCH 310/319] Set default hasValidFileSize return to true --- public/src/modules/uploader.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index 65e1a481e3..6a0d7f161a 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -66,7 +66,7 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { if (!fileInput.val()) { return showAlert('error', '[[uploads:select-file-to-upload]]'); } - if (hasValidFileSize(fileInput[0], fileSize) === false) { + if (!hasValidFileSize(fileInput[0], fileSize)) { return showAlert('error', '[[error:file-too-big, ' + fileSize + ']]'); } @@ -120,6 +120,7 @@ define('uploader', ['csrf', 'translator'], function(csrf, translator) { if (window.FileReader && maxSize) { return fileElement.files[0].size <= maxSize * 1000; } + return true; } return module; From 8baa6f70af2047edb8e6edffd04fb0030a2f2f6f Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Thu, 31 Mar 2016 09:02:38 -0400 Subject: [PATCH 311/319] Latest translations and fallbacks --- public/language/bg/uploads.json | 8 ++++---- public/language/de/uploads.json | 8 ++++---- public/language/fr/uploads.json | 8 ++++---- public/language/ko/uploads.json | 8 ++++---- public/language/pt_BR/uploads.json | 8 ++++---- public/language/tr/uploads.json | 8 ++++---- public/language/zh_CN/error.json | 4 ++-- public/language/zh_CN/groups.json | 2 +- public/language/zh_CN/modules.json | 2 +- public/language/zh_CN/uploads.json | 8 ++++---- public/language/zh_CN/user.json | 4 ++-- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/public/language/bg/uploads.json b/public/language/bg/uploads.json index 1622cb5693..e262a56d6c 100644 --- a/public/language/bg/uploads.json +++ b/public/language/bg/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Качване на файла…", + "select-file-to-upload": "Изберете файл за качване!", + "upload-success": "Файлът е качен успешно!", + "maximum-file-size": "Най-много %1 КБ" } \ No newline at end of file diff --git a/public/language/de/uploads.json b/public/language/de/uploads.json index 1622cb5693..2e0c183386 100644 --- a/public/language/de/uploads.json +++ b/public/language/de/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Lade Datei hoch...", + "select-file-to-upload": "Wähle eine Datei zum Hochladen aus!", + "upload-success": "Datei erfolgreich hochgeladen!", + "maximum-file-size": "Maximal %1 kb" } \ No newline at end of file diff --git a/public/language/fr/uploads.json b/public/language/fr/uploads.json index 1622cb5693..7cc22992da 100644 --- a/public/language/fr/uploads.json +++ b/public/language/fr/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Envoi du fichier…", + "select-file-to-upload": "Sélectionnez un ficher à envoyer", + "upload-success": "Fichier envoyé", + "maximum-file-size": "%1 Ko maximum" } \ No newline at end of file diff --git a/public/language/ko/uploads.json b/public/language/ko/uploads.json index 1622cb5693..3438b2ca03 100644 --- a/public/language/ko/uploads.json +++ b/public/language/ko/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "파일 업로드 중...", + "select-file-to-upload": "업로드할 파일을 선택해 주세요!", + "upload-success": "파일이 성공적으로 업로드 되었습니다!", + "maximum-file-size": "최대 %1 kb" } \ No newline at end of file diff --git a/public/language/pt_BR/uploads.json b/public/language/pt_BR/uploads.json index 1622cb5693..232e568e92 100644 --- a/public/language/pt_BR/uploads.json +++ b/public/language/pt_BR/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Fazendo upload do arquivo...", + "select-file-to-upload": "Escolha um arquivo para fazer upload!", + "upload-success": "Upload realizado com sucesso!", + "maximum-file-size": "No máximo %1 kb" } \ No newline at end of file diff --git a/public/language/tr/uploads.json b/public/language/tr/uploads.json index 1622cb5693..255eb420d7 100644 --- a/public/language/tr/uploads.json +++ b/public/language/tr/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "Dosya yükleniyor...", + "select-file-to-upload": "Bir dosya seç!", + "upload-success": "Dosya yüklenmesi tamamlandı!", + "maximum-file-size": "Maksimum %1 kb" } \ No newline at end of file diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index 3a96f6c556..4e8ec6a25f 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -27,7 +27,7 @@ "password-too-long": "密码太长", "user-banned": "用户已禁止", "user-too-new": "抱歉,您需要等待 %1 秒后,才可以发帖!", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "对不起,您的IP地址已被社区禁用。如果您认为这是一个错误,请与管理员联系。", "no-category": "版块不存在", "no-topic": "主题不存在", "no-post": "帖子不存在", @@ -99,5 +99,5 @@ "no-session-found": "未登录!", "not-in-room": "用户已不在聊天室中", "no-users-in-room": "这个聊天室中没有用户", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "你不能把自己踢出群组" } \ No newline at end of file diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index fd58e3308e..f988de4db6 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -41,7 +41,7 @@ "details.hidden": "隐藏", "details.hidden_help": "启用此选项后,小组将不在小组列表中展现,成员只能通过邀请加入。", "details.delete_group": "删除小组", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "系统禁用了私有群组,这个选项不起任何作用", "event.updated": "小组信息已更新", "event.deleted": "小组 \"%1\" 已被删除", "membership.accept-invitation": "接受邀请", diff --git a/public/language/zh_CN/modules.json b/public/language/zh_CN/modules.json index 50bdd2d042..bf50d3f496 100644 --- a/public/language/zh_CN/modules.json +++ b/public/language/zh_CN/modules.json @@ -6,7 +6,7 @@ "chat.user_typing": "%1 正在输入……", "chat.user_has_messaged_you": "%1 向您发送了消息。", "chat.see_all": "查看所有对话", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "将所有聊天标为已读", "chat.no-messages": "请选择接收人,以查看聊天消息历史", "chat.no-users-in-room": "此聊天室中没有用户", "chat.recent-chats": "最近聊天", diff --git a/public/language/zh_CN/uploads.json b/public/language/zh_CN/uploads.json index 1622cb5693..9c86a89605 100644 --- a/public/language/zh_CN/uploads.json +++ b/public/language/zh_CN/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb" + "uploading-file": "正在上传文件...", + "select-file-to-upload": "请选择需要上传的文件!", + "upload-success": "文件上传成功!", + "maximum-file-size": "最大 %1 kb" } \ No newline at end of file diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index f434a2f284..e713189b25 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -39,7 +39,7 @@ "change_username": "更改用户名", "change_email": "更改电子邮箱", "edit": "编辑", - "edit-profile": "Edit Profile", + "edit-profile": "编辑资料", "default_picture": "缺省图标", "uploaded_picture": "已有头像", "upload_new_picture": "上传新头像", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "在新标签打开外部链接", "enable_topic_searching": "启用主题内搜索", "topic_search_help": "如果启用此项,主题内搜索会替代浏览器默认的页面搜索,您将可以在整个主题内搜索,而不仅仅只搜索页面上展现的内容。", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "在提交回复之后显示新帖子", "follow_topics_you_reply_to": "关注您回复的主题", "follow_topics_you_create": "关注您创建的主题", "grouptitle": "选择展示的小组称号", From a078fd82e7a2c8528bbad5ce16987f6a17f89274 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 31 Mar 2016 12:26:51 -0400 Subject: [PATCH 312/319] fix julian's console.log voodoo --- loader.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/loader.js b/loader.js index 7672ebf6dd..b78abdc4a1 100644 --- a/loader.js +++ b/loader.js @@ -34,8 +34,9 @@ var pidFilePath = __dirname + '/pidfile', Loader.init = function(callback) { if (silent) { - console.log = function(value) { - output.write(value + '\n'); + console.log = function() { + var args = Array.prototype.slice.call(arguments); + output.write(args.join(' ') + '\n'); }; } From 17835833739cdd9da66966324021c44c94de67ea Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 31 Mar 2016 13:03:36 -0400 Subject: [PATCH 313/319] js-propagate fix for clustered installs --- app.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app.js b/app.js index c75c70f9cf..ed5238285e 100644 --- a/app.js +++ b/app.js @@ -149,9 +149,7 @@ function start() { meta.reload(); break; case 'js-propagate': - meta.js.target[message.target] = meta.js.target[message.target] || {}; - meta.js.target[message.target].cache = message.cache; - meta.js.target[message.target].map = message.map; + meta.js.target = message.data; emitter.emit('meta:js.compiled'); winston.verbose('[cluster] Client-side javascript and mapping propagated to worker %s', process.pid); break; From 73c4feec2054e9522003955a18d997f95e1a5beb Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 31 Mar 2016 15:52:39 -0400 Subject: [PATCH 314/319] fixes #4487 --- public/src/client/topic/events.js | 2 ++ public/src/client/topic/posts.js | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 6c8f58b55b..7f769f984b 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -118,6 +118,8 @@ define('forum/topic/events', [ editedPostEl.find('img:not(.not-responsive)').addClass('img-responsive'); app.replaceSelfLinks(editedPostEl.find('a')); posts.wrapImagesInLinks(editedPostEl.parent()); + posts.unloadImages(editedPostEl.parent()); + posts.loadImages(); editedPostEl.fadeIn(250); $(window).trigger('action:posts.edited', data); }); diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 2cbe2a0d2a..5c326532ab 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -235,9 +235,7 @@ define('forum/topic/posts', [ }; Posts.unloadImages = function(posts) { - var images = posts.find('[component="post/content"] img:not(.not-responsive)'), - scrollTop = $(window).scrollTop(), - height = $(document).height(); + var images = posts.find('[component="post/content"] img:not(.not-responsive)'); images.each(function() { $(this).attr('data-src', $(this).attr('src')); From b948e031f6e3220dd8763022c3c3bbd486dbff6d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 1 Apr 2016 15:02:17 +0300 Subject: [PATCH 315/319] closes #2779 --- public/src/admin/manage/category.js | 42 +++++++ src/categories/create.js | 109 ++++++++++++++++-- src/socket.io/admin/categories.js | 22 ++-- src/views/admin/manage/category.tpl | 3 +- .../admin/partials/categories/create.tpl | 10 ++ .../partials/categories/select-category.tpl | 10 ++ 6 files changed, 178 insertions(+), 18 deletions(-) create mode 100644 src/views/admin/partials/categories/select-category.tpl diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index 289afa0de4..d37fac64b0 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -99,6 +99,48 @@ define('admin/manage/category', [ }); }); + $('.copy-settings').on('click', function(e) { + e.preventDefault(); + socket.emit('admin.categories.getNames', function(err, categories) { + if (err) { + return app.alertError(err.message); + } + + templates.parse('admin/partials/categories/select-category', { + categories: categories + }, function(html) { + function submit() { + var formData = modal.find('form').serializeObject(); + + socket.emit('admin.categories.copySettingsFrom', {fromCid: formData['select-cid'], toCid: ajaxify.data.category.cid}, function(err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('Settings Copied!'); + ajaxify.refresh(); + }); + + modal.modal('hide'); + return false; + } + + var modal = bootbox.dialog({ + title: 'Select a Category', + message: html, + buttons: { + save: { + label: 'Copy', + className: 'btn-primary', + callback: submit + } + } + }); + + modal.find('form').on('submit', submit); + }); + }); + }); + $('.upload-button').on('click', function() { var inputEl = $(this); var cid = inputEl.attr('data-cid'); diff --git a/src/categories/create.js b/src/categories/create.js index 69d1f4dcd8..7f1f3955f7 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -1,10 +1,12 @@ 'use strict'; -var async = require('async'), - db = require('../database'), - privileges = require('../privileges'), - plugins = require('../plugins'), - utils = require('../../public/src/utils'); +var async = require('async'); + +var db = require('../database'); +var privileges = require('../privileges'); +var groups = require('../groups'); +var plugins = require('../plugins'); +var utils = require('../../public/src/utils'); module.exports = function(Categories) { @@ -17,6 +19,7 @@ module.exports = function(Categories) { db.incrObjectField('global', 'nextCid', next); }, function(cid, next) { + data.name = data.name || 'Category ' + cid; var slug = cid + '/' + utils.slugify(data.name); var order = data.order || cid; // If no order provided, place it at the end var colours = Categories.assignColours(); @@ -58,6 +61,12 @@ module.exports = function(Categories) { ], next); }, function(results, next) { + if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) { + return Categories.copySettingsFrom(data.cloneFromCid, category.cid, next); + } + next(null, category); + }, + function(category, next) { plugins.fireHook('action:category.create', category); next(null, category); } @@ -65,10 +74,94 @@ module.exports = function(Categories) { }; Categories.assignColours = function() { - var backgrounds = ['#AB4642', '#DC9656', '#F7CA88', '#A1B56C', '#86C1B9', '#7CAFC2', '#BA8BAF', '#A16946'], - text = ['#fff', '#fff', '#333', '#fff', '#333', '#fff', '#fff', '#fff'], - index = Math.floor(Math.random() * backgrounds.length); + var backgrounds = ['#AB4642', '#DC9656', '#F7CA88', '#A1B56C', '#86C1B9', '#7CAFC2', '#BA8BAF', '#A16946']; + var text = ['#fff', '#fff', '#333', '#fff', '#333', '#fff', '#fff', '#fff']; + var index = Math.floor(Math.random() * backgrounds.length); return [backgrounds[index], text[index]]; }; + + Categories.copySettingsFrom = function(fromCid, toCid, callback) { + var destination; + async.waterfall([ + function (next) { + async.parallel({ + source: async.apply(db.getObject, 'category:' + fromCid), + destination: async.apply(db.getObject, 'category:' + toCid) + }, next); + }, + function (results, next) { + if (!results.source) { + return next(new Error('[[error:invalid-cid]]')); + } + destination = results.destination; + + var tasks = []; + if (parseInt(results.source.parentCid, 10)) { + tasks.push(async.apply(db.sortedSetAdd, 'cid:' + results.source.parentCid + ':children', results.source.order, toCid)); + } + + if (destination && parseInt(destination.parentCid, 10)) { + tasks.push(async.apply(db.sortedSetRemove, 'cid:' + destination.parentCid + ':children', toCid)); + } + + destination.description = results.source.description; + destination.descriptionParsed = results.source.descriptionParsed; + destination.icon = results.source.icon; + destination.bgColor = results.source.bgColor; + destination.color = results.source.color; + destination.link = results.source.link; + destination.numRecentReplies = results.source.numRecentReplies; + destination.class = results.source.class; + destination.imageClass = results.source.imageClass; + destination.parentCid = results.source.parentCid || 0; + + tasks.push(async.apply(db.setObject, 'category:' + toCid, destination)); + + async.series(tasks, next); + }, + function (results, next) { + Categories.copyPrivilegesFrom(fromCid, toCid, next); + } + ], function(err) { + callback(err, destination); + }); + }; + + Categories.copyPrivilegesFrom = function(fromCid, toCid, callback) { + var privilegeList = [ + 'find', 'read', 'topics:create', 'topics:reply', 'purge', 'mods', + 'groups:find', 'groups:read', 'groups:topics:create', 'groups:topics:reply', 'groups:purge', 'groups:moderate' + ]; + + async.each(privilegeList, function(privilege, next) { + copyPrivilege(privilege, fromCid, toCid, next); + }, callback); + }; + + function copyPrivilege(privilege, fromCid, toCid, callback) { + async.waterfall([ + function (next) { + db.getSortedSetRange('group:cid:' + toCid + ':privileges:' + privilege + ':members', 0, -1, next); + }, + function (currentMembers, next) { + async.eachSeries(currentMembers, function(member, next) { + groups.leave('cid:' + toCid + ':privileges:' + privilege, member, next); + }, next); + }, + function (next) { + db.getSortedSetRange('group:cid:' + fromCid + ':privileges:' + privilege + ':members', 0, -1, next); + }, + function (members, next) { + if (!members || !members.length) { + return callback(); + } + + async.eachSeries(members, function(member, next) { + groups.join('cid:' + toCid + ':privileges:' + privilege, member, next); + }, next); + } + ], callback); + } + }; diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 288e395837..3b35847366 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -1,16 +1,16 @@ "use strict"; -var async = require('async'), +var async = require('async'); - db = require('../../database'), - groups = require('../../groups'), - categories = require('../../categories'), - privileges = require('../../privileges'), - plugins = require('../../plugins'), - Categories = {}; +var db = require('../../database'); +var groups = require('../../groups'); +var categories = require('../../categories'); +var privileges = require('../../privileges'); +var plugins = require('../../plugins'); +var Categories = {}; Categories.create = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } @@ -46,7 +46,7 @@ Categories.purge = function(socket, cid, callback) { }; Categories.update = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } @@ -108,4 +108,8 @@ function copyPrivilegesToChildrenRecursive(category, privilegeGroups, callback) }); } +Categories.copySettingsFrom = function(socket, data, callback) { + categories.copySettingsFrom(data.fromCid, data.toCid, callback); +}; + module.exports = Categories; \ No newline at end of file diff --git a/src/views/admin/manage/category.tpl b/src/views/admin/manage/category.tpl index ab7540d4fd..814b319913 100644 --- a/src/views/admin/manage/category.tpl +++ b/src/views/admin/manage/category.tpl @@ -105,7 +105,8 @@
      - +
      +
      diff --git a/src/views/admin/partials/categories/create.tpl b/src/views/admin/partials/categories/create.tpl index 52e218fc0e..d4c551f1bf 100644 --- a/src/views/admin/partials/categories/create.tpl +++ b/src/views/admin/partials/categories/create.tpl @@ -12,4 +12,14 @@
      + +
      + + +
      \ No newline at end of file diff --git a/src/views/admin/partials/categories/select-category.tpl b/src/views/admin/partials/categories/select-category.tpl new file mode 100644 index 0000000000..7e1f9f0d28 --- /dev/null +++ b/src/views/admin/partials/categories/select-category.tpl @@ -0,0 +1,10 @@ +
      +
      + + +
      +
      \ No newline at end of file From 07af4d10e79b7f5793d4b3d5ea5ba6b287aca978 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 1 Apr 2016 15:12:01 +0300 Subject: [PATCH 316/319] closes #4488 --- public/language/en_GB/email.json | 1 + src/user/digest.js | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/language/en_GB/email.json b/public/language/en_GB/email.json index 012270d2ab..e893709772 100644 --- a/public/language/en_GB/email.json +++ b/public/language/en_GB/email.json @@ -31,6 +31,7 @@ "digest.day": "day", "digest.week": "week", "digest.month": "month", + "digest.subject": "Digest for %1", "notif.chat.subject": "New chat message received from %1", "notif.chat.cta": "Click here to continue the conversation", diff --git a/src/user/digest.js b/src/user/digest.js index cc2c768b71..81b6ea0220 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -1,17 +1,16 @@ "use strict"; -var async = require('async'), - winston = require('winston'), - nconf = require('nconf'), - - db = require('../database'), - meta = require('../meta'), - user = require('../user'), - topics = require('../topics'), - batch = require('../batch'), - plugins = require('../plugins'), - emailer = require('../emailer'), - utils = require('../../public/src/utils'); +var async = require('async'); +var winston = require('winston'); +var nconf = require('nconf'); + +var db = require('../database'); +var meta = require('../meta'); +var user = require('../user'); +var topics = require('../topics'); +var plugins = require('../plugins'); +var emailer = require('../emailer'); +var utils = require('../../public/src/utils'); (function(Digest) { Digest.execute = function(interval) { @@ -100,7 +99,7 @@ var async = require('async'), } emailer.send('digest', userObj.uid, { - subject: '[' + meta.config.title + '] Digest for ' + now.getFullYear()+ '/' + (now.getMonth()+1) + '/' + now.getDate(), + subject: '[' + meta.config.title + '] [[email:digest.subject, ' + (now.getFullYear()+ '/' + (now.getMonth()+1) + '/' + now.getDate()) + ']]', username: userObj.username, userslug: userObj.userslug, url: nconf.get('url'), From 4b88a463fa08b8d8539f59e8918c175e073291b2 Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Fri, 1 Apr 2016 09:02:29 -0400 Subject: [PATCH 317/319] Latest translations and fallbacks --- public/language/de/email.json | 2 +- public/language/de/user.json | 2 +- public/language/es/error.json | 10 +++++----- public/language/es/global.json | 10 +++++----- public/language/es/groups.json | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/language/de/email.json b/public/language/de/email.json index d96a0b7b38..459cb40156 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -17,7 +17,7 @@ "reset.notify.text1": "Wir benachrichtigen dich, dass dein Passwort am %1 erfolgreich geändert wurde.", "reset.notify.text2": "Bitte benachrichtige umgehend einen Administrator, wenn du dies nicht autorisiert hast.", "digest.notifications": "Du hast ungelesene Benachrichtigungen von %1:", - "digest.latest_topics": "Neueste Themen vom %1", + "digest.latest_topics": "Neueste Themen auf %1", "digest.cta": "Klicke hier, um %1 zu besuchen", "digest.unsub.info": "Diese Zusammenfassung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.", "digest.no_topics": "Es gab keine aktiven Themen innerhalb %1", diff --git a/public/language/de/user.json b/public/language/de/user.json index addf47ab8f..e4fd8b8f8e 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -65,7 +65,7 @@ "show_email": "Zeige meine E-Mail Adresse an.", "show_fullname": "Zeige meinen kompletten Namen an", "restrict_chats": "Nur Chatnachrichten von Benutzern, denen ich folge, erlauben", - "digest_label": "Auszug abonnieren", + "digest_label": "Zusammenfassung abonnieren", "digest_description": "Abonniere E-Mail-Benachrichtigungen für dieses Forum (neue Benachrichtigungen und Themen) nach einem festen Zeitplan.", "digest_off": "Aus", "digest_daily": "Täglich", diff --git a/public/language/es/error.json b/public/language/es/error.json index 44a95c2cd6..630475a16f 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -14,7 +14,7 @@ "invalid-password": "Contraseña no válida", "invalid-username-or-password": "Por favor especifica tanto un usuario como contraseña", "invalid-search-term": "Término de búsqueda inválido", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-pagination-value": "Número de página inválido, debe estar entre %1 y %2", "username-taken": "Nombre de usuario ocupado", "email-taken": "Correo electrónico ocupado", "email-not-confirmed": "Su cuenta de correo electrónico no ha sido confirmada aún, por favor haga click aquí para confirmarla.", @@ -84,7 +84,7 @@ "chat-message-too-long": "Mensaje de Chat es demasiado largo", "cant-edit-chat-message": "No tienes permiso para editar este mensaje", "cant-remove-last-user": "No puedes eliminar el último usuario", - "cant-delete-chat-message": "You are not allowed to delete this message", + "cant-delete-chat-message": "No tienes permiso para eliminar este mensaje", "reputation-system-disabled": "El sistema de reputación está deshabilitado.", "downvoting-disabled": "La votación negativa está deshabilitada.", "not-enough-reputation-to-downvote": "No tienes suficiente reputación para votar negativo este post", @@ -97,7 +97,7 @@ "wrong-login-type-username": "Por favor introduce tu nombre de usuario para acceder", "invite-maximum-met": "Has alcanzado el número máximo de personas invitadas (%1 de %2).", "no-session-found": "¡No se ha encontrado ningún inicio de sesión!", - "not-in-room": "User not in room", - "no-users-in-room": "No users in this room", - "cant-kick-self": "You can't kick yourself from the group" + "not-in-room": "El usuario no está en la sala", + "no-users-in-room": "No hay usuarios en esta sala", + "cant-kick-self": "No te puedes expulsar a ti mismo del grupo" } \ No newline at end of file diff --git a/public/language/es/global.json b/public/language/es/global.json index 6e7c532fe9..d81c10ca88 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -65,7 +65,7 @@ "posted_in_ago_by": "publicado en %1 %2 por %3", "user_posted_ago": "%1 publicó %2", "guest_posted_ago": "Invitado publicó %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "Última edición por %1", "norecentposts": "No hay publicaciones recientes", "norecenttopics": "No hay temas recientes", "recentposts": "Publicaciones recientes", @@ -87,8 +87,8 @@ "map": "Mapa", "sessions": "Inicios de sesión", "ip_address": "Direcciones IP", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "allowed-file-types": "Allowed file types are %1" + "enter_page_number": "Escribe el número de página", + "upload_file": "Subir archivo", + "upload": "Subir", + "allowed-file-types": "Los tipos de archivos permitidos son: %1" } \ No newline at end of file diff --git a/public/language/es/groups.json b/public/language/es/groups.json index 1bcb9f23af..657fe67599 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Oculto", "details.hidden_help": "Si está habilitado, este grupo no aparecerá en los listados de grupos, y los usuarios tendrán que ser invitados manualmente", "details.delete_group": "Eliminar grupo", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Los grupos privados están desactivados a nivel de sistema, esta opción no cambiará nada.", "event.updated": "Los detalles del grupo han sido actualizados", "event.deleted": "El grupo \"%1\" ha sido eliminado", "membership.accept-invitation": "Aceptar Invitación", @@ -50,5 +50,5 @@ "membership.leave-group": "Dejar el grupo", "membership.reject": "Rechazar", "new-group.group_name": "Nombre de Grupo:", - "upload-group-cover": "Upload group cover" + "upload-group-cover": "Cargar foto para el grupo" } \ No newline at end of file From 06cd4cd4067226991b44ae60282f34c94376ced1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 1 Apr 2016 15:37:01 -0400 Subject: [PATCH 318/319] only triggering topic infinite loader once a second, fixes #4477 --- public/src/client/topic/posts.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 5c326532ab..696b2f51ec 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -181,10 +181,13 @@ define('forum/topic/posts', [ } Posts.loadMorePosts = function(direction) { - if (!components.get('topic').length || navigator.scrollActive) { + if (!components.get('topic').length || navigator.scrollActive || Posts._infiniteScrollTimeout) { return; } + Posts._infiniteScrollTimeout = setTimeout(function() { + delete Posts._infiniteScrollTimeout; + }, 1000); var replies = components.get('post').not('[data-index=0]').not('.new'); var afterEl = direction > 0 ? replies.last() : replies.first(); var after = parseInt(afterEl.attr('data-index'), 10) || 0; @@ -204,7 +207,6 @@ define('forum/topic/posts', [ after: after, direction: direction }, function (data, done) { - indicatorEl.fadeOut(); if (data && data.posts && data.posts.length) { From 1aaf65e9beaaefd286685e531ac1284018777bab Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 1 Apr 2016 16:10:23 -0400 Subject: [PATCH 319/319] fixes #4438 --- src/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/notifications.js b/src/notifications.js index 498337a7db..94cb5313b8 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -472,7 +472,7 @@ var async = require('async'), return true; } - return !(notifObj.mergeId === (mergeId + '|' + differentiator) && idx !== modifyIndex); + return !(notifObj.mergeId === (mergeId + (differentiator ? '|' + differentiator : '')) && idx !== modifyIndex); }); });