From cf252a29a7ec2270c48fe53d88f1edd724235566 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Oct 2014 15:32:54 -0400 Subject: [PATCH 001/264] closes #2196 --- src/middleware/middleware.js | 2 +- src/notifications.js | 4 +++- src/user/notifications.js | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 26218ba749..3f044075d2 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -53,7 +53,7 @@ middleware.updateLastOnlineTime = function(req, res, next) { middleware.incrementPageViews = function(req, res, next) { var today = new Date(); today.setHours(today.getHours(), 0, 0, 0); - + db.sortedSetIncrBy('analytics:pageviews', 1, today.getTime()); next(); }; diff --git a/src/notifications.js b/src/notifications.js index ca4537ef45..3d8aeb66dc 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -136,7 +136,9 @@ var async = require('async'), var unreadKeys = []; var readKeys = []; - uids.filter(Boolean).forEach(function(uid) { + uids.filter(function(uid) { + return parseInt(uid, 10); + }).forEach(function(uid) { unreadKeys.push('uid:' + uid + ':notifications:unread'); readKeys.push('uid:' + uid + ':notifications:read'); }); diff --git a/src/user/notifications.js b/src/user/notifications.js index f2784c373c..731ff99da8 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -211,6 +211,9 @@ var async = require('async'), }; UserNotifications.getUnreadCount = function(uid, callback) { + if (!parseInt(uid, 10)) { + return callback(null, 0); + } db.sortedSetCard('uid:' + uid + ':notifications:unread', callback); }; From 883422760d276609b9db07ee6fd4433ba8157cb8 Mon Sep 17 00:00:00 2001 From: Schamper Date: Wed, 1 Oct 2014 22:30:22 +0200 Subject: [PATCH 002/264] Fix settings save message --- public/src/modules/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/modules/settings.js b/public/src/modules/settings.js index 78ac0ad044..b31975c1ab 100644 --- a/public/src/modules/settings.js +++ b/public/src/modules/settings.js @@ -298,6 +298,7 @@ define('settings', function () { app.alert({ title: 'Settings Saved', type: 'success', + message: "Settings have been successfully saved", timeout: 2500 }); } From b8df95da98c269625b38536d7097f424c67bc0c1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Oct 2014 16:58:04 -0400 Subject: [PATCH 003/264] check message --- public/src/modules/alerts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js index ccbec68d0a..4db3a1d9ab 100644 --- a/public/src/modules/alerts.js +++ b/public/src/modules/alerts.js @@ -7,7 +7,7 @@ define('alerts', function() { module.alert = function (params) { params.alert_id = 'alert_button_' + (params.alert_id ? params.alert_id : new Date().getTime()); params.title = params.title ? params.title.trim() || '' : ''; - params.message = params.message.trim(); + params.message = params.message ? params.message.trim() : ''; params.location = params.location || 'right-top'; params.type = params.type || 'info'; From 7b8656ef8b622472b41c1b1edcc0c28fad408a35 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Oct 2014 19:00:26 -0400 Subject: [PATCH 004/264] facebook share doesn't display & --- src/controllers/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/topics.js b/src/controllers/topics.js index dfda8d4e44..aae961e20f 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -172,7 +172,7 @@ topicsController.get = function(req, res, next) { }, { property: 'og:title', - content: topicData.title + content: topicData.title.replace(/&/g, '&') }, { property: 'og:description', From a67c501eb8c3e712d8be5392a06a872a553de855 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Oct 2014 13:38:42 -0400 Subject: [PATCH 005/264] temporary solution for #2206 --- src/socket.io/posts.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 5cf5fadd29..0e9ab70722 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -32,6 +32,11 @@ SocketPosts.reply = function(socket, data, callback) { return callback(err); } + if (postData) { + postData.display_moderator_tools = false; + postData.display_move_tools = false; + } + var result = { posts: [postData], privileges: { From de98df842d8fe49ce2a6cda2ae341630ebb167f4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Oct 2014 13:55:01 -0400 Subject: [PATCH 006/264] priv fix --- public/src/forum/topic.js | 39 ++++++++++++++++++++++----------------- src/socket.io/posts.js | 12 +++--------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index bcfdc0187c..d1cf06fa2b 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -337,7 +337,7 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT var height = $(document).height(), scrollTop = $(document).scrollTop(), originalPostEl = $('li[data-index="0"]'); - + // Insert the new post html.insertBefore(before); @@ -361,18 +361,21 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT } function onNewPostsLoaded(html, posts) { - function getPostPrivileges(pid) { - socket.emit('posts.getPrivileges', pid, function(err, privileges) { - if(err) { - return app.alertError(err.message); - } - toggleModTools(html, privileges); - }); + + var pids = []; + for(var i=0; i Date: Thu, 2 Oct 2014 14:30:54 -0400 Subject: [PATCH 007/264] changed none to hidden --- public/src/forum/categoryTools.js | 2 +- public/src/forum/topic.js | 8 ++++---- public/src/forum/topic/postTools.js | 4 ++-- public/src/forum/topic/threadTools.js | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/src/forum/categoryTools.js b/public/src/forum/categoryTools.js index f40fb26b2f..620b3af8b0 100644 --- a/public/src/forum/categoryTools.js +++ b/public/src/forum/categoryTools.js @@ -132,7 +132,7 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect'], function(move $('.delete_thread span').translateHtml(' [[topic:thread_tools.' + (isAnyDeleted ? 'restore' : 'delete') + ']]'); $('.pin_thread').translateHtml(' [[topic:thread_tools.' + (isAnyPinned ? 'unpin' : 'pin') + ']]'); $('.lock_thread').translateHtml(' [[topic:thread_tools.' + (isAnyLocked ? 'un': '') + 'lock]]'); - $('.purge_thread').toggleClass('none', !areAllDeleted); + $('.purge_thread').toggleClass('hidden', !areAllDeleted); } function isAny(method, tids) { diff --git a/public/src/forum/topic.js b/public/src/forum/topic.js index d1cf06fa2b..229b3b313c 100644 --- a/public/src/forum/topic.js +++ b/public/src/forum/topic.js @@ -399,11 +399,11 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT function toggleModTools(pid, privileges) { var postEl = $('.post-row[data-pid="' + pid + '"]'); - postEl.find('.edit, .delete').toggleClass('none', !privileges.editable); - postEl.find('.move').toggleClass('none', !privileges.move); - postEl.find('.reply, .quote').toggleClass('none', !$('.post_reply').length); + postEl.find('.edit, .delete').toggleClass('hidden', !privileges.editable); + postEl.find('.move').toggleClass('hidden', !privileges.move); + postEl.find('.reply, .quote').toggleClass('hidden', !$('.post_reply').length); var isSelfPost = parseInt(postEl.attr('data-uid'), 10) === parseInt(app.uid, 10); - postEl.find('.chat, .flag').toggleClass('none', isSelfPost || !app.uid); + postEl.find('.chat, .flag').toggleClass('hidden', isSelfPost || !app.uid); } function loadMorePosts(direction) { diff --git a/public/src/forum/topic/postTools.js b/public/src/forum/topic/postTools.js index 96edf0720c..6a26e7120e 100644 --- a/public/src/forum/topic/postTools.js +++ b/public/src/forum/topic/postTools.js @@ -20,8 +20,8 @@ define('forum/topic/postTools', ['composer', 'share', 'navigator'], function(com PostTools.toggle = function(pid, isDeleted) { var postEl = $('#post-container li[data-pid="' + pid + '"]'); - postEl.find('.quote, .favourite, .post_reply, .chat').toggleClass('none', isDeleted); - postEl.find('.purge').toggleClass('none', !isDeleted); + postEl.find('.quote, .favourite, .post_reply, .chat').toggleClass('hidden', isDeleted); + postEl.find('.purge').toggleClass('hidden', !isDeleted); postEl.find('.delete .i').toggleClass('fa-trash-o', !isDeleted).toggleClass('fa-history', isDeleted); postEl.find('.delete span').translateHtml(isDeleted ? ' [[topic:restore]]' : ' [[topic:delete]]'); }; diff --git a/public/src/forum/topic/threadTools.js b/public/src/forum/topic/threadTools.js index f72705bd02..41a3d532bf 100644 --- a/public/src/forum/topic/threadTools.js +++ b/public/src/forum/topic/threadTools.js @@ -109,7 +109,7 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move'], func $('.topic-main-buttons .post_reply').attr('disabled', isLocked).html(isLocked ? ' ' + translated : translated); }); - threadEl.find('.quote, .edit, .delete').toggleClass('none', isLocked); + threadEl.find('.quote, .edit, .delete').toggleClass('hidden', isLocked); $('.topic-title i.fa-lock').toggleClass('hide', !data.isLocked); ThreadTools.threadState.locked = data.isLocked; } @@ -125,7 +125,7 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move'], func threadEl.toggleClass('deleted', data.isDelete); ThreadTools.threadState.deleted = data.isDelete; - $('.purge_thread').toggleClass('none', !data.isDelete); + $('.purge_thread').toggleClass('hidden', !data.isDelete); if (data.isDelete) { translator.translate('[[topic:deleted_message]]', function(translated) { From 1eb9016a77c9ef99e63913db0a023b7f9911d4e4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 2 Oct 2014 14:38:30 -0400 Subject: [PATCH 008/264] fixed #2207 --- public/src/modules/composer/categoryList.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/src/modules/composer/categoryList.js b/public/src/modules/composer/categoryList.js index 776e435bc9..30ece1875a 100644 --- a/public/src/modules/composer/categoryList.js +++ b/public/src/modules/composer/categoryList.js @@ -17,6 +17,11 @@ define('composer/categoryList', function() { return app.alertError(err.message); } + // Remove categories that are just external links + categories = categories.filter(function(category) { + return !category.link + }); + categories.forEach(function(category) { $('').appendTo(listEl); }); From 85048a5f759b19cae453555ab0fa44b51e64cd87 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 2 Oct 2014 15:58:13 -0400 Subject: [PATCH 009/264] closed #2203 --- src/views/admin/general/sounds.tpl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/views/admin/general/sounds.tpl b/src/views/admin/general/sounds.tpl index 13194c95c5..3556bcbb7d 100644 --- a/src/views/admin/general/sounds.tpl +++ b/src/views/admin/general/sounds.tpl @@ -8,6 +8,7 @@
+ @@ -41,6 +43,7 @@
+
diff --git a/src/views/maintenance.tpl b/src/views/maintenance.tpl index f5222cd00f..5bd60e430d 100644 --- a/src/views/maintenance.tpl +++ b/src/views/maintenance.tpl @@ -1,9 +1,12 @@ - - - - {site_title} is currently in Maintenance Mode - - -

This site is in maintenance mode. Try again later.

- - \ No newline at end of file +

[[pages:maintenance.text, {site_title}]]

+

+ +
+
+

[[pages:maintenance.messageIntro]]

+
+ {message} +
+
+
+ \ No newline at end of file From 9c8395808c3ed785b77b7dc15b7c72e7a6844d1e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Oct 2014 18:29:40 -0400 Subject: [PATCH 021/264] use page visibility api instead of window.onblur this lib supports most major browsers --- public/src/app.js | 14 +++++++------- public/vendor/visibility/visibility.min.js | 1 + src/meta/js.js | 1 + 3 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 public/vendor/visibility/visibility.min.js diff --git a/public/src/app.js b/public/src/app.js index 8138f956f2..5769353138 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -525,13 +525,13 @@ var socket, $('#logout-link').on('click', app.logout); - $window.blur(function(){ - app.isFocused = false; - }); - - $window.focus(function(){ - app.isFocused = true; - app.alternatingTitle(''); + Visibility.change(function(e, state){ + if (state === 'visible') { + app.isFocused = true; + app.alternatingTitle(''); + } else if (state === 'hidden') { + app.isFocused = false; + } }); createHeaderTooltips(); diff --git a/public/vendor/visibility/visibility.min.js b/public/vendor/visibility/visibility.min.js new file mode 100644 index 0000000000..3733ccd08a --- /dev/null +++ b/public/vendor/visibility/visibility.min.js @@ -0,0 +1 @@ +!function(e){"use strict";var i=-1,t={onVisible:function(e){var i=t.isSupported();if(!i||!t.hidden())return e(),i;var n=t.change(function(){t.hidden()||(t.unbind(n),e())});return n},change:function(e){if(!t.isSupported())return!1;i+=1;var n=i;return t._callbacks[n]=e,t._listen(),n},unbind:function(e){delete t._callbacks[e]},afterPrerendering:function(e){var i=t.isSupported(),n="prerender";if(!i||n!=t.state())return e(),i;var r=t.change(function(i,d){n!=d&&(t.unbind(r),e())});return r},hidden:function(){return!(!t._doc.hidden&&!t._doc.webkitHidden)},state:function(){return t._doc.visibilityState||t._doc.webkitVisibilityState||"visible"},isSupported:function(){return!(!t._doc.visibilityState&&!t._doc.webkitVisibilityState)},_doc:document||{},_callbacks:{},_change:function(e){var i=t.state();for(var n in t._callbacks)t._callbacks[n].call(t._doc,e,i)},_listen:function(){if(!t._init){var e="visibilitychange";t._doc.webkitVisibilityState&&(e="webkit"+e);var i=function(){t._change.apply(t,arguments)};t._doc.addEventListener?t._doc.addEventListener(e,i):t._doc.attachEvent(e,i),t._init=!0}}};"undefined"!=typeof module&&module.exports?module.exports=t:e.Visibility=t}(this),function(e){"use strict";var i=-1,t=function(t){return t.every=function(e,n,r){t._time(),r||(r=n,n=null),i+=1;var d=i;return t._timers[d]={visible:e,hidden:n,callback:r},t._run(d,!1),t.isSupported()&&t._listen(),d},t.stop=function(e){return t._timers[e]?(t._stop(e),delete t._timers[e],!0):!1},t._timers={},t._time=function(){t._timed||(t._timed=!0,t._wasHidden=t.hidden(),t.change(function(){t._stopRun(),t._wasHidden=t.hidden()}))},t._run=function(i,n){var r,d=t._timers[i];if(t.hidden()){if(null===d.hidden)return;r=d.hidden}else r=d.visible;var a=function(){d.last=new Date,d.callback.call(e)};if(n){var o=new Date,u=o-d.last;r>u?d.delay=setTimeout(function(){a(),d.id=setInterval(a,r)},r-u):(a(),d.id=setInterval(a,r))}else d.id=setInterval(a,r)},t._stop=function(e){var i=t._timers[e];clearInterval(i.id),clearTimeout(i.delay),delete i.id,delete i.delay},t._stopRun=function(){var e=t.hidden(),i=t._wasHidden;if(e&&!i||!e&&i)for(var n in t._timers)t._stop(n),t._run(n,!e)},t};"undefined"!=typeof module&&module.exports?module.exports=t(require("./visibility.core")):t(e.Visibility)}(window); \ No newline at end of file diff --git a/src/meta/js.js b/src/meta/js.js index 688e984ee7..131ae17b5b 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -31,6 +31,7 @@ module.exports = function(Meta) { 'public/vendor/jquery/js/jquery.form.min.js', 'public/vendor/jquery/serializeObject/jquery.ba-serializeobject.min.js', 'public/vendor/jquery/deserialize/jquery.deserialize.min.js', + 'public/vendor/visibility/visibility.min.js', 'public/vendor/bootstrap/js/bootstrap.min.js', 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.min.js', 'public/vendor/requirejs/require.js', From e20747c19105ffbe1a075d5f5f031413d72e418f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Oct 2014 18:30:51 -0400 Subject: [PATCH 022/264] closes #2202 --- public/src/forum/admin/general/dashboard.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/public/src/forum/admin/general/dashboard.js b/public/src/forum/admin/general/dashboard.js index 173f3d09ce..223c6925b1 100644 --- a/public/src/forum/admin/general/dashboard.js +++ b/public/src/forum/admin/general/dashboard.js @@ -17,7 +17,9 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { clearInterval(updateIntervalId); } updateIntervalId = setInterval(function() { - socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); + if (app.isFocused) { + socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); + } }, 5000); $('#logout-link').on('click', function() { @@ -303,6 +305,10 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { } function updateTrafficGraph() { + if (!app.isFocused) { + return; + } + socket.emit('admin.analytics.get', {graph: "traffic"}, function (err, data) { for (var i = 0, ii = data.pageviews.length; i < ii; i++) { graphs.traffic.datasets[0].points[i].value = data.pageviews[i]; From 6a6f0a3b781f7072e1697e61fbfb722770c738d0 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Oct 2014 18:32:36 -0400 Subject: [PATCH 023/264] app.isConnected check --- public/src/app.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/src/app.js b/public/src/app.js index 5769353138..cd1563da20 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -7,6 +7,7 @@ var socket, 'username': null, 'uid': null, 'isFocused': true, + 'isConnected': false, 'currentRoom': null, 'widgets': {}, 'cacheBuster': null @@ -54,6 +55,7 @@ var socket, socket.emit('meta.reconnected'); + app.isConnected = true; $(window).trigger('action:reconnected'); setTimeout(function() { @@ -98,6 +100,7 @@ var socket, app.showLoginMessage(); app.replaceSelfLinks(); $(window).trigger('action:connected'); + app.isConnected = true; }); socket.on('event:alert', function (data) { @@ -108,6 +111,7 @@ var socket, socket.on('event:disconnect', function() { $(window).trigger('action:disconnected'); + app.isConnected = false; socket.socket.connect(); }); From 806b1157824548ccaa69fd5b9ccb27428914bbc0 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Oct 2014 18:33:08 -0400 Subject: [PATCH 024/264] don't attempt to update graphs if we're not connected --- public/src/forum/admin/general/dashboard.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/src/forum/admin/general/dashboard.js b/public/src/forum/admin/general/dashboard.js index 223c6925b1..eeda178645 100644 --- a/public/src/forum/admin/general/dashboard.js +++ b/public/src/forum/admin/general/dashboard.js @@ -17,7 +17,7 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { clearInterval(updateIntervalId); } updateIntervalId = setInterval(function() { - if (app.isFocused) { + if (app.isFocused && app.isConnected) { socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); } }, 5000); @@ -305,10 +305,10 @@ define('forum/admin/general/dashboard', ['semver'], function(semver) { } function updateTrafficGraph() { - if (!app.isFocused) { + if (!app.isFocused || !app.isConnected) { return; } - + socket.emit('admin.analytics.get', {graph: "traffic"}, function (err, data) { for (var i = 0, ii = data.pageviews.length; i < ii; i++) { graphs.traffic.datasets[0].points[i].value = data.pageviews[i]; From c12b159bb5b70066788e78f8097cbbc3d0949442 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Oct 2014 18:51:08 -0400 Subject: [PATCH 025/264] temp debug --- src/topics.js | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/topics.js b/src/topics.js index 3cfdd959a1..144230866c 100644 --- a/src/topics.js +++ b/src/topics.js @@ -192,30 +192,58 @@ var async = require('async'), var uids = mapFilter(topics, 'uid'); var cids = mapFilter(topics, 'cid'); + var total = process.hrtime(); + async.parallel({ users: function(next) { - user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], next); + var st = process.hrtime(); + user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, data) { + process.profile('users', st); + next(err, data); + }); }, categories: function(next) { - categories.getMultipleCategoryFields(cids, ['cid', 'name', 'slug', 'icon', 'bgColor', 'color', 'disabled'], next); + var st = process.hrtime(); + categories.getMultipleCategoryFields(cids, ['cid', 'name', 'slug', 'icon', 'bgColor', 'color', 'disabled'], function(err, data) { + process.profile('categories', st); + next(err, data); + }); }, hasRead: function(next) { - Topics.hasReadTopics(tids, uid, next); + var st = process.hrtime(); + Topics.hasReadTopics(tids, uid, function(err, data) { + process.profile('hasRead', st); + next(err, data); + }); }, isAdminOrMod: function(next) { - privileges.categories.isAdminOrMod(cids, uid, next); + var st = process.hrtime(); + privileges.categories.isAdminOrMod(cids, uid, function(err, data) { + process.profile('isAdminOrMod', st); + next(err, data); + }); }, teasers: function(next) { - Topics.getTeasers(tids, uid, next); + var st = process.hrtime(); + Topics.getTeasers(tids, uid, function(err, data) { + process.profile('teasers', st); + next(err, data); + }); }, tags: function(next) { - Topics.getTopicsTagsObjects(tids, next); + var st = process.hrtime(); + Topics.getTopicsTagsObjects(tids, function(err, data) { + process.profile('tags', st); + next(err, data); + }); } }, function(err, results) { if (err) { return callback(err); } + process.profile('total', total); + var users = _.object(uids, results.users); var categories = _.object(cids, results.categories); var isAdminOrMod = {}; @@ -246,7 +274,7 @@ var async = require('async'), }); plugins.fireHook('filter:topics.get', {topics: topics, uid: uid}, function(err, topicData) { - callback(err, topicData.topics) + callback(err, topicData.topics); }); }); }); From 4c70a0da4f392800ff3301245b5fd8fb344ef85a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 2 Oct 2014 18:54:20 -0400 Subject: [PATCH 026/264] removing postgres file from databases/ --- src/database/postgres.js | 94 ---------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 src/database/postgres.js diff --git a/src/database/postgres.js b/src/database/postgres.js deleted file mode 100644 index c0374aee9a..0000000000 --- a/src/database/postgres.js +++ /dev/null @@ -1,94 +0,0 @@ - -'use strict'; - -(function(module) { - - var winston = require('winston'), - async = require('async'), - nconf = require('nconf'), - session = require('express-session'), - db, pg; - - module.questions = [ - { - name: 'postgres:host', - description: 'Host IP or address of your PostgreSQL instance', - 'default': nconf.get('postgres:host') || '127.0.0.1' - }, - { - name: 'postgres:port', - description: 'Host port of your MongoDB instance', - 'default': nconf.get('postgres:port') || 5432 - }, - { - name: 'postgres:role', - description: 'PostgreSQL Role name' - }, - // { - // name: 'postgres:password', - // description: 'Password of your MongoDB database', - // hidden: true - // }, - { - name: "postgres:database", - description: "Which database to use", - 'default': nconf.get('postgres:database') || 'nodebb' - } - ]; - - module.init = function(callback) { - try { - var sessionStore; - pg = require('pg'); - - if (!nconf.get('redis')) { - sessionStore = require('connect-pg-simple')(session); - } else { - sessionStore = require('connect-redis')(session); - } - } catch (err) { - winston.error('Unable to initialize PostgreSQL! Is PostgreSQL installed? Error :' + err.message); - process.exit(0); - } - - if (!nconf.get('postgres:password') { - winston.warn('You have no PostgreSQL password setup!'); - } - - var connString = 'postgres://' + nconf.get('postgres:role') + ':' + nconf.get('postgres:password') + '@' + nconf.get('mongopostgres:host') + ':' + nconf.get('postgres:port') + '/' + nconf.get('postgres:database'); - mongoClient.connect(connString, function(err, _db, done) { - if(err) { - winston.error("NodeBB could not connect to your PostgreSQL database. PostgreSQL returned the following error: " + err.message); - process.exit(0); - } - - db = _db; - module.client = db; - - if (!nconf.get('redis')) { - module.sessionStore = new sessionStore({ - pg: pg, - conString: conString, - tableName: 'user_sessions' - }); - } else { - module.sessionStore = new sessionStore({ - client: require('./redis').connect(), - ttl: 60 * 60 * 24 * 14 - }); - } - - require('./postgres/main')(db, module, done); - require('./postgres/hash')(db, module, done); - require('./postgres/sets')(db, module, done); - require('./postgres/sorted')(db, module, done); - require('./postgres/list')(db, module, done); - }); - }; - - module.close = function() { - db.close(); - }; - -}(exports)); - From c72c876b0499389e2926fec5e3359209b62913d8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Oct 2014 18:57:15 -0400 Subject: [PATCH 027/264] check value --- src/database/mongo/sorted.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 3714f5549d..ab4943c48c 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -287,6 +287,9 @@ module.exports = function(db, module) { } var result = values.map(function(value) { + if (!value) { + return null; + } var index = sortedSet.indexOf(value.toString()); return index !== -1 ? index : null; }); From eab180f30534d6d411734d0f84446484e6f18f44 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Oct 2014 19:03:03 -0400 Subject: [PATCH 028/264] crash fix --- src/posts.js | 4 +++- src/privileges/posts.js | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/posts.js b/src/posts.js index 6d6089f732..dad45bc196 100644 --- a/src/posts.js +++ b/src/posts.js @@ -379,7 +379,9 @@ var async = require('async'), }; Posts.getPostsFields = function(pids, fields, callback) { - pids = pids ? pids : []; + if (!Array.isArray(pids) || !pids.length) { + return callback(null, []); + } var keys = pids.map(function(pid) { return 'post:' + pid; diff --git a/src/privileges/posts.js b/src/privileges/posts.js index 9cf41f4864..ca3999898d 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -16,6 +16,9 @@ module.exports = function(privileges) { privileges.posts = {}; privileges.posts.get = function(pids, uid, callback) { + if (!Array.isArray(pids) || !pids.length) { + return callback(null, []); + } async.parallel({ manage_content: function(next) { helpers.hasEnoughReputationFor('privileges:manage_content', uid, next); From 8737c5a56d2727c3a111aec16d6769aa27e8d112 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Oct 2014 19:15:52 -0400 Subject: [PATCH 029/264] removed debug --- src/topics.js | 40 ++++++---------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/src/topics.js b/src/topics.js index 144230866c..00d107f0fa 100644 --- a/src/topics.js +++ b/src/topics.js @@ -192,58 +192,30 @@ var async = require('async'), var uids = mapFilter(topics, 'uid'); var cids = mapFilter(topics, 'cid'); - var total = process.hrtime(); - async.parallel({ users: function(next) { - var st = process.hrtime(); - user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, data) { - process.profile('users', st); - next(err, data); - }); + user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], next); }, categories: function(next) { - var st = process.hrtime(); - categories.getMultipleCategoryFields(cids, ['cid', 'name', 'slug', 'icon', 'bgColor', 'color', 'disabled'], function(err, data) { - process.profile('categories', st); - next(err, data); - }); + categories.getMultipleCategoryFields(cids, ['cid', 'name', 'slug', 'icon', 'bgColor', 'color', 'disabled'], next); }, hasRead: function(next) { - var st = process.hrtime(); - Topics.hasReadTopics(tids, uid, function(err, data) { - process.profile('hasRead', st); - next(err, data); - }); + Topics.hasReadTopics(tids, uid, next); }, isAdminOrMod: function(next) { - var st = process.hrtime(); - privileges.categories.isAdminOrMod(cids, uid, function(err, data) { - process.profile('isAdminOrMod', st); - next(err, data); - }); + privileges.categories.isAdminOrMod(cids, uid, next); }, teasers: function(next) { - var st = process.hrtime(); - Topics.getTeasers(tids, uid, function(err, data) { - process.profile('teasers', st); - next(err, data); - }); + Topics.getTeasers(tids, uid, next); }, tags: function(next) { - var st = process.hrtime(); - Topics.getTopicsTagsObjects(tids, function(err, data) { - process.profile('tags', st); - next(err, data); - }); + Topics.getTopicsTagsObjects(tids, next); } }, function(err, results) { if (err) { return callback(err); } - process.profile('total', total); - var users = _.object(uids, results.users); var categories = _.object(cids, results.categories); var isAdminOrMod = {}; From 6a996bd7180673cf5941356e6a395597b06889c2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Oct 2014 20:21:43 -0400 Subject: [PATCH 030/264] closes #2210 --- public/src/modules/chat.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 9e24641e5a..8922e90df4 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -121,12 +121,16 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, module.bringModalToTop = function(chatModal) { var topZ = 0; + if ($('.chat-modal').length === 1) { + return; + } $('.chat-modal').each(function() { var thisZ = parseInt($(this).css('zIndex'), 10); if (thisZ > topZ) { topZ = thisZ; } }); + chatModal.css('zIndex', topZ + 1); taskbar.updateActive(chatModal.attr('UUID')); }; @@ -168,7 +172,8 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, chatModal.attr('touid', touid); chatModal.attr('intervalId', 0); chatModal.attr('UUID', uuid); - chatModal.css("position", "fixed"); + chatModal.css('position', 'fixed'); + chatModal.css('zIndex', 100); chatModal.appendTo($('body')); chatModal.draggable({ start:function() { @@ -265,7 +270,6 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, module.center = function(chatModal) { chatModal.css("left", Math.max(0, (($(window).width() - $(chatModal).outerWidth()) / 2) + $(window).scrollLeft()) + "px"); chatModal.css("top", Math.max(0, $(window).height() / 2 - $(chatModal).outerHeight() / 2) + "px"); - chatModal.css("zIndex", 100); chatModal.find('#chat-message-input').focus(); return chatModal; }; From b4fb2d62a3fd40fbbf279f67218097f3049f4705 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Oct 2014 20:47:53 -0400 Subject: [PATCH 031/264] closes #2201 --- src/views/admin/settings/pagination.tpl | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/views/admin/settings/pagination.tpl b/src/views/admin/settings/pagination.tpl index 545c18c680..67a6280bcb 100644 --- a/src/views/admin/settings/pagination.tpl +++ b/src/views/admin/settings/pagination.tpl @@ -9,11 +9,25 @@ Paginate topics and posts instead of using infinite scroll.
+ + + - Topics per Page

+
+
Topic Pagination
+
+
Posts per Page
-
- Initial Number of Topics to Load (Unread, Recent, Popular etc.)
+
+
+
+ +
+
Category Pagination
+
+
+ Topics per Page

+ Initial Number of Topics to Load on Unread, Recent, and Popular
From ee289c32263a77746e47ac3bf6f4de70561ac95c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 2 Oct 2014 23:51:51 -0400 Subject: [PATCH 032/264] latest translations and fallbacks --- public/language/ar/error.json | 1 + public/language/ar/notifications.json | 4 ++-- public/language/ar/pages.json | 4 +++- public/language/ar/tags.json | 1 + public/language/ar/topic.json | 12 +++++++----- public/language/ar/user.json | 1 + public/language/cs/error.json | 1 + public/language/cs/notifications.json | 4 ++-- public/language/cs/pages.json | 4 +++- public/language/cs/tags.json | 1 + public/language/cs/topic.json | 12 +++++++----- public/language/cs/user.json | 1 + public/language/de/error.json | 1 + public/language/de/notifications.json | 4 ++-- public/language/de/pages.json | 4 +++- public/language/de/tags.json | 1 + public/language/de/topic.json | 12 +++++++----- public/language/de/user.json | 1 + public/language/en@pirate/error.json | 1 + public/language/en@pirate/notifications.json | 4 ++-- public/language/en@pirate/pages.json | 4 +++- public/language/en@pirate/tags.json | 1 + public/language/en@pirate/topic.json | 12 +++++++----- public/language/en@pirate/user.json | 1 + public/language/en_US/error.json | 1 + public/language/en_US/notifications.json | 4 ++-- public/language/en_US/pages.json | 4 +++- public/language/en_US/tags.json | 1 + public/language/en_US/topic.json | 12 +++++++----- public/language/en_US/user.json | 1 + public/language/es/error.json | 1 + public/language/es/notifications.json | 4 ++-- public/language/es/pages.json | 4 +++- public/language/es/tags.json | 1 + public/language/es/topic.json | 12 +++++++----- public/language/es/user.json | 1 + public/language/et/error.json | 1 + public/language/et/notifications.json | 4 ++-- public/language/et/pages.json | 4 +++- public/language/et/tags.json | 1 + public/language/et/topic.json | 12 +++++++----- public/language/et/user.json | 1 + public/language/fa_IR/error.json | 1 + public/language/fa_IR/notifications.json | 4 ++-- public/language/fa_IR/pages.json | 4 +++- public/language/fa_IR/tags.json | 1 + public/language/fa_IR/topic.json | 12 +++++++----- public/language/fa_IR/user.json | 1 + public/language/fi/error.json | 1 + public/language/fi/notifications.json | 4 ++-- public/language/fi/pages.json | 4 +++- public/language/fi/tags.json | 1 + public/language/fi/topic.json | 12 +++++++----- public/language/fi/user.json | 1 + public/language/fr/error.json | 1 + public/language/fr/notifications.json | 4 ++-- public/language/fr/pages.json | 4 +++- public/language/fr/tags.json | 1 + public/language/fr/topic.json | 12 +++++++----- public/language/fr/user.json | 1 + public/language/he/error.json | 1 + public/language/he/notifications.json | 4 ++-- public/language/he/pages.json | 4 +++- public/language/he/tags.json | 1 + public/language/he/topic.json | 12 +++++++----- public/language/he/user.json | 1 + public/language/hu/error.json | 1 + public/language/hu/notifications.json | 4 ++-- public/language/hu/pages.json | 4 +++- public/language/hu/tags.json | 1 + public/language/hu/topic.json | 12 +++++++----- public/language/hu/user.json | 1 + public/language/it/error.json | 1 + public/language/it/notifications.json | 4 ++-- public/language/it/pages.json | 4 +++- public/language/it/tags.json | 1 + public/language/it/topic.json | 12 +++++++----- public/language/it/user.json | 1 + public/language/ja/error.json | 1 + public/language/ja/notifications.json | 4 ++-- public/language/ja/pages.json | 4 +++- public/language/ja/tags.json | 1 + public/language/ja/topic.json | 12 +++++++----- public/language/ja/user.json | 1 + public/language/ko/error.json | 1 + public/language/ko/notifications.json | 4 ++-- public/language/ko/pages.json | 4 +++- public/language/ko/tags.json | 1 + public/language/ko/topic.json | 12 +++++++----- public/language/ko/user.json | 1 + public/language/lt/error.json | 1 + public/language/lt/notifications.json | 4 ++-- public/language/lt/pages.json | 4 +++- public/language/lt/tags.json | 1 + public/language/lt/topic.json | 12 +++++++----- public/language/lt/user.json | 1 + public/language/ms/error.json | 1 + public/language/ms/notifications.json | 4 ++-- public/language/ms/pages.json | 4 +++- public/language/ms/tags.json | 1 + public/language/ms/topic.json | 12 +++++++----- public/language/ms/user.json | 1 + public/language/nb/error.json | 1 + public/language/nb/notifications.json | 4 ++-- public/language/nb/pages.json | 4 +++- public/language/nb/tags.json | 1 + public/language/nb/topic.json | 12 +++++++----- public/language/nb/user.json | 1 + public/language/nl/error.json | 1 + public/language/nl/notifications.json | 4 ++-- public/language/nl/pages.json | 4 +++- public/language/nl/tags.json | 1 + public/language/nl/topic.json | 12 +++++++----- public/language/nl/user.json | 1 + public/language/pl/error.json | 1 + public/language/pl/notifications.json | 4 ++-- public/language/pl/pages.json | 4 +++- public/language/pl/tags.json | 1 + public/language/pl/topic.json | 12 +++++++----- public/language/pl/user.json | 1 + public/language/pt_BR/error.json | 1 + public/language/pt_BR/notifications.json | 4 ++-- public/language/pt_BR/pages.json | 4 +++- public/language/pt_BR/tags.json | 1 + public/language/pt_BR/topic.json | 12 +++++++----- public/language/pt_BR/user.json | 1 + public/language/ro/error.json | 1 + public/language/ro/notifications.json | 4 ++-- public/language/ro/pages.json | 4 +++- public/language/ro/tags.json | 1 + public/language/ro/topic.json | 12 +++++++----- public/language/ro/user.json | 1 + public/language/ru/error.json | 1 + public/language/ru/notifications.json | 4 ++-- public/language/ru/pages.json | 4 +++- public/language/ru/tags.json | 1 + public/language/ru/topic.json | 12 +++++++----- public/language/ru/user.json | 1 + public/language/sc/error.json | 1 + public/language/sc/notifications.json | 4 ++-- public/language/sc/pages.json | 4 +++- public/language/sc/tags.json | 1 + public/language/sc/topic.json | 12 +++++++----- public/language/sc/user.json | 1 + public/language/sk/error.json | 1 + public/language/sk/notifications.json | 4 ++-- public/language/sk/pages.json | 4 +++- public/language/sk/tags.json | 1 + public/language/sk/topic.json | 12 +++++++----- public/language/sk/user.json | 1 + public/language/sv/error.json | 1 + public/language/sv/notifications.json | 4 ++-- public/language/sv/pages.json | 4 +++- public/language/sv/tags.json | 1 + public/language/sv/topic.json | 12 +++++++----- public/language/sv/user.json | 1 + public/language/th/error.json | 1 + public/language/th/notifications.json | 4 ++-- public/language/th/pages.json | 4 +++- public/language/th/tags.json | 1 + public/language/th/topic.json | 12 +++++++----- public/language/th/user.json | 1 + public/language/tr/error.json | 1 + public/language/tr/notifications.json | 4 ++-- public/language/tr/pages.json | 4 +++- public/language/tr/tags.json | 1 + public/language/tr/topic.json | 12 +++++++----- public/language/tr/user.json | 1 + public/language/vi/error.json | 1 + public/language/vi/notifications.json | 4 ++-- public/language/vi/pages.json | 4 +++- public/language/vi/tags.json | 1 + public/language/vi/topic.json | 12 +++++++----- public/language/vi/user.json | 1 + public/language/zh_CN/error.json | 1 + public/language/zh_CN/notifications.json | 4 ++-- public/language/zh_CN/pages.json | 4 +++- public/language/zh_CN/tags.json | 1 + public/language/zh_CN/topic.json | 12 +++++++----- public/language/zh_CN/user.json | 1 + public/language/zh_TW/error.json | 1 + public/language/zh_TW/notifications.json | 4 ++-- public/language/zh_TW/pages.json | 4 +++- public/language/zh_TW/tags.json | 1 + public/language/zh_TW/topic.json | 12 +++++++----- public/language/zh_TW/user.json | 1 + 186 files changed, 465 insertions(+), 248 deletions(-) diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 6e6956b0ec..1928a67e1f 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "كلمة السر غير مقبولة", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "اسم المستخدم ماخوذ", "email-taken": "البريد الالكتروني ماخوذ", diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index eec61f2062..e0bba2ed65 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index c39934513a..eab53dc3dc 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", "user.favourites": "%1's Favourite Posts", - "user.settings": "User Settings" + "user.settings": "User Settings", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/ar/tags.json b/public/language/ar/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/ar/tags.json +++ b/public/language/ar/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index eed42e4f01..4c2ba2f1ca 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -28,15 +28,17 @@ "flag_title": "Flag this post for moderation", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "This thread has been deleted. Only users with thread management privileges can see it.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will no longer receive notifications from this topic.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "Watch", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Share this Post", - "thread_tools.title": "أدوات الموضوع", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "علم غير مقروء", "thread_tools.pin": "علق الموضوع", "thread_tools.unpin": "Unpin Topic", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "تفرع الموضوع", "thread_tools.delete": "حذف الموضوع", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restore Topic", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 01f1439527..ab925f5ab2 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -29,6 +29,7 @@ "edit": "صحح", "uploaded_picture": "صورة تم تحميلها", "upload_new_picture": "تحميل صورة جديدة", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Current Password", "change_password": "تغيير كلمة السر", "change_password_error": "Invalid Password!", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index f90d459cce..a46573d5b9 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 8a77183b5e..e482f15fd6 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index c39934513a..eab53dc3dc 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", "user.favourites": "%1's Favourite Posts", - "user.settings": "User Settings" + "user.settings": "User Settings", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/cs/tags.json b/public/language/cs/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/cs/tags.json +++ b/public/language/cs/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index b3a0eb1aeb..528e29f3b8 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -28,15 +28,17 @@ "flag_title": "Flag this post for moderation", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "This thread has been deleted. Only users with thread management privileges can see it.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will no longer receive notifications from this topic.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "Watch", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Share this Post", - "thread_tools.title": "Nástroje", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Označit jako nepřečtené", "thread_tools.pin": "Pin Topic", "thread_tools.unpin": "Unpin Topic", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Fork Topic", "thread_tools.delete": "Delete Topic", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restore Topic", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 1f1230bde3..582724d7df 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -29,6 +29,7 @@ "edit": "Upravit", "uploaded_picture": "Nahraný obrázek", "upload_new_picture": "Nahrát nový obrázek", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Current Password", "change_password": "Změnit heslo", "change_password_error": "Invalid Password!", diff --git a/public/language/de/error.json b/public/language/de/error.json index 42030b649a..b7c1045803 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Ungültige Benutzerdaten", "invalid-password": "Ungültiges Passwort", "invalid-username-or-password": "Bitte gebe einen Benutzernamen und ein Passwort an", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Die Nummerierung ist ungültig", "username-taken": "Der Benutzername ist bereits vergeben", "email-taken": "Die E-Mail-Adresse ist bereits vergeben", diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 7140887186..e4cd4e5989 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Du hast ungelesene Benachrichtigungen.", "new_message_from": "Neue Nachricht von %1", "upvoted_your_post_in": "%1 hat deinen Beitrag in %2 positiv bewertet.", - "moved_your_post": "%1 hat deinen Beitrag verschoben.", - "moved_your_topic": "%1 hat dein Thema verschoben.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 hat deinen Beitrag in %2 favorisiert.", "user_flagged_post_in": "%1 hat einen Beitrag in %2 gemeldet", "user_posted_to": "%1 hat auf %2 geantwortet.", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 2df893a878..75b25dc01a 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -12,5 +12,7 @@ "user.posts": "Beiträge von %1", "user.topics": "Themen von %1", "user.favourites": "Von %1 favorisierte Beiträge", - "user.settings": "Benutzer-Einstellungen" + "user.settings": "Benutzer-Einstellungen", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/de/tags.json b/public/language/de/tags.json index 79fdd2d405..9a24949a0b 100644 --- a/public/language/de/tags.json +++ b/public/language/de/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Es gibt keine Themen mit diesem Tag.", "tags": "Tags", "enter_tags_here": "Gib hier Tags ein und drück die Eingabetaste nach jedem Tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Es gibt bisher keine Tags." } \ No newline at end of file diff --git a/public/language/de/topic.json b/public/language/de/topic.json index d75edf3633..8c0baa19e9 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -28,15 +28,17 @@ "flag_title": "Diesen Beitrag zur Moderation markieren", "flag_confirm": "Sind Sie sicher, dass Sie diesen Post markieren möchten?", "flag_success": "Dieser Beitrag wurde erfolgreich für die Moderation markiert.", - "deleted_message": "Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Du erhälst nun eine Benachrichtigung, wenn jemand einen Beitrag zu diesem Thema verfasst.", "not_following_topic.message": "Du erhälst keine weiteren Benachrichtigungen zu diesem Thema.", "login_to_subscribe": "Bitte registrieren oder einloggen um dieses Thema zu abonnieren", "markAsUnreadForAll.success": "Thema für Alle als ungelesen markiert.", "watch": "Beobachten", + "unwatch": "Unwatch", "watch.title": "Bei neuen Antworten benachrichtigen", + "unwatch.title": "Stop watching this topic", "share_this_post": "Diesen Beitrag teilen", - "thread_tools.title": "Tools", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Als ungelesen markieren", "thread_tools.pin": "Thema anpinnen", "thread_tools.unpin": "Thema nicht mehr anpinnen", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Alle verschieben", "thread_tools.fork": "Thema aufspalten", "thread_tools.delete": "Thema löschen", - "thread_tools.delete_confirm": "Sind Sie sicher, dass Sie dieses Thema löschen möchten?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Thema wiederherstellen", - "thread_tools.restore_confirm": "Sind Sie sicher, dass Sie dieses Thema wiederherstellen möchten?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Thema bereinigen", - "thread_tools.purge_confirm": "Sind Sie sicher, dass Sie dieses Thema bereinigen möchten?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Thema wurde erfolgreich zu %1 verschoben.", "post_delete_confirm": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten?", "post_restore_confirm": "Sind Sie sicher, dass Sie diesen Beitrag wiederherstellen möchten?", diff --git a/public/language/de/user.json b/public/language/de/user.json index 9c0e0a1e2a..78e8e4d6c5 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -29,6 +29,7 @@ "edit": "Ändern", "uploaded_picture": "Hochgeladene Bilder", "upload_new_picture": "Neues Bild hochladen", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Aktuelles Passwort", "change_password": "Passwort ändern", "change_password_error": "Ungültiges Passwort!", diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index f90d459cce..a46573d5b9 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/en@pirate/notifications.json b/public/language/en@pirate/notifications.json index 49a3a10e05..657875d3ac 100644 --- a/public/language/en@pirate/notifications.json +++ b/public/language/en@pirate/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/en@pirate/pages.json b/public/language/en@pirate/pages.json index c39934513a..eab53dc3dc 100644 --- a/public/language/en@pirate/pages.json +++ b/public/language/en@pirate/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", "user.favourites": "%1's Favourite Posts", - "user.settings": "User Settings" + "user.settings": "User Settings", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/en@pirate/tags.json b/public/language/en@pirate/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/en@pirate/tags.json +++ b/public/language/en@pirate/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/en@pirate/topic.json b/public/language/en@pirate/topic.json index 6093dc2302..bcb92860a6 100644 --- a/public/language/en@pirate/topic.json +++ b/public/language/en@pirate/topic.json @@ -28,15 +28,17 @@ "flag_title": "Flag this post for moderation", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "This thread has been deleted. Only users with thread management privileges can see it.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will no longer receive notifications from this topic.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "Watch", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Share this Post", - "thread_tools.title": "Thread Tools", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Mark Unread", "thread_tools.pin": "Pin Topic", "thread_tools.unpin": "Unpin Topic", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Fork Topic", "thread_tools.delete": "Delete Topic", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restore Topic", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/en@pirate/user.json b/public/language/en@pirate/user.json index 6492a2ab79..079d49534c 100644 --- a/public/language/en@pirate/user.json +++ b/public/language/en@pirate/user.json @@ -29,6 +29,7 @@ "edit": "Edit", "uploaded_picture": "Uploaded Picture", "upload_new_picture": "Upload New Picture", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Current Password", "change_password": "Change Password", "change_password_error": "Invalid Password!", diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index c63073194a..6cbbb9eeb3 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/en_US/notifications.json b/public/language/en_US/notifications.json index 4d2461226d..cd90b90c74 100644 --- a/public/language/en_US/notifications.json +++ b/public/language/en_US/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/en_US/pages.json b/public/language/en_US/pages.json index d235dcb87f..65ee8cde3f 100644 --- a/public/language/en_US/pages.json +++ b/public/language/en_US/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", "user.favourites": "%1's Favorite Posts", - "user.settings": "User Settings" + "user.settings": "User Settings", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/en_US/tags.json b/public/language/en_US/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/en_US/tags.json +++ b/public/language/en_US/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/en_US/topic.json b/public/language/en_US/topic.json index c64d0c9881..cdde46ebd2 100644 --- a/public/language/en_US/topic.json +++ b/public/language/en_US/topic.json @@ -28,15 +28,17 @@ "flag_title": "Flag this post for moderation", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "This thread has been deleted. Only users with thread management privileges can see it.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will no longer receive notifications from this topic.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "Watch", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Share this Post", - "thread_tools.title": "Thread Tools", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Mark Unread", "thread_tools.pin": "Pin Topic", "thread_tools.unpin": "Unpin Topic", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Fork Topic", "thread_tools.delete": "Delete Topic", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restore Topic", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/en_US/user.json b/public/language/en_US/user.json index cdb91a91d1..4e5e30f3fe 100644 --- a/public/language/en_US/user.json +++ b/public/language/en_US/user.json @@ -29,6 +29,7 @@ "edit": "Edit", "uploaded_picture": "Uploaded Picture", "upload_new_picture": "Upload New Picture", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Current Password", "change_password": "Change Password", "change_password_error": "Invalid Password!", diff --git a/public/language/es/error.json b/public/language/es/error.json index d4c30e6d91..58430eeb56 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Datos de Usuario no válidos", "invalid-password": "Contraseña no válida", "invalid-username-or-password": "Por favor especifica tanto un usuario como contraseña", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Valor de paginación no válido.", "username-taken": "Nombre de usuario ya escogido", "email-taken": "El correo electrónico ya está escogido.", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 31f55eace7..f9007c1f05 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Tienes notificaciones sin leer.", "new_message_from": "Nuevo mensaje de %1", "upvoted_your_post_in": "%1 ha votado como relevante tu respuesta en %2.", - "moved_your_post": "%1 ha movido su publicación.", - "moved_your_topic": "%1 ha movido su tema.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 ha marcado como favorito su publicación en %2.", "user_flagged_post_in": "%1 ha marcado como indebida una respuesta en %2", "user_posted_to": "%1 ha publicado una respuesta a: %2", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index ab6e4eaedd..de68eca1f7 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posteos de %1", "user.topics": "Temas creados por %1", "user.favourites": "Publicaciones favoritas de %1 ", - "user.settings": "Preferencias del Usuario" + "user.settings": "Preferencias del Usuario", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/es/tags.json b/public/language/es/tags.json index cb679cdc7f..36dabaf8f1 100644 --- a/public/language/es/tags.json +++ b/public/language/es/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "No hay temas con esta etiqueta.", "tags": "Etiquetas", "enter_tags_here": "Introduce las etiquetas aquí. Pulsa intro desde de cada una.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Aún no hay etiquetas." } \ No newline at end of file diff --git a/public/language/es/topic.json b/public/language/es/topic.json index d8eafd749c..0cbd926f40 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -28,15 +28,17 @@ "flag_title": "Reportar esta publicación a los moderadores", "flag_confirm": "¿Estás seguro de que quieres marcar como indebido este mensaje?", "flag_success": "Este mensaje ha sido marcado para la moderación.", - "deleted_message": "Este tema ha sido borrado. Solo los miembros con privilegios pueden verlo.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Ahora recibiras notificaciones cuando alguien publique en este tema.", "not_following_topic.message": "No recibiras notificaciones de este tema.", "login_to_subscribe": "Por favor, conectate para subscribirte a este tema.", "markAsUnreadForAll.success": "Publicación marcada como no leída para todos.", "watch": "Seguir", + "unwatch": "Unwatch", "watch.title": "Serás notificado cuando haya nuevas respuestas en este tema", + "unwatch.title": "Stop watching this topic", "share_this_post": "Compartir este post", - "thread_tools.title": "Herramientas del Tema", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Marcar como no leído", "thread_tools.pin": "Tema Importante", "thread_tools.unpin": "Quitar Importante", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Mover todo", "thread_tools.fork": "Bifurcar Tema", "thread_tools.delete": "Borrar Tema", - "thread_tools.delete_confirm": "¿Estás seguro de que quieres eliminar este hilo?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restaurar Tema", - "thread_tools.restore_confirm": "¿Estás seguro de que quieres restaurar este hilo?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purgar publicación", - "thread_tools.purge_confirm": "¿Estás seguro que deseas purgar este hilo?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "El tema ha sido movido correctamente a %1", "post_delete_confirm": "¿Estás seguro de que quieres eliminar esta respuesta?", "post_restore_confirm": "¿Estás seguro de que quieres restaurar esta respuesta?", diff --git a/public/language/es/user.json b/public/language/es/user.json index 4c2f89a501..4d03c0768d 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -29,6 +29,7 @@ "edit": "Editar", "uploaded_picture": "Fotos subidas", "upload_new_picture": "Subir Nueva Foto", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Contraseña actual", "change_password": "Cambiar Contraseña", "change_password_error": "Contraseña no válida!", diff --git a/public/language/et/error.json b/public/language/et/error.json index 51926c86b5..971f42eaaf 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Vigased kasutaja andmed", "invalid-password": "Vigane parool", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Vigane lehe väärtus", "username-taken": "Kasutajanimi on juba võetud", "email-taken": "Email on võetud", diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 8ee69d3072..55352cc6df 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Sul ei ole lugemata teateid.", "new_message_from": "Uus sõnum kasutajalt %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "Kasutaja %1 postitas vastuse teemasse %2", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index 9cc027eaaf..24801a804f 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -12,5 +12,7 @@ "user.posts": "Postitused, mis on tehtud kasutaja %1 poolt", "user.topics": "Teemad on kirjutanud %1", "user.favourites": "%1's lemmikud postitused", - "user.settings": "Kasutaja sätted" + "user.settings": "Kasutaja sätted", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/et/tags.json b/public/language/et/tags.json index b746eae6d1..083121ea1b 100644 --- a/public/language/et/tags.json +++ b/public/language/et/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Teemasid, mis sisaldaksid seda märksõna, ei eksisteeri.", "tags": "Märksõnad", "enter_tags_here": "Sisesta märksõnad siia. Iga märksõna tagant sisesta enterit.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Siin ei ole veel ühtegi märksõna." } \ No newline at end of file diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 8b57bef58d..7c0f745a23 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -28,15 +28,17 @@ "flag_title": "Märgista see postitus modereerimiseks", "flag_confirm": "Oled kindel, et soovid märgistada antud postituse?", "flag_success": "See posits on nüüd märgistatud modereerimiseks.", - "deleted_message": "Teema kustutati. Ainult kasutajad, kellel on piisavad õigused saavad seda veel näha.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Sulle ei edastata enam teateid uutest postitustest kui keegi postitab siia teemasse.", "not_following_topic.message": "Sulle ei edastata enam teateid uutest postitustest siin teemas.", "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.", "watch": "Vaata", + "unwatch": "Unwatch", "watch.title": "Saa teateid uutest postitustest siin teemas", + "unwatch.title": "Stop watching this topic", "share_this_post": "Jaga seda postitust", - "thread_tools.title": "Teema tööriistad", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Märgi mitte-loetuks", "thread_tools.pin": "Tõsta esile teema", "thread_tools.unpin": "Märgista teema", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Liiguta kõik", "thread_tools.fork": "Fork Topic", "thread_tools.delete": "Kustuta teema", - "thread_tools.delete_confirm": "Oled kindel, et soovid kustutada antud teema?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Taasta teema", - "thread_tools.restore_confirm": "Oled kindel, et soovid taastada antud teema?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Kustuta teema täielikult", - "thread_tools.purge_confirm": "Oled kindel, et soovid täielikult kustutada selle teema?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Teema liigutatud kategooriasse %1", "post_delete_confirm": "Oled kindel, et soovid kustutada selle postituse?", "post_restore_confirm": "Oled kindel, et soovid taastada antud postituse?", diff --git a/public/language/et/user.json b/public/language/et/user.json index 9decf2a23e..088492c645 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -29,6 +29,7 @@ "edit": "Muuda", "uploaded_picture": "Üleslaetud pilt", "upload_new_picture": "Laadi uus pilt", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Praegune parool", "change_password": "Vaheta parooli", "change_password_error": "Vigane parool!", diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 64f4d35823..c677c890fb 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "داده‌های کاربری نامعتبر است.", "invalid-password": "گذرواژه نامعتبر است.", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "عدد صفحه‌بندی نامعتبر است.", "username-taken": "این نام کاربری گرفته شده است.", "email-taken": "این رایانامه گرفته شده است.", diff --git a/public/language/fa_IR/notifications.json b/public/language/fa_IR/notifications.json index 62b48b71af..d572a8099c 100644 --- a/public/language/fa_IR/notifications.json +++ b/public/language/fa_IR/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "شما آگاه‌سازی‌های نخوانده دارید.", "new_message_from": "پیام تازه از %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "پاسخ دادن به %2 از سوی %1", diff --git a/public/language/fa_IR/pages.json b/public/language/fa_IR/pages.json index 94458a27a2..66ad6a0aa6 100644 --- a/public/language/fa_IR/pages.json +++ b/public/language/fa_IR/pages.json @@ -12,5 +12,7 @@ "user.posts": "دیدگاه‌های %1", "user.topics": "%1 این جستار را ساخت.", "user.favourites": "دیدگاه‌های پسندیدهٔ %1", - "user.settings": "تنظیمات کاربر" + "user.settings": "تنظیمات کاربر", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/fa_IR/tags.json b/public/language/fa_IR/tags.json index 5f9c79ea58..78c658e958 100644 --- a/public/language/fa_IR/tags.json +++ b/public/language/fa_IR/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "جُستاری با این برچسب وجود ندارد.", "tags": "برچسب‌ها", "enter_tags_here": "برچسب‌ها را اینجا وارد کنید. بعد از هر برچسب، اینتر بزنید.", + "enter_tags_here_short": "Enter tags...", "no_tags": "هنوز برچسبی وجود ندارد." } \ No newline at end of file diff --git a/public/language/fa_IR/topic.json b/public/language/fa_IR/topic.json index 47f345fc6d..3472dc0792 100644 --- a/public/language/fa_IR/topic.json +++ b/public/language/fa_IR/topic.json @@ -28,15 +28,17 @@ "flag_title": "پرچم‌گذاری این جستار برای بررسی ناظران", "flag_confirm": "آیا مطمئنید که می‌خواهید روی این دیدگاه پرچم بگذارید.", "flag_success": "این جستار برای بررسی ناظران پرچم گذاشته شد.", - "deleted_message": "این جستار پاک شده است. تنها کاربران دارای پروانه‌های مدیریت جستار می‌توانند آن را ببینند.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "از این پس اگر کسی در این جستار دیدگاه بگذارد، شما آگاه خواهید شد.", "not_following_topic.message": "شما دیگر آگاه‌سازی‌های این جستار را دریافت نخواهید کرد.", "login_to_subscribe": "برای دنبال کردن این جستار، لطفا نام‌نویسی کنید یا به درون بیایید.", "markAsUnreadForAll.success": "جستار برای همگان نخوانده در نظر گرفته شد.", "watch": "تماشا کردن", + "unwatch": "Unwatch", "watch.title": "از پاسخ‌های تازه به این جستار آگاه شوید.", + "unwatch.title": "Stop watching this topic", "share_this_post": "به اشتراک‌گذاری این جستار", - "thread_tools.title": "ابزاهای جستار", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "نخوانده بگیر", "thread_tools.pin": "سنجاق زدن جستار", "thread_tools.unpin": "برداشتن سنجاق جستار", @@ -46,11 +48,11 @@ "thread_tools.move_all": "جابجایی همه", "thread_tools.fork": "شاخه ساختن از جستار", "thread_tools.delete": "پاک کردن جستار", - "thread_tools.delete_confirm": "آیا از پاک کردن این جستار اطمینان دارید؟", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "برگرداندن جستار", - "thread_tools.restore_confirm": "آیا از بازگردانی این جستار اطمینان دارید؟", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "پاک کردن جستار", - "thread_tools.purge_confirm": "آیا از پاک کردن این جستار اطمینان دارید؟", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "جابه‌جایی این جستار به %1 باموفقیت انجام شد.", "post_delete_confirm": "آیا از پاک کردن این دیدگاه اطمینان دارید؟", "post_restore_confirm": "آیا از بازگردانی این دیدگاه اطمینان دارید؟", diff --git a/public/language/fa_IR/user.json b/public/language/fa_IR/user.json index e6085077d4..1abaf529e4 100644 --- a/public/language/fa_IR/user.json +++ b/public/language/fa_IR/user.json @@ -29,6 +29,7 @@ "edit": "ویرایش", "uploaded_picture": "تصویر بارشده", "upload_new_picture": "بارگذاری تصویر تازه", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "گذرواژه کنونی", "change_password": "تغیر گذرواژه", "change_password_error": "گذرواژهٔ نامعتبر!", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 73febab0c3..6898e63d6c 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Virheellinen käyttäjätieto", "invalid-password": "Virheellinen salasana", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Virheellinen taittoarvo", "username-taken": "Käyttäjänimi varattu", "email-taken": "Sähköpostiosoite varattu", diff --git a/public/language/fi/notifications.json b/public/language/fi/notifications.json index 2eb5163d4a..94a9200830 100644 --- a/public/language/fi/notifications.json +++ b/public/language/fi/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Sinulla on lukemattomia ilmoituksia.", "new_message_from": "Uusi viesti käyttäjältä %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/fi/pages.json b/public/language/fi/pages.json index 899ce00bf2..7141fe172a 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -12,5 +12,7 @@ "user.posts": "Käyttäjän %1 kirjoittamat viestit", "user.topics": "Käyttäjän %1 aloittamat aiheet", "user.favourites": "Käyttäjän %1 suosikkiviestit", - "user.settings": "Käyttäjän asetukset" + "user.settings": "Käyttäjän asetukset", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/fi/tags.json b/public/language/fi/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/fi/tags.json +++ b/public/language/fi/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index bccb155bf4..ea5ad2122b 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -28,15 +28,17 @@ "flag_title": "Ilmianna tämä viesti moderaattoreille", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "Tämä viestiketju on poistettu. Vain käyttäjät, joilla on viestiketjujen hallintaoikeudet, voivat nähdä sen.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Saat nyt ilmoituksen, kun joku kirjoittaa tähän aiheeseen.", "not_following_topic.message": "Et saa enää ilmoituksia tästä aiheesta.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "Tarkkaile", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Jaa tämä viesti", - "thread_tools.title": "Aiheen työkalut", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Merkitse lukemattomaksi", "thread_tools.pin": "Kiinnitä aihe", "thread_tools.unpin": "Poista aiheen kiinnitys", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Haaroita aihe", "thread_tools.delete": "Poista aihe", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Palauta aihe", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 930f9cffb0..4df8432aec 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -29,6 +29,7 @@ "edit": "Muokkaa", "uploaded_picture": "Ladattu kuva", "upload_new_picture": "Lataa uusi kuva", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Nykyinen salasana", "change_password": "Vaihda salasana", "change_password_error": "Virheellinen salasana", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index bcc272f6d8..63885e4418 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Données utilisateur invalides", "invalid-password": "Mot de passe invalide", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Valeur de pagination invalide", "username-taken": "Nom d’utilisateur déjà utilisé", "email-taken": "Email déjà utilisé", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index 5e1178f78c..ee94871b46 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Vous avez des notifications non-lues", "new_message_from": "Nouveau message de %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 a répondu à : %2", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index ad713d898b..e4c70d413a 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -12,5 +12,7 @@ "user.posts": "Message écrit par %1", "user.topics": "Sujets créés par %1", "user.favourites": "Messages favoris de %1", - "user.settings": "Préférences utilisateur" + "user.settings": "Préférences utilisateur", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/fr/tags.json b/public/language/fr/tags.json index d89f217a37..ba411020b9 100644 --- a/public/language/fr/tags.json +++ b/public/language/fr/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Il n'y a aucun sujet ayant ce mot-clé", "tags": "Mots-clés", "enter_tags_here": "Entrez les mots-clés ici. Appuyez sur entrer après chaque mot-clé.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Il n'y a pas encore de mots-clés." } \ No newline at end of file diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index f73fad2ed0..eee07ade43 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -28,15 +28,17 @@ "flag_title": "Signaler ce post à la modération", "flag_confirm": "Êtes-vous sûr de bien vouloir signaler ce message ?", "flag_success": "Ce message a bien été signalé aux modérateurs.", - "deleted_message": "Ce sujet a été supprimé. Seuls les utilsateurs ayant les droits d'administration peuvent le voir.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Vous recevrez désormais des notifications lorsque quelqu'un postera dans ce sujet.", "not_following_topic.message": "Vous ne recevrez plus de notifications pour ce sujet.", "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.", "watch": "Suivre", + "unwatch": "Unwatch", "watch.title": "Être notifié des nouvelles réponses dans ce sujet", + "unwatch.title": "Stop watching this topic", "share_this_post": "Partager ce message", - "thread_tools.title": "Outils", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Marquer comme non lu", "thread_tools.pin": "Epingler le sujet", "thread_tools.unpin": "Désépingler le sujet", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Déplacer tout", "thread_tools.fork": "Scinder le sujet", "thread_tools.delete": "Supprimer le sujet", - "thread_tools.delete_confirm": "Êtes-vous sûr de bien vouloir supprimer ce sujet ?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restaurer le sujet", - "thread_tools.restore_confirm": "Êtes-vous sûr de bien vouloir restaurer ce sujet ?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Supprimer définitivement le(s) sujet(s)", - "thread_tools.purge_confirm": "Êtes-vous sûr de bien vouloir supprimer définitivement ce fil ?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Ce sujet a bien été déplacé vers %1.", "post_delete_confirm": "Êtes-vous sûr de bien vouloir supprimer ce message ?", "post_restore_confirm": "Êtes-vous sûr de bien vouloir restaurer ce message ?", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index a476ad9f05..26912f28a9 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -29,6 +29,7 @@ "edit": "Editer", "uploaded_picture": "Image envoyée", "upload_new_picture": "Envoyer une nouvelle image", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Mot de passe actuel", "change_password": "Changer le mot de passe", "change_password_error": "Mot de passe invalide !", diff --git a/public/language/he/error.json b/public/language/he/error.json index 28cd04e663..2cc13fa0bb 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "מידע משתמש שגוי", "invalid-password": "סיסמא שגויה", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "ערך דפדוף שגוי", "username-taken": "שם משתמש תפוס", "email-taken": "כתובת אימייל תפוסה", diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index f3f8efa00f..02d485149b 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index d12dc6944f..38955ecec1 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -12,5 +12,7 @@ "user.posts": "פוסטים שהועלו על ידי %1", "user.topics": "נושאים שנוצרו על ידי %1", "user.favourites": "הפוסטים המועדפים על %1", - "user.settings": "הגדרות משתמש" + "user.settings": "הגדרות משתמש", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/he/tags.json b/public/language/he/tags.json index 3ddd4ab34b..94d002603f 100644 --- a/public/language/he/tags.json +++ b/public/language/he/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "אין פוסטים עם תגית זו.", "tags": "תגיות", "enter_tags_here": "יש להכניס כאן את התגיות. לחץ אנטר אחרי כל תגית.", + "enter_tags_here_short": "Enter tags...", "no_tags": "אין עדיין תגיות." } \ No newline at end of file diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 59d3ab6736..6b49bd2ec0 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -28,15 +28,17 @@ "flag_title": "דווח על פוסט זה למנהל", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "הנושא הזה נמחק. רק מנהלים מורשים לראות אותו", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "מעתה, תקבל הודעות כאשר מישהו יעלה פוסט לנושא זה.", "not_following_topic.message": "לא תקבל הודעות נוספות בנושא זה.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "עקוב", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "שתף פוסט זה", - "thread_tools.title": "כלים", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "סמן כלא נקרא", "thread_tools.pin": "נעץ נושא", "thread_tools.unpin": "הסר נעץ", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "שכפל נושא", "thread_tools.delete": "מחק נושא", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "שחזר נושא", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/he/user.json b/public/language/he/user.json index 58ee8081e5..ea6a281a62 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -29,6 +29,7 @@ "edit": "ערוך", "uploaded_picture": "התמונה הועלתה", "upload_new_picture": "העלה תמונה חדשה", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "סיסמה נוכחית", "change_password": "שנה סיסמה", "change_password_error": "סיסמה אינה תקינה!", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index f90d459cce..a46573d5b9 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index 86ce42f88a..efe19c3892 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index 7057c11031..94c1922e5a 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -12,5 +12,7 @@ "user.posts": "Hozzászólások által %1", "user.topics": "Topics created by %1", "user.favourites": "%1 Kedvenc Hozzászólásai", - "user.settings": "Felhasználói Beállítások" + "user.settings": "Felhasználói Beállítások", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/hu/tags.json b/public/language/hu/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/hu/tags.json +++ b/public/language/hu/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 44e43200be..e65a4ca164 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -28,15 +28,17 @@ "flag_title": "A hozzászólás jelentése a moderátoroknál", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "Ez a topik törölve lett. Kizárólag azok a felhasználók láthatják, akiknek joga van hozzá.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "You will now be receiving notifications when somebody posts to this topic.", "not_following_topic.message": "You will no longer receive notifications from this topic.", "login_to_subscribe": "Please register or log in in order to subscribe to this topic.", "markAsUnreadForAll.success": "Topic marked as unread for all.", "watch": "Követés", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Hozzászólás megosztása", - "thread_tools.title": "Téma Eszközök", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Olvasatlannak jelölés", "thread_tools.pin": "Kiemel", "thread_tools.unpin": "Kiemelés megszűntetése", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Topik szétszedése", "thread_tools.delete": "Topik törlése", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Topik visszaállítása", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index a7ef8fc8c0..b84772af8d 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -29,6 +29,7 @@ "edit": "Szerkeszt", "uploaded_picture": "Feltöltött kép", "upload_new_picture": "Új kép feltöltése", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Current Password", "change_password": "Jelszó megváltoztatása", "change_password_error": "Helytelen jelszó!", diff --git a/public/language/it/error.json b/public/language/it/error.json index 2f3761f472..79bc136692 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Dati Utente non validi", "invalid-password": "Password non valida", "invalid-username-or-password": "Si prega di specificare sia un nome utente che una password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Valore di paginazione non valido", "username-taken": "Nome utente già preso", "email-taken": "Email già esistente", diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 91ee4d5a1b..f6591255f3 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Hai notifiche non lette.", "new_message_from": "Nuovo messaggio da %1", "upvoted_your_post_in": "%1 ha votato positivamente il tuo post in %2.", - "moved_your_post": "%1 has spostato il tuo post.", - "moved_your_topic": "%1 ha spostato la tua discussione.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 ha messo nei favoriti il tuo post in %2.", "user_flagged_post_in": "%1 ha segnalato un post in %2", "user_posted_to": "%1 ha postato una risposta a: %2", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index 7ce7f4cd7f..0186ca5a79 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -12,5 +12,7 @@ "user.posts": "Post creati da %1", "user.topics": "Discussioni create da %1", "user.favourites": "Post Favoriti da %1", - "user.settings": "Impostazioni Utente" + "user.settings": "Impostazioni Utente", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/it/tags.json b/public/language/it/tags.json index 49f0d53fa6..a5eb7f96e6 100644 --- a/public/language/it/tags.json +++ b/public/language/it/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Non ci sono discussioni con questo tag.", "tags": "Tags", "enter_tags_here": "Inserire qui i tags. Premere invio dopo ogni tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Non ci sono ancora tags." } \ No newline at end of file diff --git a/public/language/it/topic.json b/public/language/it/topic.json index adeb47a71d..2eb9541a01 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -28,15 +28,17 @@ "flag_title": "Segnala questo post per la moderazione", "flag_confirm": "Sei sicuro di voler contrassegnare questo post?", "flag_success": "Questo post è stato contrassegnato per la moderazione.", - "deleted_message": "Questa discussione è stata cancellata. Solo gli utenti con diritti di gestione possono vederla.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Da ora riceverai notifiche quando qualcuno posterà in questa discussione.", "not_following_topic.message": "Non riceverai più notifiche da questa discussione.", "login_to_subscribe": "Si prega di accedere o registrarsi per potersi iscrivere a questa discussione.", "markAsUnreadForAll.success": "Discussione segnata come non letta per tutti.", "watch": "Osserva", + "unwatch": "Unwatch", "watch.title": "Ricevi notifiche di nuove risposte in questa discussione", + "unwatch.title": "Stop watching this topic", "share_this_post": "Condividi questo Post", - "thread_tools.title": "Strumenti per la Discussione", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Segna come non letto", "thread_tools.pin": "Fissa Discussione", "thread_tools.unpin": "Sblocca Discussione", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Sposta Tutto", "thread_tools.fork": "Dividi Discussione", "thread_tools.delete": "Elimina Discussione", - "thread_tools.delete_confirm": "Sei sicuro di voler cancellare questa discussione?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Ripristina Discussione", - "thread_tools.restore_confirm": "Sei sicuro di voler ripristinare questa discussione?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Svuota Discussione", - "thread_tools.purge_confirm": "Sei sicuro di voler svuotare questa discussione?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Questa discussione è stata correttamente spostata in %1", "post_delete_confirm": "Sei sicuro di voler cancellare questo post?", "post_restore_confirm": "Sei sicuro di voler ripristinare questo post?", diff --git a/public/language/it/user.json b/public/language/it/user.json index 9eb7b2a6d1..f3481db16e 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -29,6 +29,7 @@ "edit": "Modifica", "uploaded_picture": "Foto caricata", "upload_new_picture": "Carica una nuova foto", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Password corrente", "change_password": "Cambia la Password", "change_password_error": "Password non valida!", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 0d6aad1afd..76f1cadd85 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "無効なユーザーデータ", "invalid-password": "無効なパスワード", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "無効な改ページ設定値", "username-taken": "ユーザー名が取られた", "email-taken": "メールアドレスが使用された", diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index 9823deff19..d06de648c4 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "未読の通知があります。", "new_message_from": "%1からの新しいメッセージ", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1%2 への返事を作成しました。", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index 36295b2fa5..34a0e00267 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -12,5 +12,7 @@ "user.posts": "%1が作成したポスト", "user.topics": "%1が作成したスレッド", "user.favourites": "%1のお気に入りポスト", - "user.settings": "ユーザー設定" + "user.settings": "ユーザー設定", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/ja/tags.json b/public/language/ja/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/ja/tags.json +++ b/public/language/ja/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 94366f766e..543ee3b3d6 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -28,15 +28,17 @@ "flag_title": "リポートする", "flag_confirm": "本当にこのポストをリポートするか?", "flag_success": "このポストをリポートしました。", - "deleted_message": "このスレッドは削除されました。管理者しか見れません。", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "このスレッドが更新された際に通知を受け取ります。", "not_following_topic.message": "このスレッドの更新通知を停止しました。", "login_to_subscribe": "このスレッドを購読するためにログインが必要です。", "markAsUnreadForAll.success": "すべてのスレッドを未読にしました。", "watch": "ウオッチ", + "unwatch": "Unwatch", "watch.title": "新しいポストの通知を受ける", + "unwatch.title": "Stop watching this topic", "share_this_post": "ポストを共有", - "thread_tools.title": "スレッドツール", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "未読にする", "thread_tools.pin": "スレッドを最上部に固定", "thread_tools.unpin": "スレッドの固定を解除", @@ -46,11 +48,11 @@ "thread_tools.move_all": "すべてを移動", "thread_tools.fork": "スレッドをフォーク", "thread_tools.delete": "スレッドを削除", - "thread_tools.delete_confirm": "本当にスレッドを削除しますか?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "スレッドをリストア", - "thread_tools.restore_confirm": "本当にスレッドをリストアしますか?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "このスレッドを %1 に移動しました。", "post_delete_confirm": "本当にポストを削除しますか?", "post_restore_confirm": "本当にポストをリストアしますか?", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index ba3b2c1ed0..29cd6ebada 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -29,6 +29,7 @@ "edit": "編集", "uploaded_picture": "アップロード済みの画像", "upload_new_picture": "新しい画像をアップロード", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "現在のパスワード", "change_password": "パスワードを変更", "change_password_error": "無効のパスワード!", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index be2363f55a..8aa27aa2a6 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "올바르지 않은 사용자 정보입니다.", "invalid-password": "올바르지 않은 비밀번호입니다.", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "올바르지 않은 페이지입니다.", "username-taken": "이미 사용 중인 사용자 이름입니다.", "email-taken": "이미 사용 중인 이메일입니다.", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 90d004d7e0..82ec4bb972 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "읽지 않은 알림이 있습니다.", "new_message_from": "%1님이 메시지를 보냈습니다.", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1님이 %2님의 게시물에 답글을 작성했습니다.", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index e72e0b57c0..cf6d0503f8 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -12,5 +12,7 @@ "user.posts": "%1님이 작성한 게시물", "user.topics": "%1님이 생성한 주제", "user.favourites": "%1님이 좋아하는 게시물", - "user.settings": "설정" + "user.settings": "설정", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/ko/tags.json b/public/language/ko/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/ko/tags.json +++ b/public/language/ko/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 7e4d14a405..45ea767a7c 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -28,15 +28,17 @@ "flag_title": "이 게시물을 신고", "flag_confirm": "정말로 신고하시겠습니까?", "flag_success": "이 게시물은 신고되었습니다.", - "deleted_message": "이 주제는 삭제되었습니다. 게시물 관리 권한이 있는 사용자만 접근할 수 있습니다.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "이제 이 주제에 새 답글이 달리면 알림을 받습니다.", "not_following_topic.message": "더 이상 이 주제의 새 답글을 알리지 않습니다.", "login_to_subscribe": "이 주제의 알림을 받기 위해서는 로그인해야 합니다.", "markAsUnreadForAll.success": "모든 사용자에 대해 읽지 않음으로 표시했습니다.", "watch": "관심 주제", + "unwatch": "Unwatch", "watch.title": "이 주제의 새 답글 알리기", + "unwatch.title": "Stop watching this topic", "share_this_post": "이 게시물 공유", - "thread_tools.title": "주제 도구", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "모두에게 읽지 않음으로 표시", "thread_tools.pin": "상단 고정", "thread_tools.unpin": "상단 고정 해제", @@ -46,11 +48,11 @@ "thread_tools.move_all": "모두 이동", "thread_tools.fork": "복제", "thread_tools.delete": "삭제", - "thread_tools.delete_confirm": "이 주제를 삭제하시겠습니까?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "복원", - "thread_tools.restore_confirm": "이 주제를 복원하시겠습니까?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "성공적으로 이 주제를 %1로 이동했습니다.", "post_delete_confirm": "이 게시물을 삭제하시겠습니까?", "post_restore_confirm": "이 게시물을 복원하시겠습니까?", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 37ef4e717d..e228bbd7f7 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -29,6 +29,7 @@ "edit": "프로필 수정", "uploaded_picture": "사진 업로드", "upload_new_picture": "새 사진 업로드", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "현재 비밀번호", "change_password": "비밀번호 변경", "change_password_error": "유효하지 않은 비밀번호", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 48edfbb72a..77ad0ede5f 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Klaidingi vartotojo duomenys", "invalid-password": "Klaidingas slaptažodis", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Klaidinga puslapiavimo reikšmė", "username-taken": "Vartotojo vardas jau užimtas", "email-taken": "El. pašto adresas jau užimtas", diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 864652cb57..8f8a3c6184 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Jūs turite neperskaitytų pranešimų.", "new_message_from": "Nauja žinutė nuo %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 parašė atsaką %2", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index 4e62692bd3..074199f7ae 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -12,5 +12,7 @@ "user.posts": "Pranešimai, kuriuos parašė %1", "user.topics": "Temos, kurias sukūrė %1", "user.favourites": "Vartotojo %1 mėgstami pranešimai", - "user.settings": "Vartotojo nustatymai" + "user.settings": "Vartotojo nustatymai", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/lt/tags.json b/public/language/lt/tags.json index db32f31aba..93a06c9cbe 100644 --- a/public/language/lt/tags.json +++ b/public/language/lt/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Temų su šią žyma nėra.", "tags": "Žymos", "enter_tags_here": "Čia surašykite žymas. Paspauskite enter po kiekvienos žymos.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Žymų kolkas nėra." } \ No newline at end of file diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 2d1896a77c..28a5924eda 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -28,15 +28,17 @@ "flag_title": "Pažymėti ši pranešimą moderatoriams", "flag_confirm": "Ar jūs tikras, kad norite pažymėti šį įrašą?", "flag_success": "Šis pranešimas buvo pažymėtas moderatorių patikrinimui.", - "deleted_message": "Ši tema buvo ištrinta. Ją gali matyti tik vartotojai su temų valdymo privilegijomis.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Dabar jūs gausite pranešimus kai kas nors atrašys šioje temoje.", "not_following_topic.message": "Jūs daugiau negausite pranešimų iš šios temos.", "login_to_subscribe": "Norėdami prenumeruoti šią temą, prašome prisiregistruoti arba prisijungti.", "markAsUnreadForAll.success": "Tema visiems vartotojams pažymėta kaip neskaityta.", "watch": "Žiūrėti", + "unwatch": "Unwatch", "watch.title": "Gauti pranešimą apie naujus įrašus šioje temoje", + "unwatch.title": "Stop watching this topic", "share_this_post": "Dalintis šiuo įrašu", - "thread_tools.title": "Temos įrankiai", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Pažymėti kaip neskaitytą", "thread_tools.pin": "Prisegti temą", "thread_tools.unpin": "Atsegti temą", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Perkelti visus", "thread_tools.fork": "Išskaidyti temą", "thread_tools.delete": "Ištrinti temą", - "thread_tools.delete_confirm": "Ar jūs tikrai norite ištrinti šią temą?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Atkurti temą", - "thread_tools.restore_confirm": "Ar jūs tikrai norite atkurti šią temą?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Išvalyti temą", - "thread_tools.purge_confirm": "Ar tikrai norite išvalyti šią temą?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Ši tema buvo sėkmingai perkelta į %1", "post_delete_confirm": "Ar jūs tikrai norite ištrinti šį įrašą?", "post_restore_confirm": "Ar jūs tikrai norite atkurti šį įrašą?", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 2ef87f0c0c..868d3db880 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -29,6 +29,7 @@ "edit": "Redaguoti", "uploaded_picture": "Įkeltas paveikslėlis", "upload_new_picture": "Įkelti naują paveikslėlį", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Dabartinis slaptažodis", "change_password": "Pakeisti slaptažodį", "change_password_error": "Negalimas slaptažodis!", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index b6ad0bd586..1af71bfec7 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Password salah!", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index 02cc302284..28d165c250 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Anda ada pemberitahuan yang belum dibaca", "new_message_from": "Pesanan baru daripada %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 telah membalas posting kepada: %2", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index 0d1ab9ca76..cf392a6348 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -12,5 +12,7 @@ "user.posts": "Kiriman dibuat oleh %1", "user.topics": "Topik dibuat oleh %1", "user.favourites": "Mesej Kegemaran %1", - "user.settings": "Tetapan pengguna" + "user.settings": "Tetapan pengguna", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/ms/tags.json b/public/language/ms/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/ms/tags.json +++ b/public/language/ms/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index dde98de2a8..fc3995784d 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -28,15 +28,17 @@ "flag_title": "Tanda posting ini untuk moderasi", "flag_confirm": "Adakah anda pasti untuk menanda kiriman ini", "flag_success": "Kiriman ini telah ditandakan untuk moderasi", - "deleted_message": "Thread ini telah dipadamkan. Hanya pengguna yang menguruskan thread ini boleh mellihatnya", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Anda akan menerima makluman apabila ada kiriman kedalam topik ini", "not_following_topic.message": "Anda tidak lagi akan menerima makluman daripada topik ini", "login_to_subscribe": "SIla daftar atau log masuk untuk melanggani topik ini", "markAsUnreadForAll.success": "Topik ditanda sebagai belum dibaca untuk semua", "watch": "Saksikan", + "unwatch": "Unwatch", "watch.title": "Akan dimaklumkan sekiranya ada balasan dalam topik ini", + "unwatch.title": "Stop watching this topic", "share_this_post": "Kongsi kiriman ini", - "thread_tools.title": "Perkakas untuk thread", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Tanda sebagai belum dibaca", "thread_tools.pin": "Pinkan topik", "thread_tools.unpin": "Unpin topik", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Fork topik", "thread_tools.delete": "Padamkan topik", - "thread_tools.delete_confirm": "Adakah anda pasti untuk memadamkan thread ini?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Pulihkan topik", - "thread_tools.restore_confirm": "Adakah anda pasti untuk memulihkan threa ini?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Topik telah dipindahkan ke %1", "post_delete_confirm": "Adakah anda pasti untuk memadam kiriman ini?", "post_restore_confirm": "Adakah anda pasti untuk memulihkan kiriman ini?", diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 366c6ae8fb..62781c0d88 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -29,6 +29,7 @@ "edit": "Edit", "uploaded_picture": "Muatnaik gambak", "upload_new_picture": "Muatnaik gambar baru", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Password sekarang", "change_password": "TUkar password", "change_password_error": "Password salah!", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index f90d459cce..a46573d5b9 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index 2ffabea7c1..54308671e1 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Du har uleste varsler.", "new_message_from": "Ny melding fra %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 har skrevet et svar til: %2", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 862d9fffdb..3c1986ebe5 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -12,5 +12,7 @@ "user.posts": "Innlegg laget av %1", "user.topics": "Emner opprettet av %1", "user.favourites": "%1 sine favoritt-innlegg", - "user.settings": "Brukerinnstillinger" + "user.settings": "Brukerinnstillinger", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/nb/tags.json b/public/language/nb/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/nb/tags.json +++ b/public/language/nb/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 0462cf426f..fb602168dc 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -28,15 +28,17 @@ "flag_title": "Rapporter dette innlegget for granskning", "flag_confirm": "Er du sikker på at du vil rapportere dette innlegget?", "flag_success": "Dette innlegget har blitt rapportert.", - "deleted_message": "Denne tråden har blitt slettet. Bare brukere med trådhåndterings-privilegier kan se den.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Du vil nå motta varsler når noen skriver i denne tråden.", "not_following_topic.message": "Du vil ikke lenger motta varsler fra denne tråden.", "login_to_subscribe": "Vennligst registrer deg eller logg inn for å abonnere på denne tråden.", "markAsUnreadForAll.success": "Tråd markert som ulest for alle.", "watch": "Overvåk", + "unwatch": "Unwatch", "watch.title": "Bli varslet om nye svar i dette emnet", + "unwatch.title": "Stop watching this topic", "share_this_post": "Del ditt innlegg", - "thread_tools.title": "Trådverktøy", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Marker som ulest", "thread_tools.pin": "Fest tråd", "thread_tools.unpin": "Ufest tråd", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Flytt alle", "thread_tools.fork": "Forgren tråd", "thread_tools.delete": "Slett tråd", - "thread_tools.delete_confirm": "Er du sikker på at du vil slette denne tråden?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Gjenopprett tråd", - "thread_tools.restore_confirm": "Er du sikker på at du vil gjenopprette denne tråden?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Tøm emne", - "thread_tools.purge_confirm": "Er du sikker på at du vil tømme dette emnet?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Emnet har blitt flyttet til %1", "post_delete_confirm": "Er du sikker på at du vil slette dette innlegget?", "post_restore_confirm": "Er du sikker på at du vil gjenopprette dette innlegget?", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index c327dd1d87..b794482f5c 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -29,6 +29,7 @@ "edit": "Endre", "uploaded_picture": "Opplastet bilde", "upload_new_picture": "Last opp nytt bidle", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Gjeldende passord", "change_password": "Endre passord", "change_password_error": "Ugyldig passord!", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index d27566d742..18602121cd 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Ongeldig Gebruikersdata", "invalid-password": "Ongeldig wachtwoord", "invalid-username-or-password": "Geef alsjeblieft een gebruikersnaam en wachtwoord op", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Ongeldig pagineringswaarde", "username-taken": "Gebruikersnaam is al bezet", "email-taken": "Email adres is al gebruikt", diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index 4c51c977b5..c071096b88 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "U heeft ongelezen notificaties", "new_message_from": "Nieuw bericht van %1", "upvoted_your_post_in": "%1 heeft uw bericht geupvote in %2.", - "moved_your_post": "%1 heeft uw bericht verplaatst", - "moved_your_topic": "%1 heeft uw onderwerp verplaatst.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 heeft uw bericht gefavoriet in %2.", "user_flagged_post_in": "%1 rapporteerde een bericht in %2", "user_posted_to": "%1 heeft een reactie op het bericht gegeven aan %2", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 3a82ff7af7..2aab50be65 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -12,5 +12,7 @@ "user.posts": "Berichten geplaatst door %1", "user.topics": "Topics gecreëerd door %1", "user.favourites": "%1's Favoriete Berichten", - "user.settings": "Gebruikersinstellingen" + "user.settings": "Gebruikersinstellingen", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/nl/tags.json b/public/language/nl/tags.json index b657763651..881149e5e1 100644 --- a/public/language/nl/tags.json +++ b/public/language/nl/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Er zijn geen onderwerpen met deze tag", "tags": "Tags", "enter_tags_here": "Voer hier uw tags in. Druk op enter na elke tag ingevoerd te hebben", + "enter_tags_here_short": "Enter tags...", "no_tags": "Er zijn nog geen tags te vinden" } \ No newline at end of file diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index 0530a16f5c..f449e551f1 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -28,15 +28,17 @@ "flag_title": "Dit bericht markeren voor moderatie", "flag_confirm": "Weet u het zeker dat u dit bericht wilt rapporteren?", "flag_success": "Dit bericht is gerapporteerd aan de admins", - "deleted_message": "Dit onderwerp is verwijderd. Alleen gebruikers met onderwerp management privileges kunnen dit onderwerp zien.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Je zult nu notificaties ontvangen wanneer iemand reageert op dit onderwerp.", "not_following_topic.message": "Je zult niet langer notificaties ontvangen van dit onderwerp.", "login_to_subscribe": "Log a.u.b. in om op dit onderwerp te abonneren.", "markAsUnreadForAll.success": "Onderwerp gemarkeerd als gelezen voor iedereen.", "watch": "Volgen", + "unwatch": "Unwatch", "watch.title": "Krijg notificaties van nieuwe reacties op dit onderwerp", + "unwatch.title": "Stop watching this topic", "share_this_post": "Deel dit Bericht", - "thread_tools.title": "Acties", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Ongelezen Markeren", "thread_tools.pin": "Onderwerp Vastmaken", "thread_tools.unpin": "Onderwerp Losmaken", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Verplaats alles", "thread_tools.fork": "Onderwerp Afsplitsen", "thread_tools.delete": "Onderwerp Verwijderen", - "thread_tools.delete_confirm": "Weet u het zeker dat u dit onderwerp wilt verwijderen?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Onderwerp Herstellen", - "thread_tools.restore_confirm": "Weet u het zeker dat u het onderwerp wilt herstellen?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Wis Onderwerp ", - "thread_tools.purge_confirm": "Weet u het zeker dat u dit onderwerp wilt wissen?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Deze onderwerp is succesvol verplaatst naar %1", "post_delete_confirm": "Weet u het zeker dat u dit bericht wilt verwijderen?", "post_restore_confirm": "Weet u het zeker dat u dit bericht wilt herstellen?", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index e91b069cae..c6803a4031 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -29,6 +29,7 @@ "edit": "Aanpassen", "uploaded_picture": "Afbeelding Uploaden", "upload_new_picture": "Nieuwe Afbeelding Uploaden", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Huidige Wachtwoord", "change_password": "Wachtwoord Aanpassen", "change_password_error": "Ongeldig wachtwoord!", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 19b93b1951..9b64bc0161 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Błędne dane użytkownika.", "invalid-password": "Błędne hasło", "invalid-username-or-password": "Proszę podać nazwę użytkownika i hasło", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Błędna wartość paginacji", "username-taken": "Login zajęty.", "email-taken": "E-mail zajęty.", diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index ff00d9b7ad..cdecbf1bc6 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Masz nieprzeczytane powiadomienia.", "new_message_from": "Nowa wiadomość od %1", "upvoted_your_post_in": "%1 zagłosował na Twój post w %2", - "moved_your_post": "%1 przesunął Twój post.", - "moved_your_topic": "%1 przesunął Twój temat.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 polubił Twój post w %2.", "user_flagged_post_in": "%1 oflagował Twój post w %2", "user_posted_to": "%1 dodał odpowiedź do %2", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 02e459b55a..6c36e275b5 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posty napisane przez %1", "user.topics": "Wątki stworzone przez %1", "user.favourites": "Ulubione posty %1", - "user.settings": "Ustawienia użytkownika" + "user.settings": "Ustawienia użytkownika", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/pl/tags.json b/public/language/pl/tags.json index d4b35e3b39..886b5d180b 100644 --- a/public/language/pl/tags.json +++ b/public/language/pl/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Nie ma tematów z tym tagiem", "tags": "Tagi", "enter_tags_here": "Tutaj wpisz tagi. Naciśnij enter po każdym.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Jeszcze nie ma tagów." } \ No newline at end of file diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 42a2a81aee..1a7294be92 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -28,15 +28,17 @@ "flag_title": "Zgłoś post do moderacji", "flag_confirm": "Na pewno chcesz oznaczyć ten post?", "flag_success": "Ten post został oznaczony do moderacji.", - "deleted_message": "Ten wątek został usunięty. Tylko użytkownicy z uprawnieniami do zarządzania wątkami mogą go widzieć.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Będziesz otrzymywał powiadomienia, gdy ktoś odpowie w tym wątku.", "not_following_topic.message": "Nie będziesz otrzymywał więcej powiadomień z tego wątku.", "login_to_subscribe": "Zaloguj się, aby subskrybować ten wątek.", "markAsUnreadForAll.success": "Wątek oznaczony jako nieprzeczytany dla wszystkich.", "watch": "Obserwuj", + "unwatch": "Unwatch", "watch.title": "Otrzymuj powiadomienia o nowych odpowiedziach w tym wątku", + "unwatch.title": "Stop watching this topic", "share_this_post": "Udostępnij", - "thread_tools.title": "Narzędzia wątków", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Oznacz jako nieprzeczytany", "thread_tools.pin": "Przypnij wątek", "thread_tools.unpin": "Odepnij wątek", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Przenieś wszystko", "thread_tools.fork": "Podziel wątek", "thread_tools.delete": "Usuń wątek", - "thread_tools.delete_confirm": "Na pewno chcesz usunąć ten wątek?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Przywróć wątek", - "thread_tools.restore_confirm": "Na pewno chcesz przywrócić ten wątek?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Wyczyść wątek", - "thread_tools.purge_confirm": "Jesteś pewien, że chcesz wyczyścić ten wątek?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Temat przeniesiono do %1", "post_delete_confirm": "Na pewno chcesz usunąć ten post?", "post_restore_confirm": "Na pewno chcesz przywrócić ten post?", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 957954f1a2..c40d4da460 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -29,6 +29,7 @@ "edit": "Edytuj", "uploaded_picture": "Przesłane zdjęcie", "upload_new_picture": "Prześlij nowe zdjęcie", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Obecne hasło", "change_password": "Zmień hasło", "change_password_error": "Błędne hasło!", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index d6e0da1ede..3d85a8a275 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Informação de usuário inválida", "invalid-password": "Senha inválida", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Informação inválida de paginação", "username-taken": "Usuário já existe", "email-taken": "Email já foi utilizado em um cadastro", diff --git a/public/language/pt_BR/notifications.json b/public/language/pt_BR/notifications.json index fc82e93866..276cc97a3f 100644 --- a/public/language/pt_BR/notifications.json +++ b/public/language/pt_BR/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Você possui notificações não lidas.", "new_message_from": "Nova mensagem de %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 respondeu para: %2", diff --git a/public/language/pt_BR/pages.json b/public/language/pt_BR/pages.json index 48c03f52d9..12cba35b85 100644 --- a/public/language/pt_BR/pages.json +++ b/public/language/pt_BR/pages.json @@ -12,5 +12,7 @@ "user.posts": "Posts feito por %1", "user.topics": "Tópicos criados por %1", "user.favourites": "Favoritos de %1", - "user.settings": "Configurações de Usuário" + "user.settings": "Configurações de Usuário", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/pt_BR/tags.json b/public/language/pt_BR/tags.json index f4d82896c7..8b9861a507 100644 --- a/public/language/pt_BR/tags.json +++ b/public/language/pt_BR/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Não há tópicos com esta tag.", "tags": "Tags", "enter_tags_here": "Digite as tags aqui. Pressione enter após cada tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Ainda não há tags." } \ No newline at end of file diff --git a/public/language/pt_BR/topic.json b/public/language/pt_BR/topic.json index a0f0caea3d..b328c25385 100644 --- a/public/language/pt_BR/topic.json +++ b/public/language/pt_BR/topic.json @@ -28,15 +28,17 @@ "flag_title": "Sinalizar este post para moderação", "flag_confirm": "Tem certeza que deseja sinalizar este post?", "flag_success": "Este post foi sinalizado para ser moderado.", - "deleted_message": "Este tópico foi deletado. Somente usuários com privilégios administrativos podem visualizá-lo.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Você receberá notificações quando alguém responder este tópico.", "not_following_topic.message": "Você não receberá mais notificações sobre este tópico.", "login_to_subscribe": "Por favor registre ou logue para assinar este tópico.", "markAsUnreadForAll.success": "Marcar Tópico como não lido para todos.", "watch": "Acompanhar", + "unwatch": "Unwatch", "watch.title": "Seja notificado sobre novas respostas neste tópico", + "unwatch.title": "Stop watching this topic", "share_this_post": "Compartilhar este Post", - "thread_tools.title": "Administrar tópicos", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Marcar como não lido", "thread_tools.pin": "Fixar Tópico", "thread_tools.unpin": "Remover Fixação do Tópico", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Mover todos", "thread_tools.fork": "Clonar Tópico", "thread_tools.delete": "Deletar Tópico", - "thread_tools.delete_confirm": "Tem certeza que deseja deletar este tópico?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restaurar Tópico", - "thread_tools.restore_confirm": "Tem certeza que deseja restaurar este tópico?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Limpar Tópico", - "thread_tools.purge_confirm": "Deseja mesmo limpar esse tópico?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Tópico movido com sucesso para %1", "post_delete_confirm": "Tem certeza que deseja deletar este post?", "post_restore_confirm": "Tem certeza que deseja restaurar este post?", diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index 60b2827e2a..7b46939cd1 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -29,6 +29,7 @@ "edit": "Editar", "uploaded_picture": "Foto Carregada", "upload_new_picture": "Carregar nova Foto", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Senha Atual", "change_password": "Alterar Senha", "change_password_error": "Senha Inválida!", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 979fd4c5a5..20dd86fcfa 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Date utilizator invalide", "invalid-password": "Parolă Invalidă", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Date paginație invalide", "username-taken": "Numele de utilizator este deja folosit", "email-taken": "Adresa de email este deja folostă", diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index 59fdb82116..9a73f389a4 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Ai notificări necitite.", "new_message_from": "Un mesaj nou de la %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 a postat un răspuns la: %2", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 3b69d67327..ec2748f07a 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -12,5 +12,7 @@ "user.posts": "Mesaje postate de %1", "user.topics": "Subiecte create de %1", "user.favourites": "Mesajele favorite ale lui %1", - "user.settings": "Setări Utilizator" + "user.settings": "Setări Utilizator", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/ro/tags.json b/public/language/ro/tags.json index cfd27f9ec3..185e6bf299 100644 --- a/public/language/ro/tags.json +++ b/public/language/ro/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Nu există nici un subiect cu acest tag.", "tags": "Taguri", "enter_tags_here": "Introdu tagurile aici. Apasă enter după fiecare tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "În acest moment nu există nici un tag." } \ No newline at end of file diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index 3bcdf5805e..ef7eac7b0f 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -28,15 +28,17 @@ "flag_title": "Semnalizează acest mesaj pentru moderare", "flag_confirm": "Ești sigur că vrei să semnalezi acest mesaj?", "flag_success": "Acest mesaj a fost semnalizat pentru moderare.", - "deleted_message": "Acest subiect a fost șters. Doar utilizatorii cu drepturi de thread management îl pot vedea.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Vei primi notificări când cineva va posta un nou mesaj in acest subiect.", "not_following_topic.message": "Nu vei mai primi notificări legate de acest subiect.", "login_to_subscribe": "Te rugăm să te înregistrezi sau să te autentifici ca să te poți abona la acest subiect.", "markAsUnreadForAll.success": "Subiect marcat ca citit pentru toți.", "watch": "Vezi", + "unwatch": "Unwatch", "watch.title": "Abonează-te la notificări legate de acest subiect", + "unwatch.title": "Stop watching this topic", "share_this_post": "Distribuie acest mesaj", - "thread_tools.title": "Unelte Subiect", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Marchează Necitit", "thread_tools.pin": "Pin Subiect", "thread_tools.unpin": "Unpin Subiect", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Mută-le pe toate", "thread_tools.fork": "Bifurcă Subiect", "thread_tools.delete": "Șterge Subiect", - "thread_tools.delete_confirm": "Ești sigur că vrei să ștergi acest subiect?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Restaurează Subiect", - "thread_tools.restore_confirm": "Ești sigur că vrei să restaurezi acest subiect?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Curăță Subiect", - "thread_tools.purge_confirm": "Ești sigur că vrei sa cureți acest subiect?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Acest mesaj a fost mutat cu succes în %1", "post_delete_confirm": "Ești sigur că vrei să ștergi acest mesaj?", "post_restore_confirm": "Esti sigur că vrei să restaurezi acest mesaj?", diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 2bb96c0c9b..8b7c9b2bec 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -29,6 +29,7 @@ "edit": "Editează", "uploaded_picture": "Poză uploadată", "upload_new_picture": "Uploadează poză nouă", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Parola curentă", "change_password": "Schimbă Parola", "change_password_error": "Parola invalidă!", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index a715f9c9a2..4222468931 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Неверные Пользовательские Данные", "invalid-password": "Неверный Пароль", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Неверное значение пагинации", "username-taken": "Имя пользователя занято", "email-taken": "Email занят", diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index 0bd4597dd7..0cf9fae9db 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "У вас есть непрочитанные уведомления", "new_message_from": "Новое сообщение от %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 ответил на запись: %2", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index adf2827471..f2353953cd 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -12,5 +12,7 @@ "user.posts": "Пост написан %1", "user.topics": "Темы созданы %1", "user.favourites": "Избранные сообщения %1", - "user.settings": "Настройки" + "user.settings": "Настройки", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/ru/tags.json b/public/language/ru/tags.json index 91aa21d2d6..346581ea36 100644 --- a/public/language/ru/tags.json +++ b/public/language/ru/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Нет топиков с таким тэгом.", "tags": "Тэги", "enter_tags_here": "Укажите тэги здесь. Нажимайте Enter после каждого тэга.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Здесь еще нет тэгов." } \ No newline at end of file diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 5a97aa09ea..29ee573a71 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -28,15 +28,17 @@ "flag_title": "Отметить сообщение для модерирования", "flag_confirm": "Вы уверены, что хотите отметить этот пост?", "flag_success": "Этот пост был помечен для модерации", - "deleted_message": "Эта ветка была удалена. Только пользователи с правами управления ветвями могут ее видеть.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Теперь вы будете получать уведомления при обновлении этой темы.", "not_following_topic.message": "Вы больше не будете получать уведомления из этой темы.", "login_to_subscribe": "Пожалуйста зарегистрируйтесь, или войдите под своим аккаунтом, чтобы подписаться на эту тему.", "markAsUnreadForAll.success": "Тема помечена как непрочитанная для всех.", "watch": "Следить", + "unwatch": "Unwatch", "watch.title": "Сообщать мне об ответах в этой теме", + "unwatch.title": "Stop watching this topic", "share_this_post": "Поделиться этим Постом", - "thread_tools.title": "Опции Темы", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Отметить как непрочитанные", "thread_tools.pin": "Прикрепить Тему", "thread_tools.unpin": "Открепить Тему", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Переместить Все", "thread_tools.fork": "Ответвить Тему", "thread_tools.delete": "Удалить Тему", - "thread_tools.delete_confirm": "Вы уверены, что хотите удалить эту ветку?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Восстановить Тему", - "thread_tools.restore_confirm": "Вы уверены, что хотите восстановить эту ветку?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Очистить Тему", - "thread_tools.purge_confirm": "Вы уверены, что хотите очистить эту ветку?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Эта тема успешно перемещена в %1", "post_delete_confirm": "Вы уверены, что хотите удалить этот пост?", "post_restore_confirm": "Вы уверены, что хотите восстановить этот пост?", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index e09a5fd425..fa0e78e253 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -29,6 +29,7 @@ "edit": "Редактировать", "uploaded_picture": "Загруженные Фотографии", "upload_new_picture": "Загрузить новую фотографию", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Текущий Пароль", "change_password": "Изменить Пароль", "change_password_error": "Неверный Пароль!", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index f90d459cce..a46573d5b9 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index 0fecd4d1a7..4bc769a7c8 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index 2f975b787d..4ad8a7c731 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -12,5 +12,7 @@ "user.posts": "Arresonos fatos dae %1", "user.topics": "Topics created by %1", "user.favourites": "Arresonos Preferidos de %1", - "user.settings": "Sèberos de Impitadore" + "user.settings": "Sèberos de Impitadore", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/sc/tags.json b/public/language/sc/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/sc/tags.json +++ b/public/language/sc/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index b6eee990c6..d97f81d2ee 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -28,15 +28,17 @@ "flag_title": "Signala custu arresonu pro sa moderatzione", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "Custa arresonada est istada cantzellada. Isceti is impitadores chi tenent is permissos pro manigiare is arresonadas dda podent bìdere.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "As a retzire notìficas si calincunu pùblica in custa arresonada.", "not_following_topic.message": "No as a retzire prus notìficas pro custa arresonada.", "login_to_subscribe": "Pro praghere registra·ti o intra pro sutascrìere custa arresonada.", "markAsUnreadForAll.success": "Arresonada marcada comente de lèghere pro totus.", "watch": "Càstia", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "Cumpartzi custu Arresonu", - "thread_tools.title": "Ainas de Arresonada", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Signa comente De Lèghere", "thread_tools.pin": "Pone in evidèntzia s'Arresonda", "thread_tools.unpin": "Boga dae s'Evidèntzia s'Arresonasa", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "Partzi Arresonada", "thread_tools.delete": "Cantzella Arresonada", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Torra a s'Arresonada Allogada", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 298fc5ffa0..6a01840a34 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -29,6 +29,7 @@ "edit": "Acontza", "uploaded_picture": "Immàgine Carrigada", "upload_new_picture": "Càrriga Immàgine Noa", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Password Presente", "change_password": "Muda Password", "change_password_error": "Invalid Password!", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 60262ff3e4..1e32d8d59f 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Neplatné užívatelské údaje", "invalid-password": "Nesprávne heslo", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Nesprávna hodnota stránkovania", "username-taken": "Užívateľske meno je obsadené", "email-taken": "Email je obsadený", diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index cffd1a1fc0..8dc04fa258 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Máte neprečítané notifikácie", "new_message_from": "Nova spáva od %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 odpovedal: %2", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index 764229a282..22120a855b 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -12,5 +12,7 @@ "user.posts": "Príspevky od %1", "user.topics": "Téma vytvorená %1\n", "user.favourites": "%1's obľubených príspevkov", - "user.settings": "Užívatelské nadstavenie" + "user.settings": "Užívatelské nadstavenie", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/sk/tags.json b/public/language/sk/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/sk/tags.json +++ b/public/language/sk/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index 72da1a0869..c295cca131 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -28,15 +28,17 @@ "flag_title": "Označiť príspevok pre moderáciu", "flag_confirm": "Ste si istý, že chcete označit tento príspevok?", "flag_success": "Tento príspevok bol označený na úpravu. ", - "deleted_message": "Toto vlákno bolo vymazané. Iba užívatelia s privilégiami ho môžu vidieť.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Budete teraz príjimať notifikácie, ked niekto prispeje do témy.", "not_following_topic.message": "Nebudete už dostávať notifikácie z tejto Témy", "login_to_subscribe": "Prosím Zaregistrujte sa alebo sa Prihláste, aby ste mohli odoberať túto Tému", "markAsUnreadForAll.success": "Téma označená ako neprečítaná pre všetkých.", "watch": "Sledovať", + "unwatch": "Unwatch", "watch.title": "Buďte informovaní o nových odpovediach k tejto téme", + "unwatch.title": "Stop watching this topic", "share_this_post": "Zdielaj tento príspevok", - "thread_tools.title": "Nástroje", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Označ ako neprečítané", "thread_tools.pin": "Zviditeľniť tému", "thread_tools.unpin": "Odstrániť zviditeľnenie témy", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Presunúť všetko", "thread_tools.fork": "Rozvetviť tému", "thread_tools.delete": "Vymazať tému", - "thread_tools.delete_confirm": "Ste si istý, že chcete vymazať tento príspevok?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Vrátiť tému", - "thread_tools.restore_confirm": "Ste si istý, že chcete obnoviť tento príspevok?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Téma bola úspešne presunutá do %1", "post_delete_confirm": "Ste si istý, že chcete vymazať tento príspevok?", "post_restore_confirm": "Ste si istí, že chcete obnoviť tento príspevok?", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 2fa171f6ef..eec0ca9486 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -29,6 +29,7 @@ "edit": "Upraviť", "uploaded_picture": "Nahraný obrázok", "upload_new_picture": "Nahrať nový obrázok", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Aktuálne heslo", "change_password": "Zmeniť heslo", "change_password_error": "Nesprávne heslo!", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 6f118116f3..e36d1d33c3 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Ogiltig användardata", "invalid-password": "Ogiltigt lösenord", "invalid-username-or-password": "Specificera både användarnamn och lösenord", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Ogiltigt sidnummer", "username-taken": "Användarnamn upptaget", "email-taken": "Epostadress upptagen", diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index 2e8e5a3f2a..01a1094540 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Du har olästa notiser.", "new_message_from": "Nytt medelande från %1", "upvoted_your_post_in": "%1 har röstat upp ditt inlägg i %2", - "moved_your_post": "%1 har flyttat dit inlägg.", - "moved_your_topic": "%1 har flyttat ditt ämne.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 har favoriserat ditt inlägg i %2.", "user_flagged_post_in": "%1 flaggade ett inlägg i %2", "user_posted_to": "%1 har skrivit ett svar på: %2", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 72c9d13e33..dbed4da96d 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -12,5 +12,7 @@ "user.posts": "Inlägg skapat av %1", "user.topics": "Ämnen skapade av %1", "user.favourites": "%1's favorit-inlägg", - "user.settings": "Avnändarinställningar" + "user.settings": "Avnändarinställningar", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/sv/tags.json b/public/language/sv/tags.json index e7f66208a8..e2e8199384 100644 --- a/public/language/sv/tags.json +++ b/public/language/sv/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Det finns inga ämnen med detta märkord.", "tags": "Märkord", "enter_tags_here": "Skriv in märkord här. Tryck på enter efter varje märkord.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Det finns inga märkord ännu." } \ No newline at end of file diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index f2f1adb18d..012b4e9735 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -28,15 +28,17 @@ "flag_title": "Rapportera detta inlägg för granskning", "flag_confirm": "Är du säker på att du vill flagga det här inlägget?", "flag_success": "Det här inlägget har flaggats för moderering.", - "deleted_message": "Denna tråd har tagits bort. Endast användare med administrations-rättigheter kan se den.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Du kommer nu få notiser när någon gör inlägg i detta ämne.", "not_following_topic.message": "Du kommer inte längre få notiser från detta ämne.", "login_to_subscribe": "Var god registrera eller logga in för att kunna prenumerera på detta ämne.", "markAsUnreadForAll.success": "Ämne markerat som oläst av alla.", "watch": "Följ", + "unwatch": "Unwatch", "watch.title": "Få notis om nya svar till det här ämnet", + "unwatch.title": "Stop watching this topic", "share_this_post": "Dela detta inlägg", - "thread_tools.title": "Trådverktyg", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Markera som oläst", "thread_tools.pin": "Fäst ämne", "thread_tools.unpin": "Lösgör ämne", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Flytta alla.", "thread_tools.fork": "Grena ämne", "thread_tools.delete": "Ta bort ämne", - "thread_tools.delete_confirm": "Är du säker på att du vill ta bort den här tråden?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Återställ ämne", - "thread_tools.restore_confirm": "Är du säker på att du vill återställa den här tråden?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Rensa ämne", - "thread_tools.purge_confirm": "Är du säker att du vill rensa ut den här tråden?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Det här ämnet har flyttats till %1", "post_delete_confirm": "Är du säker på att du vill ta bort det här inlägget?", "post_restore_confirm": "Är du säker på att du vill återställa det här inlägget?", diff --git a/public/language/sv/user.json b/public/language/sv/user.json index e4e18aafaa..b9689c5f98 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -29,6 +29,7 @@ "edit": "Ändra", "uploaded_picture": "Uppladdad bild", "upload_new_picture": "Ladda upp ny bild", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Nuvarande lösenord", "change_password": "Ändra lösenord", "change_password_error": "Ogiltigt lösenord.", diff --git a/public/language/th/error.json b/public/language/th/error.json index f90d459cce..a46573d5b9 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Invalid User Data", "invalid-password": "Invalid Password", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Invalid pagination value", "username-taken": "Username taken", "email-taken": "Email taken", diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index d78ad8e8f6..c98ef643a2 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "You have unread notifications.", "new_message_from": "New message from %1", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index b6cb79bcc3..3659c376ae 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -12,5 +12,7 @@ "user.posts": "กระทู้โดย %1", "user.topics": "Topics created by %1", "user.favourites": "กระทู้ที่ %1 ชอบ", - "user.settings": "ตั้งค่าผู้ใช้" + "user.settings": "ตั้งค่าผู้ใช้", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/th/tags.json b/public/language/th/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/th/tags.json +++ b/public/language/th/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/th/topic.json b/public/language/th/topic.json index 0736d6be97..a938ce0255 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -28,15 +28,17 @@ "flag_title": "ปักธงโพสต์นี้เพื่อดำเนินการ", "flag_confirm": "Are you sure you want to flag this post?", "flag_success": "This post has been flagged for moderation.", - "deleted_message": "กระทู้นี้ได้ถูกลบไปแล้ว เฉพาะผู้ใช้ที่มีสิทธิ์จัดการสามารถดูได้", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "คุณจะได้รับการแจ้งเตือนเมื่อมีคนโพสต์ในกระทู้นี้", "not_following_topic.message": "คุณจะไม่รับการแจ้งเตือนจากกระทู้นี้", "login_to_subscribe": "กรุณาลงทะเบียนหรือเข้าสู่ระบบเพื่อที่จะติดตามกระทู้นี้", "markAsUnreadForAll.success": "ทำเครื่องหมายว่ายังไม่ได้อ่านทั้งหมด", "watch": "ติดตาม", + "unwatch": "Unwatch", "watch.title": "Be notified of new replies in this topic", + "unwatch.title": "Stop watching this topic", "share_this_post": "แชร์โพสต์นี้", - "thread_tools.title": "เครื่องมือจัดการกระทู้", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "ทำหมายว่ายังไม่ได้อ่าน", "thread_tools.pin": "ปักหมุดกระทู้", "thread_tools.unpin": "เลิกปักหมุดกระทู้", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Move All", "thread_tools.fork": "แยกกระทู้", "thread_tools.delete": "ลบกระทู้", - "thread_tools.delete_confirm": "Are you sure you want to delete this thread?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "กู้กระทู้", - "thread_tools.restore_confirm": "Are you sure you want to restore this thread?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "This topic has been successfully moved to %1", "post_delete_confirm": "Are you sure you want to delete this post?", "post_restore_confirm": "Are you sure you want to restore this post?", diff --git a/public/language/th/user.json b/public/language/th/user.json index ba6a427e10..5ec3c1b5f7 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -29,6 +29,7 @@ "edit": "แก้ไข", "uploaded_picture": "อัปโหลดรูป", "upload_new_picture": "อัพโหลดรูปใหม่", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "รหัสผ่านปัจจุบัน", "change_password": "เปลี่ยนรหัสผ่าน", "change_password_error": "Invalid Password!", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 86b7a7567d..a6e8e7d436 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Geçersiz Kullancı Verisi", "invalid-password": "Geçersiz Şifre", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "Geçersiz Sayfa Değeri", "username-taken": "Kullanıcı İsmi Alınmış", "email-taken": "E-posta Alınmış", diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index 8b5db97764..a846939221 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "Okunmamış bildirimleriniz var.", "new_message_from": "%1 size bir mesaj gönderdi", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 %2 başlığına bir ileti gönderdi.", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 582a524b6b..a6e6ef22e3 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -12,5 +12,7 @@ "user.posts": "%1 tarafından gönderilen iletiler", "user.topics": "%1 tarafından gönderilen başlıklar", "user.favourites": "%1'in Favori İletileri", - "user.settings": "Kullanıcı Ayarları" + "user.settings": "Kullanıcı Ayarları", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/tr/tags.json b/public/language/tr/tags.json index a60ce28e1a..34ae901f26 100644 --- a/public/language/tr/tags.json +++ b/public/language/tr/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Bu etiketli başlık yok.", "tags": "Etiketler", "enter_tags_here": "Etiketleri buraya girin.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Henüz etiket yok." } \ No newline at end of file diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index f4968ca57a..1fc21d664d 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -28,15 +28,17 @@ "flag_title": "Bu iletiyi moderatöre haber et", "flag_confirm": "Bu iletiyi yöneticilere bildirmek istiyor musun?", "flag_success": "Bu ileti yöneticilere bildirildi.", - "deleted_message": "Bu başlık silindi. Sadece başlık düzenleme yetkisi olan kullanıcılar görebilir.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Artık bir kullanıcı bu başlığa ileti gönderdiğinde bildirim alacaksınız.", "not_following_topic.message": "Artık bu başlık için bildirim almayacaksınız.", "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.", "watch": "İzle", + "unwatch": "Unwatch", "watch.title": "Bu başlığa gelen yeni iletilerden haberdar ol", + "unwatch.title": "Stop watching this topic", "share_this_post": "Bu iletiyi paylaş", - "thread_tools.title": "Seçenekler", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Okunmadı Olarak İşaretle", "thread_tools.pin": "Başlığı İğnele", "thread_tools.unpin": "Başlığı İğneleme", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Hepsini Taşı", "thread_tools.fork": "Başlığı Ayır", "thread_tools.delete": "Başlığı Sil", - "thread_tools.delete_confirm": "Bu başlığı gerçekten silmek istiyor musun?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Başlığı Geri Getir", - "thread_tools.restore_confirm": "Bu başlığı gerçekten geri getirmek istiyor musun?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Konuyu Temizle", - "thread_tools.purge_confirm": "Bu konuyu temizlemek istediğinize eminmisiniz?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Başlık %1 kategorisine başarıyla taşındı.", "post_delete_confirm": "Bu iletiyi gerçekten silmek istiyor musun?", "post_restore_confirm": "Bu iletiyi gerçekten geri getirmek istiyor musun?", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 8d9584f0bc..23ca56979d 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -29,6 +29,7 @@ "edit": "Düzenle", "uploaded_picture": "Yüklenmiş Fotoğraflar", "upload_new_picture": "Yeni bir resim Yükle", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Şu anki şifre", "change_password": "Şifre Değiştir", "change_password_error": "Geçersiz Şifre", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index a70d1676dd..eea4b0c679 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "Dữ liệu tài khoản không hợp lệ", "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": "Invalid search term", "invalid-pagination-value": "Số trang không hợp lệ", "username-taken": "Tên đăng nhập đã tồn tại", "email-taken": "Email đã tồn tại", diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index 48f6174299..cbe6605a39 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -11,8 +11,8 @@ "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.", - "moved_your_post": "%1 đã di chuyển bài của bạn.", - "moved_your_topic": "%1 đã di chuyển chủ đề của bạn.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 đã thích bài của bạn trong %2.", "user_flagged_post_in": "%1 gắn cờ 1 bài trong %2", "user_posted_to": "%1 đã trả lời %2", diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index 87143000ad..ee4d6b92e9 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -12,5 +12,7 @@ "user.posts": "Các bài được %1 viết", "user.topics": "Các chủ đề được %1 tạo", "user.favourites": "Các bài gửi yêu thích của %1", - "user.settings": "Thiết lập cho người dùng" + "user.settings": "Thiết lập cho người dùng", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/vi/tags.json b/public/language/vi/tags.json index e309559c94..d8dba17a92 100644 --- a/public/language/vi/tags.json +++ b/public/language/vi/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "Không có bài viết nào với nhãn này.", "tags": "Nhãn", "enter_tags_here": "Nhập nhãn ở đây. Nhấn enter sau mỗi nhãn.", + "enter_tags_here_short": "Enter tags...", "no_tags": "Chưa có nhãn nào." } \ No newline at end of file diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index a1bfe804ae..1c4722f0f3 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -28,15 +28,17 @@ "flag_title": "Flag bài viết này để chỉnh sửa", "flag_confirm": "Bạn có chắc là muốn flag bài viết này không?", "flag_success": "Chủ đề này đã được flag để chỉnh sửa", - "deleted_message": "Thread này đã bị xóa. Chỉ người dùng có quyền quản lý thread mới xem được.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "Từ giờ bạn sẽ nhận được thông báo khi có ai đó gửi bài viết trong chủ đề này", "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ộ", "watch": "Xem", + "unwatch": "Unwatch", "watch.title": "Được thông báo khi có trả lời mới trong chủ đề này", + "unwatch.title": "Stop watching this topic", "share_this_post": "Chia sẻ bài viết này", - "thread_tools.title": "Công cụ cho Thread", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "Đánh dấu chưa đọc", "thread_tools.pin": "Pin chủ đề", "thread_tools.unpin": "Bỏ pin chủ đề", @@ -46,11 +48,11 @@ "thread_tools.move_all": "Chuyển tất cả", "thread_tools.fork": "Fork chủ đề", "thread_tools.delete": "Xóa chủ đề", - "thread_tools.delete_confirm": "Bạn có chắc là muốn hủy thread này không?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "Phục hồi chủ đề", - "thread_tools.restore_confirm": "Bạn có chắc là muốn phục hồi thread này không", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Xóa hẳn chủ đề", - "thread_tools.purge_confirm": "Bạn có chắc muốn xóa hẳn chủ đề này?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "Đã chuyển thành công chủ đề này sang %1", "post_delete_confirm": "Bạn có chắc là muốn xóa bài gửi này không?", "post_restore_confirm": "Bạn có chắc là muốn phục hồi bài gửi này không?", diff --git a/public/language/vi/user.json b/public/language/vi/user.json index c7bc8ac37e..76ad5b7582 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -29,6 +29,7 @@ "edit": "Chỉnh sửa", "uploaded_picture": "Ảnh đã tải lên", "upload_new_picture": "Tải lên ảnh mới", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "Mật khẩu hiện tại", "change_password": "Thay đổi mật khẩu", "change_password_error": "Mật khẩu không đúng!", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index 2e9a43df6d..03f184af4c 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "无效用户数据", "invalid-password": "无效密码", "invalid-username-or-password": "请确认用户名和密码", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "无效页码", "username-taken": "用户名已注册", "email-taken": "电子邮箱已注册", diff --git a/public/language/zh_CN/notifications.json b/public/language/zh_CN/notifications.json index 13d533bc53..f3b9cb4573 100644 --- a/public/language/zh_CN/notifications.json +++ b/public/language/zh_CN/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "您有未读的通知。", "new_message_from": "来自 %1 的新消息", "upvoted_your_post_in": "%1%2 点赞了您的帖子。", - "moved_your_post": "%1 移动了您的帖子。", - "moved_your_topic": "%1 移动了您的主题帖。", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1%2 收藏了您的帖子。", "user_flagged_post_in": "%1%2 标记了一个帖子", "user_posted_to": "%1 回复了:%2", diff --git a/public/language/zh_CN/pages.json b/public/language/zh_CN/pages.json index 28af9ea173..15d7fb9b1c 100644 --- a/public/language/zh_CN/pages.json +++ b/public/language/zh_CN/pages.json @@ -12,5 +12,7 @@ "user.posts": "%1 发布的帖子", "user.topics": "%1 创建的主题", "user.favourites": "%1 收藏的帖子", - "user.settings": "用户设置" + "user.settings": "用户设置", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/zh_CN/tags.json b/public/language/zh_CN/tags.json index 95c058e0f0..4e5e24d5b2 100644 --- a/public/language/zh_CN/tags.json +++ b/public/language/zh_CN/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "此话题还没有主题帖。", "tags": "话题", "enter_tags_here": "在此输入话题。每输入一个话题按一次回车。", + "enter_tags_here_short": "Enter tags...", "no_tags": "尚无话题。" } \ No newline at end of file diff --git a/public/language/zh_CN/topic.json b/public/language/zh_CN/topic.json index eb57246dbf..73ba83a2eb 100644 --- a/public/language/zh_CN/topic.json +++ b/public/language/zh_CN/topic.json @@ -28,15 +28,17 @@ "flag_title": "对此帖设置管理标志", "flag_confirm": "确认给此帖设置标记吗?", "flag_success": "此回帖已设置管理标记。", - "deleted_message": "此帖已删除,仅限管理者查看。", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "当有人回复此主题时您会收到通知。", "not_following_topic.message": "您已停止接收此主题的通知。", "login_to_subscribe": "请注册或登录后再订阅此主题。", "markAsUnreadForAll.success": "将全部主题标为未读。", "watch": "监视", + "unwatch": "Unwatch", "watch.title": "此主题有新回复时通知我", + "unwatch.title": "Stop watching this topic", "share_this_post": "分享此帖", - "thread_tools.title": "管理工具", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "未读标记", "thread_tools.pin": "置顶主题", "thread_tools.unpin": "取消置顶主题", @@ -46,11 +48,11 @@ "thread_tools.move_all": "移动全部", "thread_tools.fork": "分割主题", "thread_tools.delete": "删除主题", - "thread_tools.delete_confirm": "确认删除此帖吗?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "恢复主题", - "thread_tools.restore_confirm": "确认恢复此帖吗?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "清除主题", - "thread_tools.purge_confirm": "确认清除此帖吗?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "此主题已成功移到 %1", "post_delete_confirm": "确定删除此帖吗?", "post_restore_confirm": "确定恢复此帖吗?", diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index 39a83ee44d..be55fcb1a6 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -29,6 +29,7 @@ "edit": "编辑", "uploaded_picture": "已有头像", "upload_new_picture": "上传新头像", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "当前密码", "change_password": "更改密码", "change_password_error": "无效的密码!", diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 544d11f42e..6700970456 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -13,6 +13,7 @@ "invalid-user-data": "無效的使用者資料", "invalid-password": "無效的密碼", "invalid-username-or-password": "Please specify both a username and password", + "invalid-search-term": "Invalid search term", "invalid-pagination-value": "無效的分頁數值", "username-taken": "該使用者名稱已被使用", "email-taken": "該信箱已被使用", diff --git a/public/language/zh_TW/notifications.json b/public/language/zh_TW/notifications.json index e9132a07df..525a7cf610 100644 --- a/public/language/zh_TW/notifications.json +++ b/public/language/zh_TW/notifications.json @@ -11,8 +11,8 @@ "you_have_unread_notifications": "您有未讀的訊息!", "new_message_from": "來自 %1 的新訊息", "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", + "moved_your_post": "%1 has moved your post.", + "moved_your_topic": "%1 has moved your topic.", "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to": "%1 has posted a reply to: %2", diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index dc1bcacfe0..64610801d3 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -12,5 +12,7 @@ "user.posts": "文章由 %1 所張貼", "user.topics": "主題由 %1 所創建", "user.favourites": "%1's 最喜愛的文章", - "user.settings": "使用者設定" + "user.settings": "使用者設定", + "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", + "maintenance.messageIntro": "Additionally, the administator has left this message:" } \ No newline at end of file diff --git a/public/language/zh_TW/tags.json b/public/language/zh_TW/tags.json index f065d4bbfa..d2e9a213ac 100644 --- a/public/language/zh_TW/tags.json +++ b/public/language/zh_TW/tags.json @@ -2,5 +2,6 @@ "no_tag_topics": "There are no topics with this tag.", "tags": "Tags", "enter_tags_here": "Enter tags here. Press enter after each tag.", + "enter_tags_here_short": "Enter tags...", "no_tags": "There are no tags yet." } \ No newline at end of file diff --git a/public/language/zh_TW/topic.json b/public/language/zh_TW/topic.json index bba85af9e6..e1f964990e 100644 --- a/public/language/zh_TW/topic.json +++ b/public/language/zh_TW/topic.json @@ -28,15 +28,17 @@ "flag_title": "檢舉這篇文章, 交給仲裁者來審閱.", "flag_confirm": "你確定要檢舉這文章嗎?", "flag_success": "這文章已經被檢舉要求仲裁.", - "deleted_message": "已被刪除, 擁有管理權限的使用者才可觀看.", + "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", "following_topic.message": "有人貼文回覆主題時, 你將會收到新通知.", "not_following_topic.message": "有人貼文回覆主題時, 你將不會收到通知.", "login_to_subscribe": "請先註冊或登錄, 才可訂閱此主題.", "markAsUnreadForAll.success": "將全部的主題設為未讀.", "watch": "關注", + "unwatch": "Unwatch", "watch.title": "當主題有新回覆時將收到通知", + "unwatch.title": "Stop watching this topic", "share_this_post": "分享這篇文章", - "thread_tools.title": "管理工具", + "thread_tools.title": "Topic Tools", "thread_tools.markAsUnreadForAll": "設為未讀", "thread_tools.pin": "釘選主題", "thread_tools.unpin": "取消釘選主題", @@ -46,11 +48,11 @@ "thread_tools.move_all": "移動全部", "thread_tools.fork": "Fork 主題", "thread_tools.delete": "刪除主題", - "thread_tools.delete_confirm": "你確定要刪除這討論串嗎?", + "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", "thread_tools.restore": "還原刪除的主題", - "thread_tools.restore_confirm": "你確定要還原這討論串嗎?", + "thread_tools.restore_confirm": "Are you sure you want to restore this topic?", "thread_tools.purge": "Purge Topic", - "thread_tools.purge_confirm": "Are you sure you want to purge this thread?", + "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", "topic_move_success": "主題已成功移至 %1", "post_delete_confirm": "你確定要刪除這文章嗎?", "post_restore_confirm": "你確定要還原這文章嗎?", diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index 46def28d26..52c61fdf6b 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -29,6 +29,7 @@ "edit": "編輯", "uploaded_picture": "已有頭像", "upload_new_picture": "上傳新頭像", + "upload_new_picture_from_url": "Upload New Picture From URL", "current_password": "目前的密碼", "change_password": "更改密碼", "change_password_error": "無效的密碼!", From b7ba6a0d8fa827723513c48424c56eaf8e13b1ff Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 3 Oct 2014 01:09:35 -0400 Subject: [PATCH 033/264] fixed #2214 - each individual thread will create its own logrotate write handler, because if one is closed, everything crashes in a cascade effect because we're calling .write() after .end(), bleh. --- app.js | 12 ++++-------- loader.js | 8 +++----- src/webserver.js | 6 +++++- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app.js b/app.js index 8ed093631e..c0822a6edc 100644 --- a/app.js +++ b/app.js @@ -143,14 +143,10 @@ function start() { plugins.ready(function() { webserver.init(function() { - // If this callback is called, this means that loader.js is used - process.on('message', function(msg) { - if (msg === 'bind') { - webserver.listen(); - } - }); - process.send({ - action: 'ready' + webserver.listen(function() { + process.send({ + action: 'ready' + }); }); }); }); diff --git a/loader.js b/loader.js index 0119f10f60..449d7e084f 100644 --- a/loader.js +++ b/loader.js @@ -28,6 +28,7 @@ Loader.init = function() { exec: "app.js", silent: silent }); + Loader.primaryWorker = 1; if (silent) { console.log = function(value) { @@ -56,8 +57,6 @@ Loader.init = function() { }); } - worker.send('bind'); - // Kill an instance in the shutdown queue var workerToKill = Loader.shutdown_queue.pop(); if (workerToKill) { @@ -162,9 +161,8 @@ Loader.init = function() { }; Loader.start = function() { - var worker; - - Loader.primaryWorker = 1; + var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), + worker; for(var x=0;x Date: Fri, 3 Oct 2014 11:34:07 -0400 Subject: [PATCH 034/264] closes #2219 --- src/controllers/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 228c477415..ad60533d23 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -145,8 +145,8 @@ Controllers.login = function(req, res, next) { data.authentication = login_strategies; data.token = req.csrfToken(); data.showResetLink = emailersPresent; - data.allowLocalLogin = meta.config.allowLocalLogin === undefined || parseInt(meta.config.allowLocalLogin, 10) === 1; - data.allowRegistration = meta.config.allowRegistration; + data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1; + data.allowRegistration = parseInt(meta.config.allowRegistration, 10) === 1; data.error = req.flash('error')[0]; res.render('login', data); From 43806e5921407ec48fd8bc21cd4d29ea9c5bb7ae Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 11:48:47 -0400 Subject: [PATCH 035/264] replay ie host fix https://github.com/NodeBB/NodeBB/pull/2216 --- public/src/ajaxify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 380ddd2927..33fa498c81 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -275,7 +275,7 @@ $(document).ready(function() { } if ((!e.ctrlKey && !e.shiftKey && !e.metaKey) && e.which === 1) { - if (this.host === window.location.host) { + if (this.host === '' || this.host === window.location.host) { // Internal link var url = this.href.replace(rootUrl + '/', ''); From 73d358edc56bf2add4f27e84d8d435e3abd34a89 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 13:43:51 -0400 Subject: [PATCH 036/264] faster getTeasers got rid of getPostIndices --- src/database/mongo/sorted.js | 2 +- src/topics.js | 43 +++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index ab4943c48c..41e0cf0663 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -203,7 +203,7 @@ module.exports = function(db, module) { module.sortedSetCard = function(key, callback) { if (!key) { - return callback(); + return callback(null, 0); } db.collection('objects').count({_key: key}, function(err, count) { count = parseInt(count, 10); diff --git a/src/topics.js b/src/topics.js index 00d107f0fa..df68ec8514 100644 --- a/src/topics.js +++ b/src/topics.js @@ -193,6 +193,9 @@ var async = require('async'), var cids = mapFilter(topics, 'cid'); async.parallel({ + teasers: function(next) { + Topics.getTeasers(tids, uid, next); + }, users: function(next) { user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], next); }, @@ -205,9 +208,6 @@ var async = require('async'), isAdminOrMod: function(next) { privileges.categories.isAdminOrMod(cids, uid, next); }, - teasers: function(next) { - Topics.getTeasers(tids, uid, next); - }, tags: function(next) { Topics.getTopicsTagsObjects(tids, next); } @@ -346,20 +346,29 @@ var async = require('async'), }; Topics.getTeasers = function(tids, uid, callback) { - if(!Array.isArray(tids)) { + if(!Array.isArray(tids) || !tids.length) { return callback(null, []); } - async.map(tids, function(tid, next) { - db.getSortedSetRevRange('tid:' + tid + ':posts', 0, 0, function(err, data) { - next(err, Array.isArray(data) && data.length ? data[0] : null); - }); - }, function(err, pids) { + async.parallel({ + counts: function(next) { + async.map(tids, function(tid, next) { + db.sortedSetCard('tid:' + tid + ':posts', next); + }, next); + }, + pids: function(next) { + async.map(tids, function(tid, next) { + db.getSortedSetRevRange('tid:' + tid + ':posts', 0, 0, function(err, data) { + next(err, Array.isArray(data) && data.length ? data[0] : null); + }); + }, next); + } + }, function(err, results) { if (err) { return callback(err); } - var postKeys = pids.filter(Boolean).map(function(pid) { + var postKeys = results.pids.filter(Boolean).map(function(pid) { return 'post:' + pid; }); @@ -374,26 +383,20 @@ var async = require('async'), return array.indexOf(uid) === index; }); - async.parallel({ - users: function(next) { - user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], next); - }, - indices: function(next) { - posts.getPostIndices(postData, uid, next); - } - }, function(err, results) { + + user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], function(err, usersData) { if (err) { return callback(err); } var users = {}; - results.users.forEach(function(user) { + usersData.forEach(function(user) { users[user.uid] = user; }); var tidToPost = {}; postData.forEach(function(post, index) { post.user = users[post.uid]; - post.index = results.indices[index] + 1; + post.index = results.counts[index] + 1; post.timestamp = utils.toISOString(post.timestamp); tidToPost[post.tid] = post; }); From 33780e6fdb18c7ae8bde483bb93c1074593118e1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 14:14:41 -0400 Subject: [PATCH 037/264] closes #2133 --- src/controllers/admin/users.js | 4 +++ src/database/mongo/sorted.js | 3 +++ src/routes/admin.js | 1 + src/upgrade.js | 45 +++++++++++++++++++++++++++++++- src/user/admin.js | 14 ++++++++-- src/views/admin/manage/users.tpl | 5 ++-- 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 14f02b7fd0..4af06fed33 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -25,6 +25,10 @@ usersController.sortByJoinDate = function(req, res, next) { getUsers('users:joindate', req, res, next); }; +usersController.banned = function(req, res, next) { + getUsers('users:banned', req, res, next); +}; + function getUsers(set, req, res, next) { user.getUsersFromSet(set, 0, 49, function(err, users) { if (err) { diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 41e0cf0663..5af9d8bd7f 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -26,6 +26,9 @@ module.exports = function(db, module) { }; function sortedSetAddBulk(key, scores, values, callback) { + if (!scores.length || !values.length) { + return callback(); + } if (scores.length !== values.length) { return callback(new Error('[[error:invalid-data]]')); } diff --git a/src/routes/admin.js b/src/routes/admin.js index 5093683824..104f6c40f3 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -51,6 +51,7 @@ function addRoutes(router, middleware, controllers) { router.get('/manage/users/latest', controllers.admin.users.sortByJoinDate); router.get('/manage/users/sort-posts', controllers.admin.users.sortByPosts); router.get('/manage/users/sort-reputation', controllers.admin.users.sortByReputation); + router.get('/manage/users/banned', controllers.admin.users.banned); router.get('/manage/groups', controllers.admin.groups.get); diff --git a/src/upgrade.js b/src/upgrade.js index 65bbdd7a2d..7621c572b2 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -19,7 +19,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2014, 8, 27); + latestSchema = Date.UTC(2014, 9, 3); Upgrade.check = function(callback) { db.get('schemaDate', function(err, value) { @@ -1042,6 +1042,49 @@ Upgrade.upgrade = function(callback) { winston.info('[2014/9/27] Deleting tid::read_by_uid skipped'); next(); } + }, + function(next) { + thisSchemaDate = Date.UTC(2014, 9, 3); + if (schemaDate < thisSchemaDate) { + winston.info('[2014/10/3] Banned users sorted set'); + + db.getSortedSetRange('users:joindate', 0, -1, function(err, uids) { + if (err) { + return next(err); + } + + async.eachLimit(uids, 50, function(uid, next) { + User.getMultipleUserFields(uids, ['uid', 'banned'], function(err, userData) { + if (err) { + return next(err); + } + + var bannedUids = userData.filter(function(user) { + return user && parseInt(user.banned, 10) === 1; + }).map(function(user) { + return user.uid; + }); + var timestamps = []; + var now = Date.now(); + bannedUids.forEach(function() { + timestamps.push(now); + }); + db.sortedSetAdd('users:banned', timestamps, bannedUids, next); + }); + }, function(err) { + if (err) { + winston.error('[2014/10/3] Error encountered while updating banned users sorted set'); + return next(err); + } + + winston.info('[2014/10/3] Banned users added to sorted set'); + Upgrade.update(thisSchemaDate, next); + }); + }); + } else { + winston.info('[2014/10/3] Banned users sorted set skipped'); + next(); + } } // Add new schema updates here // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 22!!! diff --git a/src/user/admin.js b/src/user/admin.js index d489f16446..ab94a35193 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -46,11 +46,21 @@ module.exports = function(User) { }; User.ban = function(uid, callback) { - User.setUserField(uid, 'banned', 1, callback); + User.setUserField(uid, 'banned', 1, function(err) { + if (err) { + return callback(); + } + db.sortedSetAdd('users:banned', Date.now(), uid, callback); + }); }; User.unban = function(uid, callback) { db.delete('uid:' + uid + ':flagged_by'); - User.setUserField(uid, 'banned', 0, callback); + User.setUserField(uid, 'banned', 0, function(err) { + if (err) { + return callback(err); + } + db.sortedSetRemove('users:banned', uid, callback); + }); }; }; diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 6b080edeb4..543cf8e26b 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -2,12 +2,13 @@
Users
-
+
From 19c69980efeafad6b3a3b8aaa95f73c28f047690 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 3 Oct 2014 15:12:58 -0400 Subject: [PATCH 038/264] Revert "bumping to 0.5.2 for dev purposes" This reverts commit e6824fd727abaf54e49d9616d20c814a9b06a88e. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd3c79796e..087c731117 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPLv3 or later", "description": "NodeBB Forum", - "version": "0.5.2", + "version": "0.5.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 1b3b13716a31b146d5d96072a772f804c142cc03 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 3 Oct 2014 15:13:12 -0400 Subject: [PATCH 039/264] 0.5.2-dev in ACP, just so people know it's not a released version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 087c731117..d6564cfad0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPLv3 or later", "description": "NodeBB Forum", - "version": "0.5.1", + "version": "0.5.2-dev", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From dba20160ce1c17b56166626ab1172c5829b5a2cc Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 15:15:34 -0400 Subject: [PATCH 040/264] check length --- src/database/redis/sorted.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/database/redis/sorted.js b/src/database/redis/sorted.js index 86b3f3d92c..99176b1f36 100644 --- a/src/database/redis/sorted.js +++ b/src/database/redis/sorted.js @@ -12,6 +12,10 @@ module.exports = function(redisClient, module) { }; function sortedSetAddMulti(key, scores, values, callback) { + if (!score.length || !values.length) { + return callback(); + } + if (scores.length !== values.length) { return callback(new Error('[[error:invalid-data]]')); } From 740c3364807381ba936ab29852ea0048f0231185 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 15:16:04 -0400 Subject: [PATCH 041/264] typo --- src/database/redis/sorted.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/redis/sorted.js b/src/database/redis/sorted.js index 99176b1f36..54b09b1915 100644 --- a/src/database/redis/sorted.js +++ b/src/database/redis/sorted.js @@ -12,7 +12,7 @@ module.exports = function(redisClient, module) { }; function sortedSetAddMulti(key, scores, values, callback) { - if (!score.length || !values.length) { + if (!scores.length || !values.length) { return callback(); } From f5f84d9946ae19345be6f9d9088501a95d348132 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 3 Oct 2014 15:28:02 -0400 Subject: [PATCH 042/264] fixing upgrade text to use nodebb executable, removed exposure of option to run without upgrading --- app.js | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/app.js b/app.js index c0822a6edc..052ddb595d 100644 --- a/app.js +++ b/app.js @@ -73,7 +73,7 @@ if (nconf.get('config')) { } configExists = fs.existsSync(configFile); -if (!nconf.get('help') && !nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nconf.get('reset') && configExists) { +if (!nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nconf.get('reset') && configExists) { start(); } else if (nconf.get('setup') || nconf.get('install') || !configExists) { setup(); @@ -81,8 +81,6 @@ if (!nconf.get('help') && !nconf.get('setup') && !nconf.get('install') && !nconf upgrade(); } else if (nconf.get('reset')) { reset(); -} else { - displayHelp(); } function loadConfig() { @@ -167,7 +165,7 @@ function start() { case 'css-propagate': meta.css.cache = message.cache; meta.css.acpCache = message.acpCache; - winston.info('[cluster] Stylesheet propagated to worker ' + cluster.worker.id); + winston.info('[cluster] Stylesheets propagated to worker ' + cluster.worker.id); break; } }); @@ -181,10 +179,12 @@ function start() { }); } else { winston.warn('Your NodeBB schema is out-of-date. Please run the following command to bring your dataset up to spec:'); - winston.warn(' node app --upgrade'); - winston.warn('To ignore this error (not recommended):'); - winston.warn(' node app --no-check-schema'); - process.exit(); + winston.warn(' ./nodebb upgrade'); + if (cluster.isWorker) { + cluster.worker.kill(); + } else { + process.exit(); + } } }); }); @@ -355,16 +355,4 @@ function restart() { winston.error('[app] Could not restart server. Shutting down.'); shutdown(1); } -} - -function displayHelp() { - winston.info('Usage: node app [options] [arguments]'); - winston.info(' [NODE_ENV=development | NODE_ENV=production] node app [--start] [arguments]'); - winston.info(''); - winston.info('Options:'); - winston.info(' --help displays this usage information'); - winston.info(' --setup configure your environment and setup NodeBB'); - winston.info(' --upgrade upgrade NodeBB, first read: https://docs.nodebb.org/en/latest/upgrading/'); - winston.info(' --reset soft resets NodeBB; disables all plugins and restores selected theme to Vanilla'); - winston.info(' --start manually start NodeBB (default when no options are given)'); -} +} \ No newline at end of file From c37cfe4b3f25ddc5edc7beebb257333d2d4e180b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Oct 2014 15:28:46 -0400 Subject: [PATCH 043/264] closes #2209 --- src/socket.io/modules.js | 40 +++++++++++++++++++++++++--------------- src/user.js | 3 +-- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index a96c3ffd4b..b0dc4e8a7c 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -192,27 +192,37 @@ SocketModules.chats.send = function(socket, data, callback) { var msg = S(data.message).stripTags().s; - Messaging.addMessage(socket.uid, touid, msg, function(err, message) { + user.getUserField(socket.uid, 'banned', function(err, banned) { if (err) { return callback(err); } - Messaging.notifyUser(socket.uid, touid, message); + if (parseInt(banned, 10) === 1) { + return callback(new Error('[[error:user-banned]]')); + } - // Recipient - SocketModules.chats.pushUnreadCount(touid); - server.in('uid_' + touid).emit('event:chats.receive', { - withUid: socket.uid, - message: message, - self: 0 - }); + Messaging.addMessage(socket.uid, touid, msg, function(err, message) { + if (err) { + return callback(err); + } - // Sender - SocketModules.chats.pushUnreadCount(socket.uid); - server.in('uid_' + socket.uid).emit('event:chats.receive', { - withUid: touid, - message: message, - self: 1 + Messaging.notifyUser(socket.uid, touid, message); + + // Recipient + SocketModules.chats.pushUnreadCount(touid); + server.in('uid_' + touid).emit('event:chats.receive', { + withUid: socket.uid, + message: message, + self: 0 + }); + + // Sender + SocketModules.chats.pushUnreadCount(socket.uid); + server.in('uid_' + socket.uid).emit('event:chats.receive', { + withUid: touid, + message: message, + self: 1 + }); }); }); }; diff --git a/src/user.js b/src/user.js index f9ef005c6b..c5373a9d6c 100644 --- a/src/user.js +++ b/src/user.js @@ -111,6 +111,7 @@ var async = require('async'), user.uid = 0; user.username = '[[global:guest]]'; user.userslug = ''; + user.picture = User.createGravatarURLFromEmail(''); } if (user.picture) { @@ -119,8 +120,6 @@ var async = require('async'), } else { user.picture = User.createGravatarURLFromEmail(user.email); } - } else { - user.picture = User.createGravatarURLFromEmail(''); } for(var i=0; i Date: Fri, 3 Oct 2014 16:31:53 -0400 Subject: [PATCH 044/264] closes #2175 --- src/controllers/admin.js | 14 ++++++++++++++ src/database/mongo.js | 8 +++++++- src/routes/admin.js | 1 + src/socket.io/admin.js | 17 +++++++++++++---- src/views/admin/advanced/log.tpl | 30 ++++++++++++++++++++++++++++++ src/views/admin/header.tpl | 1 + 6 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 src/views/admin/advanced/log.tpl diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 10c852a74d..8f007c7783 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -28,6 +28,7 @@ var adminController = { widgets: {} }, events: {}, + logs: {}, database: {}, plugins: {}, languages: {}, @@ -172,6 +173,19 @@ adminController.events.get = function(req, res, next) { }); }; +adminController.logs.get = function(req, res, next) { + var logPath = path.join('logs', path.sep, 'output.log'); + fs.readFile(logPath, function(err, data) { + if (err || !data) { + data = ''; + } + + res.render('admin/advanced/log', { + data: data.toString() + }); + }); +}; + adminController.plugins.get = function(req, res, next) { plugins.getAll(function(err, plugins) { if (err || !Array.isArray(plugins)) { diff --git a/src/database/mongo.js b/src/database/mongo.js index bed8f542b7..253fd78fbe 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -53,7 +53,13 @@ winston.error('Unable to initialize MongoDB! Is MongoDB installed? Error :' + err.message); process.exit(); } - var connString = 'mongodb://'+ nconf.get('mongo:host') + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'); + + var usernamePassword = ''; + if (nconf.get('mongo:username') && nconf.get('mongo:password')) { + usernamePassword = nconf.get('mongo:username') + ':' + nconf.get('mongo:password') + '@'; + } + + var connString = 'mongodb://' + usernamePassword + nconf.get('mongo:host') + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'); var connOptions = { server: { poolSize: nconf.get('mongo:poolSize') || 10 diff --git a/src/routes/admin.js b/src/routes/admin.js index 104f6c40f3..ab2d3c14b1 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -64,6 +64,7 @@ function addRoutes(router, middleware, controllers) { router.get('/advanced/database', controllers.admin.database.get); router.get('/advanced/events', controllers.admin.events.get); + router.get('/advanced/logs', controllers.admin.logs.get); router.get('/development/logger', controllers.admin.logger.get); } diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 17bc3d0e20..108356465b 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -1,6 +1,12 @@ "use strict"; -var groups = require('../groups'), +var async = require('async'), + winston = require('winston'), + cluster = require('cluster'), + fs = require('fs'), + path = require('path'), + + groups = require('../groups'), meta = require('../meta'), plugins = require('../plugins'), widgets = require('../widgets'), @@ -11,10 +17,8 @@ var groups = require('../groups'), events = require('../events'), emailer = require('../emailer'), db = require('../database'), - async = require('async'), - winston = require('winston'), index = require('./index'), - cluster = require('cluster'), + SocketAdmin = { user: require('./admin/user'), @@ -232,4 +236,9 @@ function getHourlyStatsForSet(set, hours, callback) { }); } +SocketAdmin.clearLog = function(socket, data, callback) { + var logPath = path.join('logs', path.sep, 'output.log'); + fs.truncate(logPath, callback); +}; + module.exports = SocketAdmin; diff --git a/src/views/admin/advanced/log.tpl b/src/views/admin/advanced/log.tpl new file mode 100644 index 0000000000..7b396e003d --- /dev/null +++ b/src/views/admin/advanced/log.tpl @@ -0,0 +1,30 @@ +
+
+
+
Logs
+
+
{data}
+
+
+
+
+ +
+
+
+ +
+
+
+ + Advanced
  • Database
  • Events
  • +
  • Logs
  • '); + searchIndex[file].find('script').remove(); + + searchIndex[file] = searchIndex[file].text().toLowerCase().replace(/[ |\r|\n]+/g, ' '); + } + } + + delete searchIndex['/admin/header.tpl']; + delete searchIndex['/admin/footer.tpl']; + + setupACPSearch(); + }); + };; + + function setupACPSearch() { + var menu = $('#acp-search .dropdown-menu'), + routes = [], + input = $('#acp-search input'), + firstResult = null; + + input.on('keyup', function() { + $('#acp-search .dropdown').addClass('open'); + }); + + $('#acp-search').parents('form').on('submit', function(ev) { + var input = $(this).find('input'), + href = firstResult ? firstResult : RELATIVE_PATH + '/search/' + input.val(); + + ajaxify.go(href.replace(/^\//, '')); + + setTimeout(function() { + $('#acp-search .dropdown').removeClass('open'); + $(input).blur(); + }, 150); + + ev.preventDefault(); + return false; + }); + + $('.sidebar-nav a').each(function(idx, link) { + routes.push($(link).attr('href')); + }); + + input.on('blur', function() { + $(this).val('').attr('placeholder', '/'); + }); + + input.on('keyup focus', function() { + var $input = $(this), + value = $input.val().toLowerCase(), + menuItems = $('#acp-search .dropdown-menu').html(''); + + function toUpperCase(txt){ + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + } + + $input.attr('placeholder', ''); + + firstResult = null; + + if (value.length >= 3) { + for (var file in searchIndex) { + if (searchIndex.hasOwnProperty(file)) { + var position = searchIndex[file].indexOf(value); + + if (position !== -1) { + var href = file.replace('.tpl', ''), + title = href.replace(/^\/admin\//, '').split('/'), + description = searchIndex[file].substring(Math.max(0, position - 25), Math.min(searchIndex[file].length - 1, position + 25)) + .replace(value, '' + value + ''); + + for (var t in title) { + if (title.hasOwnProperty(t)) { + title[t] = title[t] + .replace('-', ' ') + .replace(/\w\S*/g, toUpperCase); + } + } + + title = title.join(' > '); + href = RELATIVE_PATH + href; + firstResult = firstResult ? firstResult : href; + + if ($.inArray(href, routes) !== -1) { + menuItems.append('
  • ' + title + '
    ...' + description + '...
  • '); + } + } + } + } + + if (menuItems.html() !== '') { + menuItems.append(''); + } + } + + if (value.length > 0) { + menuItems.append('
  • Search the forum for ' + value + '
  • '); + } else { + menuItems.append('
  • Start typing to see results...
  • '); + } + }); + } + + return search; +}); \ No newline at end of file From 07a5aeaf15600283a4b9e8babf77a51750f8dff2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 9 Oct 2014 19:20:53 -0400 Subject: [PATCH 190/264] closes #2251 --- public/src/admin/manage/users.js | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 72a9344a9d..209b56431d 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -249,27 +249,26 @@ define('admin/manage/users', ['admin/selectable'], function(selectable) { } function loadMoreUsers() { - var set = ''; - if (active === 'latest') { - set = 'users:joindate'; - } else if (active === 'sort-posts') { + var set = 'users:joindate'; + if (active === 'sort-posts') { set = 'users:postcount'; } else if (active === 'sort-reputation') { set = 'users:reputation'; + } else if (active === 'banned') { + set = 'users:banned'; } - if (set) { - loadingMoreUsers = true; - socket.emit('user.loadMore', { - set: set, - after: $('#users-container').children().length - }, function(err, data) { - if (data && data.users.length) { - onUsersLoaded(data.users); - } - loadingMoreUsers = false; - }); - } + + loadingMoreUsers = true; + socket.emit('user.loadMore', { + set: set, + after: $('#users-container').children().length + }, function(err, data) { + if (data && data.users.length) { + onUsersLoaded(data.users); + } + loadingMoreUsers = false; + }); } $('#load-more-users-btn').on('click', loadMoreUsers); From 29d90bc67d872f53bcd52ad5394388ee91c72268 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 9 Oct 2014 19:53:10 -0400 Subject: [PATCH 191/264] only use unique cids in isModerator --- src/topics.js | 2 +- src/user.js | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/topics.js b/src/topics.js index 26a68d7402..3cb6538804 100644 --- a/src/topics.js +++ b/src/topics.js @@ -179,7 +179,7 @@ var async = require('async'), Topics.getTopicsData(tids, function(err, topics) { function mapFilter(array, field) { return array.map(function(topic) { - return topic && topic[field]; + return topic && topic[field].toString(); }).filter(function(value, index, array) { return utils.isNumber(value) && array.indexOf(value) === index; }); diff --git a/src/user.js b/src/user.js index 62259f90ee..5121384dbf 100644 --- a/src/user.js +++ b/src/user.js @@ -394,10 +394,28 @@ var async = require('async'), User.isModerator = function(uid, cid, callback) { if (Array.isArray(cid)) { - var groupNames = cid.map(function(cid) { + var uniqueCids = cid.filter(function(cid, index, array) { + return array.indexOf(cid) === index; + }); + + var groupNames = uniqueCids.map(function(cid) { return 'cid:' + cid + ':privileges:mods'; }); - groups.isMemberOfGroups(uid, groupNames, callback); + + groups.isMemberOfGroups(uid, groupNames, function(err, isMembers) { + if (err) { + return callback(err); + } + + var map = {}; + uniqueCids.forEach(function(cid, index) { + map[cid] = isMembers[index]; + }); + + callback(null, cid.map(function(cid) { + return map[cid]; + })); + }); } else { if (Array.isArray(uid)) { groups.isMembers(uid, 'cid:' + cid + ':privileges:mods', callback); From e95c68e7d6a5aa782da52baece148ab8dcd0eac6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 9 Oct 2014 20:47:27 -0400 Subject: [PATCH 192/264] fix bookmark --- public/src/modules/navigator.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 232115f8da..5528b78b51 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -181,6 +181,8 @@ define('navigator', ['forum/pagination'], function(pagination) { } } else { navigator.scrollActive = false; + postIndex = parseInt(postIndex, 10) + 1; + ajaxify.go(generateUrl(postIndex)); } }; From cad3f3017cd3fc70b4e462ff28a65ac1b53f213a Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Oct 2014 03:11:58 -0400 Subject: [PATCH 193/264] moved iconSelect to admin/modules --- public/src/admin/manage/categories.js | 2 +- public/src/admin/manage/groups.js | 2 +- public/src/admin/{ => modules}/iconSelect.js | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) rename public/src/admin/{ => modules}/iconSelect.js (98%) diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index 91277c9c14..a77c8d67d2 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -1,7 +1,7 @@ "use strict"; /*global define, socket, app, bootbox, templates, ajaxify, RELATIVE_PATH*/ -define('admin/manage/categories', ['uploader', 'admin/iconSelect'], function(uploader, iconSelect) { +define('admin/manage/categories', ['uploader', 'admin/modules/iconSelect'], function(uploader, iconSelect) { var Categories = {}; Categories.init = function() { diff --git a/public/src/admin/manage/groups.js b/public/src/admin/manage/groups.js index 7ebf7d01de..6871bc07b1 100644 --- a/public/src/admin/manage/groups.js +++ b/public/src/admin/manage/groups.js @@ -1,7 +1,7 @@ "use strict"; /*global define, templates, socket, ajaxify, app, bootbox*/ -define('admin/manage/groups', ['admin/iconSelect'], function(iconSelect) { +define('admin/manage/groups', ['admin/modules/iconSelect'], function(iconSelect) { var Groups = {}; Groups.init = function() { diff --git a/public/src/admin/iconSelect.js b/public/src/admin/modules/iconSelect.js similarity index 98% rename from public/src/admin/iconSelect.js rename to public/src/admin/modules/iconSelect.js index 348619bf37..97cfe429b8 100644 --- a/public/src/admin/iconSelect.js +++ b/public/src/admin/modules/iconSelect.js @@ -1,5 +1,4 @@ - -'use strict'; +"use strict"; /* globals define, bootbox */ From ffcb324d911dbb53cd02535966a6c96edb423846 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Oct 2014 03:17:50 -0400 Subject: [PATCH 194/264] oh bootbox, I forgive you. (I lost hope in this actually being resolved upstream) --- public/src/admin/manage/flags.js | 2 +- public/src/admin/manage/tags.js | 2 +- public/src/admin/modules/iconSelect.js | 2 +- public/src/app.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/src/admin/manage/flags.js b/public/src/admin/manage/flags.js index 405b45441c..824de26971 100644 --- a/public/src/admin/manage/flags.js +++ b/public/src/admin/manage/flags.js @@ -1,5 +1,5 @@ "use strict"; -/*global define, socket, app, admin, utils, bootbox, RELATIVE_PATH*/ +/*global define, socket, app, admin, utils, RELATIVE_PATH*/ define('admin/manage/flags', ['infinitescroll', 'admin/selectable'], function(infinitescroll, selectable) { var Flags = {}; diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index 609306a7f7..b87580099d 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -69,7 +69,7 @@ define('admin/manage/tags', ['infinitescroll', 'admin/selectable'], function(inf setTimeout(function() { handleColorPickers(); - }, 500); // bootbox made me do it. + }, 500); }); }; diff --git a/public/src/admin/modules/iconSelect.js b/public/src/admin/modules/iconSelect.js index 97cfe429b8..286009bf0f 100644 --- a/public/src/admin/modules/iconSelect.js +++ b/public/src/admin/modules/iconSelect.js @@ -33,7 +33,7 @@ define(function() { } }); - setTimeout(function() { //bootbox was rewritten for BS3 and I had to add this timeout for the previous code to work. TODO: to look into + setTimeout(function() { $('.bootbox .fa-icons i').on('click', function() { $('.bootbox .selected').removeClass('selected'); $(this).addClass('selected'); diff --git a/public/src/app.js b/public/src/app.js index 0e6a41fb3d..815f4752cb 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -1,5 +1,5 @@ "use strict"; -/*global io, templates, translator, ajaxify, utils, RELATIVE_PATH*/ +/*global io, templates, translator, ajaxify, utils, bootbox, RELATIVE_PATH*/ var socket, config, From e052d8e5c1c36963260670c934832d7d2b01edef Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 10 Oct 2014 15:44:02 -0400 Subject: [PATCH 195/264] log topic move --- src/events.js | 4 ++++ src/threadTools.js | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/events.js b/src/events.js index f7cf1a10c4..37e43f3d01 100644 --- a/src/events.js +++ b/src/events.js @@ -62,6 +62,10 @@ var fs = require('fs'), events.logWithUser(uid, 'restored post (pid ' + pid + ')'); }; + events.logTopicMove = function(uid, tid) { + events.logWithUser(uid, 'moved topic (tid ' + tid + ')'); + }; + events.logTopicDelete = function(uid, tid) { events.logWithUser(uid, 'deleted topic (tid ' + tid + ')'); }; diff --git a/src/threadTools.js b/src/threadTools.js index 1e69868e62..22ceeafa07 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -207,6 +207,8 @@ var winston = require('winston'), topics.setTopicField(tid, 'cid', cid, callback); + events.logTopicMove(uid, tid); + plugins.fireHook('action:topic.move', { tid: tid, fromCid: oldCid, From 4268d424a3e1d0a83ab353616533de124ea15a00 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Oct 2014 16:34:24 -0400 Subject: [PATCH 196/264] fixes require.js error in ACP --- src/routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/index.js b/src/routes/index.js index 46737ebd57..5b8bb8d638 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -178,7 +178,7 @@ function handleErrors(err, req, res, next) { function catch404(req, res, next) { var relativePath = nconf.get('relative_path'); var isLanguage = new RegExp('^' + relativePath + '/language/[\\w]{2,}/.*.json'), - isClientScript = new RegExp('^' + relativePath + '\\/src\\/forum(\\/admin)?\\/.+\\.js'); + isClientScript = new RegExp('^' + relativePath + '\\/src\\/.+\\.js'); res.status(404); From a24dde863b0ff90238a167c4d85087544b9aacfb Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Oct 2014 16:37:58 -0400 Subject: [PATCH 197/264] moved src/client/modules/admin/selectable to src/admin/modules/selectable #2250 --- public/src/admin/manage/flags.js | 2 +- public/src/admin/manage/tags.js | 2 +- public/src/admin/manage/users.js | 2 +- public/src/{modules/admin => admin/modules}/selectable.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename public/src/{modules/admin => admin/modules}/selectable.js (97%) diff --git a/public/src/admin/manage/flags.js b/public/src/admin/manage/flags.js index 824de26971..d19ef8fb4f 100644 --- a/public/src/admin/manage/flags.js +++ b/public/src/admin/manage/flags.js @@ -1,7 +1,7 @@ "use strict"; /*global define, socket, app, admin, utils, RELATIVE_PATH*/ -define('admin/manage/flags', ['infinitescroll', 'admin/selectable'], function(infinitescroll, selectable) { +define('admin/manage/flags', ['infinitescroll', 'admin/modules/selectable'], function(infinitescroll, selectable) { var Flags = {}; Flags.init = function() { diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index b87580099d..610c1d77db 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -1,7 +1,7 @@ "use strict"; /*global define, socket, app, admin, utils, bootbox, RELATIVE_PATH*/ -define('admin/manage/tags', ['infinitescroll', 'admin/selectable'], function(infinitescroll, selectable) { +define('admin/manage/tags', ['infinitescroll', 'admin/modules/selectable'], function(infinitescroll, selectable) { var Tags = {}, timeoutId = 0; diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 209b56431d..54eead3572 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -1,6 +1,6 @@ "use strict"; /* global socket, define, templates, bootbox, app, ajaxify, */ -define('admin/manage/users', ['admin/selectable'], function(selectable) { +define('admin/manage/users', ['admin/modules/selectable'], function(selectable) { var Users = {}; Users.init = function() { diff --git a/public/src/modules/admin/selectable.js b/public/src/admin/modules/selectable.js similarity index 97% rename from public/src/modules/admin/selectable.js rename to public/src/admin/modules/selectable.js index b2b182ffae..a2416cec84 100644 --- a/public/src/modules/admin/selectable.js +++ b/public/src/admin/modules/selectable.js @@ -2,7 +2,7 @@ /*globals define*/ -define('admin/selectable', function() { +define('admin/modules/selectable', function() { var selectable = {}; // modified from http://threedubmedia.com/code/event/drop/demo/selection From 1226a2462a3745413d9fd0fa3346de5de207e563 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Oct 2014 16:40:05 -0400 Subject: [PATCH 198/264] closes #2250 --- public/src/{ => admin}/admin.js | 0 src/views/admin/header.tpl | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename public/src/{ => admin}/admin.js (100%) diff --git a/public/src/admin.js b/public/src/admin/admin.js similarity index 100% rename from public/src/admin.js rename to public/src/admin/admin.js diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl index acebeae1d5..1e3aa03e0d 100644 --- a/src/views/admin/header.tpl +++ b/src/views/admin/header.tpl @@ -25,7 +25,7 @@ - + From 7ee6f1d01cfcaea3592ab3156f16b4a6666b4a3f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Oct 2014 16:41:03 -0400 Subject: [PATCH 199/264] added cache buster to all scripts/css in acp --- src/views/admin/header.tpl | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl index 1e3aa03e0d..1bed0929ed 100644 --- a/src/views/admin/header.tpl +++ b/src/views/admin/header.tpl @@ -4,9 +4,9 @@ NodeBB Admin Control Panel - - - + + + - - - - - + + + + + - - - - - - - - + + + + + + + + Date: Mon, 13 Oct 2014 13:03:06 -0400 Subject: [PATCH 213/264] fixed #2259 --- app.js | 32 ++++++++++++++------------ loader.js | 69 ++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/app.js b/app.js index 052ddb595d..ac339fedc3 100644 --- a/app.js +++ b/app.js @@ -58,11 +58,13 @@ if(os.platform() === 'linux') { }); } -// Log GNU copyright info along with server info -winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); -winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); -winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); -winston.info(''); +if (!cluster.isWorker) { + // If run using `node app`, log GNU copyright info along with server info + winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); + winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); + winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); + winston.info(''); +} // Alternate configuration file support var configFile = path.join(__dirname, '/config.json'), @@ -102,20 +104,20 @@ function loadConfig() { } function start() { - loadConfig(); - winston.info('Time: ' + new Date()); - winston.info('Initializing NodeBB v' + pkg.version); - winston.info('* using configuration stored in: ' + configFile); - var host = nconf.get(nconf.get('database') + ':host'), - storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; + if (!cluster.isWorker) { + winston.info('Time: ' + new Date()); + winston.info('Initializing NodeBB v' + pkg.version); + winston.info('* using configuration stored in: ' + configFile); + } - winston.info('* using ' + nconf.get('database') +' store ' + storeLocation); - winston.info('* using themes stored in: ' + nconf.get('themes_path')); + if (cluster.isWorker && process.env.cluster_setup === 'true') { + var host = nconf.get(nconf.get('database') + ':host'), + storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; - if (process.env.NODE_ENV === 'development') { - winston.info('Base Configuration OK.'); + winston.info('* using ' + nconf.get('database') +' store ' + storeLocation); + winston.info('* using themes stored in: ' + nconf.get('themes_path')); } require('./src/database').init(function(err) { diff --git a/loader.js b/loader.js index 0b384ba8a1..aee0b18c44 100644 --- a/loader.js +++ b/loader.js @@ -6,10 +6,14 @@ var nconf = require('nconf'), cluster = require('cluster'), async = require('async'), logrotate = require('logrotate-stream'), + + pkg = require('./package.json'), + pidFilePath = __dirname + '/pidfile', output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), silent = process.env.NODE_ENV !== 'development' ? true : false, - numCPUs, + numProcs, + Loader = { timesStarted: 0, shutdown_queue: [], @@ -23,7 +27,7 @@ var nconf = require('nconf'), } }; -Loader.init = function() { +Loader.init = function(callback) { cluster.setupMaster({ exec: "app.js", silent: silent @@ -36,6 +40,20 @@ Loader.init = function() { }; } + process.on('SIGHUP', Loader.restart); + callback(); +}; + +Loader.displayStartupMessages = function(callback) { + console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); + console.log('This program comes with ABSOLUTELY NO WARRANTY.'); + console.log('This is free software, and you are welcome to redistribute it under certain conditions.'); + console.log('For the full license, please visit: http://www.gnu.org/copyleft/gpl.html'); + console.log(''); + callback(); +}; + +Loader.addClusterEvents = function(callback) { cluster.on('fork', function(worker) { worker.on('message', function(message) { if (message && typeof message === 'object' && message.action) { @@ -115,7 +133,7 @@ Loader.init = function() { case 'user:connect': case 'user:disconnect': case 'config:update': - notifyWorkers(message); + Loader.notifyWorkers(message); break; } } @@ -126,15 +144,9 @@ Loader.init = function() { console.log('[cluster] Child Process (' + worker.process.pid + ') listening for connections.'); }); - function notifyWorkers(msg) { - Object.keys(cluster.workers).forEach(function(id) { - cluster.workers[id].send(msg); - }); - } - cluster.on('exit', function(worker, code, signal) { if (code !== 0) { - if (Loader.timesStarted < numCPUs*3) { + if (Loader.timesStarted < numProcs*3) { Loader.timesStarted++; if (Loader.crashTimer) { clearTimeout(Loader.crashTimer); @@ -143,7 +155,7 @@ Loader.init = function() { Loader.timesStarted = 0; }); } else { - console.log(numCPUs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); + console.log(numProcs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); process.exit(); } } @@ -159,16 +171,16 @@ Loader.init = function() { } }); - process.on('SIGHUP', Loader.restart); + callback(); +} - Loader.start(); -}; - -Loader.start = function() { +Loader.start = function(callback) { var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), worker; - for(var x=0;x Date: Mon, 13 Oct 2014 14:20:08 -0400 Subject: [PATCH 214/264] min-width for user boxes in admin/manage --- public/less/admin/manage/users.less | 1 + 1 file changed, 1 insertion(+) diff --git a/public/less/admin/manage/users.less b/public/less/admin/manage/users.less index ab6b18a17f..3a0b741046 100644 --- a/public/less/admin/manage/users.less +++ b/public/less/admin/manage/users.less @@ -13,6 +13,7 @@ overflow: hidden; height: auto; max-width: 125px; + min-width: 125px; img { width:80px; From fced152e4113cda91214737c2b6c98e0fd3028a8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Oct 2014 15:06:21 -0400 Subject: [PATCH 215/264] read total from global object --- src/controllers/admin.js | 13 +++++++------ src/middleware/middleware.js | 4 +++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 8f6e898d2a..e5f0461785 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -70,16 +70,16 @@ adminController.home = function(req, res, next) { function getStats(callback) { async.parallel([ function(next) { - getStatsForSet('ip:recent', next); + getStatsForSet('ip:recent', 'uniqueIPCount', next); }, function(next) { - getStatsForSet('users:joindate', next); + getStatsForSet('users:joindate', 'userCount', next); }, function(next) { - getStatsForSet('posts:pid', next); + getStatsForSet('posts:pid', 'postCount', next); }, function(next) { - getStatsForSet('topics:tid', next); + getStatsForSet('topics:tid', 'topicCount', next); } ], function(err, results) { if (err) { @@ -94,12 +94,13 @@ function getStats(callback) { }); } -function getStatsForSet(set, callback) { +function getStatsForSet(set, field, callback) { var terms = { day: 86400000, week: 604800000, month: 2592000000 }; + var now = Date.now(); async.parallel({ day: function(next) { @@ -112,7 +113,7 @@ function getStatsForSet(set, callback) { db.sortedSetCount(set, now - terms.month, now, next); }, alltime: function(next) { - db.sortedSetCount(set, 0, now, next); + db.getObjectField('global', field, next); } }, callback); } diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 1690a29959..599689e647 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -51,7 +51,9 @@ middleware.updateLastOnlineTime = function(req, res, next) { } var today = new Date(); today.setHours(today.getHours(), 0, 0, 0); - + if (!score) { + db.incrObjectField('global', 'uniqueIPCount'); + } if (!score || score < today.getTime()) { db.sortedSetIncrBy('analytics:uniquevisitors', 1, today.getTime()); db.sortedSetAdd('ip:recent', Date.now(), req.ip || 'Unknown'); From 62d0e08d6af532e51425e8b3b430863672d44be5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Oct 2014 19:46:42 -0400 Subject: [PATCH 216/264] stopped loader from crashing whenever NodeBB restarts --- loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader.js b/loader.js index aee0b18c44..7e63804175 100644 --- a/loader.js +++ b/loader.js @@ -193,7 +193,7 @@ Loader.start = function(callback) { } } - callback(); + if (callback) callback(); }; Loader.restart = function(callback) { From 40fe40deac24f64fceaf077d91b97f853ed41eb7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Oct 2014 22:25:34 -0400 Subject: [PATCH 217/264] removed users:online set using websockets.getConnectedClients directly --- src/controllers/users.js | 2 +- src/socket.io/index.js | 51 +++++++++++++++++----------------------- src/user.js | 9 +++++-- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/controllers/users.js b/src/controllers/users.js index c365188bb3..bdc3fceb70 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -15,7 +15,7 @@ usersController.getOnlineUsers = function(req, res, next) { user.getUsersFromSet('users:online', 0, 49, next); }, count: function(next) { - db.sortedSetCard('users:online', next); + next(null, websockets.getConnectedClients().length); }, isAdministrator: function(next) { user.isAdministrator(uid, next); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 6626b812e5..a334760f6c 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -98,8 +98,6 @@ Sockets.init = function(server) { Sockets.server = io; - db.delete('users:online'); - fs.readdir(__dirname, function(err, files) { files.splice(files.indexOf('index.js'), 1); @@ -140,30 +138,30 @@ Sockets.init = function(server) { if (uid) { socket.join('uid_' + uid); socket.join('online_users'); - db.sortedSetAdd('users:online', Date.now(), uid, function(err) { - async.parallel({ - user: function(next) { - user.getUserFields(uid, ['username', 'userslug', 'picture', 'status'], next); - }, - isAdmin: function(next) { - user.isAdministrator(uid, next); - } - }, function(err, userData) { - if (err || !userData.user) { - return; - } - socket.emit('event:connect', { - status: 1, - username: userData.user.username, - userslug: userData.user.userslug, - picture: userData.user.picture, - isAdmin: userData.isAdmin, - uid: uid - }); - socket.broadcast.emit('event:user_status_change', {uid:uid, status: userData.user.status}); + async.parallel({ + user: function(next) { + user.getUserFields(uid, ['username', 'userslug', 'picture', 'status'], next); + }, + isAdmin: function(next) { + user.isAdministrator(uid, next); + } + }, function(err, userData) { + if (err || !userData.user) { + return; + } + socket.emit('event:connect', { + status: 1, + username: userData.user.username, + userslug: userData.user.userslug, + picture: userData.user.picture, + isAdmin: userData.isAdmin, + uid: uid }); + + socket.broadcast.emit('event:user_status_change', {uid:uid, status: userData.user.status}); }); + } else { socket.join('online_guests'); socket.emit('event:connect', { @@ -179,12 +177,7 @@ Sockets.init = function(server) { socket.on('disconnect', function() { var socketCount = Sockets.getUserSocketCount(uid); if (uid && socketCount <= 1) { - db.sortedSetRemove('users:online', uid, function(err) { - if (err) { - return winston.error(err.message); - } - socket.broadcast.emit('event:user_status_change', {uid: uid, status: 'offline'}); - }); + socket.broadcast.emit('event:user_status_change', {uid: uid, status: 'offline'}); } onUserDisconnect(uid, socket.id, socketCount); diff --git a/src/user.js b/src/user.js index 5121384dbf..a4920e14da 100644 --- a/src/user.js +++ b/src/user.js @@ -230,7 +230,12 @@ var async = require('async'), User.getUsersFromSet = function(set, start, stop, callback) { async.waterfall([ function(next) { - db.getSortedSetRevRange(set, start, stop, next); + if (set === 'users:online') { + var uids = require('./socket.io').getConnectedClients(); + next(null, uids.slice(start, stop + 1)); + } else { + db.getSortedSetRevRange(set, start, stop, next); + } }, function(uids, next) { User.getUsers(uids, next); @@ -247,7 +252,7 @@ var async = require('async'), User.isAdministrator(uids, next); }, isOnline: function(next) { - db.isSortedSetMembers('users:online', uids, next); + require('./socket.io').isUsersOnline(uids, next); } }, function(err, results) { if (err) { From 6ff00a935f715b420a372b6a4c0a9d43bb919029 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Oct 2014 23:36:08 -0400 Subject: [PATCH 218/264] dont reverse infinite load admin/events --- src/views/admin/advanced/events.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/admin/advanced/events.tpl b/src/views/admin/advanced/events.tpl index e125fb190f..03e3b7f4eb 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -14,7 +14,7 @@ require(['forum/infinitescroll'], function(infinitescroll) { infinitescroll.init(function(direction) { - if (direction < 0 && !$('.events').length) { + if (direction < 0 || !$('.events').length) { return; } From 835c58d27d9a0447a667061379dc298a2913ac49 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 02:39:20 -0400 Subject: [PATCH 219/264] mark read after infinite scroll dont mark read if already read --- public/src/client/topic.js | 4 ++-- src/topics/unread.js | 39 +++++++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 597f259f86..8890bf1097 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -149,7 +149,7 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT var postcount = $('.user_postcount_' + data.posts[i].uid); postcount.html(parseInt(postcount.html(), 10) + 1); } - socket.emit('topics.markAsRead', [tid]); + createNewPosts(data); } @@ -195,7 +195,6 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT }); } - function updateTopicTitle() { if($(window).scrollTop() > 50) { $('.header-topic-title').find('span').text(ajaxify.variables.get('topic_name')).show(); @@ -442,6 +441,7 @@ define('forum/topic', dependencies, function(pagination, infinitescroll, threadT }); hidePostToolsForDeletedPosts(); } else { + socket.emit('topics.markAsRead', [tid]); navigator.update(); done(); } diff --git a/src/topics/unread.js b/src/topics/unread.js index 4e8bc509d2..d4628c9c03 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -180,24 +180,45 @@ module.exports = function(Topics) { }); async.parallel({ - markRead: function(next) { - db.sortedSetAdd('uid:' + uid + ':tids_read', scores, tids, next); + topicScores: function(next) { + db.sortedSetScores('topics:recent', tids, next); }, - topicData: function(next) { - Topics.getTopicsFields(tids, ['cid'], next); + userScores: function(next) { + db.sortedSetScores('uid:' + uid + ':tids_read', tids, next); } }, function(err, results) { if (err) { return callback(err); } - var cids = results.topicData.map(function(topic) { - return topic && topic.cid; - }).filter(function(topic, index, array) { - return topic && array.indexOf(topic) === index; + tids = tids.filter(function(tid, index) { + return !results.userScores[index] || results.userScores[index] < results.topicScores[index]; }); - categories.markAsRead(cids, uid, callback); + if (!tids.length) { + return callback(); + } + + async.parallel({ + markRead: function(next) { + db.sortedSetAdd('uid:' + uid + ':tids_read', scores, tids, next); + }, + topicData: function(next) { + Topics.getTopicsFields(tids, ['cid'], next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + + var cids = results.topicData.map(function(topic) { + return topic && topic.cid; + }).filter(function(topic, index, array) { + return topic && array.indexOf(topic) === index; + }); + + categories.markAsRead(cids, uid, callback); + }); }); }; From f463030e76564b4e3382d2388a5e0ff61c2f0c3e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 03:00:24 -0400 Subject: [PATCH 220/264] closes #2264 --- src/categories/recentreplies.js | 55 ++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index d1135f7a1c..7d9cbcc047 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -113,31 +113,50 @@ module.exports = function(Categories) { return; } - var keys = pids.map(function(pid) { - return 'post:' + pid; - }); + var start = 0, + done = false, + batch = 50; - db.getObjectsFields(keys, ['timestamp'], function(err, postData) { - if (err) { - return winston.error(err.message); + async.whilst(function() { + return !done; + }, function(next) { + var movePids = pids.slice(start, start + batch); + if (!movePids.length) { + done = true; + return next(); } - - var timestamps = postData.map(function(post) { - return post && post.timestamp; + var keys = movePids.map(function(pid) { + return 'post:' + pid; }); - async.parallel([ - function(next) { - db.sortedSetRemove('categories:recent_posts:cid:' + oldCid, pids, next); - }, - function(next) { - db.sortedSetAdd('categories:recent_posts:cid:' + cid, timestamps, pids, next); - } - ], function(err) { + db.getObjectsFields(keys, ['timestamp'], function(err, postData) { if (err) { - winston.error(err.message); + return next(err); } + + var timestamps = postData.map(function(post) { + return post && post.timestamp; + }); + + async.parallel([ + function(next) { + db.sortedSetRemove('categories:recent_posts:cid:' + oldCid, movePids, next); + }, + function(next) { + db.sortedSetAdd('categories:recent_posts:cid:' + cid, timestamps, movePids, next); + } + ], function(err) { + if (err) { + return next(err); + } + start += batch; + next(); + }); }); + }, function(err) { + if (err) { + winston.error(err.stack); + } }); }); }; From 08d4d6b5bf8f18366696c9bba603e20cc9b602a9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 14 Oct 2014 11:42:10 -0400 Subject: [PATCH 221/264] changed indentation for continueLogin method in authentication.js --- src/routes/authentication.js | 74 ++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 2378bec052..c405649f66 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -34,50 +34,50 @@ function login(req, res, next) { var continueLogin = function() { - passport.authenticate('local', function(err, userData, info) { - if (err) { - req.flash('error', info); - return res.redirect(nconf.get('relative_path') + '/login'); - } - - if (!userData) { - if (typeof info === 'object') { - info = '[[error:invalid-username-or-password]]'; + passport.authenticate('local', function(err, userData, info) { + if (err) { + req.flash('error', info); + return res.redirect(nconf.get('relative_path') + '/login'); } - req.flash('error', info); - return res.redirect(nconf.get('relative_path') + '/login'); - } + if (!userData) { + if (typeof info === 'object') { + info = '[[error:invalid-username-or-password]]'; + } - // Alter user cookie depending on passed-in option - if (req.body.remember === 'on') { - var duration = 1000*60*60*24*parseInt(meta.config.loginDays || 14, 10); - req.session.cookie.maxAge = duration; - req.session.cookie.expires = new Date(Date.now() + duration); - } else { - req.session.cookie.maxAge = false; - req.session.cookie.expires = false; - } - - req.login({ - uid: userData.uid - }, function() { - if (userData.uid) { - user.logIP(userData.uid, req.ip); - - plugins.fireHook('action:user.loggedIn', userData.uid); + req.flash('error', info); + return res.redirect(nconf.get('relative_path') + '/login'); } - if (!req.session.returnTo) { - res.redirect(nconf.get('relative_path') + '/'); + // Alter user cookie depending on passed-in option + if (req.body.remember === 'on') { + var duration = 1000*60*60*24*parseInt(meta.config.loginDays || 14, 10); + req.session.cookie.maxAge = duration; + req.session.cookie.expires = new Date(Date.now() + duration); } else { - var next = req.session.returnTo; - delete req.session.returnTo; - res.redirect(nconf.get('relative_path') + next); + req.session.cookie.maxAge = false; + req.session.cookie.expires = false; } - }); - })(req, res, next); - }; + + req.login({ + uid: userData.uid + }, function() { + if (userData.uid) { + user.logIP(userData.uid, req.ip); + + plugins.fireHook('action:user.loggedIn', userData.uid); + } + + if (!req.session.returnTo) { + res.redirect(nconf.get('relative_path') + '/'); + } else { + var next = req.session.returnTo; + delete req.session.returnTo; + res.redirect(nconf.get('relative_path') + next); + } + }); + })(req, res, next); + }; if(meta.config.allowLocalLogin !== undefined && parseInt(meta.config.allowLocalLogin, 10) === 0) { return res.status(404).send(''); From b5481ceed20ba0dea65e44426f912503751aec1a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 14 Oct 2014 11:48:16 -0400 Subject: [PATCH 222/264] property fixed #2087 --- public/src/client/login.js | 10 ++++++++++ src/routes/authentication.js | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/public/src/client/login.js b/public/src/client/login.js index c4600c36ac..e7079ddfed 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -33,6 +33,16 @@ define('forum/login', function() { }); $('#content #username').focus(); + + // Add "returnTo" data if present + if (app.previousUrl) { + var returnToEl = document.createElement('input'); + returnToEl.type = 'hidden'; + returnToEl.name = 'returnTo'; + returnToEl.value = app.previousUrl.replace(window.location.origin + RELATIVE_PATH, ''); + $(returnToEl).appendTo(formEl); + console.log('appended'); + } }; return Login; diff --git a/src/routes/authentication.js b/src/routes/authentication.js index c405649f66..edd984bc4b 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -83,6 +83,11 @@ return res.status(404).send(''); } + // Handle returnTo data + if (req.body.hasOwnProperty('returnTo') && !req.session.returnTo) { + req.session.returnTo = req.body.returnTo; + } + if (req.body.username && utils.isEmailValid(req.body.username)) { user.getUsernameByEmail(req.body.username, function(err, username) { if (err) { From 62503c16c6b13559df43cfd18b60655f2a4027fb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 13:29:23 -0400 Subject: [PATCH 223/264] mark category read only if unread --- src/categories.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/categories.js b/src/categories.js index 24b041eeb1..7be6d0a6ef 100644 --- a/src/categories.js +++ b/src/categories.js @@ -248,13 +248,29 @@ var db = require('./database'), }; Categories.markAsRead = function(cids, uid, callback) { + callback = callback || function() {}; if (!Array.isArray(cids) || !cids.length) { return callback(); } var keys = cids.map(function(cid) { return 'cid:' + cid + ':read_by_uid'; }); - db.setsAdd(keys, uid, callback); + + db.isMemberOfSets(keys, uid, function(err, hasRead) { + if (err) { + return callback(err); + } + + keys = keys.filter(function(key, index) { + return !hasRead[index]; + }); + + if (!keys.length) { + return callback(); + } + + db.setsAdd(keys, uid, callback); + }); }; Categories.markAsUnreadForAll = function(cid, callback) { From 0eae679bcdb642274415edac6c777cfec3c086b2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 13:52:47 -0400 Subject: [PATCH 224/264] crash fix if field is undefined --- src/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics.js b/src/topics.js index 3cb6538804..a8aeba052d 100644 --- a/src/topics.js +++ b/src/topics.js @@ -179,7 +179,7 @@ var async = require('async'), Topics.getTopicsData(tids, function(err, topics) { function mapFilter(array, field) { return array.map(function(topic) { - return topic && topic[field].toString(); + return topic && topic[field] && topic[field].toString(); }).filter(function(value, index, array) { return utils.isNumber(value) && array.indexOf(value) === index; }); From 040d7b8424c43319c369c656a3d35e0a16a98adf Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 14:27:45 -0400 Subject: [PATCH 225/264] limit unread to 100 tids --- src/topics/unread.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/topics/unread.js b/src/topics/unread.js index d4628c9c03..271eed8ed7 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -92,6 +92,8 @@ module.exports = function(Topics) { return topic.value; }); + tids = tids.slice(0, 100); + filterTopics(uid, tids, results.ignoredCids, function(err, tids) { if (err) { return callback(err); From 29fcb6c3662819d5e390610b8a17ae234ca60a0b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 17:03:14 -0400 Subject: [PATCH 226/264] fix images in manage/flags and fadeout --- public/src/admin/manage/flags.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/public/src/admin/manage/flags.js b/public/src/admin/manage/flags.js index c6a9a532ce..edea968ae5 100644 --- a/public/src/admin/manage/flags.js +++ b/public/src/admin/manage/flags.js @@ -5,6 +5,7 @@ define('admin/manage/flags', ['forum/infinitescroll', 'admin/modules/selectable' var Flags = {}; Flags.init = function() { + $('.post-container .content img').addClass('img-responsive') handleDismiss(); handleDelete(); handleInfiniteScroll(); @@ -37,11 +38,11 @@ define('admin/manage/flags', ['forum/infinitescroll', 'admin/modules/selectable' return app.alertError(err.messaage); } btn.parent().fadeOut(function() { - btn.remove(); + $(this).remove(); + if (!$('.flags [data-pid]').length) { + $('.post-container').text('No flagged posts!'); + } }); - if (!$('.flags [data-pid]').length) { - $('.post-container').text('No flagged posts!'); - } } function handleInfiniteScroll() { From b65c17c5bc91cde38fd8ae3bef71da70121d8570 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 20:56:52 -0400 Subject: [PATCH 227/264] parseInt score --- src/database/mongo/sorted.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 075cad4fd9..659994f878 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -34,7 +34,7 @@ module.exports = function(db, module) { var bulk = db.collection('objects').initializeUnorderedBulkOp(); for(var i=0; i Date: Tue, 14 Oct 2014 22:18:24 -0400 Subject: [PATCH 228/264] moved updateCounters to purge --- src/topics/delete.js | 172 ++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 99 deletions(-) diff --git a/src/topics/delete.js b/src/topics/delete.js index 0238b123a4..679cb986ca 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -8,6 +8,79 @@ var async = require('async'), module.exports = function(Topics) { + Topics.delete = function(tid, callback) { + async.parallel([ + function(next) { + Topics.setTopicField(tid, 'deleted', 1, next); + }, + function(next) { + Topics.removeRecent(tid, next); + }, + function(next) { + db.sortedSetsRemove(['topics:posts', 'topics:views'], tid, next); + } + ], callback); + }; + + Topics.restore = function(tid, callback) { + Topics.getTopicFields(tid, ['lastposttime', 'postcount', 'viewcount'], function(err, topicData) { + if (err) { + return callback(err); + } + + async.parallel([ + function(next) { + Topics.setTopicField(tid, 'deleted', 0, next); + }, + function(next) { + Topics.updateRecent(tid, topicData.lastposttime, next); + }, + function(next) { + db.sortedSetAdd('topics:posts', topicData.postcount, tid, next); + }, + function(next) { + db.sortedSetAdd('topics:views', topicData.viewcount, tid, next); + } + ], callback); + }); + }; + + Topics.purge = function(tid, callback) { + async.parallel([ + function(next) { + db.deleteAll(['tid:' + tid + ':followers', 'tid:' + tid + ':read_by_uid'], next); + }, + function(next) { + db.sortedSetsRemove(['topics:tid', 'topics:recent', 'topics:posts', 'topics:views'], tid, next); + }, + function(next) { + deleteTopicFromCategoryAndUser(tid, next); + }, + function(next) { + Topics.deleteTopicTags(tid, next); + }, + function(next) { + updateCounters(tid, -1, next); + } + ], function(err) { + if (err) { + return callback(err); + } + plugins.fireHook('action:topic.delete', tid); + db.delete('topic:' + tid, callback); + }); + }; + + function deleteTopicFromCategoryAndUser(tid, callback) { + Topics.getTopicFields(tid, ['cid', 'uid', 'deleted'], function(err, topicData) { + if (err) { + return callback(err); + } + + db.sortedSetsRemove(['categories:' + topicData.cid + ':tid', 'uid:' + topicData.uid + ':topics'], tid, callback); + }); + } + function updateCounters(tid, incr, callback) { async.parallel([ function(next) { @@ -37,103 +110,4 @@ module.exports = function(Topics) { } ], callback); } - - Topics.delete = function(tid, callback) { - async.parallel([ - function(next) { - Topics.setTopicField(tid, 'deleted', 1, next); - }, - function(next) { - Topics.removeRecent(tid, next); - }, - function(next) { - db.sortedSetsRemove(['topics:posts', 'topics:views'], tid, next); - } - ], function(err) { - if (err) { - return callback(err); - } - - updateCounters(tid, -1, callback); - }); - }; - - Topics.restore = function(tid, callback) { - Topics.getTopicFields(tid, ['lastposttime', 'postcount', 'viewcount'], function(err, topicData) { - if(err) { - return callback(err); - } - - async.parallel([ - function(next) { - Topics.setTopicField(tid, 'deleted', 0, next); - }, - function(next) { - Topics.updateRecent(tid, topicData.lastposttime, next); - }, - function(next) { - db.sortedSetAdd('topics:posts', topicData.postcount, tid, next); - }, - function(next) { - db.sortedSetAdd('topics:views', topicData.viewcount, tid, next); - } - ], function(err) { - if (err) { - return callback(err); - } - - updateCounters(tid, 1, callback); - }); - }); - }; - - Topics.purge = function(tid, callback) { - async.parallel([ - function(next) { - db.deleteAll(['tid:' + tid + ':followers', 'tid:' + tid + ':read_by_uid'], next); - }, - function(next) { - db.sortedSetsRemove(['topics:tid', 'topics:recent', 'topics:posts', 'topics:views'], tid, next); - }, - function(next) { - deleteTopicFromCategoryAndUser(tid, next); - }, - function(next) { - Topics.deleteTopicTags(tid, next); - } - ], function(err) { - if (err) { - return callback(err); - } - plugins.fireHook('action:topic.delete', tid); - db.delete('topic:' + tid, callback); - }); - }; - - function deleteTopicFromCategoryAndUser(tid, callback) { - Topics.getTopicFields(tid, ['cid', 'uid', 'deleted'], function(err, topicData) { - if (err) { - return callback(err); - } - - db.sortedSetsRemove(['categories:' + topicData.cid + ':tid', 'uid:' + topicData.uid + ':topics'], tid, function(err) { - if (err) { - return callback(err); - } - - if (parseInt(topicData.deleted, 10) === 0) { - async.parallel([ - function(next) { - db.decrObjectField('category:' + topicData.cid, 'topic_count', next); - }, - function(next) { - db.decrObjectField('global', 'topicCount', next); - } - ], callback); - } else { - callback(); - } - }); - }); - } }; From b1d48df6d8aba1fcac41ede281c15b5a0b6b8001 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 22:51:48 -0400 Subject: [PATCH 229/264] dont modify counts on soft post delete --- src/postTools.js | 85 ++++------------------------ src/posts/delete.js | 128 +++++++++++++++++++++++++++++++++++++------ src/topics/delete.js | 7 ++- 3 files changed, 126 insertions(+), 94 deletions(-) diff --git a/src/postTools.js b/src/postTools.js index cfbd9d504f..009d4bde56 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -141,51 +141,23 @@ var winston = require('winston'), return callback(err); } - posts.setPostField(pid, 'deleted', isDelete ? 1 : 0, function(err) { - if (err) { - return callback(err); - } - - events[isDelete ? 'logPostDelete' : 'logPostRestore'](uid, pid); - - db.incrObjectFieldBy('global', 'postCount', isDelete ? -1 : 1); - - posts.getPostFields(pid, ['pid', 'tid', 'uid', 'content', 'timestamp'], function(err, postData) { + events[isDelete ? 'logPostDelete' : 'logPostRestore'](uid, pid); + if (isDelete) { + posts.delete(pid, callback); + } else { + posts.restore(pid, function(err, postData) { if (err) { return callback(err); } - - if (isDelete) { - plugins.fireHook('action:post.delete', pid); - } else { - plugins.fireHook('action:post.restore', postData); - } - - async.parallel([ - function(next) { - topics[isDelete ? 'decreasePostCount' : 'increasePostCount'](postData.tid, next); - }, - function(next) { - user.incrementUserPostCountBy(postData.uid, isDelete ? -1 : 1, next); - }, - function(next) { - updateTopicTimestamp(postData.tid, next); - }, - function(next) { - addOrRemoveFromCategory(pid, postData.tid, postData.timestamp, isDelete, next); + PostTools.parse(postData.content, function(err, parsed) { + if (err) { + return callback(err); } - ], function(err) { - if (!isDelete) { - PostTools.parse(postData.content, function(err, parsed) { - postData.content = parsed; - callback(err, postData); - }); - return; - } - callback(err, postData); + postData.content = parsed; + callback(null, postData); }); }); - }); + } }); } @@ -199,41 +171,6 @@ var winston = require('winston'), }); }; - function updateTopicTimestamp(tid, callback) { - topics.getLatestUndeletedPid(tid, function(err, pid) { - if(err || !pid) { - return callback(err); - } - - posts.getPostField(pid, 'timestamp', function(err, timestamp) { - if (err) { - return callback(err); - } - - if (timestamp) { - return topics.updateTimestamp(tid, timestamp, callback); - } - callback(); - }); - }); - } - - function addOrRemoveFromCategory(pid, tid, timestamp, isDelete, callback) { - topics.getTopicField(tid, 'cid', function(err, cid) { - if (err) { - return callback(err); - } - - db.incrObjectFieldBy('category:' + cid, 'post_count', isDelete ? -1 : 1); - - if (isDelete) { - db.sortedSetRemove('categories:recent_posts:cid:' + cid, pid, callback); - } else { - db.sortedSetAdd('categories:recent_posts:cid:' + cid, timestamp, pid, callback); - } - }); - } - PostTools.parse = function(raw, callback) { parse('filter:post.parse', raw, callback); }; diff --git a/src/posts/delete.js b/src/posts/delete.js index dfcff4dc35..744d5ee0d0 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -3,10 +3,105 @@ var async = require('async'), db = require('../database'), topics = require('../topics'), + user = require('../user'), plugins = require('../plugins'); module.exports = function(Posts) { + + Posts.delete = function(pid, callback) { + Posts.setPostField(pid, 'deleted', 1, function(err) { + if (err) { + return callback(err); + } + + Posts.getPostFields(pid, ['pid', 'tid', 'uid', 'timestamp'], function(err, postData) { + if (err) { + return callback(err); + } + + plugins.fireHook('action:post.delete', pid); + + async.parallel([ + function(next) { + updateTopicTimestamp(postData.tid, next); + }, + function(next) { + removeFromCategoryRecentPosts(pid, postData.tid, next); + } + ], function(err) { + callback(err, postData); + }); + }); + }); + }; + + Posts.restore = function(pid, callback) { + Posts.setPostField(pid, 'deleted', 0, function(err) { + if (err) { + return callback(err); + } + + Posts.getPostFields(pid, ['pid', 'tid', 'uid', 'content', 'timestamp'], function(err, postData) { + if (err) { + return callback(err); + } + + plugins.fireHook('action:post.restore', postData); + + async.parallel([ + function(next) { + updateTopicTimestamp(postData.tid, next); + }, + function(next) { + addToCategoryRecentPosts(pid, postData.tid, postData.timestamp, next); + } + ], function(err) { + callback(err, postData); + }); + }); + }); + }; + + function updateTopicTimestamp(tid, callback) { + topics.getLatestUndeletedPid(tid, function(err, pid) { + if(err || !pid) { + return callback(err); + } + + Posts.getPostField(pid, 'timestamp', function(err, timestamp) { + if (err) { + return callback(err); + } + + if (timestamp) { + return topics.updateTimestamp(tid, timestamp, callback); + } + callback(); + }); + }); + } + + function removeFromCategoryRecentPosts(pid, tid, callback) { + topics.getTopicField(tid, 'cid', function(err, cid) { + if (err) { + return callback(err); + } + + db.sortedSetRemove('categories:recent_posts:cid:' + cid, pid, callback); + }); + } + + function addToCategoryRecentPosts(pid, tid, timestamp, callback) { + topics.getTopicField(tid, 'cid', function(err, cid) { + if (err) { + return callback(err); + } + + db.sortedSetAdd('categories:recent_posts:cid:' + cid, timestamp, pid, callback); + }); + } + Posts.purge = function(pid, callback) { async.parallel([ function(next) { @@ -23,7 +118,7 @@ module.exports = function(Posts) { }, function(next) { db.sortedSetRemove('posts:pid', pid, next); - } + }, ], function(err) { if (err) { return callback(err); @@ -35,7 +130,7 @@ module.exports = function(Posts) { }; function deletePostFromTopicAndUser(pid, callback) { - Posts.getPostFields(pid, ['tid', 'uid', 'deleted'], function(err, postData) { + Posts.getPostFields(pid, ['tid', 'uid'], function(err, postData) { if (err) { return callback(err); } @@ -54,21 +149,20 @@ module.exports = function(Posts) { return callback(err); } - if (parseInt(postData.deleted, 10) === 0 && parseInt(topicData.deleted, 10) !== 1) { - async.parallel([ - function (next) { - db.decrObjectField('global', 'postCount', next); - }, - function (next) { - db.decrObjectField('category:' + topicData.cid, 'post_count', next); - }, - function (next) { - db.decrObjectField('topic:' + postData.tid, 'postcount', next); - } - ], callback); - } else { - callback(); - } + async.parallel([ + function (next) { + db.decrObjectField('global', 'postCount', next); + }, + function (next) { + db.decrObjectField('category:' + topicData.cid, 'post_count', next); + }, + function (next) { + topics.decreasePostCount(postData.tid, next); + }, + function(next) { + user.incrementUserPostCountBy(postData.uid, -1, next); + }, + ], callback); }); }); }); diff --git a/src/topics/delete.js b/src/topics/delete.js index 679cb986ca..8daec210be 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -60,7 +60,7 @@ module.exports = function(Topics) { Topics.deleteTopicTags(tid, next); }, function(next) { - updateCounters(tid, -1, next); + reduceCounters(tid, next); } ], function(err) { if (err) { @@ -72,7 +72,7 @@ module.exports = function(Topics) { }; function deleteTopicFromCategoryAndUser(tid, callback) { - Topics.getTopicFields(tid, ['cid', 'uid', 'deleted'], function(err, topicData) { + Topics.getTopicFields(tid, ['cid', 'uid'], function(err, topicData) { if (err) { return callback(err); } @@ -81,7 +81,8 @@ module.exports = function(Topics) { }); } - function updateCounters(tid, incr, callback) { + function reduceCounters(tid, callback) { + var incr = -1; async.parallel([ function(next) { db.incrObjectFieldBy('global', 'topicCount', incr, next); From 09bd42b9f68bfb66998456890c5e5f3789a35613 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 22:52:41 -0400 Subject: [PATCH 230/264] removed deleted --- src/posts/delete.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/posts/delete.js b/src/posts/delete.js index 744d5ee0d0..5b2e828abf 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -8,7 +8,6 @@ var async = require('async'), module.exports = function(Posts) { - Posts.delete = function(pid, callback) { Posts.setPostField(pid, 'deleted', 1, function(err) { if (err) { @@ -144,7 +143,7 @@ module.exports = function(Posts) { return callback(err); } - topics.getTopicFields(postData.tid, ['cid', 'deleted'], function(err, topicData) { + topics.getTopicFields(postData.tid, ['cid'], function(err, topicData) { if (err) { return callback(err); } From 761f56aeb17a37561a9a758290d085afa852a634 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 23:12:47 -0400 Subject: [PATCH 231/264] removed most of the db.sortedSetCards --- public/src/client/category.js | 4 ++-- src/categories.js | 6 +++--- src/controllers/users.js | 2 +- src/middleware/middleware.js | 2 +- src/socket.io/categories.js | 4 ---- src/topics.js | 21 ++++++++++++++------- src/topics/posts.js | 2 +- src/user/notifications.js | 4 +++- 8 files changed, 25 insertions(+), 20 deletions(-) diff --git a/public/src/client/category.js b/public/src/client/category.js index 1cc0a9fa02..a40781e642 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -73,7 +73,7 @@ define('forum/category', ['composer', 'forum/pagination', 'forum/infinitescroll' }; Category.toBottom = function() { - socket.emit('categories.lastTopicIndex', ajaxify.variables.get('category_id'), function(err, index) { + socket.emit('categories.getTopicCount', ajaxify.variables.get('category_id'), function(err, index) { navigator.scrollBottom(index); }); }; @@ -180,7 +180,7 @@ define('forum/category', ['composer', 'forum/pagination', 'forum/infinitescroll' Category.onNewTopic = function(topic) { $(window).trigger('filter:categories.new_topic', topic); - + templates.parse('category', 'topics', { privileges: {editable: !!$('.thread-tools').length}, topics: [topic] diff --git a/src/categories.js b/src/categories.js index 7be6d0a6ef..9f7c877bd7 100644 --- a/src/categories.js +++ b/src/categories.js @@ -167,8 +167,8 @@ var db = require('./database'), }; Categories.getPageCount = function(cid, uid, callback) { - db.sortedSetCard('categories:' + cid + ':tid', function(err, topicCount) { - if(err) { + Catgories.getCategoryField(cid, 'topic_count', function(err, topicCount) { + if (err) { return callback(err); } @@ -177,7 +177,7 @@ var db = require('./database'), } user.getSettings(uid, function(err, settings) { - if(err) { + if (err) { return callback(err); } diff --git a/src/controllers/users.js b/src/controllers/users.js index bdc3fceb70..84fde728fd 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -63,7 +63,7 @@ function getUsers(set, res, next) { user.getUsersFromSet(set, 0, 49, next); }, count: function(next) { - db.sortedSetCard(set, next); + db.getObjectField('global', 'userCount', next); } }, function(err, results) { if (err) { diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 599689e647..fb0ad3937e 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -128,7 +128,7 @@ middleware.addSlug = function(req, res, next) { }; middleware.checkTopicIndex = function(req, res, next) { - db.sortedSetCard('categories:' + req.params.category_id + ':tid', function(err, topicCount) { + categories.getCategoryField(req.params.category_id, 'topic_count', function(err, topicCount) { if (err) { return next(err); } diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index d92f18ca19..e1bb838dd7 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -71,10 +71,6 @@ SocketCategories.getTopicCount = function(socket, cid, callback) { categories.getCategoryField(cid, 'topic_count', callback); }; -SocketCategories.lastTopicIndex = function(socket, cid, callback) { - db.sortedSetCard('categories:' + cid + ':tid', callback); -}; - SocketCategories.getUsersInCategory = function(socket, cid, callback) { var uids = websockets.getUidsInRoom('category_' + cid); user.getMultipleUserFields(uids, ['uid', 'userslug', 'username', 'picture'], callback); diff --git a/src/topics.js b/src/topics.js index a8aeba052d..4f011c937c 100644 --- a/src/topics.js +++ b/src/topics.js @@ -77,11 +77,11 @@ var async = require('async'), }; Topics.getPageCount = function(tid, uid, callback) { - db.sortedSetCard('tid:' + tid + ':posts', function(err, postCount) { - if(err) { + Topics.getTopicField(tid, 'postcount', function(err, postCount) { + if (err) { return callback(err); } - if(!parseInt(postCount, 10)) { + if (!parseInt(postCount, 10)) { return callback(null, 1); } user.getSettings(uid, function(err, settings) { @@ -346,15 +346,22 @@ var async = require('async'), }; Topics.getTeasers = function(tids, uid, callback) { - if(!Array.isArray(tids) || !tids.length) { + if (!Array.isArray(tids) || !tids.length) { return callback(null, []); } async.parallel({ counts: function(next) { - async.map(tids, function(tid, next) { - db.sortedSetCard('tid:' + tid + ':posts', next); - }, next); + Topics.getTopicsFields(tids, ['postcount'], function(err, topics) { + if (err) { + return next(err); + } + topics = topics.map(function(topic) { + return topic && topic.postcount; + }); + + next(null, topics); + }); }, pids: function(next) { async.map(tids, function(tid, next) { diff --git a/src/topics/posts.js b/src/topics/posts.js index ee769add0e..67ceefe4c2 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -263,7 +263,7 @@ module.exports = function(Topics) { }; Topics.getPostCount = function(tid, callback) { - db.sortedSetCard('tid:' + tid + ':posts', callback); + db.getObjectField('topic:' + tid, 'postcount', callback); }; }; diff --git a/src/user/notifications.js b/src/user/notifications.js index 731ff99da8..0981c65f1f 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -214,7 +214,9 @@ var async = require('async'), if (!parseInt(uid, 10)) { return callback(null, 0); } - db.sortedSetCard('uid:' + uid + ':notifications:unread', callback); + db.getSortedSetRange('uid:' + uid + ':notifications:unread', 0, 20, function(err, nids) { + callback(err, Array.isArray(nids) ? nids.length : 0); + }); }; UserNotifications.getUnreadByField = function(uid, field, value, callback) { From ffbefda5f7bb900318bfe5eba12782b8e07adaff Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 23:35:11 -0400 Subject: [PATCH 232/264] #2265 upgrade script --- src/upgrade.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/upgrade.js b/src/upgrade.js index 32781d8ec9..4a46ecaf0f 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -19,7 +19,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2014, 9, 3); + latestSchema = Date.UTC(2014, 9, 14); Upgrade.check = function(callback) { db.get('schemaDate', function(err, value) { @@ -1083,6 +1083,68 @@ Upgrade.upgrade = function(callback) { winston.info('[2014/10/7] Banned users sorted set skipped'); next(); } + }, + function(next) { + function updateCategories(next) { + db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) { + if (err) { + return next(err); + } + + async.eachLimit(cids, 5, function(cid, next) { + db.sortedSetCard('categories:' + cid + ':tid', function(err, count) { + if (err) { + return next(err); + } + count = parseInt(count, 10) || 0; + db.setObjectField('category:' + cid, 'topic_count', count, next); + }); + }, next); + }); + } + + function updateTopics(next) { + db.getSortedSetRange('topics:tid', 0, -1, function(err, tids) { + if (err) { + return next(err); + } + + async.eachLimit(tids, 50, function(tid, next) { + db.sortedSetCard('tid:' + tid + ':posts', function(err, count) { + if (err) { + return next(err); + } + count = parseInt(count, 10) || 0; + winston.info('updating tid ' + tid + ' count ' + count); + db.setObjectField('topic:' + tid, 'postcount', count, next); + }); + }, next); + }); + } + + thisSchemaDate = Date.UTC(2014, 9, 14); + if (schemaDate < thisSchemaDate || 1) { + winston.info('[2014/10/14] Topic post count migration'); + + async.series([ + function(next) { + updateCategories(next); + }, + function(next) { + updateTopics(next); + } + ], function(err) { + if (err) { + winston.error('[2014/10/14] Error encountered while Topic post count migration'); + return next(err); + } + winston.info('[2014/10/14] Topic post count migration done'); + Upgrade.update(thisSchemaDate, next); + }); + } else { + winston.info('[2014/10/14] Topic post count migration skipped'); + next(); + } } // Add new schema updates here // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 22!!! From 4b1adba9ec9a3428394e8d920f1ae0349044682e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 23:35:32 -0400 Subject: [PATCH 233/264] removed || 1 --- src/upgrade.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrade.js b/src/upgrade.js index 4a46ecaf0f..606dcf722f 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -1123,7 +1123,7 @@ Upgrade.upgrade = function(callback) { } thisSchemaDate = Date.UTC(2014, 9, 14); - if (schemaDate < thisSchemaDate || 1) { + if (schemaDate < thisSchemaDate) { winston.info('[2014/10/14] Topic post count migration'); async.series([ From 8471fcbd79aa7357b54d1d30e7377f4009284ad8 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 23:36:59 -0400 Subject: [PATCH 234/264] fixed typo --- src/categories.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/categories.js b/src/categories.js index 9f7c877bd7..797a3cc823 100644 --- a/src/categories.js +++ b/src/categories.js @@ -167,7 +167,7 @@ var db = require('./database'), }; Categories.getPageCount = function(cid, uid, callback) { - Catgories.getCategoryField(cid, 'topic_count', function(err, topicCount) { + Categories.getCategoryField(cid, 'topic_count', function(err, topicCount) { if (err) { return callback(err); } From b3e83d2f9a5dd254ce20bfac1791782e31fbc481 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 23:41:58 -0400 Subject: [PATCH 235/264] update post count on purge --- public/src/client/topic/events.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 9b9093c09b..75da62dfb9 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -109,7 +109,7 @@ define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', ' if (data.tags && data.tags.length !== $('.tags').first().children().length) { templates.parse('partials/post_bar', 'tags', {tags: data.tags}, function(html) { var tags = $('.tags'); - + tags.fadeOut(250, function() { tags.html(html).fadeIn(250); }); @@ -120,6 +120,7 @@ define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', ' function onPostPurged(pid) { $('#post-container li[data-pid="' + pid + '"]').fadeOut(500, function() { $(this).remove(); + postTools.updatePostCount(); }); } @@ -141,8 +142,6 @@ define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', ' postEl.find('.post-content').html(data.content); } } - - postTools.updatePostCount(); } function togglePostFavourite(data) { From f318f2f815fb804d46c4b6b5c6bdda46bbedb973 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Oct 2014 23:57:27 -0400 Subject: [PATCH 236/264] move out update, should work even if post isnt in dom --- public/src/client/topic/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 75da62dfb9..29e2309ce9 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -120,8 +120,8 @@ define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', ' function onPostPurged(pid) { $('#post-container li[data-pid="' + pid + '"]').fadeOut(500, function() { $(this).remove(); - postTools.updatePostCount(); }); + postTools.updatePostCount(); } function togglePostDeleteState(data) { From 72a919e416d3ccc8137eb02f6e4fe148d1a3d8ff Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 14:49:11 -0400 Subject: [PATCH 237/264] time based check --- src/messaging.js | 77 ---------------------------------------- src/notifications.js | 13 ++++--- src/socket.io/modules.js | 20 +++++------ 3 files changed, 17 insertions(+), 93 deletions(-) diff --git a/src/messaging.js b/src/messaging.js index 75c9e91896..95ff03c9aa 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -48,7 +48,6 @@ var db = require('./database'), } async.parallel([ - async.apply(addToRecent, fromuid, message), async.apply(db.sortedSetAdd, 'messages:uid:' + uids[0] + ':to:' + uids[1], timestamp, mid), async.apply(Messaging.updateChatTime, fromuid, touid), async.apply(Messaging.updateChatTime, touid, fromuid), @@ -78,16 +77,6 @@ var db = require('./database'), }); }; - function addToRecent(fromuid, message, callback) { - db.listPrepend('messages:recent:' + fromuid, message.content, function(err) { - if (err) { - return callback(err); - } - - db.listTrim('messages:recent:' + fromuid, 0, 9, callback); - }); - } - Messaging.getMessages = function(fromuid, touid, since, isNew, callback) { var uids = sortUids(fromuid, touid); @@ -277,72 +266,6 @@ var db = require('./database'), db.sortedSetAdd('uid:' + uid + ':chats:unread', Date.now(), toUid, callback); }; - /* - todo #1798 -- this utility method creates a room name given an array of uids. - - Messaging.uidsToRoom = function(uids, callback) { - uid = parseInt(uid, 10); - if (typeof uid === 'number' && Array.isArray(roomUids)) { - var room = 'chat_'; - - room = room + roomUids.map(function(uid) { - return parseInt(uid, 10); - }).sort(function(a, b) { - return a-b; - }).join('_'); - - callback(null, room); - } else { - callback(new Error('invalid-uid-or-participant-uids')); - } - };*/ - - Messaging.verifySpammer = function(uid, callback) { - var messagesToCompare = 10; - - db.getListRange('messages:recent:' + uid, 0, messagesToCompare - 1, function(err, msgs) { - var total = 0; - - for (var i = 0, ii = msgs.length - 1; i < ii; ++i) { - total += areTooSimilar(msgs[i], msgs[i+1]) ? 1 : 0; - } - - var isSpammer = total === messagesToCompare - 1; - if (isSpammer) { - db.delete('messages:recent:' + uid); - } - - callback(err, isSpammer); - }); - }; - - // modified from http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance - function areTooSimilar(a, b) { - var matrix = []; - - for(var i = 0; i <= b.length; i++){ - matrix[i] = [i]; - } - - for(var j = 0; j <= a.length; j++){ - matrix[0][j] = j; - } - - for(i = 1; i <= b.length; i++){ - for(j = 1; j <= a.length; j++){ - if(b.charAt(i-1) === a.charAt(j-1)){ - matrix[i][j] = matrix[i-1][j-1]; - } else { - matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, - Math.min(matrix[i][j-1] + 1, - matrix[i-1][j] + 1)); - } - } - } - - return (matrix[b.length][a.length] / b.length < 0.1); - } - Messaging.notifyUser = function(fromuid, touid, messageObj) { var queueObj = Messaging.notifyQueue[fromuid + ':' + touid]; if (queueObj) { diff --git a/src/notifications.js b/src/notifications.js index 3d8aeb66dc..31663bd0e3 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -143,22 +143,25 @@ var async = require('async'), readKeys.push('uid:' + uid + ':notifications:read'); }); - async.parallel([ + var oneWeekAgo = Date.now() - 604800000; + async.series([ function(next) { db.sortedSetsAdd(unreadKeys, notification.datetime, notification.nid, next); }, function(next) { db.sortedSetsRemove(readKeys, notification.nid, next); + }, + function(next) { + db.sortedSetsRemoveRangeByScore(unreadKeys, 0, oneWeekAgo, next); + }, + function(next) { + db.sortedSetsRemoveRangeByScore(readKeys, 0, oneWeekAgo, next); } ], function(err) { if (err) { return callback(err); } - var oneWeekAgo = Date.now() - 604800000; - db.sortedSetsRemoveRangeByScore(unreadKeys, 0, oneWeekAgo); - db.sortedSetsRemoveRangeByScore(readKeys, 0, oneWeekAgo); - plugins.fireHook('action:notification.pushed', {notification: notification, uids: uids}); callback(); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index b0dc4e8a7c..02d48ac959 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -179,19 +179,17 @@ SocketModules.chats.send = function(socket, data, callback) { return; } - Messaging.verifySpammer(socket.uid, function(err, isSpammer) { - if (!err && isSpammer) { - - server.in('uid_' + socket.uid).emit('event:banned'); - - // We're just logging them out, so a "temporary ban" to prevent abuse. Revisit once we implement a way to temporarily ban users - server.logoutUser(socket.uid); - return callback(); - } - }); - var msg = S(data.message).stripTags().s; + var now = Date.now(); + socket.lastChatMessageTime = socket.lastChatMessageTime || 0; + + if (now - socket.lastChatMessageTime < 200) { + return callback(new Error('[[error:too-many-messages]]')); + } + + socket.lastChatMessageTime = now; + user.getUserField(socket.uid, 'banned', function(err, banned) { if (err) { return callback(err); From 1be6a253bf189dc24721047aa423a9d0e4549116 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 15:07:30 -0400 Subject: [PATCH 238/264] make _key value index unique --- src/database/mongo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 253fd78fbe..9862d86571 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -112,7 +112,7 @@ } }); - db.collection('objects').ensureIndex({_key :1, value: -1}, {background:true}, function(err) { + db.collection('objects').ensureIndex({_key :1, value: -1}, {background:true, unique: true}, function(err) { if(err) { winston.error('Error creating index ' + err.message); } From f2883c2c9f9087a17bcad87645e232ace9d76169 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 15:11:01 -0400 Subject: [PATCH 239/264] createIndex helper --- src/database/mongo.js | 43 ++++++++++++++----------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 9862d86571..7b1d80f7f0 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -106,40 +106,25 @@ } function createIndices() { - db.collection('objects').ensureIndex({_key :1, score: -1}, {background:true}, function(err) { - if(err) { - winston.error('Error creating index ' + err.message); - } - }); + createIndex('objects', {_key: 1, score: -1}, {background:true}); + createIndex('objects', {_key: 1, value: -1}, {background:true, unique: true}); + createIndex('objects', {expireAt: 1}, {expireAfterSeconds:0, background:true}); - db.collection('objects').ensureIndex({_key :1, value: -1}, {background:true, unique: true}, function(err) { - if(err) { - winston.error('Error creating index ' + err.message); - } - }); + createIndex('search', {content:'text'}, {background:true}); + createIndex('search', {key: 1, id: 1}, {background:true}); - db.collection('objects').ensureIndex({'expireAt':1}, {expireAfterSeconds:0, background:true}, function(err) { - if(err) { - winston.error('Error creating index ' + err.message); - } - }); - - db.collection('search').ensureIndex({content:'text'}, {background:true}, function(err) { - if(err) { - winston.error('Error creating index ' + err.message); - } - }); - - db.collection('search').ensureIndex({key: 1, id: 1}, {background: true}, function(err) { - if(err) { - winston.error('Error creating index ' + err.message); - } - }); - - if(typeof callback === 'function') { + if (typeof callback === 'function') { callback(); } } + + function createIndex(collection, index, options) { + db.collection(collection).ensureIndex(index, options, function(err) { + if (err) { + winston.error('Error creating index ' + err.message); + } + }); + } }); }; From 90224d2de38e1490a075b797b5c950f34d2d4255 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 15:25:51 -0400 Subject: [PATCH 240/264] removed unique for now --- src/database/mongo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 7b1d80f7f0..0a5c5db6ef 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -107,7 +107,7 @@ function createIndices() { createIndex('objects', {_key: 1, score: -1}, {background:true}); - createIndex('objects', {_key: 1, value: -1}, {background:true, unique: true}); + createIndex('objects', {_key: 1, value: -1}, {background:true}); createIndex('objects', {expireAt: 1}, {expireAfterSeconds:0, background:true}); createIndex('search', {content:'text'}, {background:true}); From 80489c6564f2a17da4c04006822581e92953591d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 15:57:37 -0400 Subject: [PATCH 241/264] log post purges --- src/events.js | 4 ++++ src/postTools.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/events.js b/src/events.js index 37e43f3d01..d24c6aec4f 100644 --- a/src/events.js +++ b/src/events.js @@ -62,6 +62,10 @@ var fs = require('fs'), events.logWithUser(uid, 'restored post (pid ' + pid + ')'); }; + events.logPostPurge = function(uid, pid) { + events.logWithUser(uid, 'purged post (pid ' + pid + ')'); + }; + events.logTopicMove = function(uid, tid) { events.logWithUser(uid, 'moved topic (tid ' + tid + ')'); }; diff --git a/src/postTools.js b/src/postTools.js index 009d4bde56..4e6206ac34 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -166,7 +166,7 @@ var winston = require('winston'), if (err || !canEdit) { return callback(err || new Error('[[error:no-privileges]]')); } - + events.logPostPurge(uid, pid); posts.purge(pid, callback); }); }; From 834c4f8ff019b570dca48cb54aa09776ab43ac9a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 16:19:27 -0400 Subject: [PATCH 242/264] log stack --- app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index ac339fedc3..3b02134831 100644 --- a/app.js +++ b/app.js @@ -171,9 +171,9 @@ function start() { break; } }); - + process.on('uncaughtException', function(err) { - winston.error(err.message); + winston.error(err.stack); console.log(err.stack); meta.js.killMinifier(); From eb546dfaab042680a9ce34d6e5f4e8882bc2ce15 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 16:26:50 -0400 Subject: [PATCH 243/264] temp until package manager is in place --- src/plugins.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins.js b/src/plugins.js index df03b776cf..ef8078b5c1 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -660,8 +660,8 @@ var fs = require('fs'), pluginMap[plugin.name].version = plugin.version; getVersion(plugin.id, function(err, version) { - pluginMap[plugin.name].latest = version; - pluginMap[plugin.name].outdated = version !== pluginMap[plugin.name].version; + pluginMap[plugin.name].latest = version || plugin.version; + pluginMap[plugin.name].outdated = pluginMap[plugin.name].latest !== pluginMap[plugin.name].version; next(); }); }, function(err) { @@ -697,10 +697,10 @@ var fs = require('fs'), npm.load({}, function() { npm.commands.show([name, 'version'], true, function(err, version) { if (err || !version) { - return callback(null, 'no version'); + return callback(); } var obj = Object.keys(version); - callback(null, Array.isArray(obj) && obj.length ? obj[0] : 'no version'); + callback(null, Array.isArray(obj) && obj.length ? obj[0] : null); }); }); } From 9e8be432b32a4f0caedc9f58954a633f2e8fd3ae Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 15 Oct 2014 21:55:31 -0400 Subject: [PATCH 244/264] notification changes -only send a notification when the person you follow creates a topic -you still get a notification per post if you are following a topic -changed notifications.push so that it sends the notifications over a period of time, currently to 50 users per second -optimized topics.notifyFollowers and user.notifications.sendTopicNotification, they no longer query the database for the topic and post data instead they get it as params -you can no longer follow yourself :) -changed mongo sortedSetRemove so that it doesn't use $in if there is only a single value to remove --- public/language/en_GB/notifications.json | 1 + src/database/mongo/sorted.js | 17 +++++--- src/notifications.js | 55 +++++++++++++++++++++--- src/topics/create.js | 8 ++-- src/topics/follow.js | 41 ++++++------------ src/user/follow.js | 8 ++++ src/user/notifications.js | 54 ++++++----------------- 7 files changed, 98 insertions(+), 86 deletions(-) diff --git a/public/language/en_GB/notifications.json b/public/language/en_GB/notifications.json index 6e35eac76a..54c926a597 100644 --- a/public/language/en_GB/notifications.json +++ b/public/language/en_GB/notifications.json @@ -18,6 +18,7 @@ "favourited_your_post_in": "%1 has favourited your post in %2.", "user_flagged_post_in": "%1 flagged a post in %2", "user_posted_to" : "%1 has posted a reply to: %2", + "user_posted_topic": "%1 has posted a new topic: %2", "user_mentioned_you_in": "%1 mentioned you in %2", "user_started_following_you": "%1 started following you.", diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 659994f878..71a30e8275 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -61,18 +61,21 @@ module.exports = function(db, module) { }; module.sortedSetRemove = function(key, value, callback) { + function done(err) { + callback(err); + } callback = callback || helpers.noop; if (!key) { return callback(); } - if (!Array.isArray(value)) { - value = [value]; - } - value = value.map(helpers.valueToString); - db.collection('objects').remove({_key: key, value: {$in: value}}, function(err) { - callback(err); - }); + if (Array.isArray(value)) { + value = value.map(helpers.valueToString); + db.collection('objects').remove({_key: key, value: {$in: value}}, done); + } else { + value = helpers.valueToString(value); + db.collection('objects').remove({_key: key, value: value}, done); + } }; module.sortedSetsRemove = function(keys, value, callback) { diff --git a/src/notifications.js b/src/notifications.js index 31663bd0e3..3ea7e0dd18 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -128,17 +128,58 @@ var async = require('async'), return callback(); } - var websockets = require('./socket.io'); if (!Array.isArray(uids)) { uids = [uids]; } + uids = uids.filter(function(uid) { + return parseInt(uid, 10); + }); + + if (!uids.length) { + return callback(); + } + + var done = false; + var start = 0; + var batchSize = 50; + + setTimeout(function() { + async.whilst( + function() { + return !done; + }, + function(next) { + var currentUids = uids.slice(start, start + batchSize); + if (!currentUids.length) { + done = true; + return next(); + } + pushToUids(currentUids, notification, function(err) { + if (err) { + return next(err); + } + start = start + batchSize; + + setTimeout(next, 1000); + }); + }, + function(err) { + if (err) { + winston.error(err.stack); + } + } + ); + }, 1000); + + callback(); + }; + + function pushToUids(uids, notification, callback) { var unreadKeys = []; var readKeys = []; - uids.filter(function(uid) { - return parseInt(uid, 10); - }).forEach(function(uid) { + uids.forEach(function(uid) { unreadKeys.push('uid:' + uid + ':notifications:unread'); readKeys.push('uid:' + uid + ':notifications:read'); }); @@ -163,13 +204,15 @@ var async = require('async'), } plugins.fireHook('action:notification.pushed', {notification: notification, uids: uids}); - callback(); + var websockets = require('./socket.io'); for(var i=0; i Date: Thu, 16 Oct 2014 02:02:16 -0400 Subject: [PATCH 245/264] set key as well not sure if this fixes dupe keys --- src/database/mongo/hash.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index 43460f421c..0766989a2c 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -10,7 +10,7 @@ module.exports = function(db, module) { if (!key) { return callback(); } - + data._key = key; db.collection('objects').update({_key: key}, {$set: data}, {upsert: true, w: 1}, function(err) { callback(err); }); From 762b2fff370fc0347fb1b646036433d872cbd284 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 16 Oct 2014 18:04:04 -0400 Subject: [PATCH 246/264] display user count in browsing --- public/src/client/topic/browsing.js | 29 +++++++++++++++++++++++++++-- src/socket.io/index.js | 22 +++++++++++++--------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index d2cebbcf14..ad8e4e9129 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -10,9 +10,12 @@ define('forum/topic/browsing', function() { Browsing.onUpdateUsersInRoom = function(data) { if(data && data.room.indexOf('topic_' + ajaxify.variables.get('topic_id')) !== -1) { + $('.browsing-users').toggleClass('hidden', !data.users.length); for(var i=0; i Date: Thu, 16 Oct 2014 20:03:22 -0400 Subject: [PATCH 247/264] removed this wasn't the problem after all --- src/database/mongo/hash.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index 0766989a2c..43460f421c 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -10,7 +10,7 @@ module.exports = function(db, module) { if (!key) { return callback(); } - data._key = key; + db.collection('objects').update({_key: key}, {$set: data}, {upsert: true, w: 1}, function(err) { callback(err); }); From 3ba4d2aa2bb227503c2bfb1b0e9bdfafbc312c6c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 01:11:55 -0400 Subject: [PATCH 248/264] get correct count only from one of the active users elements --- public/src/client/topic/browsing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index ad8e4e9129..3d84dfc577 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -23,7 +23,7 @@ define('forum/topic/browsing', function() { Browsing.onUserEnter = function(data) { var activeEl = $('.thread_active_users'); var user = activeEl.find('a[data-uid="' + data.uid + '"]'); - if (!user.length && activeEl.children().length < 10) { + if (!user.length && activeEl.first().children().length < 10) { addUserIcon(data); } else if (user.length) { user.attr('data-count', parseInt(user.attr('data-count'), 10) + 1); From 59b3e6f78fdcdb4dfbded9d65dfd58e08c0a6355 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 17 Oct 2014 01:42:55 -0400 Subject: [PATCH 249/264] reverting #2259 temporarily until we figure out why logs aren't showing up --- app.js | 32 ++++++++++++-------------- loader.js | 69 +++++++++++++++++-------------------------------------- 2 files changed, 36 insertions(+), 65 deletions(-) diff --git a/app.js b/app.js index 3b02134831..441b3846e2 100644 --- a/app.js +++ b/app.js @@ -58,13 +58,11 @@ if(os.platform() === 'linux') { }); } -if (!cluster.isWorker) { - // If run using `node app`, log GNU copyright info along with server info - winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); - winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); - winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); - winston.info(''); -} +// Log GNU copyright info along with server info +winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); +winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); +winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); +winston.info(''); // Alternate configuration file support var configFile = path.join(__dirname, '/config.json'), @@ -104,20 +102,20 @@ function loadConfig() { } function start() { + loadConfig(); - if (!cluster.isWorker) { - winston.info('Time: ' + new Date()); - winston.info('Initializing NodeBB v' + pkg.version); - winston.info('* using configuration stored in: ' + configFile); - } + winston.info('Time: ' + new Date()); + winston.info('Initializing NodeBB v' + pkg.version); + winston.info('* using configuration stored in: ' + configFile); + var host = nconf.get(nconf.get('database') + ':host'), + storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; - if (cluster.isWorker && process.env.cluster_setup === 'true') { - var host = nconf.get(nconf.get('database') + ':host'), - storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; + winston.info('* using ' + nconf.get('database') +' store ' + storeLocation); + winston.info('* using themes stored in: ' + nconf.get('themes_path')); - winston.info('* using ' + nconf.get('database') +' store ' + storeLocation); - winston.info('* using themes stored in: ' + nconf.get('themes_path')); + if (process.env.NODE_ENV === 'development') { + winston.info('Base Configuration OK.'); } require('./src/database').init(function(err) { diff --git a/loader.js b/loader.js index 7e63804175..c1603278fe 100644 --- a/loader.js +++ b/loader.js @@ -6,14 +6,10 @@ var nconf = require('nconf'), cluster = require('cluster'), async = require('async'), logrotate = require('logrotate-stream'), - - pkg = require('./package.json'), - pidFilePath = __dirname + '/pidfile', output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), silent = process.env.NODE_ENV !== 'development' ? true : false, - numProcs, - + numCPUs, Loader = { timesStarted: 0, shutdown_queue: [], @@ -27,7 +23,7 @@ var nconf = require('nconf'), } }; -Loader.init = function(callback) { +Loader.init = function() { cluster.setupMaster({ exec: "app.js", silent: silent @@ -40,20 +36,6 @@ Loader.init = function(callback) { }; } - process.on('SIGHUP', Loader.restart); - callback(); -}; - -Loader.displayStartupMessages = function(callback) { - console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); - console.log('This program comes with ABSOLUTELY NO WARRANTY.'); - console.log('This is free software, and you are welcome to redistribute it under certain conditions.'); - console.log('For the full license, please visit: http://www.gnu.org/copyleft/gpl.html'); - console.log(''); - callback(); -}; - -Loader.addClusterEvents = function(callback) { cluster.on('fork', function(worker) { worker.on('message', function(message) { if (message && typeof message === 'object' && message.action) { @@ -133,7 +115,7 @@ Loader.addClusterEvents = function(callback) { case 'user:connect': case 'user:disconnect': case 'config:update': - Loader.notifyWorkers(message); + notifyWorkers(message); break; } } @@ -144,9 +126,15 @@ Loader.addClusterEvents = function(callback) { console.log('[cluster] Child Process (' + worker.process.pid + ') listening for connections.'); }); + function notifyWorkers(msg) { + Object.keys(cluster.workers).forEach(function(id) { + cluster.workers[id].send(msg); + }); + } + cluster.on('exit', function(worker, code, signal) { if (code !== 0) { - if (Loader.timesStarted < numProcs*3) { + if (Loader.timesStarted < numCPUs*3) { Loader.timesStarted++; if (Loader.crashTimer) { clearTimeout(Loader.crashTimer); @@ -155,7 +143,7 @@ Loader.addClusterEvents = function(callback) { Loader.timesStarted = 0; }); } else { - console.log(numProcs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); + console.log(numCPUs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); process.exit(); } } @@ -171,16 +159,16 @@ Loader.addClusterEvents = function(callback) { } }); - callback(); -} + process.on('SIGHUP', Loader.restart); -Loader.start = function(callback) { + Loader.start(); +}; + +Loader.start = function() { var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), worker; - console.log('Clustering enabled: Spinning up ' + numProcs + ' process(es).\n'); - - for(var x=0;x Date: Fri, 17 Oct 2014 01:47:13 -0400 Subject: [PATCH 250/264] Revert "reverting #2259 temporarily until we figure out why logs aren't showing up" This reverts commit 59b3e6f78fdcdb4dfbded9d65dfd58e08c0a6355. --- app.js | 32 ++++++++++++++------------ loader.js | 69 ++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/app.js b/app.js index 441b3846e2..3b02134831 100644 --- a/app.js +++ b/app.js @@ -58,11 +58,13 @@ if(os.platform() === 'linux') { }); } -// Log GNU copyright info along with server info -winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); -winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); -winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); -winston.info(''); +if (!cluster.isWorker) { + // If run using `node app`, log GNU copyright info along with server info + winston.info('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); + winston.info('This program comes with ABSOLUTELY NO WARRANTY.'); + winston.info('This is free software, and you are welcome to redistribute it under certain conditions.'); + winston.info(''); +} // Alternate configuration file support var configFile = path.join(__dirname, '/config.json'), @@ -102,20 +104,20 @@ function loadConfig() { } function start() { - loadConfig(); - winston.info('Time: ' + new Date()); - winston.info('Initializing NodeBB v' + pkg.version); - winston.info('* using configuration stored in: ' + configFile); - var host = nconf.get(nconf.get('database') + ':host'), - storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; + if (!cluster.isWorker) { + winston.info('Time: ' + new Date()); + winston.info('Initializing NodeBB v' + pkg.version); + winston.info('* using configuration stored in: ' + configFile); + } - winston.info('* using ' + nconf.get('database') +' store ' + storeLocation); - winston.info('* using themes stored in: ' + nconf.get('themes_path')); + if (cluster.isWorker && process.env.cluster_setup === 'true') { + var host = nconf.get(nconf.get('database') + ':host'), + storeLocation = host ? 'at ' + host + (host.indexOf('/') === -1 ? ':' + nconf.get(nconf.get('database') + ':port') : '') : ''; - if (process.env.NODE_ENV === 'development') { - winston.info('Base Configuration OK.'); + winston.info('* using ' + nconf.get('database') +' store ' + storeLocation); + winston.info('* using themes stored in: ' + nconf.get('themes_path')); } require('./src/database').init(function(err) { diff --git a/loader.js b/loader.js index c1603278fe..7e63804175 100644 --- a/loader.js +++ b/loader.js @@ -6,10 +6,14 @@ var nconf = require('nconf'), cluster = require('cluster'), async = require('async'), logrotate = require('logrotate-stream'), + + pkg = require('./package.json'), + pidFilePath = __dirname + '/pidfile', output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), silent = process.env.NODE_ENV !== 'development' ? true : false, - numCPUs, + numProcs, + Loader = { timesStarted: 0, shutdown_queue: [], @@ -23,7 +27,7 @@ var nconf = require('nconf'), } }; -Loader.init = function() { +Loader.init = function(callback) { cluster.setupMaster({ exec: "app.js", silent: silent @@ -36,6 +40,20 @@ Loader.init = function() { }; } + process.on('SIGHUP', Loader.restart); + callback(); +}; + +Loader.displayStartupMessages = function(callback) { + console.log('NodeBB v' + pkg.version + ' Copyright (C) 2013-2014 NodeBB Inc.'); + console.log('This program comes with ABSOLUTELY NO WARRANTY.'); + console.log('This is free software, and you are welcome to redistribute it under certain conditions.'); + console.log('For the full license, please visit: http://www.gnu.org/copyleft/gpl.html'); + console.log(''); + callback(); +}; + +Loader.addClusterEvents = function(callback) { cluster.on('fork', function(worker) { worker.on('message', function(message) { if (message && typeof message === 'object' && message.action) { @@ -115,7 +133,7 @@ Loader.init = function() { case 'user:connect': case 'user:disconnect': case 'config:update': - notifyWorkers(message); + Loader.notifyWorkers(message); break; } } @@ -126,15 +144,9 @@ Loader.init = function() { console.log('[cluster] Child Process (' + worker.process.pid + ') listening for connections.'); }); - function notifyWorkers(msg) { - Object.keys(cluster.workers).forEach(function(id) { - cluster.workers[id].send(msg); - }); - } - cluster.on('exit', function(worker, code, signal) { if (code !== 0) { - if (Loader.timesStarted < numCPUs*3) { + if (Loader.timesStarted < numProcs*3) { Loader.timesStarted++; if (Loader.crashTimer) { clearTimeout(Loader.crashTimer); @@ -143,7 +155,7 @@ Loader.init = function() { Loader.timesStarted = 0; }); } else { - console.log(numCPUs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); + console.log(numProcs*3 + ' restarts in 10 seconds, most likely an error on startup. Halting.'); process.exit(); } } @@ -159,16 +171,16 @@ Loader.init = function() { } }); - process.on('SIGHUP', Loader.restart); + callback(); +} - Loader.start(); -}; - -Loader.start = function() { +Loader.start = function(callback) { var output = logrotate({ file: __dirname + '/logs/output.log', size: '1m', keep: 3, compress: true }), worker; - for(var x=0;x Date: Fri, 17 Oct 2014 13:44:29 -0400 Subject: [PATCH 251/264] updating markdown minimum version to 0.7.x and up --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca1a6bbbc3..474d6feab5 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "morgan": "^1.3.2", "nconf": "~0.6.7", "nodebb-plugin-dbsearch": "0.0.14", - "nodebb-plugin-markdown": "~0.6.3", + "nodebb-plugin-markdown": "^0.7.0", "nodebb-plugin-mentions": "~0.6.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-theme-lavender": "~0.1.0", From b5fb7691cdf2c15cabae684b3b94e8d00e3b3cfa Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 17:20:45 -0400 Subject: [PATCH 252/264] optimize getUnreadByField only get the most recent 100 notifications dont call UserNotifications.getNotifications which does alot more work, call the db directly --- src/socket.io/topics.js | 6 ++---- src/user/notifications.js | 9 ++++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index d80f12956e..5ca5e37989 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -68,6 +68,7 @@ SocketTopics.enter = function(socket, tid, callback) { if (!tid || !socket.uid) { return; } + SocketTopics.markAsRead(socket, [tid], callback); topics.increaseViewCount(tid); websockets.updateRoomBrowsingText('topic_' + tid); @@ -77,10 +78,6 @@ SocketTopics.postcount = function(socket, tid, callback) { topics.getTopicField(tid, 'postcount', callback); }; -SocketTopics.increaseViewCount = function(socket, tid) { - topics.increaseViewCount(tid); -}; - SocketTopics.markAsRead = function(socket, tids, callback) { if(!Array.isArray(tids) || !socket.uid) { return callback(new Error('[[error:invalid-data]]')); @@ -92,6 +89,7 @@ SocketTopics.markAsRead = function(socket, tids, callback) { tids = tids.filter(function(tid) { return tid && utils.isNumber(tid); }); + topics.markAsRead(tids, socket.uid, function(err) { if (err) { return callback(err); diff --git a/src/user/notifications.js b/src/user/notifications.js index 2e3c2edd3d..3b96ab93d4 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -220,7 +220,7 @@ var async = require('async'), }; UserNotifications.getUnreadByField = function(uid, field, value, callback) { - db.getSortedSetRange('uid:' + uid + ':notifications:unread', 0, -1, function(err, nids) { + db.getSortedSetRange('uid:' + uid + ':notifications:unread', 0, 99, function(err, nids) { if (err) { return callback(err); } @@ -229,7 +229,11 @@ var async = require('async'), return callback(null, []); } - UserNotifications.getNotifications(nids, uid, function(err, notifications) { + var keys = nids.map(function(nid) { + return 'notifications:' + nid; + }); + + db.getObjectsFields(keys, [field], function(err, notifications) { if (err) { return callback(err); } @@ -246,7 +250,6 @@ var async = require('async'), }); }; - UserNotifications.sendTopicNotificationToFollowers = function(uid, topicData, postData) { db.getSetMembers('followers:' + uid, function(err, followers) { if (err || !Array.isArray(followers) || !followers.length) { From cfd7edbf343d3fd5504c822305804692dd6336f5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 17:23:47 -0400 Subject: [PATCH 253/264] added nid --- src/user/notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/notifications.js b/src/user/notifications.js index 3b96ab93d4..6315438aed 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -233,7 +233,7 @@ var async = require('async'), return 'notifications:' + nid; }); - db.getObjectsFields(keys, [field], function(err, notifications) { + db.getObjectsFields(keys, ['nid', field], function(err, notifications) { if (err) { return callback(err); } From 7bf655541cb6c0efaead74a61bfa1e753c80f6ac Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 18:31:20 -0400 Subject: [PATCH 254/264] cleanup and optimize notifications --- src/notifications.js | 2 +- src/user/notifications.js | 95 +++++++++++++++------------------------ 2 files changed, 38 insertions(+), 59 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 3ea7e0dd18..f7859fced1 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -264,7 +264,7 @@ var async = require('async'), }; Notifications.markAllRead = function(uid, callback) { - db.getSortedSetRange('uid:' + uid + ':notifications:unread', 0, 99, function(err, nids) { + db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99, function(err, nids) { if (err) { return callback(err); } diff --git a/src/user/notifications.js b/src/user/notifications.js index 6315438aed..9d1f04b1ba 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -19,16 +19,7 @@ var async = require('async'), (function(UserNotifications) { UserNotifications.get = function(uid, callback) { - var maxNotifs = 15; - - async.parallel({ - unread: function(next) { - getNotificationsFromSet('uid:' + uid + ':notifications:unread', uid, 0, 9, maxNotifs, next); - }, - read: function(next) { - getNotificationsFromSet('uid:' + uid + ':notifications:read', uid, 0, 9, maxNotifs, next); - } - }, function(err, notifications) { + getNotifications(uid, 10, function(err, notifications) { if (err) { return callback(err); } @@ -36,7 +27,7 @@ var async = require('async'), notifications.read = notifications.read.filter(Boolean); notifications.unread = notifications.unread.filter(Boolean); - // Limit the number of notifications to `maxNotifs`, prioritising unread notifications + var maxNotifs = 15; if (notifications.read.length + notifications.unread.length > maxNotifs) { notifications.read.length = maxNotifs - notifications.unread.length; } @@ -45,7 +36,18 @@ var async = require('async'), }); }; - function getNotificationsFromSet(set, uid, start, stop, max, callback) { + function getNotifications(uid, count, callback) { + async.parallel({ + unread: function(next) { + getNotificationsFromSet('uid:' + uid + ':notifications:unread', false, uid, 0, count - 1, next); + }, + read: function(next) { + getNotificationsFromSet('uid:' + uid + ':notifications:read', true, uid, 0, count - 1, next); + } + }, callback); + } + + function getNotificationsFromSet(set, read, uid, start, stop, callback) { db.getSortedSetRevRange(set, start, stop, function(err, nids) { if (err) { return callback(err); @@ -55,10 +57,6 @@ var async = require('async'), return callback(null, []); } - if (nids.length > max) { - nids.length = max; - } - UserNotifications.getNotifications(nids, uid, function(err, notifications) { if (err) { return callback(err); @@ -73,6 +71,9 @@ var async = require('async'), } deletedNids.push(nids[index]); + } else { + notification.read = read; + notification.readClass = !notification.read ? 'label-warning' : ''; } }); @@ -86,30 +87,16 @@ var async = require('async'), } UserNotifications.getAll = function(uid, count, callback) { - async.parallel({ - unread: function(next) { - db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, count, next); - }, - read: function(next) { - db.getSortedSetRevRange('uid:' + uid + ':notifications:read', 0, count, next); - } - }, function(err, results) { + getNotifications(uid, count, function(err, notifs) { if (err) { return callback(err); } - - var nids = results.unread.concat(results.read); - UserNotifications.getNotifications(nids, uid, function(err, notifs) { - if (err) { - return callback(err); - } - - notifs = notifs.filter(Boolean).sort(function(a, b) { - return b.datetime - a.datetime; - }); - - callback(null, notifs); + notifs = notifs.unread.concat(notifs.read); + notifs = notifs.filter(Boolean).sort(function(a, b) { + return b.datetime - a.datetime; }); + + callback(null, notifs); }); }; @@ -119,34 +106,26 @@ var async = require('async'), return callback(err); } - db.isSortedSetMembers('uid:' + uid + ':notifications:read', nids, function(err, hasRead) { + var pids = notifications.map(function(notification) { + return notification ? notification.pid : null; + }); + + generatePostPaths(pids, uid, function(err, pidToPaths) { if (err) { return callback(err); } - var pids = notifications.map(function(notification) { - return notification ? notification.pid : null; - }); - - generatePostPaths(pids, uid, function(err, pidToPaths) { - if (err) { - return callback(err); + notifications = notifications.map(function(notification, index) { + if (!notification) { + return null; } - notifications = notifications.map(function(notification, index) { - if (!notification) { - return null; - } - - notification.read = hasRead[index]; - notification.path = pidToPaths[notification.pid] || notification.path || ''; - notification.datetimeISO = utils.toISOString(notification.datetime); - notification.readClass = !notification.read ? 'label-warning' : ''; - return notification; - }); - - callback(null, notifications); + notification.path = pidToPaths[notification.pid] || notification.path || ''; + notification.datetimeISO = utils.toISOString(notification.datetime); + return notification; }); + + callback(null, notifications); }); }); }; @@ -206,7 +185,7 @@ var async = require('async'), return callback(null, []); } - UserNotifications.getNotifications(nids, uid, callback); + UserNotifications.getNotifications(nids, uid); }); }; From c5e1f8e0aaec72e4cb7f26140c7aa493528ba709 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 18:40:20 -0400 Subject: [PATCH 255/264] user onlineUsers instead of calculating from rooms --- src/socket.io/index.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index c5ce1cca23..3f456df2fe 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -287,14 +287,7 @@ Sockets.getUserSocketCount = function(uid) { }; Sockets.getOnlineUserCount = function () { - var roomNames = Object.keys(io.sockets.manager.rooms); - if (!Array.isArray(roomNames)) { - return 0; - } - roomNames = roomNames.filter(function(name) { - return name.indexOf('/uid_') === 0; - }); - return roomNames.length; + return onlineUsers.length; }; Sockets.getOnlineAnonCount = function () { From 6cb5f9c0981ac56374195dd79eb2ff95ccd5137e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 18:46:17 -0400 Subject: [PATCH 256/264] emit stats to registered users only --- src/socket.io/index.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 3f456df2fe..36ebed87db 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -178,12 +178,11 @@ Sockets.init = function(server) { var socketCount = Sockets.getUserSocketCount(uid); if (uid && socketCount <= 1) { socket.broadcast.emit('event:user_status_change', {uid: uid, status: 'offline'}); + emitOnlineUserCount(); } onUserDisconnect(uid, socket.id, socketCount); - emitOnlineUserCount(); - for(var roomName in io.sockets.manager.roomClients[socket.id]) { if (roomName.indexOf('topic') !== -1) { io.sockets.in(roomName.slice(1)).emit('event:user_leave', socket.uid); @@ -430,7 +429,7 @@ function emitTopicPostStats(callback) { }; if (!callback) { - io.sockets.emit('meta.getUsageStats', null, stats); + io.sockets.in('online_users').emit('meta.getUsageStats', null, stats); } else { callback(null, stats); } @@ -450,7 +449,7 @@ function emitOnlineUserCount(callback) { if (callback) { callback(null, returnObj); } else { - io.sockets.emit('user.getActiveUsers', null, returnObj); + io.sockets.in('online_users').emit('user.getActiveUsers', null, returnObj); } } From 93d4a7c1f1920d16476e5cf1a38c7d211c39fecf Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 18:51:58 -0400 Subject: [PATCH 257/264] fix notifications to actually get recent --- src/user/notifications.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/user/notifications.js b/src/user/notifications.js index 9d1f04b1ba..a1319c7b09 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -176,7 +176,7 @@ var async = require('async'), var now = Date.now(), yesterday = now - (1000*60*60*24); // Approximate, can be more or less depending on time changes, makes no difference really. - db.getSortedSetRangeByScore('uid:' + uid + ':notifications:unread', 0, 20, yesterday, now, function(err, nids) { + db.getSortedSetRevRangeByScore('uid:' + uid + ':notifications:unread', 0, 20, now, yesterday, function(err, nids) { if (err) { return callback(err); } @@ -193,13 +193,13 @@ var async = require('async'), if (!parseInt(uid, 10)) { return callback(null, 0); } - db.getSortedSetRange('uid:' + uid + ':notifications:unread', 0, 20, function(err, nids) { + db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 20, function(err, nids) { callback(err, Array.isArray(nids) ? nids.length : 0); }); }; UserNotifications.getUnreadByField = function(uid, field, value, callback) { - db.getSortedSetRange('uid:' + uid + ':notifications:unread', 0, 99, function(err, nids) { + db.getSortedSetRevRange('uid:' + uid + ':notifications:unread', 0, 99, function(err, nids) { if (err) { return callback(err); } From d2334fbb4ae84bf6f2661b11f19d61f6b312bd77 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 19:12:18 -0400 Subject: [PATCH 258/264] dont search empty string, get 20 tags instead of 10 --- public/src/client/tags.js | 5 +++++ src/socket.io/topics.js | 6 ++++++ src/topics/tags.js | 5 +++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/public/src/client/tags.js b/public/src/client/tags.js index bf4395f497..e5c2dcaa45 100644 --- a/public/src/client/tags.js +++ b/public/src/client/tags.js @@ -14,6 +14,11 @@ define('forum/tags', ['forum/infinitescroll'], function(infinitescroll) { clearTimeout(timeoutId); timeoutId = 0; } + + if (!$('#tag-search').val().length) { + return; + } + timeoutId = setTimeout(function() { socket.emit('topics.searchAndLoadTags', {query: $('#tag-search').val()}, function(err, results) { if (err) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 5ca5e37989..c7bfaa49a0 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -521,6 +521,12 @@ SocketTopics.search = function(socket, data, callback) { }; SocketTopics.searchAndLoadTags = function(socket, data, callback) { + if (!data) { + return callback(new Error('[[error:invalid-data]]')); + } + if (!data.query || !data.query.length) { + return callback(null, []); + } topics.searchTags(data, function(err, tags) { if (err) { return callback(err); diff --git a/src/topics/tags.js b/src/topics/tags.js index 681d137fc9..07b65b9ceb 100644 --- a/src/topics/tags.js +++ b/src/topics/tags.js @@ -222,14 +222,15 @@ module.exports = function(Topics) { return callback(null, tags); } data.query = data.query.toLowerCase(); + var matches = []; for(var i=0; i b; }); From ded8de905d4cce7824f6c60917567a4a22a0151c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 17 Oct 2014 19:37:09 -0400 Subject: [PATCH 259/264] closes #2278 --- src/middleware/index.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/middleware/index.js b/src/middleware/index.js index e1b7c0c218..3758c0a712 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -46,6 +46,13 @@ function routeCurrentTheme(app, themeId, themesData) { meta.themes.setPath(themeObj); } +function setupFavicon() { + var faviconPath = path.join(__dirname, '../../', 'public', meta.config['brand:favicon'] ? meta.config['brand:favicon'] : 'favicon.ico'); + if (fs.existsSync(faviconPath)) { + app.use(favicon(faviconPath)); + } +} + module.exports = function(app, data) { middleware = require('./middleware')(app); @@ -62,7 +69,8 @@ module.exports = function(app, data) { app.use(compression()); - app.use(favicon(path.join(__dirname, '../../', 'public', meta.config['brand:favicon'] ? meta.config['brand:favicon'] : 'favicon.ico'))); + setupFavicon(); + app.use(relativePath + '/apple-touch-icon', middleware.routeTouchIcon); app.use(bodyParser.urlencoded({extended: true})); From 1eb1eb6844c2028ffce811a523a1aa139d0b79ed Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 17 Oct 2014 19:38:49 -0400 Subject: [PATCH 260/264] #2278 --- src/middleware/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/middleware/index.js b/src/middleware/index.js index 3758c0a712..6d8ab06c25 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -46,7 +46,7 @@ function routeCurrentTheme(app, themeId, themesData) { meta.themes.setPath(themeObj); } -function setupFavicon() { +function setupFavicon(app) { var faviconPath = path.join(__dirname, '../../', 'public', meta.config['brand:favicon'] ? meta.config['brand:favicon'] : 'favicon.ico'); if (fs.existsSync(faviconPath)) { app.use(favicon(faviconPath)); @@ -69,7 +69,7 @@ module.exports = function(app, data) { app.use(compression()); - setupFavicon(); + setupFavicon(app); app.use(relativePath + '/apple-touch-icon', middleware.routeTouchIcon); From 02f74ca03212b12d4d0e72018f7e124169644f62 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 20:49:12 -0400 Subject: [PATCH 261/264] fix browsing users removal --- public/src/client/topic/browsing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index 3d84dfc577..d8c945c33b 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -39,7 +39,7 @@ define('forum/topic/browsing', function() { var count = Math.max(0, parseInt(user.attr('data-count'), 10) - 1); user.attr('data-count', count); if (count <= 0) { - user.remove(); + user.parent().remove(); } } else { increaseUserCount(-1); From 94ffe5d170216ebcf94556ff10c37a889a3170e0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 23:04:50 -0400 Subject: [PATCH 262/264] closes #2276 --- public/src/admin/general/dashboard.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 50de4ec55e..a860b817df 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -125,20 +125,20 @@ define('admin/general/dashboard', ['semver'], function(semver) { return app.alertError(err.message); } - var html = '
    ' + - '
    '+ data.onlineRegisteredCount +'
    ' + + var html = '
    ' + + '
    '+ data.onlineRegisteredCount +'
    ' + '
    Users
    ' + '
    ' + - '
    ' + - '
    '+ data.onlineGuestCount +'
    ' + + '
    ' + + '
    '+ data.onlineGuestCount +'
    ' + '
    Guests
    ' + '
    ' + - '
    ' + - '
    '+ (data.onlineRegisteredCount + data.onlineGuestCount) +'
    ' + + '
    ' + + '
    '+ (data.onlineRegisteredCount + data.onlineGuestCount) +'
    ' + '
    Total
    ' + '
    ' + - '
    ' + - '
    '+ data.socketCount +'
    ' + + '
    ' + + '
    '+ data.socketCount +'
    ' + '
    Connections
    ' + '
    '; @@ -359,7 +359,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { segments = graphs.topics.segments; function reassignExistingTopics() { - for (var i = 0, ii = segments.length; i < ii; i++ ) { + for (var i = segments.length - 1; i >= 0; i--) { if (!segments[i]) { continue; } From 794d6eb9ab2963b5c573f20d21cb42fe7f38b6e4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 23:14:17 -0400 Subject: [PATCH 263/264] closes #2200 --- public/src/admin/general/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index a860b817df..c2bd8c704b 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -14,7 +14,7 @@ define('admin/general/dashboard', ['semver'], function(semver) { app.enterRoom('admin'); socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); - isMobile = !/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); intervals.rooms = setInterval(function() { if (app.isFocused && app.isConnected) { From b209fb563ef69d285f258f2aa7483bca0e6dcb47 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 17 Oct 2014 23:29:28 -0400 Subject: [PATCH 264/264] #2218 --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 474d6feab5..c4d6916ac7 100644 --- a/package.json +++ b/package.json @@ -35,14 +35,14 @@ "mkdirp": "~0.5.0", "morgan": "^1.3.2", "nconf": "~0.6.7", - "nodebb-plugin-dbsearch": "0.0.14", + "nodebb-plugin-dbsearch": "0.0.15", "nodebb-plugin-markdown": "^0.7.0", "nodebb-plugin-mentions": "~0.6.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-theme-lavender": "~0.1.0", "nodebb-theme-vanilla": "~0.1.0", "nodebb-widget-essentials": "~0.1.1", - "npm": "^1.5.0-alpha-4", + "npm": "^2.1.4", "passport": "^0.2.1", "passport-local": "1.0.0", "prompt": "^0.2.14", @@ -59,7 +59,7 @@ "templates.js": "0.1.2", "uglify-js": "git+https://github.com/julianlam/UglifyJS2.git", "underscore": "~1.7.0", - "validator": "~3.19.1", + "validator": "~3.21.0", "winston": "^0.8.0", "xregexp": "~2.0.0" },