From 6fe8d25166e4d3bfe5b9cc3b7831662c7d201375 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 16 Jan 2015 12:58:31 -0500 Subject: [PATCH 01/73] add uid to filter:topic.get --- src/topics.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/topics.js b/src/topics.js index 1e9df9958f..3135fd6a88 100644 --- a/src/topics.js +++ b/src/topics.js @@ -255,7 +255,9 @@ var async = require('async'), topicData.locked = parseInt(topicData.locked, 10) === 1; topicData.pinned = parseInt(topicData.pinned, 10) === 1; - plugins.fireHook('filter:topic.get', topicData, callback); + plugins.fireHook('filter:topic.get', {topic: topicData, uid: uid}, function(err, data) { + callback(err, data ? data.topics : null); + }); }); }); }; From 236fe91e953200fae651707293c556eff16deef6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 16 Jan 2015 13:00:50 -0500 Subject: [PATCH 02/73] fix typo --- src/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics.js b/src/topics.js index 3135fd6a88..d206b5c211 100644 --- a/src/topics.js +++ b/src/topics.js @@ -256,7 +256,7 @@ var async = require('async'), topicData.pinned = parseInt(topicData.pinned, 10) === 1; plugins.fireHook('filter:topic.get', {topic: topicData, uid: uid}, function(err, data) { - callback(err, data ? data.topics : null); + callback(err, data ? data.topic : null); }); }); }); From b333653464458c2cd27717768f28d9a356e8c3a7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 16 Jan 2015 23:52:51 -0500 Subject: [PATCH 03/73] prevent js crash if responseJSON is undefined --- public/src/modules/uploader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/uploader.js b/public/src/modules/uploader.js index d2f7612c0e..6efdbd988c 100644 --- a/public/src/modules/uploader.js +++ b/public/src/modules/uploader.js @@ -49,7 +49,7 @@ define('uploader', ['csrf'], function(csrf) { }, error: function(xhr) { xhr = maybeParse(xhr); - showAlert('error', xhr.responseJSON.error); + showAlert('error', xhr.responseJSON ? xhr.responseJSON.error : 'error uploading, code : ' + xhr.status); }, uploadProgress: function(event, position, total, percent) { From 093e499bf8f584b82dddc67c89a7255f4ced6216 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 20 Jan 2015 20:55:22 -0500 Subject: [PATCH 04/73] defining module name in iconSelect module --- public/src/modules/iconSelect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/iconSelect.js b/public/src/modules/iconSelect.js index 88ab1903ed..f21bd76e1f 100644 --- a/public/src/modules/iconSelect.js +++ b/public/src/modules/iconSelect.js @@ -2,7 +2,7 @@ /* globals define, bootbox */ -define(function() { +define('iconSelect', function() { var iconSelect = {}; iconSelect.init = function(el, onModified) { From 2917304f6c84da2baab5766a25e9e3a96ff95fe4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 21 Jan 2015 16:14:31 -0500 Subject: [PATCH 05/73] companion commit to nodebb/nodebb-theme-vanilla@0d17032 --- public/src/client/groups/list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index 38d70d7c4a..36f1e0f3e7 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -5,7 +5,7 @@ define('forum/groups/list', function() { var Groups = {}; Groups.init = function() { - var groupsEl = $('.groups.row'); + var groupsEl = $('#groups-list'); groupsEl.on('click', '.list-cover', function() { var groupName = $(this).parents('[data-group]').attr('data-group'); @@ -41,7 +41,7 @@ define('forum/groups/list', function() { }; Groups.search = function(query) { - var groupsEl = $('.groups.row'); + var groupsEl = $('#groups-list'); socket.emit('groups.search', { query: query, From 78a5843ae45e7cd8cb4cbab887112f05469536f2 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 21 Jan 2015 16:33:09 -0500 Subject: [PATCH 06/73] fixed tests by removing the broken one, heh heh heh --- src/groups.js | 21 --------------------- tests/groups.js | 11 ----------- 2 files changed, 32 deletions(-) diff --git a/src/groups.js b/src/groups.js index 87e6070757..58170eeaa8 100644 --- a/src/groups.js +++ b/src/groups.js @@ -265,27 +265,6 @@ var async = require('async'), db.getSetMembers('group:' + groupName + ':members', callback); }; - Groups.search = function(query, options, callback) { - if (!query) { - return callback(null, []); - } - - db.getSetMembers('groups', function(err, groups) { - if (err) { - return callback(err); - } - groups = groups.filter(function(groupName) { - return groupName.match(new RegExp(utils.escapeRegexChars(query), 'i')); - }); - - async.map(groups, function(groupName, next) { - Groups.get(groupName, options, next); - }, function(err, groups) { - callback(err, internals.filterGroups(groups, options)); - }); - }); - }; - Groups.isMember = function(uid, groupName, callback) { if (!uid || parseInt(uid, 10) <= 0) { return callback(null, false); diff --git a/tests/groups.js b/tests/groups.js index 47da1b8bbb..0025000828 100644 --- a/tests/groups.js +++ b/tests/groups.js @@ -88,17 +88,6 @@ describe('Groups', function() { done(); }); }); - - it('should return the "Hidden" group when "showAllGroups" option is passed in', function(done) { - Groups.search('hidden', { - showAllGroups: true - }, function(err, groups) { - if (err) return done(err); - assert.equal(1, groups.length); - assert.strictEqual('Hidden', groups[0].name); - done(); - }); - }); }); describe('.isMember()', function() { From 5fb8817b3c54e9c4e86eaf9c6dbeae34b732a0c1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 22 Jan 2015 14:13:39 -0500 Subject: [PATCH 07/73] closes #2643 --- src/user/delete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/delete.js b/src/user/delete.js index b13fa1aa97..e6cdcebb19 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -85,7 +85,7 @@ module.exports = function(User) { db.deleteAll(keys, next); }, function(next) { - deleteUserIps(uids, next); + deleteUserIps(uid, next); }, function(next) { deleteUserFromFollowers(uid, next); From 77216acbcc341c0572b4a7324064fb0f19492c1f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 22 Jan 2015 14:18:19 -0500 Subject: [PATCH 08/73] user.delete test --- tests/user.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/user.js b/tests/user.js index 3ef541623b..381c6f0a44 100644 --- a/tests/user.js +++ b/tests/user.js @@ -171,6 +171,28 @@ describe('User', function() { }); }); + describe('.delete()', function() { + var uid; + before(function(done) { + User.create({username: 'userToDelete', password: '123456', email: 'delete@me.com'}, function(err, newUid) { + assert.ifError(err); + uid = newUid; + done(); + }); + }); + + it('should delete a user account', function(done) { + User.delete(uid, function(err) { + assert.ifError(err); + User.exists('userToDelete', function(err, exists) { + assert.ifError(err); + assert.equal(exists, false); + done(); + }); + }); + }); + }); + after(function() { db.flushdb(); }); From d895ca6827d203abd71f9170fb24fe2daa9014b7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 22 Jan 2015 14:19:23 -0500 Subject: [PATCH 09/73] missing semicolon --- src/user/delete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/user/delete.js b/src/user/delete.js index e6cdcebb19..3440e810a4 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -127,7 +127,7 @@ module.exports = function(User) { } db.delete('uid:' + uid + ':ip', callback); }); - }) + }); } function deleteUserFromFollowers(uid, callback) { From 72f28b7b3831bc084ef5606c5a3c2c8760f1f579 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 22 Jan 2015 14:19:59 -0500 Subject: [PATCH 10/73] closed #2641 --- public/language/en_GB/error.json | 1 + public/src/client/groups/details.js | 2 +- src/groups.js | 21 +++++++++++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index fed0c807c9..7e21a1290a 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -66,6 +66,7 @@ "group-already-exists": "Group already exists", "group-name-change-not-allowed": "Group name change not allowed", "group-already-member": "You are already part of this group", + "group-needs-owner": "This group requires at least one owner", "post-already-deleted": "This post has already been deleted", "post-already-restored": "This post has already been restored", diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index b667176ae9..09826fb673 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -34,7 +34,7 @@ define('forum/groups/details', ['iconSelect', 'vendor/colorpicker/colorpicker', if (!err) { ownerFlagEl.toggleClass('invisible'); } else { - app.alertError(err); + app.alertError(err.message); } }); break; diff --git a/src/groups.js b/src/groups.js index fbb138dce5..beeddd19a9 100644 --- a/src/groups.js +++ b/src/groups.js @@ -659,8 +659,8 @@ var async = require('async'), Groups.requestMembership = function(groupName, uid, callback) { async.parallel({ - exists: async.apply(Groups.isMember, uid, groupName), - isMember: async.apply(Groups.exists, groupName) + exists: async.apply(Groups.exists, groupName), + isMember: async.apply(Groups.isMember, uid, groupName) }, function(err, checks) { if (!checks.exists) { return callback(new Error('[[error:no-group]]')); @@ -694,7 +694,12 @@ var async = require('async'), Groups.leave = function(groupName, uid, callback) { callback = callback || function() {}; - db.sortedSetRemove('group:' + groupName + ':members', uid, function(err) { + var tasks = [ + async.apply(db.sortedSetRemove, 'group:' + groupName + ':members', uid), + async.apply(db.setRemove, 'group:' + groupName + ':owners', uid) + ]; + + async.parallel(tasks, function(err) { if (err) { return callback(err); } @@ -891,7 +896,15 @@ var async = require('async'), Groups.ownership.rescind = function(toUid, groupName, callback) { // Note: No ownership checking is done here on purpose! - db.setRemove('group:' + groupName + ':owners', toUid, callback); + + // If the owners set only contains one member, error out! + db.setCount('group:' + groupName + ':owners', function(err, numOwners) { + if (numOwners <= 1) { + return callback(new Error('[[error:group-needs-owner]]')); + } + + db.setRemove('group:' + groupName + ':owners', toUid, callback); + }); }; Groups.search = function(query, options, callback) { From 070215b05ef45fc8cab78cc334098d3ce508a12b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 22 Jan 2015 16:08:20 -0500 Subject: [PATCH 11/73] simplified isOwner check because there's no need to check admin status as admins automatically become owners now --- src/groups.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/groups.js b/src/groups.js index e7c1eed77b..7082ba5b65 100644 --- a/src/groups.js +++ b/src/groups.js @@ -884,22 +884,13 @@ var async = require('async'), Groups.updateCoverPosition(data.groupName, data.position, callback); }); - } + }; Groups.ownership = {}; Groups.ownership.isOwner = function(uid, groupName, callback) { - // Note: All admins are also owners - async.waterfall([ - async.apply(db.isSetMember, 'group:' + groupName + ':owners', uid), - function(isOwner, next) { - if (isOwner) { - return next(null, isOwner); - } - - user.isAdministrator(uid, next); - } - ], callback); + // Note: All admins automatically become owners upon joining + db.isSetMember('group:' + groupName + ':owners', uid, callback); }; Groups.ownership.grant = function(toUid, groupName, callback) { From ab69477b24ef9d44a0fd74d40d97ce4e3c7bc64b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 27 Jan 2015 17:37:21 -0500 Subject: [PATCH 12/73] moved filter:user,get to central function --- src/controllers/users.js | 12 +++--------- src/user.js | 8 ++++++-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/controllers/users.js b/src/controllers/users.js index a1d5b84f19..0a2d4d0d67 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -44,9 +44,7 @@ usersController.getOnlineUsers = function(req, res, next) { show_anon: anonymousUserCount ? '' : 'hide' }; - plugins.fireHook('filter:userlist.get', {data: userData, uid: uid}, function(err, userData) { - res.render('users', userData.data); - }); + res.render('users', userData); }); }; @@ -76,9 +74,7 @@ usersController.getUsers = function(set, count, req, res, next) { show_anon: 'hide' }; - plugins.fireHook('filter:userlist.get', {data: userData, uid: uid}, function(err, userData) { - res.render('users', userData.data); - }); + res.render('users', userData); }); }; @@ -118,9 +114,7 @@ usersController.getUsersForSearch = function(req, res, next) { show_anon: 'hide' }; - plugins.fireHook('filter:userlist.get', {data: userData, uid: uid}, function(err, userData) { - res.render('users', userData.data); - }); + res.render('users', userData); }); }; diff --git a/src/user.js b/src/user.js index 0a83994964..5e9382efd9 100644 --- a/src/user.js +++ b/src/user.js @@ -249,8 +249,12 @@ var async = require('async'), user.banned = parseInt(user.banned, 10) === 1; user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1; }); - - callback(null, results.userData); + plugins.fireHook('filter:userlist.get', {users: results.userData}, function(err, data) { + if (err) { + return callback(err); + } + callback(null, data.users); + }); }); }); }; From 0dc0c39f4813745ebde5d812ef0b6d1f81f81975 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 27 Jan 2015 19:58:17 -0500 Subject: [PATCH 13/73] removed li selector --- public/src/client/topic/posts.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 8e21928498..7fd55e8bd4 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -52,7 +52,7 @@ define('forum/topic/posts', [ function removeAlreadyAddedPosts() { data.posts = data.posts.filter(function(post) { - return $('#post-container li[data-pid="' + post.pid +'"]').length === 0; + return $('#post-container [data-pid="' + post.pid +'"]').length === 0; }); } @@ -64,8 +64,8 @@ define('forum/topic/posts', [ var firstPostVotes = parseInt(data.posts[0].votes, 10); var firstPostIndex = parseInt(data.posts[0].index, 10); - var firstReply = $('#post-container li.post-row[data-index!="0"]').first(); - var lastReply = $('#post-container li.post-row[data-index!="0"]').last(); + var firstReply = $('#post-container .post-row[data-index!="0"]').first(); + var lastReply = $('#post-container .post-row[data-index!="0"]').last(); if (config.topicPostSort === 'oldest_to_newest') { if (firstPostTimestamp < parseInt(firstReply.attr('data-timestamp'), 10)) { @@ -111,7 +111,7 @@ define('forum/topic/posts', [ // Save document height and position for future reference (about 5 lines down) var height = $(document).height(), scrollTop = $(document).scrollTop(), - originalPostEl = $('li[data-index="0"]'); + originalPostEl = $('.post-row[data-index="0"]'); // Insert the new post html.insertBefore(before); @@ -186,7 +186,7 @@ define('forum/topic/posts', [ function loadPostsAfter(after) { var tid = ajaxify.variables.get('topic_id'); - if (!utils.isNumber(tid) || !utils.isNumber(after) || (after === 0 && $('#post-container li.post-row[data-index="1"]').length)) { + if (!utils.isNumber(tid) || !utils.isNumber(after) || (after === 0 && $('#post-container .post-row[data-index="1"]').length)) { return; } @@ -235,13 +235,13 @@ define('forum/topic/posts', [ }; function showBottomPostBar() { - if($('#post-container .post-row').length > 1 || !$('#post-container li[data-index="0"]').length) { + if($('#post-container .post-row').length > 1 || !$('#post-container [data-index="0"]').length) { $('.bottom-post-bar').removeClass('hide'); } } function hidePostToolsForDeletedPosts(element) { - element.find('li.deleted').each(function() { + element.find('.post-row.deleted').each(function() { postTools.toggle($(this).attr('data-pid'), true); }); } From d47cd270dfffd1a899a8c27f66e495401d71a73c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 27 Jan 2015 23:37:47 -0500 Subject: [PATCH 14/73] some random favourite typo --- src/favourites.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/favourites.js b/src/favourites.js index 0673626f51..c07468c78a 100644 --- a/src/favourites.js +++ b/src/favourites.js @@ -274,7 +274,7 @@ var async = require('async'), } if (!isFavouriting && !results.hasFavourited) { - return callback(new Error('[[error:alrady-unfavourited]]')); + return callback(new Error('[[error:already-unfavourited]]')); } async.waterfall([ From 370a60c14fd5409e4e059dffd11d2c2d17f1d17b Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 27 Jan 2015 23:50:01 -0500 Subject: [PATCH 15/73] potential bug @barisusakli I think you changed this, just pinging you in case --- public/src/client/topic/threadTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index 41a3d532bf..b401a850ed 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -61,7 +61,7 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move'], func fork.init(); $('.posts').on('click', '.follow', function() { - socket.emit('topics.follow', tid, function(err, state) { + socket.emit('topics.toggleFollow', tid, function(err, state) { if(err) { return app.alert({ type: 'danger', From 5a3c056759be7e51e1154564197a1c39e43b5397 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 27 Jan 2015 23:50:10 -0500 Subject: [PATCH 16/73] removing li specific selector --- public/src/client/topic/events.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 90f54ec064..40217b0969 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -69,7 +69,7 @@ define('forum/topic/events', [ }; function updatePostVotesAndUserReputation(data) { - var votes = $('li[data-pid="' + data.post.pid + '"] .votes'), + var votes = $('[data-pid="' + data.post.pid + '"] .votes'), reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]'); votes.html(data.post.votes).attr('data-votes', data.post.votes); @@ -77,7 +77,7 @@ define('forum/topic/events', [ } function updateFavouriteCount(data) { - $('li[data-pid="' + data.post.pid + '"] .favouriteCount').html(data.post.reputation).attr('data-favourites', data.post.reputation); + $('[data-pid="' + data.post.pid + '"] .favouriteCount').html(data.post.reputation).attr('data-favourites', data.post.reputation); } function toggleTopicDeleteState(data) { @@ -139,14 +139,14 @@ define('forum/topic/events', [ } function onPostPurged(pid) { - $('#post-container li[data-pid="' + pid + '"]').fadeOut(500, function() { + $('#post-container [data-pid="' + pid + '"]').fadeOut(500, function() { $(this).remove(); }); postTools.updatePostCount(); } function togglePostDeleteState(data) { - var postEl = $('#post-container li[data-pid="' + data.pid + '"]'); + var postEl = $('#post-container [data-pid="' + data.pid + '"]'); if (!postEl.length) { return; @@ -166,7 +166,7 @@ define('forum/topic/events', [ } function togglePostFavourite(data) { - var favBtn = $('li[data-pid="' + data.post.pid + '"] .favourite'); + var favBtn = $('[data-pid="' + data.post.pid + '"] .favourite'); if (!favBtn.length) { return; } @@ -185,7 +185,7 @@ define('forum/topic/events', [ } function togglePostVote(data) { - var post = $('li[data-pid="' + data.post.pid + '"]'); + var post = $('[data-pid="' + data.post.pid + '"]'); post.find('.upvote').toggleClass('btn-primary upvoted', data.upvote); post.find('.downvote').toggleClass('btn-primary downvoted', data.downvote); From 8bc2d973527f2eaa252e0cca28770f612e3bb5ab Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 29 Jan 2015 10:08:48 -0500 Subject: [PATCH 17/73] stringify helper for t.js --- public/src/modules/helpers.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index bc40bde658..e8f77a5614 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -4,7 +4,7 @@ // export the class if we are in a Node-like system. if (typeof module === 'object' && module.exports === exports) { - exports = module.exports/* = SemVer*/; + exports = module.exports/* = SemVer*/; } var helpers = {}; @@ -21,6 +21,11 @@ return ''; }; + helpers.stringify = function(obj) { + // Turns the incoming object into a JSON string + return JSON.stringify(obj).replace(/&/gm,"&").replace(//gm,">").replace(/"/g, '"'); + }; + // Groups helpers helpers.membershipBtn = function(groupObj) { if (groupObj.isMember) { From 6a2c35c263bba4319603932768bc971e74e110e7 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 29 Jan 2015 15:45:31 -0500 Subject: [PATCH 18/73] latest t.js --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c46f966b43..c67d9268e6 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "socket.io-redis": "^0.1.3", "socketio-wildcard": "~0.1.1", "string": "^3.0.0", - "templates.js": "0.1.10", + "templates.js": "0.1.15", "uglify-js": "git+https://github.com/julianlam/UglifyJS2.git", "underscore": "~1.7.0", "validator": "~3.26.0", From 6ebc048f1f3a626881b600887a7b43a93ca96077 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 29 Jan 2015 16:41:48 -0500 Subject: [PATCH 19/73] searching on keyup instead of enter key --- public/src/client/groups/list.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index 9ff22d9396..a3f9394450 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -31,9 +31,7 @@ define('forum/groups/list', function() { }); // Group searching - $('#search-text').on('keydown', function(e) { - if (e.keyCode === 13) { Groups.search(e); } - }); + $('#search-text').on('keyup', Groups.search); $('#search-button').on('click', Groups.search); }; From b54f2de504880fc26d40c41f7a347103c24c77ae Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 29 Jan 2015 17:02:20 -0500 Subject: [PATCH 20/73] pass uid to getUsers and getUsersFromSets --- src/controllers/admin/users.js | 3 ++- src/controllers/groups.js | 3 ++- src/controllers/users.js | 10 +++++----- src/search.js | 6 +++--- src/socket.io/admin/categories.js | 2 +- src/socket.io/admin/user.js | 2 +- src/socket.io/user.js | 5 +++-- src/user.js | 8 ++++---- src/user/follow.js | 2 +- src/user/search.js | 9 +++++---- 10 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 17944b8370..283302b48e 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -31,7 +31,8 @@ usersController.banned = function(req, res, next) { }; function getUsers(set, req, res, next) { - user.getUsersFromSet(set, 0, 49, function(err, users) { + var uid = req.user ? parseInt(req.user.uid, 10) : 0; + user.getUsersFromSet(set, uid, 0, 49, function(err, users) { if (err) { return next(err); } diff --git a/src/controllers/groups.js b/src/controllers/groups.js index c20993a7df..18ea0cbf2d 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -49,12 +49,13 @@ groupsController.details = function(req, res, next) { }; groupsController.members = function(req, res, next) { + var uid = req.user ? parseInt(req.user.uid, 10) : 0; async.waterfall([ function(next) { groups.getGroupNameByGroupSlug(req.params.slug, next); }, function(groupName, next) { - user.getUsersFromSet('group:' + groupName + ':members', 0, 49, next); + user.getUsersFromSet('group:' + groupName + ':members', uid, 0, 49, next); }, ], function(err, users) { if (err) { diff --git a/src/controllers/users.js b/src/controllers/users.js index 0a2d4d0d67..81001d0f3a 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -14,7 +14,7 @@ usersController.getOnlineUsers = function(req, res, next) { async.parallel({ users: function(next) { - user.getUsersFromSet('users:online', 0, 49, next); + user.getUsersFromSet('users:online', uid, 0, 49, next); }, count: function(next) { var now = Date.now(); @@ -63,7 +63,7 @@ usersController.getUsersSortedByJoinDate = function(req, res, next) { usersController.getUsers = function(set, count, req, res, next) { var uid = req.user ? req.user.uid : 0; - getUsersAndCount(set, count, function(err, data) { + getUsersAndCount(set, uid, count, function(err, data) { if (err) { return next(err); } @@ -78,10 +78,10 @@ usersController.getUsers = function(set, count, req, res, next) { }); }; -function getUsersAndCount(set, count, callback) { +function getUsersAndCount(set, uid, count, callback) { async.parallel({ users: function(next) { - user.getUsersFromSet(set, 0, count - 1, next); + user.getUsersFromSet(set, uid, 0, count - 1, next); }, count: function(next) { db.getObjectField('global', 'userCount', next); @@ -102,7 +102,7 @@ usersController.getUsersForSearch = function(req, res, next) { var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20, uid = req.user ? req.user.uid : 0; - getUsersAndCount('users:joindate', resultsPerPage, function(err, data) { + getUsersAndCount('users:joindate', uid, resultsPerPage, function(err, data) { if (err) { return next(err); } diff --git a/src/search.js b/src/search.js index c4a830f41a..e0be3ecafd 100644 --- a/src/search.js +++ b/src/search.js @@ -40,7 +40,7 @@ search.search = function(data, callback) { if (searchIn === 'posts') { searchInPosts(query, data.postedBy, uid, done); } else if (searchIn === 'users') { - searchInUsers(query, done); + searchInUsers(query, uid, done); } else if (searchIn === 'tags') { searchInTags(query, done); } else { @@ -99,8 +99,8 @@ function searchInPosts(query, postedBy, uid, callback) { }); } -function searchInUsers(query, callback) { - user.search({query: query}, function(err, results) { +function searchInUsers(query, uid, callback) { + user.search({query: query, uid: uid}, function(err, results) { callback(err, results ? results.users : null); }); } diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 2ba036d7e0..9a9ef0ea7e 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -36,7 +36,7 @@ Categories.search = function(socket, data, callback) { var username = data.username, cid = data.cid; - user.search({query: username}, function(err, data) { + user.search({query: username, uid: socket.uid}, function(err, data) { if (err) { return callback(err); } diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index 9189727fbb..5f7199bf29 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -175,7 +175,7 @@ User.deleteUsers = function(socket, uids, callback) { }; User.search = function(socket, data, callback) { - user.search({query: data.query, searchBy: data.searchBy, startsWith: false}, function(err, searchData) { + user.search({query: data.query, searchBy: data.searchBy, startsWith: false, uid: socket.uid}, function(err, searchData) { if (err) { return callback(err); } diff --git a/src/socket.io/user.js b/src/socket.io/user.js index d28421c383..6004bdd469 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -66,7 +66,8 @@ SocketUser.search = function(socket, data, callback) { page: data.page, searchBy: data.searchBy, sortBy: data.sortBy, - filterBy: data.filterBy + filterBy: data.filterBy, + uid: socket.uid }, callback); }; @@ -332,7 +333,7 @@ SocketUser.loadMore = function(socket, data, callback) { var start = parseInt(data.after, 10), end = start + 19; - user.getUsersFromSet(data.set, start, end, function(err, userData) { + user.getUsersFromSet(data.set, socket.uid, start, end, function(err, userData) { if (err) { return callback(err); } diff --git a/src/user.js b/src/user.js index 80f7a951db..c7d8649d22 100644 --- a/src/user.js +++ b/src/user.js @@ -219,18 +219,18 @@ var async = require('async'), } }; - User.getUsersFromSet = function(set, start, stop, callback) { + User.getUsersFromSet = function(set, uid, start, stop, callback) { async.waterfall([ function(next) { User.getUidsFromSet(set, start, stop, next); }, function(uids, next) { - User.getUsers(uids, next); + User.getUsers(uids, uid, next); } ], callback); }; - User.getUsers = function(uids, callback) { + User.getUsers = function(uids, uid, callback) { var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation', 'email:confirmed']; plugins.fireHook('filter:users.addFields', {fields: fields}, function(err, data) { if (err) { @@ -264,7 +264,7 @@ var async = require('async'), user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1; }); - plugins.fireHook('filter:userlist.get', {users: results.userData}, function(err, data) { + plugins.fireHook('filter:userlist.get', {users: results.userData, uid: uid}, function(err, data) { if (err) { return callback(err); } diff --git a/src/user/follow.js b/src/user/follow.js index c3e2cb340c..6b0c0a3973 100644 --- a/src/user/follow.js +++ b/src/user/follow.js @@ -59,7 +59,7 @@ module.exports = function(User) { return callback(err); } - User.getUsers(uids, callback); + User.getUsers(uids, uid, callback); }); } diff --git a/src/user/search.js b/src/user/search.js index 95130bf68f..9df346f6ec 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -14,13 +14,14 @@ module.exports = function(User) { var searchBy = data.searchBy || ['username']; var startsWith = data.hasOwnProperty('startsWith') ? data.startsWith : true; var page = data.page || 1; + var uid = data.uid || 0; if (!query) { return callback(null, {timing: 0, users: [], matchCount: 0, pages: []}); } if (searchBy.indexOf('ip') !== -1) { - return searchByIP(query, callback); + return searchByIP(query, uid, callback); } var startTime = process.hrtime(); @@ -46,7 +47,7 @@ module.exports = function(User) { matchCount = uids.length; uids = uids.slice(start, end); - User.getUsers(uids, next); + User.getUsers(uids, uid, next); }, function(userData, next) { @@ -194,14 +195,14 @@ module.exports = function(User) { } } - function searchByIP(ip, callback) { + function searchByIP(ip, uid, callback) { var start = process.hrtime(); async.waterfall([ function(next) { db.getSortedSetRevRange('ip:' + ip + ':uid', 0, -1, next); }, function(uids, next) { - User.getUsers(uids, next); + User.getUsers(uids, uid, next); }, function(users, next) { var diff = process.hrtime(start); From 530bdbbd1a375b3b51bc2f9b824af36de45c2876 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 29 Jan 2015 17:10:49 -0500 Subject: [PATCH 21/73] dont rename if key doesn't exist --- src/database/redis/main.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/database/redis/main.js b/src/database/redis/main.js index 9b08e4af65..e9bd5b2f09 100644 --- a/src/database/redis/main.js +++ b/src/database/redis/main.js @@ -105,8 +105,13 @@ module.exports = function(redisClient, module) { module.rename = function(oldKey, newKey, callback) { callback = callback || function() {}; - redisClient.rename(oldKey, newKey, function(err, res) { - callback(err); + redisClient.exist(oldKey, function(err, exists) { + if (err || !exists) { + return callback(err); + } + redisClient.rename(oldKey, newKey, function(err, res) { + callback(err); + }); }); }; From d1a1cada19af00a8247f5550aa48a394baeb06ea Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 29 Jan 2015 17:12:12 -0500 Subject: [PATCH 22/73] fix typo --- src/database/redis/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/redis/main.js b/src/database/redis/main.js index e9bd5b2f09..efe1b7958a 100644 --- a/src/database/redis/main.js +++ b/src/database/redis/main.js @@ -105,7 +105,7 @@ module.exports = function(redisClient, module) { module.rename = function(oldKey, newKey, callback) { callback = callback || function() {}; - redisClient.exist(oldKey, function(err, exists) { + redisClient.exists(oldKey, function(err, exists) { if (err || !exists) { return callback(err); } From f3f3ca8e5008a7d5303c6e02660384ad7ba6fcce Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 29 Jan 2015 19:25:01 -0500 Subject: [PATCH 23/73] if key isn't found dont error --- src/database/redis/main.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/database/redis/main.js b/src/database/redis/main.js index efe1b7958a..ebad6ae8e6 100644 --- a/src/database/redis/main.js +++ b/src/database/redis/main.js @@ -105,13 +105,8 @@ module.exports = function(redisClient, module) { module.rename = function(oldKey, newKey, callback) { callback = callback || function() {}; - redisClient.exists(oldKey, function(err, exists) { - if (err || !exists) { - return callback(err); - } - redisClient.rename(oldKey, newKey, function(err, res) { - callback(err); - }); + redisClient.rename(oldKey, newKey, function(err, res) { + callback(err && err.message !== 'ERR no such key' ? err : null); }); }; From 4f5918390a87fe9d13b8f1e30065364d210ceab5 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 30 Jan 2015 14:19:15 -0500 Subject: [PATCH 24/73] if user search is blank, return all users --- public/src/client/users.js | 5 ----- src/user/search.js | 4 ---- 2 files changed, 9 deletions(-) diff --git a/public/src/client/users.js b/public/src/client/users.js index b96f3f5501..c3f374c4ff 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -115,11 +115,6 @@ define('forum/users', function() { var username = $('#search-user').val(); var notify = $('#user-notfound-notify'); page = page || 1; - if (!username) { - notify.html(''); - notify.parent().removeClass('btn-warning label-warning btn-success label-success'); - return; - } notify.html(''); var filters = []; diff --git a/src/user/search.js b/src/user/search.js index 9df346f6ec..34140005e1 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -16,10 +16,6 @@ module.exports = function(User) { var page = data.page || 1; var uid = data.uid || 0; - if (!query) { - return callback(null, {timing: 0, users: [], matchCount: 0, pages: []}); - } - if (searchBy.indexOf('ip') !== -1) { return searchByIP(query, uid, callback); } From 4a7ec3ccc6b0b00b76c0996fa19148a957d6e163 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 30 Jan 2015 15:48:17 -0500 Subject: [PATCH 25/73] added groups page to user profile --- public/src/client/groups/list.js | 4 ++-- src/controllers/accounts.js | 23 +++++++++++++++++++++++ src/routes/index.js | 1 + src/views/config.json | 1 + 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index 0410a9fa17..d0b4c69b50 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -8,9 +8,9 @@ define('forum/groups/list', function() { var groupsEl = $('#groups-list'); groupsEl.on('click', '.list-cover', function() { - var groupName = $(this).parents('[data-group]').attr('data-group'); + var groupSlug = $(this).parents('[data-slug]').attr('data-slug'); - ajaxify.go('groups/' + utils.slugify(groupName)); + ajaxify.go('groups/' + groupSlug); }); // Group creation diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 741de9a626..c55977a351 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -233,6 +233,29 @@ accountsController.getTopics = function(req, res, next) { getFromUserSet('account/topics', 'topics', topics.getTopicsFromSet, 'topics', req, res, next); }; +accountsController.getGroups = function(req, res, next) { + var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; + + getBaseUser(req.params.userslug, callerUID, function(err, userData) { + if (err) { + return next(err); + } + + if (!userData) { + return helpers.notFound(req, res); + } + + groups.getUserGroups([userData.uid], function(err, groups) { + if (err) { + return next(err); + } + + userData.groups = groups[0]; + + res.render('account/groups', userData); + }); + }); +}; function getFromUserSet(tpl, set, method, type, req, res, next) { var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; diff --git a/src/routes/index.js b/src/routes/index.js index 1af03e0930..f8012c9456 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -68,6 +68,7 @@ function accountRoutes(app, middleware, controllers) { setupPageRoute(app, '/user/:userslug/followers', middleware, middlewares, controllers.accounts.getFollowers); setupPageRoute(app, '/user/:userslug/posts', middleware, middlewares, controllers.accounts.getPosts); setupPageRoute(app, '/user/:userslug/topics', middleware, middlewares, controllers.accounts.getTopics); + setupPageRoute(app, '/user/:userslug/groups', middleware, middlewares, controllers.accounts.getGroups); setupPageRoute(app, '/user/:userslug/favourites', middleware, accountMiddlewares, controllers.accounts.getFavourites); setupPageRoute(app, '/user/:userslug/watched', middleware, accountMiddlewares, controllers.accounts.getWatchedTopics); diff --git a/src/views/config.json b/src/views/config.json index 70997cf4a8..26ae7b692c 100644 --- a/src/views/config.json +++ b/src/views/config.json @@ -14,6 +14,7 @@ "^user/.*/watched": "account/watched", "^user/.*/posts": "account/posts", "^user/.*/topics": "account/topics", + "^user/.*/groups": "account/groups", "^user/[^\/]+": "account/profile", "^reset/.*": "reset_code", "^tags/.*": "tag", From da0b2c84e675ec03fc4f73568c65d97afa23036e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 30 Jan 2015 16:24:57 -0500 Subject: [PATCH 26/73] passing memberCount and createTime into getUserGroups --- src/groups.js | 54 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/groups.js b/src/groups.js index 4a7611c531..4eca55c05d 100644 --- a/src/groups.js +++ b/src/groups.js @@ -781,35 +781,51 @@ var async = require('async'), groupData = groupData.filter(function(group) { return parseInt(group.hidden, 10) !== 1 && !!group.userTitle; + }).map(function(group) { + group.createtimeISO = utils.toISOString(group.createtime); + return group; }); - var groupSets = groupData.map(function(group) { - group.labelColor = group.labelColor || '#000000'; + async.map(groupData, function(groupObj, next) { + Groups.getMemberCount(groupObj.name, function(err, memberCount) { + if (err) { return next(err); } - if (!group['cover:url']) { - group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png'; - group['cover:position'] = '50% 50%'; + groupObj.memberCount = memberCount; + next(err, groupObj); + }); + }, function(err, groupData) { + if (err) { + return callback(err); } - return 'group:' + group.name + ':members'; - }); + var groupSets = groupData.map(function(group) { + group.labelColor = group.labelColor || '#000000'; - async.map(uids, function(uid, next) { - db.isMemberOfSortedSets(groupSets, uid, function(err, isMembers) { - if (err) { - return next(err); + if (!group['cover:url']) { + group['cover:url'] = nconf.get('relative_path') + '/images/cover-default.png'; + group['cover:position'] = '50% 50%'; } - var memberOf = []; - isMembers.forEach(function(isMember, index) { - if (isMember) { - memberOf.push(groupData[index]); + return 'group:' + group.name + ':members'; + }); + + async.map(uids, function(uid, next) { + db.isMemberOfSortedSets(groupSets, uid, function(err, isMembers) { + if (err) { + return next(err); } - }); - next(null, memberOf); - }); - }, callback); + var memberOf = []; + isMembers.forEach(function(isMember, index) { + if (isMember) { + memberOf.push(groupData[index]); + } + }); + + next(null, memberOf); + }); + }, callback); + }); }); }); }; From b62337b0b90e124c9f444a54b08d2e6c10ef2921 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 30 Jan 2015 16:27:29 -0500 Subject: [PATCH 27/73] fixed browser title in user groups page --- public/language/en_GB/pages.json | 1 + 1 file changed, 1 insertion(+) diff --git a/public/language/en_GB/pages.json b/public/language/en_GB/pages.json index 8b231f8a94..4095ae38a3 100644 --- a/public/language/en_GB/pages.json +++ b/public/language/en_GB/pages.json @@ -11,6 +11,7 @@ "user.followers": "People who Follow %1", "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", + "user.groups": "%1's Groups", "user.favourites": "%1's Favourite Posts", "user.settings": "User Settings", From 59da48dee5056fe07c7fe6163926643786b2059e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 1 Feb 2015 19:35:41 -0500 Subject: [PATCH 28/73] added too-many-messages language key --- public/language/en_GB/error.json | 1 + 1 file changed, 1 insertion(+) diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index 7e21a1290a..47b0bf8938 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -83,6 +83,7 @@ "cant-chat-with-yourself": "You can't chat with yourself!", "chat-restricted": "This user has restricted their chat messages. They must follow you before you can chat with them", + "too-many-messages": "You have sent too many messages, please wait awhile.", "reputation-system-disabled": "Reputation system is disabled.", "downvoting-disabled": "Downvoting is disabled", From c85958626990ab0e1cf9795e9697f9ef7d63df55 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 00:12:47 -0500 Subject: [PATCH 29/73] calculate topic post indices instead of querying db --- src/controllers/topics.js | 8 +++----- src/topics.js | 30 ++++++++++-------------------- src/topics/posts.js | 36 +++++++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/controllers/topics.js b/src/controllers/topics.js index f470cfc6d1..83d873b583 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -116,15 +116,13 @@ topicsController.get = function(req, res, next) { } topicData.pageCount = pageCount; - topicData.currentPage = page; - if(page > 1) { + + if (page > 1) { topicData.posts.splice(0, 1); } - plugins.fireHook('filter:controllers.topic.get', topicData, function(err, topicData) { - next(null, topicData); - }); + plugins.fireHook('filter:controllers.topic.get', topicData, next); }); }, function (topicData, next) { diff --git a/src/topics.js b/src/topics.js index 1e9df9958f..692088ec52 100644 --- a/src/topics.js +++ b/src/topics.js @@ -215,25 +215,11 @@ var async = require('async'), } async.parallel({ + mainPost: function(next) { + Topics.getMainPost(tid, uid, next); + }, posts: function(next) { - posts.getPidsFromSet(set, start, end, reverse, function(err, pids) { - if (err) { - return next(err); - } - - pids = topicData.mainPid ? [topicData.mainPid].concat(pids) : pids; - - if (!pids.length) { - return next(null, []); - } - posts.getPostsByPids(pids, uid, function(err, posts) { - if (err) { - return next(err); - } - - Topics.addPostData(posts, uid, next); - }); - }); + Topics.getTopicPosts(tid, set, start, end, uid, reverse, next); }, category: async.apply(Topics.getCategoryData, tid), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', []), @@ -244,7 +230,7 @@ var async = require('async'), return callback(err); } - topicData.posts = results.posts; + topicData.posts = results.mainPost ? [results.mainPost].concat(results.posts) : results.posts; topicData.category = results.category; topicData.thread_tools = results.threadTools; topicData.tags = results.tags; @@ -280,7 +266,11 @@ var async = require('async'), if (err) { return callback(err); } - + postData.forEach(function(post) { + if (post) { + post.index = 0; + } + }); Topics.addPostData(postData, uid, callback); }); }); diff --git a/src/topics/posts.js b/src/topics/posts.js index d4809f2a79..6d4cd9be8f 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -29,15 +29,28 @@ module.exports = function(Topics) { ], callback); }; - Topics.getTopicPosts = function(tid, set, start, end, uid, reverse, callback) { callback = callback || function() {}; - posts.getPostsByTid(tid, set, start, end, uid, reverse, function(err, postData) { + async.parallel({ + posts: function(next) { + posts.getPostsByTid(tid, set, start, end, uid, reverse, next); + }, + postCount: function(next) { + Topics.getTopicField(tid, 'postcount', next); + } + }, function(err, results) { if (err) { return callback(err); } - Topics.addPostData(postData, uid, callback); + var indices = Topics.calculatePostIndices(start, end, results.postCount, reverse); + results.posts.forEach(function(post, index) { + if (post) { + post.index = indices[index]; + } + }); + + Topics.addPostData(results.posts, uid, callback); }); }; @@ -103,9 +116,6 @@ module.exports = function(Topics) { }, privileges: function(next) { privileges.posts.get(pids, uid, next); - }, - indices: function(next) { - posts.getPostIndices(postData, uid, next); } }, function(err, results) { if (err) { @@ -114,7 +124,6 @@ module.exports = function(Topics) { postData.forEach(function(postObj, i) { if (postObj) { - postObj.index = results.indices[i]; postObj.deleted = parseInt(postObj.deleted, 10) === 1; postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]); postObj.editor = postObj.editor ? results.editors[postObj.editor] : null; @@ -141,6 +150,19 @@ module.exports = function(Topics) { }); }; + Topics.calculatePostIndices = function(start, end, postCount, reverse) { + var indices = []; + var count = end - start + 1; + for(var i=0; i Date: Sat, 7 Feb 2015 00:19:22 -0500 Subject: [PATCH 30/73] pass on mainPid --- src/topics.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/topics.js b/src/topics.js index 692088ec52..a0aeed33db 100644 --- a/src/topics.js +++ b/src/topics.js @@ -216,7 +216,7 @@ var async = require('async'), async.parallel({ mainPost: function(next) { - Topics.getMainPost(tid, uid, next); + getMainPosts([topicData.mainPid], uid, next); }, posts: function(next) { Topics.getTopicPosts(tid, set, start, end, uid, reverse, next); @@ -230,7 +230,7 @@ var async = require('async'), return callback(err); } - topicData.posts = results.mainPost ? [results.mainPost].concat(results.posts) : results.posts; + topicData.posts = Array.isArray(results.mainPost) && results.mainPost.length ? [results.mainPost[0]].concat(results.posts) : results.posts; topicData.category = results.category; topicData.thread_tools = results.threadTools; topicData.tags = results.tags; @@ -262,19 +262,23 @@ var async = require('async'), return topic ? topic.mainPid : null; }); - posts.getPostsByPids(mainPids, uid, function(err, postData) { - if (err) { - return callback(err); + getMainPosts(mainPids, uid, callback); + }); + }; + + function getMainPosts(mainPids, uid, callback) { + posts.getPostsByPids(mainPids, uid, function(err, postData) { + if (err) { + return callback(err); + } + postData.forEach(function(post) { + if (post) { + post.index = 0; } - postData.forEach(function(post) { - if (post) { - post.index = 0; - } - }); - Topics.addPostData(postData, uid, callback); }); + Topics.addPostData(postData, uid, callback); }); - }; + } Topics.getTopicField = function(tid, field, callback) { db.getObjectField('topic:' + tid, field, callback); From 8bbd7d971b83371c1d61d7e9f47c1a4b41c99f7c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 00:52:53 -0500 Subject: [PATCH 31/73] fix index to post if sorting is by votes and pagination is used --- src/controllers/topics.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 83d873b583..498a3d81db 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -89,17 +89,23 @@ topicsController.get = function(req, res, next) { var postIndex = 0; page = parseInt(req.query.page, 10) || 1; req.params.post_index = parseInt(req.params.post_index, 10) || 0; + if (reverse && req.params.post_index === 1) { + req.params.post_index = 0; + } if (!settings.usePagination) { if (reverse) { - if (req.params.post_index === 1) { - req.params.post_index = 0; - } - postIndex = Math.max(postCount - (req.params.post_index || postCount) - (settings.postsPerPage - 1), 0); + postIndex = Math.max(0, postCount - (req.params.post_index || postCount) - (settings.postsPerPage - 1)); } else { - postIndex = Math.max((req.params.post_index || 1) - (settings.postsPerPage + 1), 0); + postIndex = Math.max(0, (req.params.post_index || 1) - (settings.postsPerPage + 1)); } } else if (!req.query.page) { - var index = Math.max(req.params.post_index - 1, 0) || 0; + var index = 0; + if (reverse) { + index = Math.max(0, postCount - (req.params.post_index || postCount)); + } else { + index = Math.max(0, req.params.post_index - 1) || 0; + } + page = Math.max(1, Math.ceil(index / settings.postsPerPage)); } From eff1256dfbde2e2721766e661fe386593e87928a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 20:00:07 -0500 Subject: [PATCH 32/73] search sort, search in posts, titles, posts& titles --- public/language/en_GB/search.json | 15 +- public/src/app.js | 2 +- public/src/client/search.js | 41 +++-- public/src/modules/search.js | 58 ++++--- src/controllers/search.js | 3 +- src/search.js | 244 +++++++++++++++++++++++++----- 6 files changed, 286 insertions(+), 77 deletions(-) diff --git a/public/language/en_GB/search.json b/public/language/en_GB/search.json index 4f099ef554..b8a970d6a9 100644 --- a/public/language/en_GB/search.json +++ b/public/language/en_GB/search.json @@ -3,6 +3,8 @@ "no-matches": "No matches found", "in": "In", "by": "By", + "titles": "Titles", + "titles-posts": "Titles and Posts", "posted-by": "Posted by", "in-categories": "In Categories", "search-child-categories": "Search child categories", @@ -19,5 +21,16 @@ "one-month": "One month", "three-months": "Three months", "six-months": "Six months", - "one-year": "One year" + "one-year": "One year", + "sort-by": "Sort by", + "post-time": "Post time", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } diff --git a/public/src/app.js b/public/src/app.js index 35037c8033..1e5b92cf4d 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -436,7 +436,7 @@ app.uid = null; e.preventDefault(); var input = $(this).find('input'); - search.query({term: input.val(), in: 'posts'}, function() { + search.query({term: input.val()}, function() { input.val(''); }); }); diff --git a/public/src/client/search.js b/public/src/client/search.js index 029f7b811a..691ab51281 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -15,26 +15,31 @@ define('forum/search', ['search'], function(searchModule) { fillOutFormFromQueryParams(); searchIn.on('change', function() { - $('.post-search-item').toggleClass('hide', searchIn.val() !== 'posts'); + updateFormItemVisiblity(searchIn.val()); }); highlightMatches(searchQuery); $('#advanced-search').off('submit').on('submit', function(e) { e.preventDefault(); - var input = $(this).find('#search-input'); + var $this = $(this) + var input = $this.find('#search-input'); - searchModule.query({ + var searchData = { term: input.val(), - in: $(this).find('#search-in').val(), - by: $(this).find('#posted-by-user').val(), - categories: $(this).find('#posted-in-categories').val(), - searchChildren: $(this).find('#search-children').is(':checked'), - replies: $(this).find('#reply-count').val(), - repliesFilter: $(this).find('#reply-count-filter').val(), - timeFilter: $(this).find('#post-time-filter').val(), - timeRange: $(this).find('#post-time-range').val() - }, function() { + in: $this.find('#search-in').val(), + by: $this.find('#posted-by-user').val(), + categories: $this.find('#posted-in-categories').val(), + searchChildren: $this.find('#search-children').is(':checked'), + replies: $this.find('#reply-count').val(), + repliesFilter: $this.find('#reply-count-filter').val(), + timeFilter: $this.find('#post-time-filter').val(), + timeRange: $this.find('#post-time-range').val(), + sortBy: $this.find('#post-sort-by').val(), + sortDirection: $this.find('#post-sort-direction').val() + }; + + searchModule.query(searchData, function() { input.val(''); }); }); @@ -42,12 +47,17 @@ define('forum/search', ['search'], function(searchModule) { enableAutoComplete(); }; + function updateFormItemVisiblity(searchIn) { + var hide = searchIn.indexOf('posts') === -1 && searchIn.indexOf('titles') === -1; + $('.post-search-item').toggleClass('hide', hide); + } + function fillOutFormFromQueryParams() { var params = utils.params(); if (params) { if (params.in) { $('#search-in').val(params.in); - $('.post-search-item').toggleClass('hide', params.in !== 'posts'); + updateFormItemVisiblity(params.in); } if (params.by) { @@ -71,6 +81,11 @@ define('forum/search', ['search'], function(searchModule) { $('#post-time-range').val(params.timeRange); $('#post-time-filter').val(params.timeFilter); } + + if (params.sortBy) { + $('#post-sort-by').val(params.sortBy); + $('#post-sort-direction').val(params.sortDirection); + } } } diff --git a/public/src/modules/search.js b/public/src/modules/search.js index 2b90ab290a..9b896b0394 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -9,8 +9,6 @@ define('search', ['navigator'], function(nav) { Search.query = function(data, callback) { var term = data.term; - var searchIn = data.in || 'posts'; - var postedBy = data.by || ''; // Detect if a tid was specified var topicSearch = term.match(/in:topic-([\d]+)/); @@ -23,29 +21,8 @@ define('search', ['navigator'], function(nav) { } catch(e) { return app.alertError('[[error:invalid-search-term]]'); } - var query = {in: searchIn}; - if (postedBy && searchIn === 'posts') { - query.by = postedBy; - } - - if (data.categories && data.categories.length) { - query.categories = data.categories; - if (data.searchChildren) { - query.searchChildren = data.searchChildren; - } - } - - if (parseInt(data.replies, 10) > 0) { - query.replies = data.replies; - query.repliesFilter = data.repliesFilter || 'atleast'; - } - if (data.timeRange) { - query.timeRange = data.timeRange; - query.timeFilter = data.timeFilter || 'newer'; - } - - ajaxify.go('search/' + term + '?' + decodeURIComponent($.param(query))); + ajaxify.go('search/' + term + '?' + createQueryString(data)); callback(); } else { var cleanedTerm = term.replace(topicSearch[0], ''), @@ -55,6 +32,39 @@ define('search', ['navigator'], function(nav) { } }; + function createQueryString(data) { + var searchIn = data.in || 'titlesposts'; + var postedBy = data.by || ''; + var query = {in: searchIn}; + + if (postedBy && (searchIn === 'posts' || searchIn === 'titles' || searchIn === 'titlesposts')) { + query.by = postedBy; + } + + if (data.categories && data.categories.length) { + query.categories = data.categories; + if (data.searchChildren) { + query.searchChildren = data.searchChildren; + } + } + + if (parseInt(data.replies, 10) > 0) { + query.replies = data.replies; + query.repliesFilter = data.repliesFilter || 'atleast'; + } + + if (data.timeRange) { + query.timeRange = data.timeRange; + query.timeFilter = data.timeFilter || 'newer'; + } + + if (data.sortBy) { + query.sortBy = data.sortBy; + query.sortDirection = data.sortDirection; + } + return decodeURIComponent($.param(query)); + } + Search.queryTopic = function(tid, term, callback) { socket.emit('topics.search', { tid: tid, diff --git a/src/controllers/search.js b/src/controllers/search.js index 2c0222a6b3..f5f93f6874 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -28,7 +28,6 @@ searchController.search = function(req, res, next) { time: 0, search_query: '', posts: [], - topics: [], users: [], tags: [], categories: categories, @@ -49,6 +48,8 @@ searchController.search = function(req, res, next) { repliesFilter: req.query.repliesFilter, timeRange: req.query.timeRange, timeFilter: req.query.timeFilter, + sortBy: req.query.sortBy, + sortDirection: req.query.sortDirection, page: page, uid: uid }, function(err, results) { diff --git a/src/search.js b/src/search.js index b8f8ffa849..6e70cfa1bc 100644 --- a/src/search.js +++ b/src/search.js @@ -8,7 +8,8 @@ var async = require('async'), categories = require('./categories'), user = require('./user'), plugins = require('./plugins'), - privileges = require('./privileges'); + privileges = require('./privileges'), + utils = require('../public/src/utils'); var search = {}; @@ -21,6 +22,9 @@ search.search = function(data, callback) { } result.search_query = query; + if (searchIn === 'titles' || searchIn === 'titlesposts') { + searchIn = 'posts'; + } result[searchIn] = data.matches; result.matchCount = data.matchCount; result.hidePostedBy = searchIn !== 'posts'; @@ -31,7 +35,7 @@ search.search = function(data, callback) { var start = process.hrtime(); var query = data.query; - var searchIn = data.searchIn || 'posts'; + var searchIn = data.searchIn || 'titlesposts'; var result = { posts: [], @@ -39,8 +43,8 @@ search.search = function(data, callback) { tags: [] }; - if (searchIn === 'posts') { - searchInPosts(query, data, done); + if (searchIn === 'posts' || searchIn === 'titles' || searchIn === 'titlesposts') { + searchInContent(query, data, done); } else if (searchIn === 'users') { searchInUsers(query, data.uid, done); } else if (searchIn === 'tags') { @@ -50,14 +54,22 @@ search.search = function(data, callback) { } }; -function searchInPosts(query, data, callback) { +function searchInContent(query, data, callback) { data.uid = data.uid || 0; async.parallel({ pids: function(next) { - searchQuery('post', query, next); + if (data.searchIn === 'posts' || data.searchIn === 'titlesposts') { + searchQuery('post', query, next); + } else { + next(null, []); + } }, tids: function(next) { - searchQuery('topic', query, next); + if (data.searchIn === 'titles' || data.searchIn === 'titlesposts') { + searchQuery('topic', query, next); + } else { + next(null, []); + } }, searchCategories: function(next) { getSearchCategories(data, next); @@ -104,24 +116,9 @@ function searchInPosts(query, data, callback) { } function filterAndSort(pids, data, searchCategories, callback) { - var postFields = ['pid', 'tid', 'timestamp']; - var topicFields = []; - - if (data.postedBy) { - postFields.push('uid'); - } - - if (searchCategories.length) { - topicFields.push('cid'); - } - - if (data.replies) { - topicFields.push('postcount'); - } - async.parallel({ posts: function(next) { - getMatchedPosts(pids, postFields, topicFields, next); + getMatchedPosts(pids, data, searchCategories, next); }, postedByUid: function(next) { if (data.postedBy) { @@ -154,28 +151,130 @@ function filterAndSort(pids, data, searchCategories, callback) { }); } -function getMatchedPosts(pids, postFields, topicFields, callback) { - var keys = pids.map(function(pid) { - return 'post:' + pid; - }); +function getMatchedPosts(pids, data, searchCategories, callback) { + var postFields = ['pid', 'tid', 'timestamp']; + var topicFields = []; + var categoryFields = []; + + if (data.postedBy) { + postFields.push('uid'); + } + + if (searchCategories.length || (data.sortBy && data.sortBy.startsWith('category.'))) { + topicFields.push('cid'); + } + + if (data.replies) { + topicFields.push('postcount'); + } + + if (data.sortBy) { + if (data.sortBy.startsWith('topic.')) { + topicFields.push(data.sortBy.split('.')[1]); + } else if (data.sortBy.startsWith('user.')) { + postFields.push('uid'); + } else if (data.sortBy.startsWith('category.')) { + categoryFields.push(data.sortBy.split('.')[1]); + } else if (data.sortBy.startsWith('teaser')) { + topicFields.push('teaserPid'); + } + } + var posts; async.waterfall([ function(next) { + var keys = pids.map(function(pid) { + return 'post:' + pid; + }); db.getObjectsFields(keys, postFields, next); }, function(_posts, next) { posts = _posts; - if (!topicFields.length) { - return callback(null, posts); - } - var topicKeys = posts.map(function(post) { - return 'topic:' + post.tid; - }); - db.getObjectsFields(topicKeys, topicFields, next); + + async.parallel({ + users: function(next) { + if (data.sortBy && data.sortBy.startsWith('user')) { + var uids = posts.map(function(post) { + return post.uid; + }); + user.getMultipleUserFields(uids, ['username'], next); + } else { + next(); + } + }, + topics: function(next) { + if (!topicFields.length) { + return next(); + } + + var topics; + async.waterfall([ + function(next) { + var topicKeys = posts.map(function(post) { + return 'topic:' + post.tid; + }); + db.getObjectsFields(topicKeys, topicFields, next); + }, + function(_topics, next) { + topics = _topics; + + async.parallel({ + teasers: function(next) { + if (topicFields.indexOf('teaserPid') !== -1) { + var teaserKeys = topics.map(function(topic) { + return 'post:' + topic.teaserPid; + }); + db.getObjectsFields(teaserKeys, ['timestamp'], next); + } else { + next(); + } + }, + categories: function(next) { + if (!categoryFields.length) { + return next(); + } + var cids = topics.map(function(topic) { + return 'category:' + topic.cid; + }); + db.getObjectsFields(cids, categoryFields, next); + } + }, next); + } + ], function(err, results) { + if (err) { + return next(err); + } + + topics.forEach(function(topic, index) { + if (topic && results.categories && results.categories[index]) { + topic.category = results.categories[index]; + } + if (topic && results.teasers && results.teasers[index]) { + topic.teaser = results.teasers[index]; + } + }); + + next(null, topics); + }); + } + }, next); }, - function(topics, next) { + function(results, next) { + posts.forEach(function(post, index) { - post.topic = topics[index]; + if (results.topics && results.topics[index]) { + post.topic = results.topics[index]; + if (results.topics[index].category) { + post.category = results.topics[index].category; + } + if (results.topics[index].teaser) { + post.teaser = results.topics[index].teaser; + } + } + + if (results.users && results.users[index]) { + post.user = results.users[index]; + } }); next(null, posts); @@ -236,8 +335,75 @@ function filterByTimerange(posts, timeRange, timeFilter) { } function sortPosts(posts, data) { + if (!posts.length) { + return; + } + data.sortBy = data.sortBy || 'timestamp'; + data.sortDirection = data.sortDirection || 'desc'; + if (data.sortBy === 'timestamp') { + if (data.sortDirection === 'desc') { + posts.sort(function(p1, p2) { + return p2.timestamp - p1.timestamp; + }); + } else { + posts.sort(function(p1, p2) { + return p1.timestamp - p2.timestamp; + }); + } + + return; + } + + var firstPost = posts[0]; + var fields = data.sortBy.split('.'); + + if (!fields || fields.length !== 2 || !firstPost[fields[0]] || !firstPost[fields[0]][fields[1]]) { + return; + } + + var value = firstPost[fields[0]][fields[1]]; + var isNumeric = utils.isNumber(value); + + if (isNumeric) { + if (data.sortDirection === 'desc') { + sortDescendingNumeric(posts, fields); + } else { + sortAscendingNumeric(posts, fields); + } + } else { + if (data.sortDirection === 'desc') { + sortDescendingAlpha(posts, fields); + } else { + sortAscendingAlpha(posts, fields); + } + } +} + +function sortAscendingNumeric(posts, fields) { + posts.sort(function(p1, p2) { + return p1[fields[0]][fields[1]] - p2[fields[0]][fields[1]]; + }); +} + +function sortDescendingNumeric(posts, fields) { posts.sort(function(p1, p2) { - return p2.timestamp - p1.timestamp; + return p2[fields[0]][fields[1]] - p1[fields[0]][fields[1]]; + }); +} + +function sortAscendingAlpha(posts, fields) { + posts.sort(function(p1, p2) { + if (p1[fields[0]][fields[1]] > p2[fields[0]][fields[1]]) return -1; + if (p1[fields[0]][fields[1]] < p2[fields[0]][fields[1]]) return 1; + return 0; + }); +} + +function sortDescendingAlpha(posts, fields) { + posts.sort(function(p1, p2) { + if (p1[fields[0]][fields[1]] < p2[fields[0]][fields[1]]) return -1; + if (p1[fields[0]][fields[1]] > p2[fields[0]][fields[1]]) return 1; + return 0; }); } @@ -311,6 +477,10 @@ function searchInTags(query, callback) { } function getMainPids(tids, callback) { + if (!Array.isArray(tids) || !tids.length) { + return callback(null, []); + } + topics.getTopicsFields(tids, ['mainPid'], function(err, topics) { if (err) { return callback(err); From 4d342410728a305a77607b71009f7f94774eaab0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 20:02:21 -0500 Subject: [PATCH 33/73] missing semicolon --- public/src/client/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/search.js b/public/src/client/search.js index 691ab51281..c1761b20cd 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -22,7 +22,7 @@ define('forum/search', ['search'], function(searchModule) { $('#advanced-search').off('submit').on('submit', function(e) { e.preventDefault(); - var $this = $(this) + var $this = $(this); var input = $this.find('#search-input'); var searchData = { From d96e4ec22af83638a663abe7aeaf4ec8c3d6f014 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 20:30:03 -0500 Subject: [PATCH 34/73] fix category filter and pagination, strip marquee --- public/src/utils.js | 10 +++++++++- src/controllers/search.js | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/public/src/utils.js b/public/src/utils.js index b58984a20e..3b82573c9b 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -204,7 +204,15 @@ tags : ['a', 'abbr', 'acronym', 'address', 'applet', 'area', 'article', 'aside', 'audio', 'b', 'base', 'basefont', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'map', 'mark', 'menu', 'meta', 'meter', 'nav', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr'], - stripTags : ['abbr', 'acronym', 'address', 'applet', 'area', 'article', 'aside', 'audio', 'base', 'basefont', 'bdi', 'bdo', 'big', 'body', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hr', 'html', 'iframe', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'map', 'mark', 'menu', 'meta', 'meter', 'nav', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'param', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'source', 'span', 'strike', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr'], + stripTags : ['abbr', 'acronym', 'address', 'applet', 'area', 'article', 'aside', 'audio', 'base', 'basefont', + 'bdi', 'bdo', 'big', 'blink', 'body', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', + 'command', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'embed', + 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'head', 'header', 'hr', 'html', 'iframe', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', + 'map', 'mark', 'marquee', 'menu', 'meta', 'meter', 'nav', 'noframes', 'noscript', 'object', 'ol', 'optgroup', 'option', + 'output', 'param', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', + 'source', 'span', 'strike', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', + 'th', 'thead', 'time', 'title', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr'], escapeRegexChars: function(text) { return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); diff --git a/src/controllers/search.js b/src/controllers/search.js index f5f93f6874..d9e6bc9f3a 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -37,6 +37,9 @@ searchController.search = function(req, res, next) { req.params.term = validator.escape(req.params.term); var page = Math.max(1, parseInt(req.query.page, 10)) || 1; + if (req.query.categories && !Array.isArray(req.query.categories)) { + req.query.categories = [req.query.categories]; + } search.search({ query: req.params.term, From 5cc728994b0cc300dbcd39b0fb45f4f10371c9b4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 20:55:57 -0500 Subject: [PATCH 35/73] dont need hidePostedBy --- src/search.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/search.js b/src/search.js index 6e70cfa1bc..e26cb75f70 100644 --- a/src/search.js +++ b/src/search.js @@ -27,7 +27,6 @@ search.search = function(data, callback) { } result[searchIn] = data.matches; result.matchCount = data.matchCount; - result.hidePostedBy = searchIn !== 'posts'; result.time = (process.elapsedTimeSince(start) / 1000).toFixed(2); callback(null, result); } From 4d63a7c0206e9459734c699e1b7b0e4f9904d00c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 23:00:58 -0500 Subject: [PATCH 36/73] closes ##2705 --- src/topics.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/topics.js b/src/topics.js index 8ad164df1f..a9514dabba 100644 --- a/src/topics.js +++ b/src/topics.js @@ -222,7 +222,7 @@ var async = require('async'), Topics.getTopicPosts(tid, set, start, end, uid, reverse, next); }, category: async.apply(Topics.getCategoryData, tid), - threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', []), + threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), tags: async.apply(Topics.getTopicTagsObjects, tid), isFollowing: async.apply(Topics.isFollowing, [tid], uid) }, function(err, results) { @@ -232,7 +232,7 @@ var async = require('async'), topicData.posts = Array.isArray(results.mainPost) && results.mainPost.length ? [results.mainPost[0]].concat(results.posts) : results.posts; topicData.category = results.category; - topicData.thread_tools = results.threadTools; + topicData.thread_tools = results.threadTools.tools; topicData.tags = results.tags; topicData.isFollowing = results.isFollowing[0]; From 138a13f1b25060d7b3fbc1cd20a6f2d3e8cab7c6 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 23:10:54 -0500 Subject: [PATCH 37/73] dont crash if searchQuery is falsy --- public/src/client/search.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/src/client/search.js b/public/src/client/search.js index c1761b20cd..42bf7dd4fe 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -90,6 +90,9 @@ define('forum/search', ['search'], function(searchModule) { } function highlightMatches(searchQuery) { + if (!searchQuery) { + return; + } var searchTerms = searchQuery.split(' '); var regexes = []; for (var i=0; i Date: Sat, 7 Feb 2015 23:32:42 -0500 Subject: [PATCH 38/73] show seconds like search page --- public/language/en_GB/users.json | 2 +- src/notifications.js | 10 ---------- src/user/search.js | 5 +---- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/public/language/en_GB/users.json b/public/language/en_GB/users.json index 683ad7e155..0f3687c9ed 100644 --- a/public/language/en_GB/users.json +++ b/public/language/en_GB/users.json @@ -5,7 +5,7 @@ "search": "Search", "enter_username": "Enter a username to search", "load_more": "Load More", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/src/notifications.js b/src/notifications.js index 96502508f7..5d10686212 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -270,12 +270,6 @@ var async = require('async'), }; Notifications.prune = function() { - var start = process.hrtime(); - - if (process.env.NODE_ENV === 'development') { - winston.info('[notifications.prune] Removing expired notifications from the database.'); - } - var week = 604800000, numPruned = 0; @@ -307,10 +301,6 @@ var async = require('async'), if (err) { return winston.error('Encountered error pruning notifications: ' + err.message); } - - if (process.env.NODE_ENV === 'development') { - winston.info('[notifications.prune] Notification pruning completed. ' + numPruned + ' expired notification' + (numPruned !== 1 ? 's' : '') + ' removed.'); - } }); }); }; diff --git a/src/user/search.js b/src/user/search.js index a593258f11..20bbec2258 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -46,11 +46,8 @@ module.exports = function(User) { User.getUsers(uids, uid, next); }, function(userData, next) { - - var diff = process.hrtime(startTime); - var timing = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(1); var data = { - timing: timing, + timing: (process.elapsedTimeSince(startTime) / 1000).toFixed(2), users: userData, matchCount: matchCount }; From 10928ed11b9eb431da72987f484fe2b0db7d946e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 7 Feb 2015 23:51:25 -0500 Subject: [PATCH 39/73] escape post content --- src/posts/summary.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/posts/summary.js b/src/posts/summary.js index dd537ce8d6..962a51aaa6 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -82,6 +82,7 @@ module.exports = function(Posts) { if (options.stripTags) { post.content = stripTags(post.content); } + post.content = post.content ? validator.escape(post.content) : post.content; return next(null, post); } From 7f6518e4a60797e2747ac0aaff520177e845ace4 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sun, 8 Feb 2015 13:38:42 -0500 Subject: [PATCH 40/73] private plugin link fix --- public/src/client/account/header.js | 12 ++++++++---- src/middleware/middleware.js | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index f0a0c112fa..6dcc0b27e4 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -1,3 +1,6 @@ +'use strict'; +/* globals define, app, ajaxify */ + define('forum/account/header', function() { var AccountHeader = {}; @@ -7,10 +10,11 @@ define('forum/account/header', function() { }; function displayAccountMenus() { - $('.account-sub-links .plugin-link').each(function() { - var $this = $(this); - $this.toggleClass('hide', $this.hasClass('private')); - }); + if (!app.user.uid || app.user.uid !== parseInt(ajaxify.variables.get('theirid'), 10)) { + $('.account-sub-links .plugin-link.private').each(function() { + $(this).addClass('hide'); + }); + } } function selectActivePill() { diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 111b0b1ceb..f95c70e3ac 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -340,6 +340,7 @@ middleware.renderHeader = function(req, res, callback) { return; } results.user.isAdmin = results.isAdmin || false; + results.user.uid = parseInt(results.user.uid, 10); results.user['email:confirmed'] = parseInt(results.user['email:confirmed'], 10) === 1; templateValues.browserTitle = results.title; From 1843d0364e586eae05bd1ea8723175d1b6eda3e8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 8 Feb 2015 21:06:38 -0500 Subject: [PATCH 41/73] closed #2708 --- public/language/en_GB/email.json | 4 ++ public/language/en_GB/reset_password.json | 4 +- public/src/client/reset_code.js | 47 +++++++++------------ src/controllers/index.js | 9 ++-- src/socket.io/user.js | 27 +++++++++--- src/upgrade.js | 22 +++++++++- src/user/reset.js | 17 +++----- src/views/emails/reset_notify.tpl | 10 +++++ src/views/emails/reset_notify_plaintext.tpl | 8 ++++ 9 files changed, 98 insertions(+), 50 deletions(-) create mode 100644 src/views/emails/reset_notify.tpl create mode 100644 src/views/emails/reset_notify_plaintext.tpl diff --git a/public/language/en_GB/email.json b/public/language/en_GB/email.json index efee400748..33fd28377b 100644 --- a/public/language/en_GB/email.json +++ b/public/language/en_GB/email.json @@ -13,6 +13,10 @@ "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", + "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/en_GB/reset_password.json b/public/language/en_GB/reset_password.json index 27537ffdf2..96ba318a8a 100644 --- a/public/language/en_GB/reset_password.json +++ b/public/language/en_GB/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Please enter your email address and we will send you an email with instructions on how to reset your account.", "enter_email_address": "Enter Email Address", "password_reset_sent": "Password Reset Sent", - "invalid_email": "Invalid Email / Email does not exist!" + "invalid_email": "Invalid Email / Email does not exist!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } diff --git a/public/src/client/reset_code.js b/public/src/client/reset_code.js index 9a7fc80075..f690a2b152 100644 --- a/public/src/client/reset_code.js +++ b/public/src/client/reset_code.js @@ -11,44 +11,39 @@ define('forum/reset_code', function() { resetEl.on('click', function() { if (password.val().length < 6) { - $('#error').addClass('hide').hide(); - noticeEl.find('strong').html('Invalid Password'); - noticeEl.find('p').html('The password entered is too short, please pick a different password.'); - noticeEl.removeClass('hide').css({display: 'block'}); - } else if (password.value !== repeat.value) { - $('#error').hide(); - noticeEl.find('strong').html('Invalid Password'); - noticeEl.find('p').html('The two passwords you\'ve entered do not match.'); - noticeEl.removeClass('hide').css({display: 'block'}); + app.alertError('[[reset_password:password_too_short]]'); + } else if (password.val() !== repeat.val()) { + app.alertError('[[reset_password:passwords_do_not_match]]'); } else { + resetEl.prop('disabled', true).html(' Changing Password'); socket.emit('user.reset.commit', { code: reset_code, password: password.val() }, function(err) { - if(err) { + if (err) { + ajaxify.refresh(); return app.alertError(err.message); } - $('#error').addClass('hide').hide(); - $('#notice').addClass('hide').hide(); - $('#success').removeClass('hide').addClass('show').show(); + + window.location.href = RELATIVE_PATH + '/login'; }); } }); - socket.emit('user.reset.valid', reset_code, function(err, valid) { - if(err) { - return app.alertError(err.message); - } + // socket.emit('user.reset.valid', reset_code, function(err, valid) { + // if(err) { + // return app.alertError(err.message); + // } - if (valid) { - resetEl.prop('disabled', false); - } else { - var formEl = $('#reset-form'); - // Show error message - $('#error').show(); - formEl.remove(); - } - }); + // if (valid) { + // resetEl.prop('disabled', false); + // } else { + // var formEl = $('#reset-form'); + // // Show error message + // $('#error').show(); + // formEl.remove(); + // } + // }); }; return ResetCode; diff --git a/src/controllers/index.js b/src/controllers/index.js index 797d30e22d..ff337250f4 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -106,9 +106,12 @@ Controllers.home = function(req, res, next) { Controllers.reset = function(req, res, next) { if (req.params.code) { - res.render('reset_code', { - reset_code: req.params.code ? req.params.code : null, - breadcrumbs: helpers.buildBreadcrumbs([{text: '[[reset_password:reset_password]]', url: '/reset'}, {text: '[[reset_password:update_password]]'}]) + user.reset.validate(req.params.code, function(err, valid) { + res.render('reset_code', { + valid: valid, + reset_code: req.params.code ? req.params.code : null, + breadcrumbs: helpers.buildBreadcrumbs([{text: '[[reset_password:reset_password]]', url: '/reset'}, {text: '[[reset_password:update_password]]'}]) + }); }); } else { res.render('reset', { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 28feb5616f..4df8915994 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -13,6 +13,8 @@ var async = require('async'), websockets = require('./index'), meta = require('../meta'), events = require('../events'), + emailer = require('../emailer'), + db = require('../database'), SocketUser = {}; SocketUser.exists = function(socket, data, callback) { @@ -81,23 +83,34 @@ SocketUser.reset.send = function(socket, email, callback) { } }; -SocketUser.reset.valid = function(socket, code, callback) { - if (code) { - user.reset.validate(code, callback); - } -}; - SocketUser.reset.commit = function(socket, data, callback) { if(data && data.code && data.password) { - user.reset.commit(data.code, data.password, function(err) { + async.series([ + async.apply(db.getObjectField, 'reset:uid', data.code), + async.apply(user.reset.commit, data.code, data.password) + ], function(err, data) { if (err) { return callback(err); } + + var uid = data[0], + now = new Date(), + parsedDate = now.getFullYear() + '/' + (now.getMonth()+1) + '/' + now.getDate(); + + user.getUserField(uid, 'username', function(err, username) { + emailer.send('reset_notify', uid, { + username: username, + date: parsedDate, + site_title: meta.config.title || 'NodeBB', + subject: '[[email:reset.notify.subject]]' + }); + }); events.log({ type: 'password-reset', uid: socket.uid, ip: socket.ip }); + callback(); }); } }; diff --git a/src/upgrade.js b/src/upgrade.js index ed82dcd20a..52347bcb40 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -21,7 +21,7 @@ var db = require('./database'), schemaDate, thisSchemaDate, // IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema - latestSchema = Date.UTC(2015, 0, 30); + latestSchema = Date.UTC(2015, 1, 8); Upgrade.check = function(callback) { db.get('schemaDate', function(err, value) { @@ -807,6 +807,26 @@ Upgrade.upgrade = function(callback) { winston.info('[2015/01/30] Adding group member counts skipped'); next(); } + }, + function(next) { + thisSchemaDate = Date.UTC(2015, 1, 8); + if (schemaDate < thisSchemaDate) { + updatesMade = true; + winston.info('[2015/02/08] Clearing reset tokens'); + + db.deleteAll(['reset:expiry', 'reset:uid'], function(err) { + if (err) { + winston.error('[2015/02/08] Error encountered while Clearing reset tokens'); + return next(err); + } + + winston.info('[2015/02/08] Clearing reset tokens done'); + Upgrade.update(thisSchemaDate, next); + }); + } else { + winston.info('[2015/02/08] Clearing reset tokens skipped'); + next(); + } } // Add new schema updates here diff --git a/src/user/reset.js b/src/user/reset.js index c65e77a570..e49c077180 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -1,4 +1,3 @@ - 'use strict'; var async = require('async'), @@ -21,19 +20,13 @@ var async = require('async'), return callback(err, false); } - db.getObjectField('reset:expiry', code, function(err, expiry) { + db.sortedSetScore('reset:issueDate', code, function(err, issueDate) { + // db.getObjectField('reset:expiry', code, function(err, expiry) { if (err) { return callback(err); } - if (parseInt(expiry, 10) >= Date.now() / 1000) { - callback(null, true); - } else { - // Expired, delete from db - db.deleteObjectField('reset:uid', code); - db.deleteObjectField('reset:expiry', code); - callback(null, false); - } + callback(null, parseInt(issueDate, 10) > (Date.now() - (1000*60*120))); }); }); }; @@ -46,7 +39,7 @@ var async = require('async'), var reset_code = utils.generateUUID(); db.setObjectField('reset:uid', reset_code, uid); - db.setObjectField('reset:expiry', reset_code, (60 * 60) + Math.floor(Date.now() / 1000)); + db.sortedSetAdd('reset:issueDate', Date.now(), reset_code); var reset_link = nconf.get('url') + '/reset/' + reset_code; @@ -85,7 +78,7 @@ var async = require('async'), user.setUserField(uid, 'password', hash); db.deleteObjectField('reset:uid', code); - db.deleteObjectField('reset:expiry', code); + db.sortedSetRemove('reset:issueDate', code); user.auth.resetLockout(uid, callback); }); diff --git a/src/views/emails/reset_notify.tpl b/src/views/emails/reset_notify.tpl new file mode 100644 index 0000000000..34c26aa481 --- /dev/null +++ b/src/views/emails/reset_notify.tpl @@ -0,0 +1,10 @@ +

[[email:greeting_with_name, {username}]],

+ +

[[email:reset.notify.text1, {date}]]

+ +

[[email:reset.notify.text2]]

+ +

+ [[email:closing]]
+ {site_title} +

\ No newline at end of file diff --git a/src/views/emails/reset_notify_plaintext.tpl b/src/views/emails/reset_notify_plaintext.tpl new file mode 100644 index 0000000000..788618f9d5 --- /dev/null +++ b/src/views/emails/reset_notify_plaintext.tpl @@ -0,0 +1,8 @@ +[[email:greeting_with_name, {username}]], + +[[email:reset.notify.text1, {date}]] + +[[email:reset.notify.text2]] + +[[email:closing]] +{site_title} \ No newline at end of file From c35126116522ed753a164879001d5f69d2528cf7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sun, 8 Feb 2015 22:02:13 -0500 Subject: [PATCH 42/73] added daily cleaning of reset tokens #2708 --- src/notifications.js | 4 +--- src/user/jobs.js | 3 ++- src/user/reset.js | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/notifications.js b/src/notifications.js index 5d10686212..dc3aae7ea2 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -18,9 +18,7 @@ var async = require('async'), (function(Notifications) { Notifications.init = function() { - if (process.env.NODE_ENV === 'development') { - winston.verbose('[notifications.init] Registering jobs.'); - } + winston.verbose('[notifications.init] Registering jobs.'); new cron('*/30 * * * *', Notifications.prune, null, true); }; diff --git a/src/user/jobs.js b/src/user/jobs.js index 506f0d388b..16f6bd4ce8 100644 --- a/src/user/jobs.js +++ b/src/user/jobs.js @@ -4,7 +4,6 @@ var winston = require('winston'), cronJob = require('cron').CronJob, - user = require('../user'), meta = require('../meta'); module.exports = function(User) { @@ -23,6 +22,8 @@ module.exports = function(User) { winston.verbose('[user.startJobs] Digest job (monthly) started.'); User.digest.execute('month'); }, null, true); + + new cronJob('0 0 0 * * *', User.reset.clean, null, true); }; }; diff --git a/src/user/reset.js b/src/user/reset.js index e49c077180..3ce2f86cf8 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -2,6 +2,7 @@ var async = require('async'), nconf = require('nconf'), + winston = require('winston'), user = require('../user'), utils = require('../../public/src/utils'), @@ -13,7 +14,6 @@ var async = require('async'), emailer = require('../emailer'); (function(UserReset) { - UserReset.validate = function(code, callback) { db.getObjectField('reset:uid', code, function(err, uid) { if (err || !uid) { @@ -86,4 +86,20 @@ var async = require('async'), }); }; + UserReset.clean = function(callback) { + // Locate all codes that have expired, and remove them from the set/hash + async.waterfall([ + async.apply(db.getSortedSetRangeByScore, 'reset:issueDate', 0, -1, -1, +new Date()-(1000*60*120)), + function(tokens, next) { + if (!tokens.length) { return next(); } + + winston.verbose('[UserReset.clean] Removing ' + tokens.length + ' reset tokens from database'); + async.parallel([ + async.apply(db.deleteObjectField, 'reset:uid', tokens), + async.apply(db.sortedSetRemove, 'reset:issueDate', tokens) + ], next); + } + ], callback); + }; + }(exports)); From b1340b74c631edec1b33be3e0f2ca494cf7e8575 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 9 Feb 2015 13:41:21 -0500 Subject: [PATCH 43/73] updating vanilla minver --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 22c2570b1a..b5812a425d 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", "nodebb-theme-lavender": "^0.2.0", - "nodebb-theme-vanilla": "^0.2.0", + "nodebb-theme-vanilla": "^1.0.0", "nodebb-widget-essentials": "~0.2.0", "npm": "^2.1.4", "passport": "^0.2.1", From 9b451093498f0781fdcb69eb146c73ad354783b8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 9 Feb 2015 14:49:43 -0500 Subject: [PATCH 44/73] updating development version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b5812a425d..cb00f143cc 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPLv3 or later", "description": "NodeBB Forum", - "version": "0.6.1-dev", + "version": "0.7.0-dev", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From be92f07ab929a050df635d048499b2fd3165f684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Feb 2015 15:32:35 -0500 Subject: [PATCH 45/73] save/clear search preferences --- public/language/en_GB/search.json | 6 ++- public/src/client/search.js | 68 +++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/public/language/en_GB/search.json b/public/language/en_GB/search.json index b8a970d6a9..75749d4e06 100644 --- a/public/language/en_GB/search.json +++ b/public/language/en_GB/search.json @@ -32,5 +32,9 @@ "username": "Username", "category": "Category", "descending": "In descending order", - "ascending": "In ascending order" + "ascending": "In ascending order", + "save-preferences": "Save preferences", + "clear-preferences": "Clear preferences", + "search-preferences-saved": "Search preferences saved", + "search-preferences-cleared": "Search preferences cleared" } diff --git a/public/src/client/search.js b/public/src/client/search.js index 42bf7dd4fe..01637dd429 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -12,7 +12,7 @@ define('forum/search', ['search'], function(searchModule) { var searchIn = $('#advanced-search #search-in'); - fillOutFormFromQueryParams(); + fillOutForm(); searchIn.on('change', function() { updateFormItemVisiblity(searchIn.val()); @@ -22,38 +22,49 @@ define('forum/search', ['search'], function(searchModule) { $('#advanced-search').off('submit').on('submit', function(e) { e.preventDefault(); - var $this = $(this); - var input = $this.find('#search-input'); - - var searchData = { - term: input.val(), - in: $this.find('#search-in').val(), - by: $this.find('#posted-by-user').val(), - categories: $this.find('#posted-in-categories').val(), - searchChildren: $this.find('#search-children').is(':checked'), - replies: $this.find('#reply-count').val(), - repliesFilter: $this.find('#reply-count-filter').val(), - timeFilter: $this.find('#post-time-filter').val(), - timeRange: $this.find('#post-time-range').val(), - sortBy: $this.find('#post-sort-by').val(), - sortDirection: $this.find('#post-sort-direction').val() - }; + + var input = $(this).find('#search-input'); + + var searchData = getSearchData(); + searchData.term = input.val(); searchModule.query(searchData, function() { input.val(''); }); }); + handleSavePreferences(); + enableAutoComplete(); }; + function getSearchData() { + var form = $('#advanced-search'); + var searchData = { + in: form.find('#search-in').val(), + by: form.find('#posted-by-user').val(), + categories: form.find('#posted-in-categories').val(), + searchChildren: form.find('#search-children').is(':checked'), + replies: form.find('#reply-count').val(), + repliesFilter: form.find('#reply-count-filter').val(), + timeFilter: form.find('#post-time-filter').val(), + timeRange: form.find('#post-time-range').val(), + sortBy: form.find('#post-sort-by').val(), + sortDirection: form.find('#post-sort-direction').val() + }; + return searchData; + } + function updateFormItemVisiblity(searchIn) { var hide = searchIn.indexOf('posts') === -1 && searchIn.indexOf('titles') === -1; $('.post-search-item').toggleClass('hide', hide); } - function fillOutFormFromQueryParams() { + function fillOutForm() { var params = utils.params(); + var searchData = getSearchPreferences(); + params = utils.merge(searchData, params); + if (params) { if (params.in) { $('#search-in').val(params.in); @@ -110,6 +121,27 @@ define('forum/search', ['search'], function(searchModule) { }); } + function handleSavePreferences() { + $('#save-preferences').on('click', function() { + localStorage.setItem('search-preferences', JSON.stringify(getSearchData())); + app.alertSuccess('[[search:search-preferences-saved]]'); + return false; + }); + + $('#clear-preferences').on('click', function() { + localStorage.removeItem('search-preferences'); + app.alertSuccess('[[search:search-preferences-cleared]]'); + return false; + }); + } + + function getSearchPreferences() { + try { + return JSON.parse(localStorage.getItem('search-preferences')); + } catch(e) { + return {}; + } + } function enableAutoComplete() { var input = $('#posted-by-user'); From c98720ee4c3461da46fe846f4ac21533ecad3c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 9 Feb 2015 17:02:47 -0500 Subject: [PATCH 46/73] show results as WIP --- public/language/en_GB/search.json | 3 ++- public/src/client/search.js | 10 +++++++++- public/src/modules/search.js | 4 ++++ src/controllers/search.js | 3 ++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/public/language/en_GB/search.json b/public/language/en_GB/search.json index 75749d4e06..8c73511bda 100644 --- a/public/language/en_GB/search.json +++ b/public/language/en_GB/search.json @@ -36,5 +36,6 @@ "save-preferences": "Save preferences", "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared" + "search-preferences-cleared": "Search preferences cleared", + "show-results-as": "Show results as" } diff --git a/public/src/client/search.js b/public/src/client/search.js index 01637dd429..96f2640ca0 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -50,7 +50,8 @@ define('forum/search', ['search'], function(searchModule) { timeFilter: form.find('#post-time-filter').val(), timeRange: form.find('#post-time-range').val(), sortBy: form.find('#post-sort-by').val(), - sortDirection: form.find('#post-sort-direction').val() + sortDirection: form.find('#post-sort-direction').val(), + showAs: form.find('#show-as-topics').is(':checked') ? 'topics' : 'posts' }; return searchData; } @@ -97,6 +98,13 @@ define('forum/search', ['search'], function(searchModule) { $('#post-sort-by').val(params.sortBy); $('#post-sort-direction').val(params.sortDirection); } + + if (params.showAs) { + var isTopic = params.showAs === 'topics'; + var ispost = params.showAs === 'posts'; + $('#show-as-topics').prop('checked', isTopic).parent().toggleClass('active', isTopic); + $('#show-as-posts').prop('checked', isPost).parent().toggleClass('active', isPost); + } } } diff --git a/public/src/modules/search.js b/public/src/modules/search.js index 9b896b0394..eedf0b76b9 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -62,6 +62,10 @@ define('search', ['navigator'], function(nav) { query.sortBy = data.sortBy; query.sortDirection = data.sortDirection; } + + if (data.showAs) { + query.showAs = data.showAs; + } return decodeURIComponent($.param(query)); } diff --git a/src/controllers/search.js b/src/controllers/search.js index d9e6bc9f3a..5c38c3f79b 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -62,7 +62,8 @@ searchController.search = function(req, res, next) { var pageCount = Math.max(1, Math.ceil(results.matchCount / 10)); results.pagination = pagination.create(page, pageCount, req.query); - + results.showAsPosts = !req.query.showAs || req.query.showAs === 'posts'; + results.showAsTopics = req.query.showAs === 'topics'; results.breadcrumbs = breadcrumbs; results.categories = categories; res.render('search', results); From 6cd615ee45aa814758022e1e6be05e4b0f2e2807 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 9 Feb 2015 17:45:35 -0500 Subject: [PATCH 47/73] dont add post/topic query params if searching for users/tags --- public/src/client/search.js | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/public/src/client/search.js b/public/src/client/search.js index 96f2640ca0..a8924ce8f9 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -22,7 +22,7 @@ define('forum/search', ['search'], function(searchModule) { $('#advanced-search').off('submit').on('submit', function(e) { e.preventDefault(); - + var input = $(this).find('#search-input'); var searchData = getSearchData(); @@ -41,18 +41,22 @@ define('forum/search', ['search'], function(searchModule) { function getSearchData() { var form = $('#advanced-search'); var searchData = { - in: form.find('#search-in').val(), - by: form.find('#posted-by-user').val(), - categories: form.find('#posted-in-categories').val(), - searchChildren: form.find('#search-children').is(':checked'), - replies: form.find('#reply-count').val(), - repliesFilter: form.find('#reply-count-filter').val(), - timeFilter: form.find('#post-time-filter').val(), - timeRange: form.find('#post-time-range').val(), - sortBy: form.find('#post-sort-by').val(), - sortDirection: form.find('#post-sort-direction').val(), - showAs: form.find('#show-as-topics').is(':checked') ? 'topics' : 'posts' + in: form.find('#search-in').val() }; + + if (searchData.in === 'posts' || searchData.in === 'titlespost' || searchData.in === 'titles') { + searchData.by = form.find('#posted-by-user').val(); + searchData.categories = form.find('#posted-in-categories').val(); + searchData.searchChildren = form.find('#search-children').is(':checked'); + searchData.replies = form.find('#reply-count').val(); + searchData.repliesFilter = form.find('#reply-count-filter').val(); + searchData.timeFilter = form.find('#post-time-filter').val(); + searchData.timeRange = form.find('#post-time-range').val(); + searchData.sortBy = form.find('#post-sort-by').val(); + searchData.sortDirection = form.find('#post-sort-direction').val(); + searchData.showAs = form.find('#show-as-topics').is(':checked') ? 'topics' : 'posts'; + } + return searchData; } @@ -65,7 +69,7 @@ define('forum/search', ['search'], function(searchModule) { var params = utils.params(); var searchData = getSearchPreferences(); params = utils.merge(searchData, params); - + if (params) { if (params.in) { $('#search-in').val(params.in); @@ -101,8 +105,8 @@ define('forum/search', ['search'], function(searchModule) { if (params.showAs) { var isTopic = params.showAs === 'topics'; - var ispost = params.showAs === 'posts'; - $('#show-as-topics').prop('checked', isTopic).parent().toggleClass('active', isTopic); + var isPost = params.showAs === 'posts'; + $('#show-as-topics').prop('checked', isTopic).parent().toggleClass('active', isTopic); $('#show-as-posts').prop('checked', isPost).parent().toggleClass('active', isPost); } } @@ -130,7 +134,7 @@ define('forum/search', ['search'], function(searchModule) { } function handleSavePreferences() { - $('#save-preferences').on('click', function() { + $('#save-preferences').on('click', function() { localStorage.setItem('search-preferences', JSON.stringify(getSearchData())); app.alertSuccess('[[search:search-preferences-saved]]'); return false; From 5e7bf7a27245a6bf160a9a4a1390205e5bbb71e9 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 9 Feb 2015 17:50:19 -0500 Subject: [PATCH 48/73] default search in posts --- src/controllers/search.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/search.js b/src/controllers/search.js index 5c38c3f79b..0a26822699 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -41,6 +41,7 @@ searchController.search = function(req, res, next) { req.query.categories = [req.query.categories]; } + req.query.in = req.query.in || 'posts'; search.search({ query: req.params.term, searchIn: req.query.in, From b6125b1674d0ae8de7b8368497c05513dbe43cae Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 9 Feb 2015 18:00:02 -0500 Subject: [PATCH 49/73] toString pid --- src/search.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/search.js b/src/search.js index e26cb75f70..5cab307a98 100644 --- a/src/search.js +++ b/src/search.js @@ -89,7 +89,7 @@ function searchInContent(query, data, callback) { }, function(mainPids, next) { results.pids.forEach(function(pid) { - if (mainPids.indexOf(pid) === -1) { + if (mainPids.indexOf(pid.toString()) === -1) { mainPids.push(pid); } }); @@ -485,7 +485,7 @@ function getMainPids(tids, callback) { return callback(err); } topics = topics.map(function(topic) { - return topic && topic.mainPid; + return topic && topic.mainPid && topic.mainPid.toString(); }).filter(Boolean); callback(null, topics); }); From 15e6c5154147ffc3b1d3db43df950e97c64b4671 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Feb 2015 10:53:19 -0500 Subject: [PATCH 50/73] latest translations --- public/language/ar/email.json | 3 + public/language/ar/error.json | 1 + public/language/ar/pages.json | 1 + public/language/ar/reset_password.json | 4 +- public/language/ar/search.json | 30 +++++- public/language/ar/users.json | 2 +- public/language/bn/email.json | 3 + public/language/bn/error.json | 1 + public/language/bn/pages.json | 1 + public/language/bn/reset_password.json | 4 +- public/language/bn/search.json | 30 +++++- public/language/bn/users.json | 2 +- public/language/cs/email.json | 3 + public/language/cs/error.json | 1 + public/language/cs/pages.json | 1 + public/language/cs/reset_password.json | 4 +- public/language/cs/search.json | 30 +++++- public/language/cs/users.json | 2 +- public/language/de/category.json | 2 +- public/language/de/email.json | 3 + public/language/de/error.json | 3 +- public/language/de/pages.json | 1 + public/language/de/reset_password.json | 4 +- public/language/de/search.json | 30 +++++- public/language/el/email.json | 3 + public/language/el/error.json | 1 + public/language/el/pages.json | 1 + public/language/el/reset_password.json | 4 +- public/language/el/search.json | 30 +++++- public/language/el/users.json | 2 +- public/language/en@pirate/email.json | 3 + public/language/en@pirate/error.json | 1 + public/language/en@pirate/pages.json | 1 + public/language/en@pirate/reset_password.json | 4 +- public/language/en@pirate/search.json | 30 +++++- public/language/en@pirate/users.json | 2 +- public/language/en_US/email.json | 3 + public/language/en_US/error.json | 1 + public/language/en_US/pages.json | 1 + public/language/en_US/reset_password.json | 4 +- public/language/en_US/search.json | 30 +++++- public/language/en_US/users.json | 2 +- public/language/es/email.json | 3 + public/language/es/error.json | 1 + public/language/es/pages.json | 1 + public/language/es/reset_password.json | 4 +- public/language/es/search.json | 30 +++++- public/language/es/users.json | 2 +- public/language/et/email.json | 3 + public/language/et/error.json | 1 + public/language/et/pages.json | 1 + public/language/et/reset_password.json | 4 +- public/language/et/search.json | 30 +++++- public/language/et/users.json | 2 +- public/language/fa_IR/email.json | 3 + public/language/fa_IR/error.json | 1 + public/language/fa_IR/pages.json | 1 + public/language/fa_IR/reset_password.json | 4 +- public/language/fa_IR/search.json | 30 +++++- public/language/fa_IR/users.json | 2 +- public/language/fi/email.json | 3 + public/language/fi/error.json | 1 + public/language/fi/pages.json | 1 + public/language/fi/reset_password.json | 4 +- public/language/fi/search.json | 30 +++++- public/language/fi/users.json | 2 +- public/language/fr/email.json | 3 + public/language/fr/error.json | 1 + public/language/fr/pages.json | 1 + public/language/fr/reset_password.json | 4 +- public/language/fr/search.json | 30 +++++- public/language/fr/users.json | 2 +- public/language/he/category.json | 2 +- public/language/he/email.json | 49 +++++----- public/language/he/error.json | 77 ++++++++-------- public/language/he/global.json | 16 ++-- public/language/he/groups.json | 38 ++++---- public/language/he/modules.json | 20 ++-- public/language/he/notifications.json | 42 ++++----- public/language/he/pages.json | 7 +- public/language/he/recent.json | 22 ++--- public/language/he/reset_password.json | 4 +- public/language/he/search.json | 38 +++++++- public/language/he/tags.json | 2 +- public/language/he/topic.json | 92 +++++++++---------- public/language/he/user.json | 42 ++++----- public/language/he/users.json | 8 +- public/language/hu/email.json | 3 + public/language/hu/error.json | 1 + public/language/hu/pages.json | 1 + public/language/hu/reset_password.json | 4 +- public/language/hu/search.json | 30 +++++- public/language/hu/users.json | 2 +- public/language/id/email.json | 3 + public/language/id/error.json | 1 + public/language/id/pages.json | 1 + public/language/id/reset_password.json | 4 +- public/language/id/search.json | 30 +++++- public/language/id/users.json | 2 +- public/language/it/email.json | 3 + public/language/it/error.json | 1 + public/language/it/pages.json | 1 + public/language/it/reset_password.json | 4 +- public/language/it/search.json | 30 +++++- public/language/it/users.json | 2 +- public/language/ja/email.json | 3 + public/language/ja/error.json | 1 + public/language/ja/pages.json | 1 + public/language/ja/reset_password.json | 4 +- public/language/ja/search.json | 30 +++++- public/language/ja/users.json | 2 +- public/language/ko/email.json | 3 + public/language/ko/error.json | 1 + public/language/ko/pages.json | 1 + public/language/ko/reset_password.json | 4 +- public/language/ko/search.json | 30 +++++- public/language/ko/users.json | 2 +- public/language/lt/email.json | 3 + public/language/lt/error.json | 1 + public/language/lt/pages.json | 1 + public/language/lt/reset_password.json | 4 +- public/language/lt/search.json | 30 +++++- public/language/lt/users.json | 2 +- public/language/ms/email.json | 3 + public/language/ms/error.json | 1 + public/language/ms/pages.json | 1 + public/language/ms/reset_password.json | 4 +- public/language/ms/search.json | 30 +++++- public/language/ms/users.json | 2 +- public/language/nb/email.json | 3 + public/language/nb/error.json | 1 + public/language/nb/pages.json | 1 + public/language/nb/reset_password.json | 4 +- public/language/nb/search.json | 30 +++++- public/language/nb/users.json | 2 +- public/language/nl/email.json | 3 + public/language/nl/error.json | 1 + public/language/nl/pages.json | 1 + public/language/nl/reset_password.json | 4 +- public/language/nl/search.json | 30 +++++- public/language/nl/users.json | 2 +- public/language/pl/email.json | 3 + public/language/pl/error.json | 1 + public/language/pl/pages.json | 1 + public/language/pl/reset_password.json | 4 +- public/language/pl/search.json | 30 +++++- public/language/pl/users.json | 2 +- public/language/pt_BR/email.json | 3 + public/language/pt_BR/error.json | 1 + public/language/pt_BR/pages.json | 1 + public/language/pt_BR/reset_password.json | 4 +- public/language/pt_BR/search.json | 30 +++++- public/language/pt_BR/users.json | 2 +- public/language/ro/email.json | 3 + public/language/ro/error.json | 1 + public/language/ro/pages.json | 1 + public/language/ro/reset_password.json | 4 +- public/language/ro/search.json | 30 +++++- public/language/ro/users.json | 2 +- public/language/ru/email.json | 3 + public/language/ru/error.json | 1 + public/language/ru/pages.json | 1 + public/language/ru/reset_password.json | 4 +- public/language/ru/search.json | 32 ++++++- public/language/ru/users.json | 2 +- public/language/sc/email.json | 3 + public/language/sc/error.json | 1 + public/language/sc/pages.json | 1 + public/language/sc/reset_password.json | 4 +- public/language/sc/search.json | 30 +++++- public/language/sc/users.json | 2 +- public/language/sk/email.json | 3 + public/language/sk/error.json | 1 + public/language/sk/pages.json | 1 + public/language/sk/reset_password.json | 4 +- public/language/sk/search.json | 30 +++++- public/language/sk/users.json | 2 +- public/language/sv/email.json | 3 + public/language/sv/error.json | 1 + public/language/sv/pages.json | 1 + public/language/sv/reset_password.json | 4 +- public/language/sv/search.json | 30 +++++- public/language/sv/users.json | 2 +- public/language/th/email.json | 3 + public/language/th/error.json | 1 + public/language/th/pages.json | 1 + public/language/th/reset_password.json | 4 +- public/language/th/search.json | 30 +++++- public/language/th/users.json | 2 +- public/language/tr/category.json | 2 +- public/language/tr/email.json | 7 +- public/language/tr/error.json | 15 +-- public/language/tr/global.json | 12 +-- public/language/tr/groups.json | 26 +++--- public/language/tr/pages.json | 1 + public/language/tr/recent.json | 18 ++-- public/language/tr/reset_password.json | 4 +- public/language/tr/search.json | 36 +++++++- public/language/tr/topic.json | 4 +- public/language/tr/user.json | 10 +- public/language/tr/users.json | 8 +- public/language/vi/email.json | 3 + public/language/vi/error.json | 1 + public/language/vi/pages.json | 1 + public/language/vi/reset_password.json | 4 +- public/language/vi/search.json | 30 +++++- public/language/vi/users.json | 2 +- public/language/zh_CN/email.json | 3 + public/language/zh_CN/error.json | 1 + public/language/zh_CN/pages.json | 1 + public/language/zh_CN/reset_password.json | 4 +- public/language/zh_CN/search.json | 30 +++++- public/language/zh_CN/users.json | 2 +- public/language/zh_TW/email.json | 3 + public/language/zh_TW/error.json | 1 + public/language/zh_TW/pages.json | 1 + public/language/zh_TW/reset_password.json | 4 +- public/language/zh_TW/search.json | 32 ++++++- public/language/zh_TW/users.json | 2 +- 219 files changed, 1555 insertions(+), 365 deletions(-) diff --git a/public/language/ar/email.json b/public/language/ar/email.json index f2820e0600..98cb9c0b0d 100644 --- a/public/language/ar/email.json +++ b/public/language/ar/email.json @@ -9,6 +9,9 @@ "reset.text1": "لقد توصلنا بطلب إعادة تعيين كلمة السرالخاصة بك، ربما لكونك قد نسيتها, إن لم يكن الأمر كذلك، المرجو تجاهل هذه الرسالة.", "reset.text2": "لمواصلة طلب إعاة تعيين كلمة السر، المرجو تتبع هذا الرابط.", "reset.cta": "انقر هنا لإعادة تعيين كلمة السر الخاصة بك.", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "لديك تنبيهات غير مقروءة من طرف %1:", "digest.latest_topics": "آخر المستجدات من %1", "digest.cta": "انقر هنا لمشاهدة %1", diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 26d90ae89e..73eb289378 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -35,6 +35,7 @@ "topic-locked": "الموضوع مقفول", "still-uploading": "الرجاء انتظار الرفع", "content-too-short": "المرجو إدخال موضوع أطول من هذا. يجب أن تتوفر المواضيع على %1 حروف على الأقل.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "المرجو إدخال عنوان أطول من هذا. يجب أن تتوفر العناوين على %1 حروف على الأقل.", "title-too-long": "المرجو إدخال عنوان أقصر من هذا. يجب ألا تتجاوز العناوين %1 حرفًا.", "too-many-posts": "يمكنك إنشاء المواضيع بمعدل موضوع واحد كل %1 ثانية - المرجو الانتظار قليلا.", diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index 0dc17e025a..15e8209928 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -11,6 +11,7 @@ "user.followers": "المستخدمون الذين يتبعون %1", "user.posts": "ردود %1", "user.topics": "مواضيع %1", + "user.groups": "%1's Groups", "user.favourites": "مفضلات %1", "user.settings": "خيارات المستخدم", "maintenance.text": "جاري صيانة %1. المرجو العودة لاحقًا.", diff --git a/public/language/ar/reset_password.json b/public/language/ar/reset_password.json index 603f117b7e..b4f95dd780 100644 --- a/public/language/ar/reset_password.json +++ b/public/language/ar/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "يرجى إدخال عنوان البريد الإلكتروني الخاص بك وسوف نرسل لك رسالة بالبريد الالكتروني مع تعليمات حول كيفية إستعادة حسابك.", "enter_email_address": "ادخل عنوان البريد الإلكتروني", "password_reset_sent": "إعادة تعيين كلمة السر أرسلت", - "invalid_email": "بريد إلكتروني غير صالح أو غير موجود" + "invalid_email": "بريد إلكتروني غير صالح أو غير موجود", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/ar/search.json b/public/language/ar/search.json index 581a791905..50b985d452 100644 --- a/public/language/ar/search.json +++ b/public/language/ar/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/ar/users.json b/public/language/ar/users.json index b37bca619f..a842def62b 100644 --- a/public/language/ar/users.json +++ b/public/language/ar/users.json @@ -5,7 +5,7 @@ "search": "بحث", "enter_username": "أدخل اسم مستخدم للبحث", "load_more": "حمل المزيد", - "users-found-search-took": "تم إيجاد %1 مستخدمـ(ين)! استغرق البحث %2 ميليثانية.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/bn/email.json b/public/language/bn/email.json index b151164f2f..91169e5549 100644 --- a/public/language/bn/email.json +++ b/public/language/bn/email.json @@ -9,6 +9,9 @@ "reset.text1": "আমরা আপনার পাসওয়ার্ড রিসেট করার অনুরোধ পেয়েছি, সম্ভবত আপনি আপনার পাসওয়ার্ড ভুলে গিয়েছেন বলেই। তবে যদি তা না হয়ে থাকে, তাহলে এই মেইলকে উপেক্ষা করতে পারেন।", "reset.text2": "পাসওয়ার্ড রিসেট করতে নিচের লিংকে ক্লিক করুন", "reset.cta": "পাসওয়ার্ড রিসেট করতে এখানে ক্লিক করুন", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "%1 থেকে আনরিড নোটিফিকেশন আছে।", "digest.latest_topics": "%1 এর সর্বশেষ টপিকসমূহ", "digest.cta": "%1 ভিজিট করতে এখানে ক্লিক করুন", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index ea1240c0ad..d1abf066d9 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -35,6 +35,7 @@ "topic-locked": "টপিক বন্ধ", "still-uploading": "আপলোড সম্পূর্ণ জন্য অনুগ্রহ করে অপেক্ষা করুন", "content-too-short": "অনুগ্রহকরে অপেক্ষকৃত বড় পোষ্ট করুন। একটি পোষ্টে নূন্যতম %1 অক্ষর থাকতে হবে।", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "অনুগ্রহপূর্বক বড় শিরোনাম ব্যাবহার করুন। শিরোনামের জন্য নূন্যতম %1 অক্ষর ব্যাবহার করতে হবে।", "title-too-long": "অনুগ্রহ করে সংক্ষিপ্ত শিরোনাম লিখুন। শিরোনাম %1 অক্ষরের বেশি হতে পারবে না।", "too-many-posts": "আপনি প্রতি %1 সেকেন্ডে একবার পোষ্ট করতে পারবেন। পরবর্তী পোষ্ট করার জন্য অপেক্ষা করুন। ", diff --git a/public/language/bn/pages.json b/public/language/bn/pages.json index 1e28db3a2d..4ab90a11a2 100644 --- a/public/language/bn/pages.json +++ b/public/language/bn/pages.json @@ -11,6 +11,7 @@ "user.followers": "যারা %1 কে অনুসরণ করেন", "user.posts": "%1 এর পোস্ট সমুহ", "user.topics": "%1 এর টপিক সমুহ", + "user.groups": "%1's Groups", "user.favourites": "%1'র প্রিয় পোস্টগুলো", "user.settings": "সদস্য সেটিংস", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/bn/reset_password.json b/public/language/bn/reset_password.json index d4aa6415c1..5643e1c427 100644 --- a/public/language/bn/reset_password.json +++ b/public/language/bn/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "অনুগ্রহপূর্বক আপনার ইমেইল এড্রেস প্রদান করুন, আমরা আপনাকে আপনার পাসওয়ার্ড রিসেট সম্পর্কিত তথ্যাবলী ইমেইলে পাঠিয়ে দিবো। ", "enter_email_address": "আপনার ইমেইল এড্রেস", "password_reset_sent": "পাসওয়ার্ড রিসেট মেইল পাঠানো হয়েছে", - "invalid_email": "ভুল ইমেইল / ইমেইল ডেটাবেইজে নেই" + "invalid_email": "ভুল ইমেইল / ইমেইল ডেটাবেইজে নেই", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/bn/search.json b/public/language/bn/search.json index eafce184ec..0038567599 100644 --- a/public/language/bn/search.json +++ b/public/language/bn/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/bn/users.json b/public/language/bn/users.json index 5d7dbd5cec..402aa33c27 100644 --- a/public/language/bn/users.json +++ b/public/language/bn/users.json @@ -5,7 +5,7 @@ "search": "খুঁজুন", "enter_username": "ইউজারনেম এর ভিত্তিতে সার্চ করুন", "load_more": "আরো লোড করুন", - "users-found-search-took": "%1 সদস্য(দের) খুঁজে পাওয়া গিয়েছে! সময় লেগেছে %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/cs/email.json b/public/language/cs/email.json index 27a2f06198..a259648e70 100644 --- a/public/language/cs/email.json +++ b/public/language/cs/email.json @@ -9,6 +9,9 @@ "reset.text1": "Obdrželi jsme požadavek na obnovu hesla, pravděpodobně kvůli tomu, že jste ho zapomněli. Pokud to není tento případ, ignorujte, prosím, tento email.", "reset.text2": "Přejete-li si pokračovat v obnově vašeho hesla, klikněte, prosím, na následující odkaz:", "reset.cta": "Klikněte zde, chcete-li obnovit vaše heslo", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Máte tu nepřečtená oznámení od %1:", "digest.latest_topics": "Nejnovější témata od %1", "digest.cta": "Kliknutím zde navštívíte %1", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index c5ae30c511..f858b2b15f 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -35,6 +35,7 @@ "topic-locked": "Téma uzamčeno", "still-uploading": "Vyčkejte, prosím, nežli se vše kompletně nahraje.", "content-too-short": "Vložte, prosím, delší příspěvek. Příspěvky by měly obsahovat nejméně %1 znaků.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Vložte, prosím, delší titulek. Titulky by měly obsahovat nejméně %1 znaků.", "title-too-long": "Vložte, prosím, kratší titulek. Titulky by neměly být delší, než-li %1 znaků.", "too-many-posts": "Své příspěvky můžete odesílat po %1 sekundách - vyčkejte, prosím, před dalším odesláním", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index b77b6411ba..15386435af 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -11,6 +11,7 @@ "user.followers": "People who Follow %1", "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", + "user.groups": "%1's Groups", "user.favourites": "%1's Favourite Posts", "user.settings": "User Settings", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/cs/reset_password.json b/public/language/cs/reset_password.json index 41dce1549f..ba87244661 100644 --- a/public/language/cs/reset_password.json +++ b/public/language/cs/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Zadejte svou emailovou adresu a my Vám pošleme informace, jak můžete obnovit své heslo.", "enter_email_address": "Zadejte emailovou adresu", "password_reset_sent": "Obnova hesla odeslána", - "invalid_email": "Špatný email / Email neexistuje!" + "invalid_email": "Špatný email / Email neexistuje!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/cs/search.json b/public/language/cs/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/cs/search.json +++ b/public/language/cs/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/cs/users.json b/public/language/cs/users.json index fe3e7cb9b7..22b698a8c0 100644 --- a/public/language/cs/users.json +++ b/public/language/cs/users.json @@ -5,7 +5,7 @@ "search": "Vyhledávat", "enter_username": "Zadej uživatelské jméno k hledání", "load_more": "Načíst další", - "users-found-search-took": "Nazelezeno: %1 uživetel(ů)! Vyhledání trvalo %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/de/category.json b/public/language/de/category.json index f455b1604b..e3d45d3af8 100644 --- a/public/language/de/category.json +++ b/public/language/de/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Neues Thema", - "no_topics": "Es gibt noch keine Themen in dieser Kategorie.
Warum beginnst du nicht das erste?", + "no_topics": "Es gibt noch keine Themen in dieser Kategorie.
Warum beginnst du nicht eins?", "browsing": "Aktiv", "no_replies": "Niemand hat geantwortet", "share_this_category": "Teile diese Kategorie", diff --git a/public/language/de/email.json b/public/language/de/email.json index 4236feca0b..b60e620dd8 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -9,6 +9,9 @@ "reset.text1": "Wir haben eine Anfrage auf Zurücksetzung deines Passworts erhalten, wahrscheinlich, weil du es vergessen hast. Falls dies nicht der Fall ist, ignoriere bitte diese E-Mail.", "reset.text2": "Klicke bitte auf den folgenden Link, um mit der Zurücksetzung deines Passworts fortzufahren:", "reset.cta": "Klicke hier, um dein Passwort zurückzusetzen", + "reset.notify.subject": "Passwort erfolgreich geändert", + "reset.notify.text1": "Wir benachrichtigen dich das am %1, dein Passwort erfolgreich geändert wurde.", + "reset.notify.text2": "Wenn du das nicht autorisiert hast, bitte benachrichtige umgehend einen Administrator.", "digest.notifications": "Du hast ungelesene Benachrichtigungen von %1:", "digest.latest_topics": "Aktuellste Themen vom %1", "digest.cta": "Klicke hier, um %1 zu besuchen", diff --git a/public/language/de/error.json b/public/language/de/error.json index 376b75f62d..b2deb8a2d3 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -2,7 +2,7 @@ "invalid-data": "Daten ungültig", "not-logged-in": "Du bist nicht angemeldet.", "account-locked": "Dein Account wurde vorübergehend gesperrt.", - "search-requires-login": "Die Suche erfordert ein Konto! Bitte log dich ein oder registrieren dich!", + "search-requires-login": "Die Suche erfordert ein Konto! Bitte log dich ein oder registriere dich!", "invalid-cid": "Ungültige Kategorie-ID", "invalid-tid": "Ungültige Themen-ID", "invalid-pid": "Ungültige Beitrags-ID", @@ -35,6 +35,7 @@ "topic-locked": "Thema ist gesperrt", "still-uploading": "Bitte warte bis der Vorgang abgeschlossen ist.", "content-too-short": "Bitte gib einen längeren Beitrag ein. Beiträge sollten mindestens %1 Zeichen enthalten.", + "content-too-long": "Bitte schreibe einen kürzeren Beitrag. Beiträge können nicht mehr als %1 Zeichen enthalten.", "title-too-short": "Bitte gib einen längeren Titel ein. Titel sollten mindestens %1 Zeichen enthalten.", "title-too-long": "Der Titel darf maximal %1 Zeichen enthalten.", "too-many-posts": "Du kannst maximal alle %1 Sekunden einen Beitrag erstellen - bitte warte, bevor du einen neuen Beitrag erstellst", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 277678114f..78b7c7469d 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -11,6 +11,7 @@ "user.followers": "Nutzer, die %1 folgen", "user.posts": "Beiträge von %1", "user.topics": "Themen von %1", + "user.groups": "%1's Gruppen", "user.favourites": "Von %1 favorisierte Beiträge", "user.settings": "Benutzer-Einstellungen", "maintenance.text": "%1 befindet sich derzeit in der Wartung. Bitte komm später wieder.", diff --git a/public/language/de/reset_password.json b/public/language/de/reset_password.json index bbbfae1249..02d9329f7d 100644 --- a/public/language/de/reset_password.json +++ b/public/language/de/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Bitte gib Deine E-Mail Adresse ein und wir senden Dir eine Anleitung, wie Du Dein Passwort zurücksetzen kannst.", "enter_email_address": "E-Mail Adresse eingeben", "password_reset_sent": "Passwortzurücksetzung beantragt.", - "invalid_email": "Ungültige E-Mail / Adresse existiert nicht!" + "invalid_email": "Ungültige E-Mail / Adresse existiert nicht!", + "password_too_short": "Das eingegebene Passwort ist zu kurz, bitte wähle ein anderes Passwort.", + "passwords_do_not_match": "Die eingegebenen Passwörter stimmen nicht überein." } \ No newline at end of file diff --git a/public/language/de/search.json b/public/language/de/search.json index 80f5d100a7..d817f2aa7f 100644 --- a/public/language/de/search.json +++ b/public/language/de/search.json @@ -3,5 +3,33 @@ "no-matches": "Keine Ergebnisse gefunden", "in": "In", "by": "Bei", - "posted-by": "Geschrieben von" + "titles": "Titel", + "titles-posts": "Titel und Beiträge", + "posted-by": "Geschrieben von", + "in-categories": "In Kategorien", + "search-child-categories": "Suche in Unterkategorien", + "reply-count": "Antwort Anzahl", + "at-least": "Mindestens", + "at-most": "Höchstens", + "post-time": "Beitrags Zeit", + "newer-than": "Neuer als", + "older-than": "Älter als", + "any-date": "Jeder Zeitpunkt", + "yesterday": "Gestern", + "one-week": "Eine Woche", + "two-weeks": "Zwei Wochen", + "one-month": "Ein Monat", + "three-months": "Drei Monate", + "six-months": "Sechs Monate", + "one-year": "Ein Jahr", + "sort-by": "Sortieren nach", + "last-reply-time": "Letzter Antwort Zeitpunkt", + "topic-title": "Thementitel", + "number-of-replies": "Anzahl von Antworten", + "number-of-views": "Anzahl der Aufrufe", + "topic-start-date": "Thema Startdatum", + "username": "Benutzername", + "category": "Kategorie", + "descending": "In absteigender Reihenfolge", + "ascending": "In aufsteigender Reihenfolge" } \ No newline at end of file diff --git a/public/language/el/email.json b/public/language/el/email.json index 6563d675d5..c4a52f1ffa 100644 --- a/public/language/el/email.json +++ b/public/language/el/email.json @@ -9,6 +9,9 @@ "reset.text1": "Λάβαμε ένα αίτημα για επαναφορά του κωδικού σου, πιθανότατα γιατί τον ξέχασες. Αν δεν έκανες εσύ αυτό το αίτημα, αγνόησε αυτό το email.", "reset.text2": "Για να κάνεις την επαναφορά του κωδικού σου, παρακαλώ πάτα στο παρακάτω σύνδεσμο:", "reset.cta": "Κάνε κλικ εδώ για να επαναφέρεις τον κωδικό σου", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Πρόσφατα θέματα στο %1", "digest.cta": "Κάνε κλικ εδώ για να επισκεφτείς το %1", diff --git a/public/language/el/error.json b/public/language/el/error.json index e072c910f8..9cadac2731 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -35,6 +35,7 @@ "topic-locked": "Το θέμα έχει κλειδωθεί", "still-uploading": "Παρακαλώ περίμενε να τελειώσει το ανέβασμα των αρχείων.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Παρακαλώ γράψε έναν μικρότερο τίτλο. Δεν μπορεί να είναι μεγαλύτερος από %1 χαρακτήρες.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/el/pages.json b/public/language/el/pages.json index 04301ee967..0b9a89746e 100644 --- a/public/language/el/pages.json +++ b/public/language/el/pages.json @@ -11,6 +11,7 @@ "user.followers": "Άτομα που ακολουθούν τον/την %1", "user.posts": "Δημοσιεύσεις από τον/την %1", "user.topics": "Θέματα από τον/την %1", + "user.groups": "%1's Groups", "user.favourites": "Οι αγαπημένες δημοσιεύσεις του/της %1", "user.settings": "Επιλογές Χρήστη", "maintenance.text": "Το %1 αυτή την στιγμή συντηρείται. Παρακαλώ έλα αργότερα.", diff --git a/public/language/el/reset_password.json b/public/language/el/reset_password.json index e088a5bd9f..1ceecfd014 100644 --- a/public/language/el/reset_password.json +++ b/public/language/el/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Παρακαλώ γράψε την διεύθυνση email σου και θα σου στείλουμε ένα email με οδηγίες για το πως να επαναφέρεις τον λογαριασμό σου.", "enter_email_address": "Εισαγωγή Διεύθυνσης Email", "password_reset_sent": "Η Επαναφορά Κωδικού Εστάλη", - "invalid_email": "Άκυρο Email / Το email δεν υπάρχει!" + "invalid_email": "Άκυρο Email / Το email δεν υπάρχει!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/el/search.json b/public/language/el/search.json index fd5d9fa97e..eb08d6b538 100644 --- a/public/language/el/search.json +++ b/public/language/el/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/el/users.json b/public/language/el/users.json index 7a668b12a8..aae33e825c 100644 --- a/public/language/el/users.json +++ b/public/language/el/users.json @@ -5,7 +5,7 @@ "search": "Αναζήτηση", "enter_username": "Γράψε ένα όνομα χρήστη προς αναζήτηση", "load_more": "Φόρτωση περισσότερων", - "users-found-search-took": "%1 χρήστης(ες) βρέθηκαν! Η αναζήτηση πήρε %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/en@pirate/email.json b/public/language/en@pirate/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/en@pirate/email.json +++ b/public/language/en@pirate/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index 6079502fae..9bbcf03247 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -35,6 +35,7 @@ "topic-locked": "Topic Locked", "still-uploading": "Please wait for uploads to complete.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/en@pirate/pages.json b/public/language/en@pirate/pages.json index b77b6411ba..15386435af 100644 --- a/public/language/en@pirate/pages.json +++ b/public/language/en@pirate/pages.json @@ -11,6 +11,7 @@ "user.followers": "People who Follow %1", "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", + "user.groups": "%1's Groups", "user.favourites": "%1's Favourite Posts", "user.settings": "User Settings", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/en@pirate/reset_password.json b/public/language/en@pirate/reset_password.json index dcdf4e76b6..ba9f012ea6 100644 --- a/public/language/en@pirate/reset_password.json +++ b/public/language/en@pirate/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Please enter your email address and we will send you an email with instructions on how to reset your account.", "enter_email_address": "Enter Email Address", "password_reset_sent": "Password Reset Sent", - "invalid_email": "Invalid Email / Email does not exist!" + "invalid_email": "Invalid Email / Email does not exist!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/en@pirate/search.json b/public/language/en@pirate/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/en@pirate/search.json +++ b/public/language/en@pirate/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/en@pirate/users.json b/public/language/en@pirate/users.json index adbfee83cc..daabbb899c 100644 --- a/public/language/en@pirate/users.json +++ b/public/language/en@pirate/users.json @@ -5,7 +5,7 @@ "search": "Search", "enter_username": "Gimme y'er handle", "load_more": "Load More", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/en_US/email.json b/public/language/en_US/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/en_US/email.json +++ b/public/language/en_US/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index 6079502fae..9bbcf03247 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -35,6 +35,7 @@ "topic-locked": "Topic Locked", "still-uploading": "Please wait for uploads to complete.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/en_US/pages.json b/public/language/en_US/pages.json index d96ee1a8e6..c6d577d2f5 100644 --- a/public/language/en_US/pages.json +++ b/public/language/en_US/pages.json @@ -11,6 +11,7 @@ "user.followers": "People who Follow %1", "user.posts": "Posts made by %1", "user.topics": "Topics created by %1", + "user.groups": "%1's Groups", "user.favourites": "%1's Favorite Posts", "user.settings": "User Settings", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/en_US/reset_password.json b/public/language/en_US/reset_password.json index dcdf4e76b6..ba9f012ea6 100644 --- a/public/language/en_US/reset_password.json +++ b/public/language/en_US/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Please enter your email address and we will send you an email with instructions on how to reset your account.", "enter_email_address": "Enter Email Address", "password_reset_sent": "Password Reset Sent", - "invalid_email": "Invalid Email / Email does not exist!" + "invalid_email": "Invalid Email / Email does not exist!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/en_US/search.json b/public/language/en_US/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/en_US/search.json +++ b/public/language/en_US/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/en_US/users.json b/public/language/en_US/users.json index a06aee2734..0038dcffc4 100644 --- a/public/language/en_US/users.json +++ b/public/language/en_US/users.json @@ -5,7 +5,7 @@ "search": "Search", "enter_username": "Enter a username to search", "load_more": "Load More", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/es/email.json b/public/language/es/email.json index 870687c4e6..fd42293e1b 100644 --- a/public/language/es/email.json +++ b/public/language/es/email.json @@ -9,6 +9,9 @@ "reset.text1": "Recibimos una solicitud para reiniciar tu contraseña, posiblemente porque la olvidaste. Si no es así, por favor ignora este email.", "reset.text2": "Para continuar con el reinicio de contraseña, por favor cliquea en el siguiente vínculo:", "reset.cta": "Cliquea aquí para reiniciar tu contraseña", + "reset.notify.subject": "Se ha modificado correctamente la contraseña.", + "reset.notify.text1": "Te estamos notificando que a a %1, tu contraseña ha sido cambiado correctamente.", + "reset.notify.text2": "Si no has sido tu, por favor notifica al administrador inmediatamente.", "digest.notifications": "Tiene notificaciones sin leer de %1:", "digest.latest_topics": "Últimos temas de %1", "digest.cta": "Cliquea aquí para visitar %1", diff --git a/public/language/es/error.json b/public/language/es/error.json index 1c4f54397b..7a79b28ba4 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -35,6 +35,7 @@ "topic-locked": "Tema bloqueado", "still-uploading": "Por favor, espera a que terminen las subidas.", "content-too-short": "Por favor introduzca una publicación más larga. Las publicaciones deben contener al menos %1 caracteres.", + "content-too-long": "Por favor introduzca un mensaje más corto. Los mensajes no pueden exceder los %1 caracteres.", "title-too-short": "Por favor introduzca un título más largo. Los títulos deben contener al menos %1 caracteres.", "title-too-long": "Por favor, introduce un título más corto, que no sobrepase los %1 caracteres.", "too-many-posts": "Solo puedes publicar una vez cada %1 segundos - por favor espere antes de volver a publicar", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index 27d9ca8f67..4cd102fdf0 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -11,6 +11,7 @@ "user.followers": "Seguidores de %1", "user.posts": "Mensajes de %1", "user.topics": "Temas creados por %1", + "user.groups": "%1's Grupos", "user.favourites": "Publicaciones favoritas de %1 ", "user.settings": "Preferencias de usuario", "maintenance.text": "%1 está en mantenimiento actualmente. Por favor vuelva en otro momento.", diff --git a/public/language/es/reset_password.json b/public/language/es/reset_password.json index ea8e2b1fac..da269f5448 100644 --- a/public/language/es/reset_password.json +++ b/public/language/es/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Por favor ingresa tu correo electrónico y te enviaremos un mensaje con indicaciones para restablecer tu cuenta.", "enter_email_address": "Introduce tu correo electrónico", "password_reset_sent": "Restablecimiento de contraseña enviado", - "invalid_email": "¡Correo electrónico no válido o inexistente!" + "invalid_email": "¡Correo electrónico no válido o inexistente!", + "password_too_short": "La contraseña introducida es demasiado corta, por favor introduzca una contraseña diferente.", + "passwords_do_not_match": "Las dos contraseñas introducidas no concuerdan." } \ No newline at end of file diff --git a/public/language/es/search.json b/public/language/es/search.json index 769c91f354..e23eea6ba8 100644 --- a/public/language/es/search.json +++ b/public/language/es/search.json @@ -3,5 +3,33 @@ "no-matches": "No se encontraron coincidencias", "in": "En", "by": "Por", - "posted-by": "Publicado por" + "titles": "Títulos", + "titles-posts": "Títulos y publicaciones", + "posted-by": "Publicado por", + "in-categories": "En categorías", + "search-child-categories": "Buscar categorías hijas", + "reply-count": "Número de Respuestas", + "at-least": "De mínimo", + "at-most": "De máximo", + "post-time": "Fecha de publicación", + "newer-than": "Más reciente que", + "older-than": "Más antiguo que", + "any-date": "Cualquier fecha", + "yesterday": "Ayer", + "one-week": "Una semana", + "two-weeks": "Dos semanas", + "one-month": "Un mes", + "three-months": "Tres meses", + "six-months": "Seis meses", + "one-year": "Un año", + "sort-by": "Ordenar por", + "last-reply-time": "Fecha de última respuesta", + "topic-title": "Título de tema", + "number-of-replies": "Número de respuestas", + "number-of-views": "Número de visualizaciones", + "topic-start-date": "Fecha de inicio del tema", + "username": "Usuario", + "category": "Categoría", + "descending": "En orden descendente", + "ascending": "En orden ascendente" } \ No newline at end of file diff --git a/public/language/es/users.json b/public/language/es/users.json index 529a6accb5..81668516cf 100644 --- a/public/language/es/users.json +++ b/public/language/es/users.json @@ -5,7 +5,7 @@ "search": "Buscar", "enter_username": "Ingresa el nombre de usuario que quieres buscar", "load_more": "Cargar más", - "users-found-search-took": "¡%1 usuario(s) encontrados! La búsqueda tardó %2 ms.", + "users-found-search-took": "¡%1 usuario(s) encontrado! La búsqueda ha llevado %2 segundos.", "filter-by": "Filtrar Por", "online-only": "Sólo en línea", "picture-only": "Sólo imagen" diff --git a/public/language/et/email.json b/public/language/et/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/et/email.json +++ b/public/language/et/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/et/error.json b/public/language/et/error.json index ea2c2e9ff4..277568c591 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -35,6 +35,7 @@ "topic-locked": "Teema lukustatud", "still-uploading": "Palun oota, kuni üleslaadimised on laetud.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Palun sisesta lühem pealkiri. Pealkirjad ei saa olla pikemad kui %1 tähemärki.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index be7537527b..4a8ef6408f 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -11,6 +11,7 @@ "user.followers": "Kasutajad, kes jälgivad %1", "user.posts": "Postitused, mis on tehtud kasutaja %1 poolt", "user.topics": "Teemad on kirjutanud %1", + "user.groups": "%1's Groups", "user.favourites": "%1's lemmikud postitused", "user.settings": "Kasutaja sätted", "maintenance.text": "%1 foorumil on käimas hooldustööd. Palun külastage meid mõne aja pärast uuesti.", diff --git a/public/language/et/reset_password.json b/public/language/et/reset_password.json index c504ed9296..98e4fe4fae 100644 --- a/public/language/et/reset_password.json +++ b/public/language/et/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Palun sisesta oma emaili aadress ja me saadame sulle emaili koos õpetusega, kuidas oma parooli vahetada.", "enter_email_address": "Sisesta emaili aadress", "password_reset_sent": "Saadetud", - "invalid_email": "Vigane emaili aadress / emaili aadressi ei ekisteeri!" + "invalid_email": "Vigane emaili aadress / emaili aadressi ei ekisteeri!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/et/search.json b/public/language/et/search.json index 840538a793..448f45b055 100644 --- a/public/language/et/search.json +++ b/public/language/et/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/et/users.json b/public/language/et/users.json index 4782d131f5..ac83e6b160 100644 --- a/public/language/et/users.json +++ b/public/language/et/users.json @@ -5,7 +5,7 @@ "search": "Otsi", "enter_username": "Sisesta kasutajanimi, keda soovid otsida", "load_more": "Lae veel", - "users-found-search-took": "%1kasutaja(t) leiti! Otsing kestis %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/fa_IR/email.json b/public/language/fa_IR/email.json index 79cf1e91cf..206fe1823b 100644 --- a/public/language/fa_IR/email.json +++ b/public/language/fa_IR/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "برای تنظیم مجدد گذرواژه‌ی خود اینجا کلیک کنید", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "برای دیدن 1% اینجا کلیک کنید", diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 61736c18c4..e99118134c 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -35,6 +35,7 @@ "topic-locked": "جستار بسته شد.", "still-uploading": "خواهشمندیم تا پایان بارگذاری‌ها شکیبا باشید.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "خواهشمندیم عنوان کوتاه‌تری بنویسید. عنوان‌ها نمی‌توانند بیش‌تر از %1 نویسه داشته باشند.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/fa_IR/pages.json b/public/language/fa_IR/pages.json index ec3b4e6800..42dacfa193 100644 --- a/public/language/fa_IR/pages.json +++ b/public/language/fa_IR/pages.json @@ -11,6 +11,7 @@ "user.followers": "کاربرانی که %1 را دنبال می‌کنند", "user.posts": "دیدگاه‌های %1", "user.topics": "%1 این جستار را ساخت.", + "user.groups": "%1's Groups", "user.favourites": "دیدگاه‌های پسندیدهٔ %1", "user.settings": "تنظیمات کاربر", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/fa_IR/reset_password.json b/public/language/fa_IR/reset_password.json index a0171f831c..5e6ea61461 100644 --- a/public/language/fa_IR/reset_password.json +++ b/public/language/fa_IR/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "لطفا نشانی رایانامهٔ خود را بنویسید و ما دستورکار بازیابی شناسه‌تان را به این رایانامه می‌فرستیم.", "enter_email_address": "نوشتن نشانی رایانامه", "password_reset_sent": "رایانامهٔ بازیابی گذرواژه فرستاده شد", - "invalid_email": "رایانامهٔ نامعتبر / رایانامه وجود ندارد!" + "invalid_email": "رایانامهٔ نامعتبر / رایانامه وجود ندارد!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/fa_IR/search.json b/public/language/fa_IR/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/fa_IR/search.json +++ b/public/language/fa_IR/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/fa_IR/users.json b/public/language/fa_IR/users.json index aec64b6020..b164bd0839 100644 --- a/public/language/fa_IR/users.json +++ b/public/language/fa_IR/users.json @@ -5,7 +5,7 @@ "search": "جستجو", "enter_username": "یک نام کاربری برای جستجو وارد کنید", "load_more": "بارگذاری بیش‌تر", - "users-found-search-took": "%1 کاربر() در مدت زمان %2 میلی ثانیه یافت شد!", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/fi/email.json b/public/language/fi/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/fi/email.json +++ b/public/language/fi/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index a9f843b34a..813f7896e2 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -35,6 +35,7 @@ "topic-locked": "Aihe lukittu", "still-uploading": "Ole hyvä ja odota tiedostojen lähettämisen valmistumista.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Otsikkosi on liian pitkä. Otsikoiden pituuden tulee olla enintään %1 merkkiä.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/fi/pages.json b/public/language/fi/pages.json index 22b1b20306..07d941a4dc 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -11,6 +11,7 @@ "user.followers": "Käyttäjät, jotka seuraavat käyttäjää %1", "user.posts": "Käyttäjän %1 kirjoittamat viestit", "user.topics": "Käyttäjän %1 aloittamat aiheet", + "user.groups": "%1's Groups", "user.favourites": "Käyttäjän %1 suosikkiviestit", "user.settings": "Käyttäjän asetukset", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/fi/reset_password.json b/public/language/fi/reset_password.json index 071287708d..9d78c5f372 100644 --- a/public/language/fi/reset_password.json +++ b/public/language/fi/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Syötä sähköpostiosoitteesi, niin me lähetämme sinulle sähköpostilla ohjeet käyttäjätilisi palauttamiseksi.", "enter_email_address": "Syötä sähköpostiosoite", "password_reset_sent": "Salasanan palautuskoodi lähetetty", - "invalid_email": "Virheellinen sähköpostiosoite / Sähköpostiosoitetta ei ole olemassa!" + "invalid_email": "Virheellinen sähköpostiosoite / Sähköpostiosoitetta ei ole olemassa!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/fi/search.json b/public/language/fi/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/fi/search.json +++ b/public/language/fi/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/fi/users.json b/public/language/fi/users.json index 67556152ae..f1cca4ea56 100644 --- a/public/language/fi/users.json +++ b/public/language/fi/users.json @@ -5,7 +5,7 @@ "search": "Hae", "enter_username": "Syötä käyttäjätunnus hakeaksesi", "load_more": "Lataa lisää", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/fr/email.json b/public/language/fr/email.json index 0e4f57d601..a3b80ecd21 100644 --- a/public/language/fr/email.json +++ b/public/language/fr/email.json @@ -9,6 +9,9 @@ "reset.text1": "Nous avons reçu une demande de réinitialisation de votre mot de passe, probablement parce que vous l'avez oublié. Si ce n'est pas le cas, veuillez ignorer cet email.", "reset.text2": "Pour confirmer la réinitialisation de votre mot de passe, veuillez cliquer sur le lien suivant :", "reset.cta": "Cliquez ici pour réinitialiser votre mot de passe", + "reset.notify.subject": "Mot de Passe modifié", + "reset.notify.text1": "Nous vous informons que le %1, votre mot de passe a été modifié.", + "reset.notify.text2": "Si vous n'avez pas autorisé ceci, veuillez contacter immédiatement un administrateur.", "digest.notifications": "Vous avez des notifications non-lues de %1 :", "digest.latest_topics": "Derniers sujets de %1 :", "digest.cta": "Cliquez ici pour aller sur %1", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 50507ebd02..bfa70c579c 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -35,6 +35,7 @@ "topic-locked": "Sujet verrouillé", "still-uploading": "Veuillez patienter pendant le téléchargement.", "content-too-short": "Veuillez entrer un message plus long. %1 caractères minimum.", + "content-too-long": "Veuillez poster un message plus cours. Les messages ne peuvent être plus long que %1 caractères.", "title-too-short": "Veuillez entrer un titre plus long. %1 caractères minimum.", "title-too-long": "Veuillez entrer un titre plus court. Les titres ne peuvent excéder %1 caractères.", "too-many-posts": "Vous ne pouvez poster que toutes les %1 secondes.", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 1085bcfc21..7698a55986 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -11,6 +11,7 @@ "user.followers": "Personnes qui suivent %1", "user.posts": "Message écrit par %1", "user.topics": "Sujets créés par %1", + "user.groups": "Les Groupes de %1", "user.favourites": "Messages favoris de %1", "user.settings": "Préférences utilisateur", "maintenance.text": "%1 est en maintenance. Veuillez revenir un peu plus tard.", diff --git a/public/language/fr/reset_password.json b/public/language/fr/reset_password.json index 00e531a9c4..f21186c870 100644 --- a/public/language/fr/reset_password.json +++ b/public/language/fr/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Veuillez entrer votre adresse email pour recevoir un email contenant les instructions permettant de réinitialiser votre compte.", "enter_email_address": "Entrer votre adresse email", "password_reset_sent": "La demande de réinitialisation du mot de passe a bien été envoyée", - "invalid_email": "Email invalide / L'email n'existe pas !" + "invalid_email": "Email invalide / L'email n'existe pas !", + "password_too_short": "Le mot de passe est trop court, veuillez entre un mot de passe différent.", + "passwords_do_not_match": "Les deux mots de passe saisient ne correspondent pas." } \ No newline at end of file diff --git a/public/language/fr/search.json b/public/language/fr/search.json index b8cdfc8d2a..20e22d2fa0 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -3,5 +3,33 @@ "no-matches": "Aucune réponse trouvée", "in": "Dans", "by": "Par", - "posted-by": "Posté par" + "titles": "Titres", + "titles-posts": "Titres et Messages", + "posted-by": "Posté par", + "in-categories": "Dans les catégories", + "search-child-categories": "Chercher les sous catégories", + "reply-count": "Nombre de réponses", + "at-least": "Au moins", + "at-most": "Au plus", + "post-time": "Date de message", + "newer-than": "Plus récent que", + "older-than": "Plus vieux que", + "any-date": "Toute date", + "yesterday": "Hier", + "one-week": "Une semaine", + "two-weeks": "Deux semaines", + "one-month": "Un mois", + "three-months": "Trois mois", + "six-months": "Six mois", + "one-year": "Un an", + "sort-by": "Trier par", + "last-reply-time": "Date de dernière réponse", + "topic-title": "Titre de sujet", + "number-of-replies": "Nombre de réponses", + "number-of-views": "Nombre de vues", + "topic-start-date": "Date de création du sujet", + "username": "Nom d'utilisateur", + "category": "Catgorie", + "descending": "Par ordre décroissant", + "ascending": "Par ordre croissant" } \ No newline at end of file diff --git a/public/language/fr/users.json b/public/language/fr/users.json index 8d2c4481ea..1028292a9b 100644 --- a/public/language/fr/users.json +++ b/public/language/fr/users.json @@ -5,7 +5,7 @@ "search": "Rechercher", "enter_username": "Entrer un nom d'utilisateur pour rechercher", "load_more": "Charger la suite", - "users-found-search-took": "%1 utilisateur(s) trouvé(s) ! Recherche effectuée en %2 ms.", + "users-found-search-took": "%1 utilisateur(s) trouvé(s)! La recherche a pris %2 secondes.", "filter-by": "Filtrer Par", "online-only": "En Ligne uniquement", "picture-only": "Avec Image uniquement" diff --git a/public/language/he/category.json b/public/language/he/category.json index bc5e530729..86292076b6 100644 --- a/public/language/he/category.json +++ b/public/language/he/category.json @@ -4,5 +4,5 @@ "browsing": "צופים בנושא זה כעת", "no_replies": "אין תגובות", "share_this_category": "שתף קטגוריה זו", - "ignore": "Ignore" + "ignore": "התעלם" } \ No newline at end of file diff --git a/public/language/he/email.json b/public/language/he/email.json index e3199a9b14..8743ba21d8 100644 --- a/public/language/he/email.json +++ b/public/language/he/email.json @@ -1,25 +1,28 @@ { - "password-reset-requested": "Password Reset Requested - %1!", - "welcome-to": "Welcome to %1", - "greeting_no_name": "Hello", - "greeting_with_name": "Hello %1", - "welcome.text1": "Thank you for registering with %1!", - "welcome.text2": "To fully activate your account, we need to verify that you own the email address you registered with.", - "welcome.cta": "Click here to confirm your email address", - "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", - "reset.text2": "To continue with the password reset, please click on the following link:", - "reset.cta": "Click here to reset your password", - "digest.notifications": "You have unread notifications from %1:", - "digest.latest_topics": "Latest topics from %1", - "digest.cta": "Click here to visit %1", - "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", - "notif.chat.subject": "New chat message received from %1", - "notif.chat.cta": "Click here to continue the conversation", - "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", - "notif.post.cta": "Click here to read the full topic", - "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", - "test.text1": "This is a test email to verify that the emailer is set up correctly for your NodeBB.", - "unsub.cta": "Click here to alter those settings", - "closing": "Thanks!" + "password-reset-requested": "בקשת איפוס הסיסמה נשלחה - %1!", + "welcome-to": "ברוכים הבאים ל%1", + "greeting_no_name": "שלום", + "greeting_with_name": "שלום %1", + "welcome.text1": "תודה שנרשמת ל%1!", + "welcome.text2": "על מנת להפעיל את החשבון שלך, אנו צריכים לוודא שאתה בעל חשבון המייל שנרשמת איתו.", + "welcome.cta": "לחץ כאן על מנת לאשר את כתובת המייל שלך.", + "reset.text1": "קיבלנו בקשה לאפס את הסיסמה לחשבון שלך, כנראה מפני ששכחת אותה. אם לא ביקשת לאפס את הסיסמה, אנא התעלם ממייל זה.", + "reset.text2": "על מנת להמשיך עם תהליך איפוס הסיסמה, אנא לחץ על הלינק הבא:", + "reset.cta": "לחץ כאן לאפס את הסיסמה שלך.", + "reset.notify.subject": "הסיסמה שונתה בהצלחה.", + "reset.notify.text1": "אנו מודיעים לך שב%1, סיסמתך שונתה בהצלחה.", + "reset.notify.text2": "אם לא אישרת בקשה זו, אנא הודע למנהל מיד.", + "digest.notifications": "יש לך התראה שלא נקראה מ%1:", + "digest.latest_topics": "נושאים אחרונים מ%1", + "digest.cta": "לחץ כאן כדי לבקר ב %1", + "digest.unsub.info": "תקציר זה נשלח אליך על-פי הגדרות החשבון שלך.", + "digest.no_topics": "אין נושאים פעילים ב%1 האחרון/ים", + "notif.chat.subject": "הודעת צ'אט חדשה התקבלה מ%1", + "notif.chat.cta": "לחץ כאן כדי להמשיך את השיחה", + "notif.chat.unsub.info": "התראה הצ'אט הזו נשלחה אליך על-פי הגדרות החשבון שלך.", + "notif.post.cta": "לחץ כאן בשביל לקרוא את כל הנושא", + "notif.post.unsub.info": "התראת הפוסט הזו נשלחה אליך על-פי הגדרות החשבון שלך.", + "test.text1": "זהו אימייל ניסיון על מנת לוודא שהגדרות המייל בוצעו כהלכה בהגדרות NodeBB.", + "unsub.cta": "לחץ כאן לשנות הגדרות אלו", + "closing": "תודה!" } \ No newline at end of file diff --git a/public/language/he/error.json b/public/language/he/error.json index 28a5461705..23d21ee1ae 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -12,62 +12,63 @@ "invalid-title": "כותרת שגויה", "invalid-user-data": "מידע משתמש שגוי", "invalid-password": "סיסמא שגויה", - "invalid-username-or-password": "Please specify both a username and password", - "invalid-search-term": "Invalid search term", + "invalid-username-or-password": "אנא הגדר שם משתמש וסיסמה", + "invalid-search-term": "מילת חיפוש לא תקינה", "invalid-pagination-value": "ערך דפדוף שגוי", "username-taken": "שם משתמש תפוס", "email-taken": "כתובת אימייל תפוסה", - "email-not-confirmed": "Your email has not been confirmed yet, please click here to confirm your email.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed", + "email-not-confirmed": "כתובת המייל שלך עוד לא אושרה, לחץ כאן על-מנת לאשר את המייל שלך.", + "email-not-confirmed-chat": "לא תוכל לדבר בצ'אט עד שלא תאשר את כתובת המייל שלך", "username-too-short": "שם משתמש קצר מדי", - "username-too-long": "Username too long", + "username-too-long": "שם משתמש ארוך מדי", "user-banned": "המשתמש חסום", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", - "no-category": "Category does not exist", - "no-topic": "Topic does not exist", - "no-post": "Post does not exist", - "no-group": "Group does not exist", - "no-user": "User does not exist", - "no-teaser": "Teaser does not exist", - "no-privileges": "You do not have enough privileges for this action.", - "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", + "user-too-new": "מצטערים, אתה צריך לחכות %1 שניות לפני שתוכל לפרסם את הפוסט הראשון שלך", + "no-category": "קטגוריה אינה קיימת", + "no-topic": "נושא אינו קיים", + "no-post": "פוסט אינו קיים", + "no-group": "קבוצה אינה קיימת", + "no-user": "משתמש אינו קיים", + "no-teaser": "תקציר אינו קיים", + "no-privileges": "ההרשאות שלך אינן מספיקות לביצוע פעולה זו", + "no-emailers-configured": "לא נמצאו פלאגינים למייל, לכן אין אפשרות לשלוח מייל ניסיון.", "category-disabled": "קטגוריה לא פעילה", "topic-locked": "נושא נעול", "still-uploading": "אנא המתן לסיום ההעלאות", - "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", - "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", + "content-too-short": "יש להכניס פוסט ארוך יותר. פוסטים חייבים להכיל לפחות %1 תווים.", + "content-too-long": "יש לקצר את הפוסט. פוסטים אינם יכולים להיות ארוכים מ %1 תווים.", + "title-too-short": "יש להכניס כותרת ארוכה יותר. כותרות חייבות להכיל לפחות %1 תווים.", "title-too-long": "יש לקצר את הכותרת. כותרות אינן יכולות להיות ארוכות מ %1 תווים.", - "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", - "too-many-posts-newbie": "As a new user, you can only post once every %1 seconds until you have earned %2 reputation - please wait before posting again", - "file-too-big": "Maximum allowed file size is %1 kbs - please upload a smaller file", + "too-many-posts": "אתה יכול להעלות פוסט כל %1 שניות בלבד - אנא המתן.", + "too-many-posts-newbie": "כמשתמש חדש, אתה יכול להעלות פוסט כל %1 שניות עד שצברת %2 מוניטין - אנא המתן.", + "file-too-big": "גודל קובץ מקסימלי הינו %1 קילובייט - אנא העלה קובץ קטן יותר.", "cant-vote-self-post": "לא ניתן להצביע לפוסט שלך", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "כבר הוספת פוסט זה למועדפים", + "already-unfavourited": "כבר הסרת פוסט זה מהמועדפים", "cant-ban-other-admins": "אינך יכול לחסום מנהלים אחרים!", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", + "invalid-image-type": "פורמט תמונה לא תקין. הפורמטים המורשים הם: %1", + "invalid-image-extension": "פורמט תמונה לא תקין", "group-name-too-short": "שם הקבוצה קצר מדי", "group-already-exists": "הקבוצה כבר קיימת", "group-name-change-not-allowed": "לא ניתן לשנות את שם הקבוצה", - "group-already-member": "You are already part of this group", - "group-needs-owner": "This group requires at least one owner", - "post-already-deleted": "This post has already been deleted", - "post-already-restored": "This post has already been restored", - "topic-already-deleted": "This topic has already been deleted", - "topic-already-restored": "This topic has already been restored", + "group-already-member": "אתה כבר חבר בקבוצה זו", + "group-needs-owner": "קבוצה זו חייבת לפחות מנהל אחד", + "post-already-deleted": "פוסט זה כבר נמחק", + "post-already-restored": "פוסט זה כבר שוחזר", + "topic-already-deleted": "נושא זה כבר נמחק", + "topic-already-restored": "נושא זה כבר שוחזר", "topic-thumbnails-are-disabled": "תמונות ממוזערות לנושא אינן מאופשרות.", "invalid-file": "קובץ לא תקין", "uploads-are-disabled": "העלאת קבצים אינה מאופשרת", "upload-error": "שגיאה בהעלאה : %1", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "מצטערים, אורך החתימה המקסימלי הוא %1 תווים.", "cant-chat-with-yourself": "לא ניתן לעשות צ'אט עם עצמך!", - "chat-restricted": "This user has restricted their chat messages. They must follow you before you can chat with them", - "too-many-messages": "You have sent too many messages, please wait awhile.", - "reputation-system-disabled": "Reputation system is disabled.", - "downvoting-disabled": "Downvoting is disabled", + "chat-restricted": "משתמש זה חסם את הודעות הצ'אט שלו ממשתמשים זרים. המשתמש חייב לעקוב אחריך לפני שתוכל לשוחח איתו בצ'אט", + "too-many-messages": "שלחת יותר מדי הודעות, אנא המתן לזמן מה.", + "reputation-system-disabled": "מערכת המוניטין לא פעילה.", + "downvoting-disabled": "היכולת להצביע נגד לא פעילה", "not-enough-reputation-to-downvote": "אין לך מספיק מוניטין כדי להוריד את הדירוג של פוסט זה", - "not-enough-reputation-to-flag": "You do not have enough reputation to flag this post", - "reload-failed": "NodeBB encountered a problem while reloading: \"%1\". NodeBB will continue to serve the existing client-side assets, although you should undo what you did just prior to reloading.", - "registration-error": "Registration Error", - "parse-error": "Something went wrong while parsing server response" + "not-enough-reputation-to-flag": "אין לך מוניטין מספק על מנת לסמן את הפוסט הזה", + "reload-failed": "אירעה תקלה ב NodeBB בזמן הטעינה של: \"%1\". המערכת תמשיך להגיש דפים קיימים, אבל כדאי שתשחזר את הפעולות שלך מהפעם האחרונה שהמערכת עבדה כראוי.", + "registration-error": "שגיאה בהרשמה", + "parse-error": "אירעה שגיאה בעת בעת ניתוח תגובת השרת" } \ No newline at end of file diff --git a/public/language/he/global.json b/public/language/he/global.json index 7a5d014492..da7f284644 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -3,10 +3,10 @@ "search": "חיפוש", "buttons.close": "סגור", "403.title": "גישה נדחתה", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "נראה שהגעת לעמוד שאין לך הרשאה לצפות בו", + "403.login": "נסה להתחבר.", "404.title": "לא נמצא", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "נראה שהגעת לעמוד שלא קיים. חזור לעמוד הבית", "500.title": "שגיאה פנימית.", "500.message": "אופס! נראה שמשהו השתבש!", "register": "הרשמה", @@ -27,7 +27,7 @@ "header.tags": "תגיות", "header.popular": "פופולרי", "header.users": "משתמשים", - "header.groups": "Groups", + "header.groups": "קבוצות", "header.chats": "צ'אטים", "header.notifications": "התראות", "header.search": "חיפוש", @@ -74,8 +74,8 @@ "guests": "אורחים", "updated.title": "הפורום עודכן", "updated.message": "הפורום עודכן לגרסא האחרונה. נא ללחוץ כאן לעדכון הדף.", - "privacy": "Privacy", - "follow": "Follow", - "unfollow": "Unfollow", - "delete_all": "Delete All" + "privacy": "פרטיות", + "follow": "עקוב", + "unfollow": "הפסק לעקוב", + "delete_all": "מחק הכל" } \ No newline at end of file diff --git a/public/language/he/groups.json b/public/language/he/groups.json index 6dfd71256b..54f7936c08 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -1,21 +1,21 @@ { - "groups": "Groups", - "view_group": "View Group", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "cover-instructions": "Drag and Drop a photo, drag to position, and hit Save", - "cover-change": "Change", - "cover-save": "Save", - "cover-saving": "Saving", - "details.title": "Group Details", - "details.members": "Member List", - "details.pending": "Pending Members", - "details.has_no_posts": "This group's members have not made any posts.", - "details.latest_posts": "Latest Posts", - "details.private": "Private Group", - "details.public": "Public Group", - "details.owner_options": "Group Administration", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted" + "groups": "קבוצות", + "view_group": "צפה בקבוצה", + "owner": "מנהל הקבוצה", + "new_group": "צור קבוצה חדשה", + "no_groups_found": "אין קבוצות לצפייה", + "cover-instructions": "גרור תמונה, הזז למיקום הרצוי ואז לחץ על שמור", + "cover-change": "שנה", + "cover-save": "שמור", + "cover-saving": "שומר", + "details.title": "פרטי הקבוצה", + "details.members": "רשימת חברי הקבוצה", + "details.pending": "חברי קבוצה הממתינים לאישור", + "details.has_no_posts": "חברי הקבוצה הזו לא העלו אף פוסט.", + "details.latest_posts": "פוסטים אחרונים", + "details.private": "קבוצה פרטית", + "details.public": "קבוצה פומבית", + "details.owner_options": "ניהול הקבוצה", + "event.updated": "פרטי הקבוצה עודכנו", + "event.deleted": "קבוצת \"%1\" נמחקה" } \ No newline at end of file diff --git a/public/language/he/modules.json b/public/language/he/modules.json index 521915ec96..43bf264e7b 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -1,20 +1,20 @@ { "chat.chatting_with": "שוחח עם ", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "הקלד את הודעת הצ'אט כאן, לחץ אנטר לשליחה", "chat.send": "שלח", "chat.no_active": "אין לך צ'אטים פעילים", "chat.user_typing": "%1 מקליד ...", "chat.user_has_messaged_you": "ל%1 יש הודעה עבורך.", "chat.see_all": "צפה בכל הצ'אטים", - "chat.no-messages": "Please select a recipient to view chat message history", - "chat.recent-chats": "Recent Chats", - "chat.contacts": "Contacts", - "chat.message-history": "Message History", - "chat.pop-out": "Pop out chat", - "chat.maximize": "Maximize", - "chat.seven_days": "7 Days", - "chat.thirty_days": "30 Days", - "chat.three_months": "3 Months", + "chat.no-messages": "אנא בחר נמען על מנת לראות את היסטוריית הצ'אט איתו", + "chat.recent-chats": "צ'אטים אחרונים", + "chat.contacts": "אנשי קשר", + "chat.message-history": "היסטוריית הודעות", + "chat.pop-out": "הוצא את חלון הצ'אט", + "chat.maximize": "הרחב", + "chat.seven_days": "7 ימים", + "chat.thirty_days": "30 ימים", + "chat.three_months": "3 חודשים", "composer.user_said_in": "%1 אמר ב%2:", "composer.user_said": "%1 אמר:", "composer.discard": "האם למחוק פוסט זה?" diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index 9bc2d9c5d8..515b890810 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -2,26 +2,26 @@ "title": "התראות", "no_notifs": "אין התראות", "see_all": "צפה בכל ההתראות", - "back_to_home": "Back to %1", + "back_to_home": "חזרה ל%1", "outgoing_link": "לינק", - "outgoing_link_message": "You are now leaving %1.", - "continue_to": "Continue to %1", - "return_to": "Return to %1", - "new_notification": "New Notification", - "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.", - "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.", - "email-confirmed": "Email Confirmed", - "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", - "email-confirm-error": "An error occurred...", - "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", - "email-confirm-sent": "Confirmation email sent." + "outgoing_link_message": "אתה כעת עוזב את %1.", + "continue_to": "המשך ל %1", + "return_to": "חזור ל %1", + "new_notification": "התראה חדשה", + "you_have_unread_notifications": "יש לך התראות שלא נקראו.", + "new_message_from": "הודעה חדשה מ %1", + "upvoted_your_post_in": "%1 הצביע בעד הפוסט שלך ב %2", + "moved_your_post": "%1 העביר את הפוסט שלך.", + "moved_your_topic": "%1 הזיז את הנושא שלך.", + "favourited_your_post_in": "%1 הוסיף את הפוסט שלך ב %2 למועדפים שלו.", + "user_flagged_post_in": "%1 דיווח על פוסט ב %2", + "user_posted_to": "%1 פרסם תגובה ל: %2", + "user_posted_topic": "%1 העלה נושא חדש: %2", + "user_mentioned_you_in": "%1 הזכיר אותך ב %2", + "user_started_following_you": "%1 התחיל לעקוב אחריך.", + "email-confirmed": "כתובת המייל אושרה", + "email-confirmed-message": "תודה שאישרת את כתובת המייל שלך. החשבון שלך פעיל כעת.", + "email-confirm-error": "אירעה שגיאה...", + "email-confirm-error-message": "אירעה שגיאה בעת אישור המייל שלך. ייתכן כי הקוד היה שגוי או פג תוקף.", + "email-confirm-sent": "מייל אישור נשלח." } \ No newline at end of file diff --git a/public/language/he/pages.json b/public/language/he/pages.json index 46544cf924..aaeb1fcac5 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -5,14 +5,15 @@ "recent": "נושאים אחרונים", "users": "משתמשים רשומים", "notifications": "התראות", - "tags": "Topics tagged under \"%1\"", + "tags": "נושאים שתויגו תחת \"%1\"", "user.edit": "עורך את %1", "user.following": "אנשים ש%1 עוקב אחריהם", "user.followers": "אנשים שעוקבים אחרי %1", "user.posts": "פוסטים שהועלו על ידי %1", "user.topics": "נושאים שנוצרו על ידי %1", + "user.groups": "הקבוצות של %1", "user.favourites": "הפוסטים המועדפים על %1", "user.settings": "הגדרות משתמש", - "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", - "maintenance.messageIntro": "Additionally, the administrator has left this message:" + "maintenance.text": "%1 כרגע תחת עבודות תחזוקה. אנא חזור בזמן מאוחר יותר.", + "maintenance.messageIntro": "בנוסף, המנהל השאיר את ההודעה הזו:" } \ No newline at end of file diff --git a/public/language/he/recent.json b/public/language/he/recent.json index 6e1cd5f811..44960c78f7 100644 --- a/public/language/he/recent.json +++ b/public/language/he/recent.json @@ -3,16 +3,16 @@ "day": "יום", "week": "שבוע", "month": "חודש", - "year": "Year", - "alltime": "All Time", + "year": "שנה", + "alltime": "כל הזמן", "no_recent_topics": "אין נושאים חדשים", - "there-is-a-new-topic": "There is a new topic.", - "there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.", - "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", - "there-are-new-topics": "There are %1 new topics.", - "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", - "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", - "there-is-a-new-post": "There is a new post.", - "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Click here to reload." + "there-is-a-new-topic": "יש נושא חדש.", + "there-is-a-new-topic-and-a-new-post": "יש נושא ופוסט חדש.", + "there-is-a-new-topic-and-new-posts": "יש נושא ו%1 פוסטים חדשים.", + "there-are-new-topics": "יש %1 נושאים חדשים.", + "there-are-new-topics-and-a-new-post": "יש %1 נושאים ופוסט חדש.", + "there-are-new-topics-and-new-posts": "יש %1 נושאים ו %2 פוסטים חדשים.", + "there-is-a-new-post": "יש פוסט חדש.", + "there-are-new-posts": "יש %1 פוסטים חדשים.", + "click-here-to-reload": "לחץ כאן על מנת לטעון מחדש." } \ No newline at end of file diff --git a/public/language/he/reset_password.json b/public/language/he/reset_password.json index 7aa44652cd..2ed1435b18 100644 --- a/public/language/he/reset_password.json +++ b/public/language/he/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "אנא הקלד את כתובת האימייל שלך ואנו נשלח לך הוראות כיצד לאפס את חשבונך", "enter_email_address": "הכנס כתובת אימייל", "password_reset_sent": "קוד איפוס סיסמה נשלח", - "invalid_email": "מייל שגוי / כתובת מייל לא נמצאה" + "invalid_email": "מייל שגוי / כתובת מייל לא נמצאה", + "password_too_short": "הסיסמה שבחרת קצרה מדי, אנא בחר סיסמה שונה.", + "passwords_do_not_match": "הסיסמאות שהזנת אינן תואמות." } \ No newline at end of file diff --git a/public/language/he/search.json b/public/language/he/search.json index c89241d382..fec789c3be 100644 --- a/public/language/he/search.json +++ b/public/language/he/search.json @@ -1,7 +1,35 @@ { - "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", - "no-matches": "No matches found", - "in": "In", - "by": "By", - "posted-by": "Posted by" + "results_matching": "נמצאו %1 תוצאות עבור החיפוש \"%2\", (%3 שניות)", + "no-matches": "לא נמצאו תוצאות", + "in": "ב", + "by": "על ידי", + "titles": "כותרות", + "titles-posts": "כותרות ופוסטים", + "posted-by": "פורסם על-ידי", + "in-categories": "בקטגוריות", + "search-child-categories": "חפש בתת קטגוריות", + "reply-count": "כמות תגובות", + "at-least": "לפחות", + "at-most": "לכל היותר", + "post-time": "זמן הפוסט", + "newer-than": "חדש מ", + "older-than": "ישן מ", + "any-date": "כל תאריך", + "yesterday": "אתמול", + "one-week": "שבוע אחד", + "two-weeks": "שבועיים", + "one-month": "חודש אחד", + "three-months": "שלושה חודשים", + "six-months": "שישה חודשים", + "one-year": "שנה אחת", + "sort-by": "סדר על-פי", + "last-reply-time": "תאריך תגובה אחרון", + "topic-title": "כותרת הנושא", + "number-of-replies": "מספר התגובות", + "number-of-views": "מספר הצפיות", + "topic-start-date": "זמן תחילת הנושא", + "username": "שם משתמש", + "category": "קטגוריה", + "descending": "בסדר יורד", + "ascending": "בסדר עולה" } \ No newline at end of file diff --git a/public/language/he/tags.json b/public/language/he/tags.json index 94d002603f..13912500cb 100644 --- a/public/language/he/tags.json +++ b/public/language/he/tags.json @@ -2,6 +2,6 @@ "no_tag_topics": "אין פוסטים עם תגית זו.", "tags": "תגיות", "enter_tags_here": "יש להכניס כאן את התגיות. לחץ אנטר אחרי כל תגית.", - "enter_tags_here_short": "Enter tags...", + "enter_tags_here_short": "הכנס תגיות", "no_tags": "אין עדיין תגיות." } \ No newline at end of file diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 2e0d4a0d2e..e16ebc08cf 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -1,61 +1,61 @@ { "topic": "נושא", - "topic_id": "Topic ID", - "topic_id_placeholder": "Enter topic ID", + "topic_id": "מזהה נושא", + "topic_id_placeholder": "הכנס מזהה נושא", "no_topics_found": "לא נמצאו נושאים!", "no_posts_found": "לא נמצאו פוסטים!", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "פוסט זה נמחק!", "profile": "פרופיל", "posted_by": "הפוסט הועלה על ידי %1", - "posted_by_guest": "Posted by Guest", + "posted_by_guest": "פורסם על-ידי אורח", "chat": "צ'אט", "notify_me": "קבל התראה כאשר יש תגובות חדשות בנושא זה", "quote": "ציטוט", "reply": "תגובה", "edit": "עריכה", "delete": "מחק", - "purge": "Purge", - "restore": "Restore", + "purge": "מחק הכל", + "restore": "שחזר", "move": "הזז", "fork": "פורק", "link": "לינק", "share": "Share", "tools": "כלים", "flag": "דווח", - "locked": "Locked", - "bookmark_instructions": "Click here to return to your last position or close to discard.", + "locked": "נעול", + "bookmark_instructions": "לחץ כאן על-מנת לחזור למיקום האחרון או סגור למחיקה.", "flag_title": "דווח על פוסט זה למנהל", - "flag_confirm": "Are you sure you want to flag this post?", - "flag_success": "This post has been flagged for moderation.", - "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", + "flag_confirm": "אתה בטוח שאתה רוצה לדווח על הפוסט הזה?", + "flag_success": "התקבל דיווח על פוסט זה.", + "deleted_message": "נושא זה נמחק. רק משתמשים עם ההרשאות המתאימות יכולים לצפות בו.", "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.", + "login_to_subscribe": "אנא הרשם או התחבר על-מנת לעקוב אחר נושא זה.", + "markAsUnreadForAll.success": "נושא זה סומן כלא נקרא לכולם.", "watch": "עקוב", - "unwatch": "Unwatch", - "watch.title": "Be notified of new replies in this topic", - "unwatch.title": "Stop watching this topic", + "unwatch": "הפסק לעקוב", + "watch.title": "קבל התראה כאשר יש תגובות חדשות בנושא זה", + "unwatch.title": "הפסק לעקוב אחר נושא זה", "share_this_post": "שתף פוסט זה", - "thread_tools.title": "Topic Tools", + "thread_tools.title": "כלי נושא", "thread_tools.markAsUnreadForAll": "סמן כלא נקרא", "thread_tools.pin": "נעץ נושא", "thread_tools.unpin": "הסר נעץ", "thread_tools.lock": "נעל נושא", "thread_tools.unlock": "הסר נעילה", "thread_tools.move": "הזז נושא", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "הזז הכל", "thread_tools.fork": "שכפל נושא", "thread_tools.delete": "מחק נושא", - "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", + "thread_tools.delete_confirm": "אתה בטוח שאתה רוצה למחוק את הנושא הזה?", "thread_tools.restore": "שחזר נושא", - "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 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?", - "post_purge_confirm": "Are you sure you want to purge this post?", + "thread_tools.restore_confirm": "אתה בטוח שאתה רוצה לשחזר את הנושא הזה?", + "thread_tools.purge": "מחק נושא", + "thread_tools.purge_confirm": "אתה בטוח שאתה רוצה למחוק את הנושא הזה?", + "topic_move_success": "נושא זה הועבר בהצלחה ל %1", + "post_delete_confirm": "אתה בטוח שאתה רוצה למחוק את הפוסט הזה?", + "post_restore_confirm": "אתה בטוח שאתה רוצה לשחזר את הפוסט הזה?", + "post_purge_confirm": "אתה בטוח שאתה רוצה למחוק את הפוסט הזה?", "load_categories": "טוען קטגוריות", "disabled_categories_note": "קטגוריות מבוטלות צבועות באפור", "confirm_move": "הזז", @@ -65,34 +65,34 @@ "favourites.has_no_favourites": "אין לך כרגע פוסטים מועדפים, סמן מספר פוסטים כמועדפים על מנת לראות אותם כאן!", "loading_more_posts": "טוען פוסטים נוספים", "move_topic": "הזז נושא", - "move_topics": "Move Topics", + "move_topics": "הזז נושאים", "move_post": "הזז פוסט", - "post_moved": "Post moved!", + "post_moved": "הפוסט הועבר!", "fork_topic": "שכפל נושא", "topic_will_be_moved_to": "נושא זה יועבר לקטגוריה", "fork_topic_instruction": "לחץ על הפוסטים שברצונך לשכפל", "fork_no_pids": "לא בחרת אף פוסט!", - "fork_success": "Successfully forked topic! Click here to go to the forked topic.", + "fork_success": "הפוסט שוכפל בהצלחה! לחץ כאן על מנת לעבור לפוסט המשוכפל.", "composer.title_placeholder": "הכנס את כותרת הנושא כאן...", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "שם", "composer.discard": "מחק", "composer.submit": "שלח", - "composer.replying_to": "Replying to %1", + "composer.replying_to": "מגיב ל %1", "composer.new_topic": "נושא חדש", - "composer.uploading": "uploading...", - "composer.thumb_url_label": "Paste a topic thumbnail URL", - "composer.thumb_title": "Add a thumbnail to this topic", + "composer.uploading": "מעלה...", + "composer.thumb_url_label": "הדבק את כתובת ה URL לתמונה המוקטנת עבור הנושא", + "composer.thumb_title": "הוסף תמונה מוקטנת לנושא זה", "composer.thumb_url_placeholder": "http://example.com/thumb.png", - "composer.thumb_file_label": "Or upload a file", - "composer.thumb_remove": "Clear fields", - "composer.drag_and_drop_images": "Drag and Drop Images Here", - "more_users_and_guests": "%1 more user(s) and %2 guest(s)", - "more_users": "%1 more user(s)", - "more_guests": "%1 more guest(s)", - "users_and_others": "%1 and %2 others", - "sort_by": "Sort by", - "oldest_to_newest": "Oldest to Newest", - "newest_to_oldest": "Newest to Oldest", - "most_votes": "Most votes", - "most_posts": "Most posts" + "composer.thumb_file_label": "או העלה קובץ", + "composer.thumb_remove": "נקה שדות", + "composer.drag_and_drop_images": "גרור תמונות לכאן", + "more_users_and_guests": "%1 משתמשים ו%2 אורחים נוספים", + "more_users": "%1 משתמשים נוספים", + "more_guests": "%1 אורחים נוספים", + "users_and_others": "%1 ו%2 אחרים", + "sort_by": "סדר על-פי", + "oldest_to_newest": "מהישן לחדש", + "newest_to_oldest": "מהחדש לישן", + "most_votes": "הכי הרבה הצבעות", + "most_posts": "הכי הרבה פוסטים" } \ No newline at end of file diff --git a/public/language/he/user.json b/public/language/he/user.json index ec3d0e5b7a..e8b3a5d3a7 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -2,12 +2,12 @@ "banned": "מורחק", "offline": "לא מחובר", "username": "שם משתמש", - "joindate": "Join Date", - "postcount": "Post Count", + "joindate": "תאריך הצטרפות", + "postcount": "כמות פוסטים", "email": "כתובת אימייל", - "confirm_email": "Confirm Email", - "delete_account": "Delete Account", - "delete_account_confirm": "Are you sure you want to delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your username to confirm that you wish to destroy this account.", + "confirm_email": "אשר מייל", + "delete_account": "מחק חשבון", + "delete_account_confirm": "אתה בטוח שאתה רוצה למחוק את חשבונך?
פעולה זו לא ניתנת לשחזור ולא תוכל לגשת למידע שלך

הזן את שם המשתמש שלך על מנת לאשר שברצונך למחוק את חשבונך.", "fullname": "שם מלא", "website": "אתר", "location": "מיקום", @@ -18,7 +18,7 @@ "profile_views": "צפיות בפרופיל", "reputation": "מוניטין", "favourites": "מועדפים", - "watched": "Watched", + "watched": "נצפה", "followers": "עוקבים", "following": "עוקב אחרי", "signature": "חתימה", @@ -32,7 +32,7 @@ "edit": "ערוך", "uploaded_picture": "התמונה הועלתה", "upload_new_picture": "העלה תמונה חדשה", - "upload_new_picture_from_url": "Upload New Picture From URL", + "upload_new_picture_from_url": "העלה תמונה חדשה מ URL", "current_password": "סיסמה נוכחית", "change_password": "שנה סיסמה", "change_password_error": "סיסמה אינה תקינה!", @@ -43,28 +43,28 @@ "change_password_success": "הסיסמה שלך עודכנה!", "confirm_password": "אמת סיסמה", "password": "סיסמה", - "username_taken_workaround": "The username you requested was already taken, so we have altered it slightly. You are now known as %1", + "username_taken_workaround": "שם המשתמש שבחרת כבר תפוס, אז שינינו אותו מעט. שם המשתמש שלך כעת הוא %1", "upload_picture": "העלה תמונה", "upload_a_picture": "העלה תמונה", "image_spec": "ניתן להעלות תמונות בפורמט PNG, JPG או GIF בלבד", "max": "מקסימום", "settings": "הגדרות", "show_email": "פרסם את כתובת האימייל שלי", - "show_fullname": "Show My Full Name", - "restrict_chats": "Only allow chat messages from users I follow", - "digest_label": "Subscribe to Digest", - "digest_description": "Subscribe to email updates for this forum (new notifications and topics) according to a set schedule", - "digest_off": "Off", + "show_fullname": "הצג את שמי המלא", + "restrict_chats": "אשר הודעות צ'אט ממשתמשים שאני עוקב אחריהם בלבד", + "digest_label": "הרשם לקבלת תקציר", + "digest_description": "הרשם לקבלת עדכונים מפורום זה (התראות ונושאים חדשים) על-פי לוח זמנים קבוע מראש.", + "digest_off": "כבוי", "digest_daily": "יומי", "digest_weekly": "שבועי", "digest_monthly": "חודשי", - "send_chat_notifications": "Send an email if a new chat message arrives and I am not online", - "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", + "send_chat_notifications": "שלח לי הודעה למייל כאשר הודעת צ'אט נשלחה אלי בזמן שאיני מחובר", + "send_post_notifications": "שלח לי הודעה למייל כאשר תגובות חדשות פורסמו לנושאים שאני עוקב אחריהם", "has_no_follower": "למשתמש זה אין עוקבים :(", "follows_no_one": "משתמש זה אינו עוקב אחרי אחרים :(", "has_no_posts": "המשתמש הזה עוד לא פרסם כלום.", "has_no_topics": "המשתמש טרם יצר נושאים כלשהם.", - "has_no_watched_topics": "This user didn't watch any topics yet.", + "has_no_watched_topics": "משתמש זה לא עקב אחרי אף נושא עדיין.", "email_hidden": "כתובת אימייל מוסתרת", "hidden": "מוסתר", "paginate_description": "צור עימוד לנושאים במקום לטעון את כל התוכן בעמוד אחד.", @@ -72,9 +72,9 @@ "posts_per_page": "כמות פוסטים בעמוד", "notification_sounds": "השמע צליל כאשר מתקבלת הודעה עבורך.", "browsing": "הגדרות צפייה", - "open_links_in_new_tab": "Open outgoing links in new tab?", - "enable_topic_searching": "Enable In-Topic Searching", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", - "follow_topics_you_reply_to": "Follow topics that you reply to.", - "follow_topics_you_create": "Follow topics you create." + "open_links_in_new_tab": "פתח לינקים חיצוניים בטאב חדש?", + "enable_topic_searching": "הפעל חיפוש בתוך נושא", + "topic_search_help": "אם מופעל, חיפוש בתוך נושא יעקוף את מנגנון החיפוש הרגיל של הדפדפן שלך על מנת לאפשר לך לחפש בתוך כל הנושא ולא רק מה שמוצג כרגע בעמוד.", + "follow_topics_you_reply_to": "עקוב אחר נושאים שהגבת עליהם.", + "follow_topics_you_create": "עקוב אחר נושאים שיצרת." } \ No newline at end of file diff --git a/public/language/he/users.json b/public/language/he/users.json index c37d6e3609..5b996d5f5d 100644 --- a/public/language/he/users.json +++ b/public/language/he/users.json @@ -5,8 +5,8 @@ "search": "חיפוש", "enter_username": "הכנס שם משתמש לחיפוש", "load_more": "טען עוד", - "users-found-search-took": "נמצאו %1 משתמש(ים)! החיפוש ארך %2 מילי שניות.", - "filter-by": "Filter By", - "online-only": "Online only", - "picture-only": "Picture only" + "users-found-search-took": "%1 משתמשים נמצאו! החיפוש ערך %2 שניות.", + "filter-by": "פלטר על-פי", + "online-only": "אונליין בלבד", + "picture-only": "תמונה בלבד" } \ No newline at end of file diff --git a/public/language/hu/email.json b/public/language/hu/email.json index eaf8595c79..8430b8ff27 100644 --- a/public/language/hu/email.json +++ b/public/language/hu/email.json @@ -9,6 +9,9 @@ "reset.text1": "Kaptunk egy kérést jelszava visszaállításához, valószínűleg azért, mert elfelejtette azt. Ha ez nem így van, hagyja figyelmen kívül ezt a levelet.", "reset.text2": "Ha szeretné, hogy továbbra alaphelyzetbe a jelszavát, kérjük kattintson az alábbi linkre:", "reset.cta": "Kattints ide a jelszavad visszaállításához", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Olvasatlan értesítéseid vannak a következőtől: %1", "digest.latest_topics": "Legutóbbi témák a következőből: %1", "digest.cta": "Kattints ide, hogy meglátogasd a következőt: %1", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 705be11958..821145775e 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -35,6 +35,7 @@ "topic-locked": "Téma lezárva", "still-uploading": "Please wait for uploads to complete.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index 9dfa18ac9a..f8d1c20484 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -11,6 +11,7 @@ "user.followers": "Tagok akik követik %1 -t", "user.posts": "Hozzászólások által %1", "user.topics": "%1 által létrehozott témák", + "user.groups": "%1's Groups", "user.favourites": "%1 Kedvenc Hozzászólásai", "user.settings": "Felhasználói Beállítások", "maintenance.text": "%1 jelenleg karbantartás alatt van. Kérlek nézz vissza késöbb!", diff --git a/public/language/hu/reset_password.json b/public/language/hu/reset_password.json index d0efcfda44..3f5721d6d6 100644 --- a/public/language/hu/reset_password.json +++ b/public/language/hu/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Kérlek add meg az e-mail címedet, ahová elküldjük a további teendőket a jelszavad visszaállításával kapcsolatban.", "enter_email_address": "Email cím megadása", "password_reset_sent": "Jelszó-visszaállítás elküldve", - "invalid_email": "Helytelen E-mail cím / Nem létező E-mail cím!" + "invalid_email": "Helytelen E-mail cím / Nem létező E-mail cím!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/hu/search.json b/public/language/hu/search.json index f5df223660..6cae8bb926 100644 --- a/public/language/hu/search.json +++ b/public/language/hu/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/hu/users.json b/public/language/hu/users.json index 2f992c73b2..95e721a4d7 100644 --- a/public/language/hu/users.json +++ b/public/language/hu/users.json @@ -5,7 +5,7 @@ "search": "Keresés", "enter_username": "Írj be egy nicknevet a kereséshez", "load_more": "Több betöltése", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/id/email.json b/public/language/id/email.json index 86557a5832..481f412f23 100644 --- a/public/language/id/email.json +++ b/public/language/id/email.json @@ -9,6 +9,9 @@ "reset.text1": "Kami menerima permintan untuk mengatur ulang kata sandi anda, Ini dikarenakan anda telah lupa akan kata sandi anda. Tolong abaikan email ini jika sebaliknya.", "reset.text2": "Mohon klik link berikut untuk mengatur ulang kata sandi anda.", "reset.cta": "Klik di sini untuk mengatur ulang kata sandi anda", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Anda mempunyai notifikasi yang belum terbaca dari %1:", "digest.latest_topics": "Topik-topik terbaru dari %1", "digest.cta": "Klik di sini untuk mengunjungi %1", diff --git a/public/language/id/error.json b/public/language/id/error.json index dcce92a9bf..ce802296e2 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -35,6 +35,7 @@ "topic-locked": "Topik dikunci", "still-uploading": "Tunggu proses upload sampai selesai", "content-too-short": "Mohon masukkan posting yang lebih panjang. Posting harus memuat setidaknya %1 karakter.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Mohon masukkan judul yang lebih panjang. Judul harus memuat setidaknya %1 karakter.", "title-too-long": "Mohon masukkan judul yang lebih pendek. Judul tidak dapat melebihi %1 karakter.", "too-many-posts": "Kamu hanya dapat melakukan posting satu kali setiap %1 detik - mohon tunggu beberapa saat sebelum melakukan posting kembali", diff --git a/public/language/id/pages.json b/public/language/id/pages.json index bfedbfaa27..83b55a2b22 100644 --- a/public/language/id/pages.json +++ b/public/language/id/pages.json @@ -11,6 +11,7 @@ "user.followers": "Pengguna yang mengikuti %1", "user.posts": "Posting dibuat oleh %1", "user.topics": "Topik dibuat oleh %1", + "user.groups": "%1's Groups", "user.favourites": "Posting Favorit %1", "user.settings": "Pengaturan Pengguna", "maintenance.text": "%1 saat ini sedang dalam masa pemeliharaan. Silahkan kembali lain waktu.", diff --git a/public/language/id/reset_password.json b/public/language/id/reset_password.json index 7ae5b9e8d7..ec65c5ca68 100644 --- a/public/language/id/reset_password.json +++ b/public/language/id/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Mohon masukkan alamat emailmu dan kami akan mengirimkan mu sebuah email dengan instruksi mengenai cara pengaturan ulang akunmu.", "enter_email_address": "Masukkan Alamat Email", "password_reset_sent": "Pengaturan Kembali Kata Sandi telah DIkirim", - "invalid_email": "Email Salah / Email tidak ada!" + "invalid_email": "Email Salah / Email tidak ada!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/id/search.json b/public/language/id/search.json index af974065ab..5eb7f1f851 100644 --- a/public/language/id/search.json +++ b/public/language/id/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/id/users.json b/public/language/id/users.json index 4f7636a9c3..783d9478f3 100644 --- a/public/language/id/users.json +++ b/public/language/id/users.json @@ -5,7 +5,7 @@ "search": "Pencarian", "enter_username": "Masukkan nama pengguna untuk mencari", "load_more": "Tampilkan Lebih Banyak", - "users-found-search-took": "%1 pengguna ditemukan! Pencarian butuh waktu %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/it/email.json b/public/language/it/email.json index 8c0a1666c2..d54cf8c4cd 100644 --- a/public/language/it/email.json +++ b/public/language/it/email.json @@ -9,6 +9,9 @@ "reset.text1": "Abbiamo ricevuto una richiesta di reset della tua password, probabilmente perché l'hai dimenticata. Se non è così si prega di ignorare questa email.", "reset.text2": "Per confermare il reset della password per favore clicca il seguente link:", "reset.cta": "Clicca qui per resettare la tua password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Hai una notifica non letta da %1:", "digest.latest_topics": "Ultimi argomenti su %1", "digest.cta": "Clicca qui per visitare %1", diff --git a/public/language/it/error.json b/public/language/it/error.json index 241f9d90ea..fe207d0502 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -35,6 +35,7 @@ "topic-locked": "Discussione Bloccata", "still-uploading": "Per favore attendere il completamento degli uploads.", "content-too-short": "Inserisci un post più lungo. Il Messaggio deve contenere almeno %1 caratteri.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Inserisci un titolo più lungo. I titoli devono contenere almeno %1 caratteri.", "title-too-long": "Per favore inserire un titolo più corto, non può essere più lungo di %1 caratteri.", "too-many-posts": "È possibile inserire un Post ogni %1 secondi - si prega di attendere prima di postare di nuovo", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index 38c22f82b7..72d2a3e042 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -11,6 +11,7 @@ "user.followers": "Persone che seguono %1", "user.posts": "Post creati da %1", "user.topics": "Discussioni create da %1", + "user.groups": "%1's Groups", "user.favourites": "Post Favoriti da %1", "user.settings": "Impostazioni Utente", "maintenance.text": "%1 è attualmente in manutenzione. Per favore ritorna più tardi.", diff --git a/public/language/it/reset_password.json b/public/language/it/reset_password.json index 9340714167..4789b7f1c1 100644 --- a/public/language/it/reset_password.json +++ b/public/language/it/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Inserisci il tuo indirizzo email e ti invieremo un'email con le istruzioni per resettare il tuo account.", "enter_email_address": "Inserisci l'Indirizzo Email", "password_reset_sent": "Password Reset Inviata", - "invalid_email": "Email invalida / L'email non esiste!" + "invalid_email": "Email invalida / L'email non esiste!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/it/search.json b/public/language/it/search.json index 6b1250cf39..9d021ec7c5 100644 --- a/public/language/it/search.json +++ b/public/language/it/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/it/users.json b/public/language/it/users.json index 3faed8adbb..44f4b4f916 100644 --- a/public/language/it/users.json +++ b/public/language/it/users.json @@ -5,7 +5,7 @@ "search": "Cerca", "enter_username": "Inserisci il nome utente da cercare", "load_more": "Carica altri", - "users-found-search-took": "%1 utente(i) trovati! La ricerca ha impiegato %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/ja/email.json b/public/language/ja/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/ja/email.json +++ b/public/language/ja/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index a7b4c90a77..2a4a1ebac9 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -35,6 +35,7 @@ "topic-locked": "スレッドがロックされた", "still-uploading": "アップロードが完成するまでお待ちください。", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "タイトルに最大 %1 文字の制限があります。", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index e4534d567d..eb5274c6f1 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -11,6 +11,7 @@ "user.followers": "%1のフォロワー", "user.posts": "%1が作成したポスト", "user.topics": "%1が作成したスレッド", + "user.groups": "%1's Groups", "user.favourites": "%1のお気に入りポスト", "user.settings": "ユーザー設定", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/ja/reset_password.json b/public/language/ja/reset_password.json index c732e9e159..7e31c22720 100644 --- a/public/language/ja/reset_password.json +++ b/public/language/ja/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "メールアドレスを入力してください.パスワードリセットの指示をメールでご送付します。", "enter_email_address": "メールアドレスを入力してください", "password_reset_sent": "パスワードリセットのメールを送信しました", - "invalid_email": "このメールアドレスは存在しません" + "invalid_email": "このメールアドレスは存在しません", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/ja/search.json b/public/language/ja/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/ja/search.json +++ b/public/language/ja/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/ja/users.json b/public/language/ja/users.json index 9bf3d7a0d9..6d73cf0513 100644 --- a/public/language/ja/users.json +++ b/public/language/ja/users.json @@ -5,7 +5,7 @@ "search": "検索", "enter_username": "検索するユーザー名を入力してください", "load_more": "もっと表示", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/ko/email.json b/public/language/ko/email.json index a7e4ea2cfc..1c5032db35 100644 --- a/public/language/ko/email.json +++ b/public/language/ko/email.json @@ -9,6 +9,9 @@ "reset.text1": "패스워드 재설정 요청을 받았습니다. 패스워드를 분실해서 요청한 것이 아니라면 이 메일을 무시하셔도 좋습니다.", "reset.text2": "패스워드를 재설정하려면 다음 링크를 클릭하세요.", "reset.cta": "패스워드를 재설정하려면 여기를 클릭하세요.", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "%1에 읽지 않은 게시물이 있습니다.", "digest.latest_topics": "%1의 최근 주제", "digest.cta": "%1에 방문하시려면 클릭하세요.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 88c01be5d7..fcca053185 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -35,6 +35,7 @@ "topic-locked": "잠긴 주제입니다.", "still-uploading": "업로드가 끝날 때까지 기다려 주세요.", "content-too-short": "게시물의 내용이 너무 짧습니다. 최소 %1자 이상이어야 합니다.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "제목이 너무 짧습니다. 최소 %1자 이상이어야 합니다.", "title-too-long": "제목은 최대 %1자로 제한됩니다.", "too-many-posts": "새 게시물 작성은 %1초 간격으로 제한됩니다 - 잠시 기다렸다가 작성해주세요.", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index 570f5b22f5..ce1f9e5a05 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -11,6 +11,7 @@ "user.followers": "%1님을 팔로우하는 사용자", "user.posts": "%1님이 작성한 게시물", "user.topics": "%1님이 생성한 주제", + "user.groups": "%1's Groups", "user.favourites": "%1님이 좋아하는 게시물", "user.settings": "설정", "maintenance.text": "%1 사이트는 현재 점검 중입니다. 나중에 다시 방문해주세요.", diff --git a/public/language/ko/reset_password.json b/public/language/ko/reset_password.json index d229a5a931..60fe18c8e5 100644 --- a/public/language/ko/reset_password.json +++ b/public/language/ko/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "이메일 주소를 입력하면 비밀번호를 초기화하는 방법을 메일로 알려드립니다.", "enter_email_address": "여기에 이메일 주소를 입력하세요.", "password_reset_sent": "이메일이 발송되었습니다.", - "invalid_email": "올바르지 않거나 가입되지 않은 이메일입니다." + "invalid_email": "올바르지 않거나 가입되지 않은 이메일입니다.", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/ko/search.json b/public/language/ko/search.json index 391a7477ee..3905534515 100644 --- a/public/language/ko/search.json +++ b/public/language/ko/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/ko/users.json b/public/language/ko/users.json index 14f0b96551..9135621eb6 100644 --- a/public/language/ko/users.json +++ b/public/language/ko/users.json @@ -5,7 +5,7 @@ "search": "검색", "enter_username": "검색할 사용자 이름을 입력하세요.", "load_more": "더 보기", - "users-found-search-took": "%1명의 사용자를 찾았습니다! 검색에 %2 ms가 소요되었습니다.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/lt/email.json b/public/language/lt/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/lt/email.json +++ b/public/language/lt/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 91f17b67bc..1951d21778 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -35,6 +35,7 @@ "topic-locked": "Tema užrakinta", "still-uploading": "Prašome palaukti kol bus baigti visi kėlimai į serverį", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Pavadinimas turėtų būti trumpesnis. Maksimalus leistinas ilgis- %1 simbolių.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index 1551e325f2..338cd346f5 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -11,6 +11,7 @@ "user.followers": "Žmonės, kurie seka %1", "user.posts": "Pranešimai, kuriuos parašė %1", "user.topics": "Temos, kurias sukūrė %1", + "user.groups": "%1's Groups", "user.favourites": "Vartotojo %1 mėgstami pranešimai", "user.settings": "Vartotojo nustatymai", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/lt/reset_password.json b/public/language/lt/reset_password.json index 66192d423f..104f75e6e3 100644 --- a/public/language/lt/reset_password.json +++ b/public/language/lt/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Prašome įrašyti el. pašto adresą ir mes atsiųsime jums instrukciją, kaip atstatyti jūsų paskyrą.", "enter_email_address": "Įrašykite el. pašto adresą", "password_reset_sent": "Slaptažodžio atstatymas išsiųstas", - "invalid_email": "Klaidingas arba neegzistuojantis el. pašto adresas!" + "invalid_email": "Klaidingas arba neegzistuojantis el. pašto adresas!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/lt/search.json b/public/language/lt/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/lt/search.json +++ b/public/language/lt/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/lt/users.json b/public/language/lt/users.json index 58f5d1793e..043ca55bcc 100644 --- a/public/language/lt/users.json +++ b/public/language/lt/users.json @@ -5,7 +5,7 @@ "search": "Ieškoti", "enter_username": "Įrašykite vartotojo vardą paieškai", "load_more": "Įkelti daugiau", - "users-found-search-took": "%1 paskyra(-os)! Paieška užtruko %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/ms/email.json b/public/language/ms/email.json index 6e765e9f0b..4c5ca1adde 100644 --- a/public/language/ms/email.json +++ b/public/language/ms/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 9c50886310..3c68a1d7e5 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -35,6 +35,7 @@ "topic-locked": "Topic Locked", "still-uploading": "Please wait for uploads to complete.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index 6ce4a94980..dc7c0385e9 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -11,6 +11,7 @@ "user.followers": "Pengguna yang Mengikuti %1", "user.posts": "Kiriman dibuat oleh %1", "user.topics": "Topik dibuat oleh %1", + "user.groups": "%1's Groups", "user.favourites": "Mesej Kegemaran %1", "user.settings": "Tetapan pengguna", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/ms/reset_password.json b/public/language/ms/reset_password.json index 20c519aa55..2951ed5007 100644 --- a/public/language/ms/reset_password.json +++ b/public/language/ms/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Sila masukkan alamat emel dan kami akan menghantar arahan untuk penetapan semula akaun anda", "enter_email_address": "Masukkan alamat emel", "password_reset_sent": "Penetapan semula password telah dihantar", - "invalid_email": "Emel yang tidak sah / Emel tidak wujud" + "invalid_email": "Emel yang tidak sah / Emel tidak wujud", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/ms/search.json b/public/language/ms/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/ms/search.json +++ b/public/language/ms/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/ms/users.json b/public/language/ms/users.json index 3e1a3f089b..26475bd746 100644 --- a/public/language/ms/users.json +++ b/public/language/ms/users.json @@ -5,7 +5,7 @@ "search": "Cari", "enter_username": "Masukkan nama pengguna untuk carian", "load_more": "Muat lagi", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/nb/email.json b/public/language/nb/email.json index 69fa94dcca..65e1accaee 100644 --- a/public/language/nb/email.json +++ b/public/language/nb/email.json @@ -9,6 +9,9 @@ "reset.text1": "Vi har blir bedt om å tilbakestille passordet ditt, muligens fordi du har glemt det. Hvis dette ikke stemmer kan du ignorere denne eposten.", "reset.text2": "For å fortsette med tilbakestillingen, vennligst klikk på følgende lenke:", "reset.cta": "Klikk her for å tilbakestille passordet ditt", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Du har uleste varsler fra %1:", "digest.latest_topics": "Siste emner fra %1", "digest.cta": "Klikk her for å besøke %1", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 3703ca393c..a19bdad64d 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -35,6 +35,7 @@ "topic-locked": "Emne låst", "still-uploading": "Vennligst vent til opplastingene blir fullført.", "content-too-short": "Vennligst skriv et lengere innlegg. Innlegg må inneholde minst %1 tegn.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Vennligst skriv en lengere tittel. Titler må inneholde minst %1 tegn.", "title-too-long": "Vennligst skriv en kortere tittel. Titler må inneholde minst %1 tegn.", "too-many-posts": "Du kan bare poste et innlegg hvert %1 sekund - vennligst vent før du poster igjen", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 151b1c7a79..1d657bd759 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -11,6 +11,7 @@ "user.followers": "Personer som følger %1", "user.posts": "Innlegg laget av %1", "user.topics": "Emner opprettet av %1", + "user.groups": "%1's Groups", "user.favourites": "%1 sine favoritt-innlegg", "user.settings": "Brukerinnstillinger", "maintenance.text": "%1 er for tiden under vedlikehold. Kom tilbake en annen gang.", diff --git a/public/language/nb/reset_password.json b/public/language/nb/reset_password.json index d8aab92154..ed6659abdf 100644 --- a/public/language/nb/reset_password.json +++ b/public/language/nb/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Vennligst skriv din e-post-adresse og vi vil sende den en e-post med instruksjoner om hvordan du tilbakestiller din konto.", "enter_email_address": "Skriv e-post", "password_reset_sent": "Passord-tilbakestilling sendt", - "invalid_email": "Ugyldig e-post / e-post eksisterer ikke" + "invalid_email": "Ugyldig e-post / e-post eksisterer ikke", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/nb/search.json b/public/language/nb/search.json index 8daeddcb06..053950fd9e 100644 --- a/public/language/nb/search.json +++ b/public/language/nb/search.json @@ -3,5 +3,33 @@ "no-matches": "Ingen matcher funnet", "in": "I", "by": "Av", - "posted-by": "Skapt av" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Skapt av", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/nb/users.json b/public/language/nb/users.json index a2038667ab..661479fbf1 100644 --- a/public/language/nb/users.json +++ b/public/language/nb/users.json @@ -5,7 +5,7 @@ "search": "Søk", "enter_username": "Skriv ett brukernavn for å søke", "load_more": "Last flere", - "users-found-search-took": "%1 bruker(e) funnet! Søk tok %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filtrer etter", "online-only": "Bare påloggede", "picture-only": "Bare bilde" diff --git a/public/language/nl/email.json b/public/language/nl/email.json index ec4296182c..a1f26cd2ea 100644 --- a/public/language/nl/email.json +++ b/public/language/nl/email.json @@ -9,6 +9,9 @@ "reset.text1": "Wij ontvingen een verzoek van u om uw wachtwoord te resetten. Als dat niet het geval is, kunt u deze mail negeren ", "reset.text2": "Om uw wachtwoord te resetten, klik op de volgende link", "reset.cta": "Klik hier om u wachtwoord te resetten", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "U heeft ongelezen notificaties van %1:", "digest.latest_topics": "De laatste onderwerpen van %1", "digest.cta": "Klik hier om deze website te bezoeken %1 ", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 7fa4a2f24e..8b2c37d5a1 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -35,6 +35,7 @@ "topic-locked": "Onderwerp gesloten", "still-uploading": "Heb even geduld totdat de alle bestanden geüpload zijn", "content-too-short": "Maak de bericht alsjeblieft wat langer. Op z'n minst %1 karakters", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Maak de titel wat langer. Op z'n minst %1 karakters", "title-too-long": "Maak de titel wat korter. Het kan niet langer zijn dan %1 karakters", "too-many-posts": "Je kan eens in de %1 seconden een bericht aanmaken. Wacht alstublieft.", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index b567e526d1..09cda815b9 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -11,6 +11,7 @@ "user.followers": "Mensen die %1 Volgen", "user.posts": "Berichten geplaatst door %1", "user.topics": "Topics gecreëerd door %1", + "user.groups": "%1's Groups", "user.favourites": "%1's Favoriete Berichten", "user.settings": "Gebruikersinstellingen", "maintenance.text": "%1 is momenteel in onderhoud modus. Probeer later opnieuw", diff --git a/public/language/nl/reset_password.json b/public/language/nl/reset_password.json index a529b6b8f8..2bac7d3849 100644 --- a/public/language/nl/reset_password.json +++ b/public/language/nl/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Vul a.u.b. je email address in en we versturen je een email met de stappen hoe je je account reset.", "enter_email_address": "Vul uw Email Adres in", "password_reset_sent": "Wachtwoord Reset Verzonden", - "invalid_email": "Fout Email Adres / Email Adres bestaat niet!" + "invalid_email": "Fout Email Adres / Email Adres bestaat niet!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/nl/search.json b/public/language/nl/search.json index 60193a06b7..168dde5142 100644 --- a/public/language/nl/search.json +++ b/public/language/nl/search.json @@ -3,5 +3,33 @@ "no-matches": "Geen matches gevonden", "in": "in", "by": "door", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/nl/users.json b/public/language/nl/users.json index 4df6bda6f1..315b86fe31 100644 --- a/public/language/nl/users.json +++ b/public/language/nl/users.json @@ -5,7 +5,7 @@ "search": "Zoeken", "enter_username": "Vul een gebruikersnaam in om te zoeken", "load_more": "Meer Laden", - "users-found-search-took": "%1 gebruiker(s) gevonden! Zoekactie duurde %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter op", "online-only": "Online ", "picture-only": "Alleen een afbeelding" diff --git a/public/language/pl/email.json b/public/language/pl/email.json index 04816f6185..d1f327d90a 100644 --- a/public/language/pl/email.json +++ b/public/language/pl/email.json @@ -9,6 +9,9 @@ "reset.text1": "Otrzymaliśmy żądanie przywrócenia Twojego hasła. Jeśli nie żądałeś przywrócenia hasła, zignoruj ten e-mail.", "reset.text2": "Aby przywrócić swoje hasło, skorzystaj z poniższego linku:", "reset.cta": "Kliknij tu, by przywrócić swoje hasło", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Masz nowe powiadomienia od %1:", "digest.latest_topics": "Ostatnie tematy z %1", "digest.cta": "Kliknij, by odwiedzić %1", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 8929f25bfa..119a9ca553 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -35,6 +35,7 @@ "topic-locked": "Temat zamknięty", "still-uploading": "Poczekaj na pełne załadowanie", "content-too-short": "Proszę wpisać dłuższy post. Posty powinny zawierać co najmniej %1 znaków.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Proszę podać dłuższy tytuł. Tytuły powinny zawierać co najmniej %1 znaków.", "title-too-long": "Wpisz krótszy tytuł, nie może być dłuższy niż %1 znaków.", "too-many-posts": "Możesz wysyłać posty co %1 sekund - proszę poczekać", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index f8afb878f5..4aad8f6c6d 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -11,6 +11,7 @@ "user.followers": "Obserwujący %1", "user.posts": "Posty napisane przez %1", "user.topics": "Wątki stworzone przez %1", + "user.groups": "%1's Groups", "user.favourites": "Ulubione posty %1", "user.settings": "Ustawienia użytkownika", "maintenance.text": "Obecnie trwają prace konserwacyjne nad %1. Proszę wrócić później.", diff --git a/public/language/pl/reset_password.json b/public/language/pl/reset_password.json index fa0affeab6..99b7518a97 100644 --- a/public/language/pl/reset_password.json +++ b/public/language/pl/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Podaj swój adres e-mail i wyślemy ci wiadomość z instrukcjami jak zresetować hasło.", "enter_email_address": "Wpisz swój adres e-mail", "password_reset_sent": "Instrukcje zostały wysłane", - "invalid_email": "Niepoprawny adres e-mail." + "invalid_email": "Niepoprawny adres e-mail.", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/pl/search.json b/public/language/pl/search.json index 472b6bf10c..c8775e8c66 100644 --- a/public/language/pl/search.json +++ b/public/language/pl/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/pl/users.json b/public/language/pl/users.json index 38ff75b928..2df9600a30 100644 --- a/public/language/pl/users.json +++ b/public/language/pl/users.json @@ -5,7 +5,7 @@ "search": "Szukaj", "enter_username": "Wpisz nazwę użytkownika", "load_more": "Więcej", - "users-found-search-took": "Znaleziono %1 użytkowników. Szukanie zajęło %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/pt_BR/email.json b/public/language/pt_BR/email.json index 04e7f76246..250bf39788 100644 --- a/public/language/pt_BR/email.json +++ b/public/language/pt_BR/email.json @@ -9,6 +9,9 @@ "reset.text1": "Nós recebemos um pedido para reconfigurar sua senha, possivelmente porque você a esqueceu. Se este não é o caso, por favor ignore este email.", "reset.text2": "Para continuar com a reconfiguração de senha, por favor clique no seguinte link:", "reset.cta": "Clique aqui para reconfigurar sua senha", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Você tem notificações não lidas de %1:", "digest.latest_topics": "Últimos tópicos de %1", "digest.cta": "Clique aqui para visitar %1", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index c1ab421cb3..51d9f13502 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -35,6 +35,7 @@ "topic-locked": "Tópico Trancado", "still-uploading": "Aguarde a conclusão dos uploads.", "content-too-short": "Por favor digite um post mais longo. Posts devem conter no mínimo %1 caracteres.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Por favor digite um título mais longo. Títulos devem conter no mínimo %1 caracteres.", "title-too-long": "Por favor entre com um título mais curto; Títulos não podem ser maiores que %1 caracteres.", "too-many-posts": "Você pode postar apenas uma vez a cada %1 segundos - por favor aguarde antes de postar novamente", diff --git a/public/language/pt_BR/pages.json b/public/language/pt_BR/pages.json index a65c95781b..ae42c35f0f 100644 --- a/public/language/pt_BR/pages.json +++ b/public/language/pt_BR/pages.json @@ -11,6 +11,7 @@ "user.followers": "Pessoas que Seguem %1", "user.posts": "Posts feitos por %1", "user.topics": "Tópicos criados por %1", + "user.groups": "%1's Groups", "user.favourites": "Posts Favoritos de %1", "user.settings": "Configurações de Usuário", "maintenance.text": "%1 está atualmente sob manutenção. Por favor retorne em outro momento.", diff --git a/public/language/pt_BR/reset_password.json b/public/language/pt_BR/reset_password.json index 7646899cd1..bf96416678 100644 --- a/public/language/pt_BR/reset_password.json +++ b/public/language/pt_BR/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Por favor digite seu endereço de email e nós iremos lhe enviar em email com instruções de como reconfigurar a sua conta.", "enter_email_address": "Digite seu Email", "password_reset_sent": "Reconfiguração de Senha Enviada", - "invalid_email": "Email Inválido / Email não existe!" + "invalid_email": "Email Inválido / Email não existe!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/pt_BR/search.json b/public/language/pt_BR/search.json index f4d633ffd7..9f10c0970b 100644 --- a/public/language/pt_BR/search.json +++ b/public/language/pt_BR/search.json @@ -3,5 +3,33 @@ "no-matches": "Nenhum resultado encontrado", "in": "Em", "by": "Por", - "posted-by": "Postado por" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Postado por", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/pt_BR/users.json b/public/language/pt_BR/users.json index dc447048a0..32edc568f5 100644 --- a/public/language/pt_BR/users.json +++ b/public/language/pt_BR/users.json @@ -5,7 +5,7 @@ "search": "Procurar", "enter_username": "Digite um nome de usuário para procurar", "load_more": "Carregar Mais", - "users-found-search-took": "%1 usuário(s) encontrado(s)! A pesquisa demorou %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filtrar Por", "online-only": "Apenas Online", "picture-only": "Apenas foto" diff --git a/public/language/ro/email.json b/public/language/ro/email.json index 0e3a1da8ab..25f9723466 100644 --- a/public/language/ro/email.json +++ b/public/language/ro/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "Pentru a continua cu resetarea parolei, te rugăm sa apeși pe următorul link:", "reset.cta": "Apasă aici pentru a-ți reseta parola", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Ultimele mesaje de la %1", "digest.cta": "Apasă aici pentru a vizita %1", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 06cad8ebe8..1e7de8b50b 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -35,6 +35,7 @@ "topic-locked": "Subiect Închis", "still-uploading": "Te rugăm să aștepți până se termină uploadul.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Te rugăm să introduci un titlu mai scurt. Titlurile nu pot fi mai lungi de %1 caractere.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index c3b65dfd23..141c5fb1df 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -11,6 +11,7 @@ "user.followers": "Utilizatori care îl urmăresc pe %1", "user.posts": "Mesaje postate de %1", "user.topics": "Subiecte create de %1", + "user.groups": "%1's Groups", "user.favourites": "Mesajele favorite ale lui %1", "user.settings": "Setări Utilizator", "maintenance.text": "%1 este momentan în mentenanță. Întoarce-te în curând!", diff --git a/public/language/ro/reset_password.json b/public/language/ro/reset_password.json index b4ae4564f8..d9edc5c856 100644 --- a/public/language/ro/reset_password.json +++ b/public/language/ro/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Te rugăm sa introduci adresa ta de email și îți vom trimite un email cu instrucțiuni pentru a îți reseta contul tău de utilizator.", "enter_email_address": "Introdu adresă de email", "password_reset_sent": "Emailul pentru resetarea parolei a fost trimis", - "invalid_email": "Adresă de email invalidă / Adresa de email nu există!" + "invalid_email": "Adresă de email invalidă / Adresa de email nu există!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/ro/search.json b/public/language/ro/search.json index 35c5b72b74..cdae3636ce 100644 --- a/public/language/ro/search.json +++ b/public/language/ro/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/ro/users.json b/public/language/ro/users.json index 065d2b07e2..4ef70026a8 100644 --- a/public/language/ro/users.json +++ b/public/language/ro/users.json @@ -5,7 +5,7 @@ "search": "Căutare", "enter_username": "Introdu un nume de utilizator pentru a căuta", "load_more": "Încarcă mai multe", - "users-found-search-took": "%1 utilizator(i) găsit! Căutarea a durat %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/ru/email.json b/public/language/ru/email.json index 9b070ed2b2..eed54608d0 100644 --- a/public/language/ru/email.json +++ b/public/language/ru/email.json @@ -9,6 +9,9 @@ "reset.text1": "Мы получили запрос на сброс Вашего пароля. Если Вы не подавали запрос, пожалуйста, проигнорируйте это сообщение.", "reset.text2": "Для продолжения процедуры изменения пароля, пожалуйста, перейдите по ссылке:", "reset.cta": "Кликните здесь для изменения пароля", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "У Вас непрочитанные уведомления от %1:", "digest.latest_topics": "Последние темы %1", "digest.cta": "Кликните здесь для просмотра %1", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index d6ac5e2d25..5683d863d1 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -35,6 +35,7 @@ "topic-locked": "Тема закрыта", "still-uploading": "Пожалуйста, подождите завершения загрузки.", "content-too-short": "Пост должен содержать минимум %1 симв.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Заголовок должен содержать минимум %1 симв.", "title-too-long": "Заголовок не может быть длиннее %1 символов.", "too-many-posts": "Вы можете делать пост один раз в %1 сек.", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 85348af836..f8a014193b 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -11,6 +11,7 @@ "user.followers": "Читают %1", "user.posts": "Пост написан %1", "user.topics": "Темы созданы %1", + "user.groups": "%1's Groups", "user.favourites": "Избранные сообщения %1", "user.settings": "Настройки", "maintenance.text": "%1 в настоящее время на обслуживании. Пожалуйста, возвращайтесь позже.", diff --git a/public/language/ru/reset_password.json b/public/language/ru/reset_password.json index fdcb497d10..c9b523cf2e 100644 --- a/public/language/ru/reset_password.json +++ b/public/language/ru/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Пожалуйста введите ваш email адрес и мы отправим Вам письмо с инструкцией восстановления пароля.", "enter_email_address": "Введите Email адрес", "password_reset_sent": "Пароль Отправлен", - "invalid_email": "Неверный Email / Email не существует!" + "invalid_email": "Неверный Email / Email не существует!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/ru/search.json b/public/language/ru/search.json index aeb1235df2..f6ecb8d611 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -1,7 +1,35 @@ { "results_matching": "%1 результатов по фразе \"%2\", (%3 секунды) ", - "no-matches": "No matches found", + "no-matches": "Совпадений не найдено", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/ru/users.json b/public/language/ru/users.json index 78251703d2..e4253bcf62 100644 --- a/public/language/ru/users.json +++ b/public/language/ru/users.json @@ -5,7 +5,7 @@ "search": "Поиск", "enter_username": "Введите имя пользователя для поиска", "load_more": "Загрузить еще", - "users-found-search-took": "Нашел %1 пользователя(ей)! Поиск занял %2 мс.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/sc/email.json b/public/language/sc/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/sc/email.json +++ b/public/language/sc/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 6079502fae..9bbcf03247 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -35,6 +35,7 @@ "topic-locked": "Topic Locked", "still-uploading": "Please wait for uploads to complete.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index 4ccd57cfd2..0f846179c3 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -11,6 +11,7 @@ "user.followers": "Gente chi Sighit %1", "user.posts": "Arresonos fatos dae %1", "user.topics": "Topics created by %1", + "user.groups": "%1's Groups", "user.favourites": "Arresonos Preferidos de %1", "user.settings": "Sèberos de Impitadore", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/sc/reset_password.json b/public/language/sc/reset_password.json index 877f9c716e..d86b716c31 100644 --- a/public/language/sc/reset_password.json +++ b/public/language/sc/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Pro praghere pone s'indiritzu email tuo e t'amus a imbiare un'email cun is istrutziones pro torrare a assentare s'intrada tua.", "enter_email_address": "Pone s'Indiritzu Email", "password_reset_sent": "Còdighe pro Torrare a Assentare sa Password Imbiadu", - "invalid_email": "Email Non Bàlida / Email chi no esistit!" + "invalid_email": "Email Non Bàlida / Email chi no esistit!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/sc/search.json b/public/language/sc/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/sc/search.json +++ b/public/language/sc/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/sc/users.json b/public/language/sc/users.json index 56b67f30f8..19e6cfe95f 100644 --- a/public/language/sc/users.json +++ b/public/language/sc/users.json @@ -5,7 +5,7 @@ "search": "Chirca", "enter_username": "Pone unu nùmene de impitadore de chircare", "load_more": "Càrriga de prus", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/sk/email.json b/public/language/sk/email.json index e3199a9b14..f290435e75 100644 --- a/public/language/sk/email.json +++ b/public/language/sk/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "To continue with the password reset, please click on the following link:", "reset.cta": "Click here to reset your password", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 92f07fce4c..0ca1924e76 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -35,6 +35,7 @@ "topic-locked": "Uzamknutá téma", "still-uploading": "Prosím čakajte na dokončenie nahrávania", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Prosím uvedťe kratší názov. Názov nesmie byť dlhší ako 1 % znakov", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index bcc524ed0d..c54ac7e71f 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -11,6 +11,7 @@ "user.followers": "Užívatelia následujúci %1", "user.posts": "Príspevky od %1", "user.topics": "Téma vytvorená %1\n", + "user.groups": "%1's Groups", "user.favourites": "%1's obľubených príspevkov", "user.settings": "Užívatelské nadstavenie", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/sk/reset_password.json b/public/language/sk/reset_password.json index bceaea8148..2391c09cae 100644 --- a/public/language/sk/reset_password.json +++ b/public/language/sk/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Zadajte svoju emailovú adresu a my Vám pošleme informácie, ako môžete obnoviť svoje heslo.", "enter_email_address": "Zadajte e-mail", "password_reset_sent": "Obnova hesla odoslaná", - "invalid_email": "Zlý email / Email neexistuje!" + "invalid_email": "Zlý email / Email neexistuje!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/sk/search.json b/public/language/sk/search.json index c89241d382..a04eb4fc1e 100644 --- a/public/language/sk/search.json +++ b/public/language/sk/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/sk/users.json b/public/language/sk/users.json index 56188b953e..819f861de7 100644 --- a/public/language/sk/users.json +++ b/public/language/sk/users.json @@ -5,7 +5,7 @@ "search": "Vyhľadávať", "enter_username": "Zadaj užívateľské meno k hľadaniu", "load_more": "Načítať dalšie", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/sv/email.json b/public/language/sv/email.json index b6ef31353f..808c73caa8 100644 --- a/public/language/sv/email.json +++ b/public/language/sv/email.json @@ -9,6 +9,9 @@ "reset.text1": "Vi fick en förfrågan om att återställa ditt lösenord, möjligen för att du har glömt det. Om detta inte är fallet, så kan du bortse från det här epostmeddelandet. ", "reset.text2": "För att fortsätta med återställning av lösenordet så kan du klicka på följande länk:", "reset.cta": "Klicka här för att återställa ditt lösenord", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Du har olästa notiser från %1:", "digest.latest_topics": "Senaste ämnen från %1", "digest.cta": "Klicka här för att besöka %1", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index d1d82a2f0d..bf9769aa41 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -35,6 +35,7 @@ "topic-locked": "Ämnet låst", "still-uploading": "Vänta medan uppladdningen slutförs.", "content-too-short": "Skriv ett längre inlägg. Inlägget måste ha minst %1 tecken.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Skriv en längre rubrik. Rubriken måste ha minst %1 tecken.", "title-too-long": "Skriv in en kortare rubrik. Rubriker får inte vara längre än %1 tecken.", "too-many-posts": "Du kan endast skapa inlägg var %1:e sekund - vänta ett tag innan du försöker skapa ett nytt inlägg", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 2082249d8c..f7a4904a84 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -11,6 +11,7 @@ "user.followers": "Personer som följer %1", "user.posts": "Inlägg skapat av %1", "user.topics": "Ämnen skapade av %1", + "user.groups": "%1's Groups", "user.favourites": "%1's favorit-inlägg", "user.settings": "Avnändarinställningar", "maintenance.text": "%1 genomgår underhåll just nu. Vänligen kom tillbaka lite senare.", diff --git a/public/language/sv/reset_password.json b/public/language/sv/reset_password.json index 03682d812e..a3771a31b4 100644 --- a/public/language/sv/reset_password.json +++ b/public/language/sv/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Var god fyll i din epost-adress så får du snart en epost med instruktioner hur du återsätller ditt konto.", "enter_email_address": "Skriv in epostadress", "password_reset_sent": "Lösenordsåterställning skickad", - "invalid_email": "Felaktig epost / Epost finns inte!" + "invalid_email": "Felaktig epost / Epost finns inte!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/sv/search.json b/public/language/sv/search.json index 193ea99480..0e4e831f93 100644 --- a/public/language/sv/search.json +++ b/public/language/sv/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/sv/users.json b/public/language/sv/users.json index 2b370c1146..591a32c344 100644 --- a/public/language/sv/users.json +++ b/public/language/sv/users.json @@ -5,7 +5,7 @@ "search": "Sök", "enter_username": "Ange ett användarnamn för att söka", "load_more": "Ladda fler", - "users-found-search-took": "%1 användare hittades! Sökningen tog %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/th/email.json b/public/language/th/email.json index 18bf7c5d1f..d91ba43963 100644 --- a/public/language/th/email.json +++ b/public/language/th/email.json @@ -9,6 +9,9 @@ "reset.text1": "We received a request to reset your password, possibly because you have forgotten it. If this is not the case, please ignore this email.", "reset.text2": "เพื่อดำเนินการตั้งรหัสผ่านใหม่ต่อไป, โปรดกดที่ลิ้งค์นี้:", "reset.cta": "กดตรงนี้เพื่อตั้งรหัสผ่านใหม่", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "คุณมีข้อความแจ้งเตือนที่ยังไม่ได้อ่านจาก %1:", "digest.latest_topics": "หัวข้อสนทนาล่าสุดจาก %1", "digest.cta": "กดตรงนี้เพื่อเข้าดู %1", diff --git a/public/language/th/error.json b/public/language/th/error.json index 55dc809071..05985e9b49 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -35,6 +35,7 @@ "topic-locked": "Topic Locked", "still-uploading": "Please wait for uploads to complete.", "content-too-short": "Please enter a longer post. Posts should contain at least %1 characters.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Please enter a longer title. Titles should contain at least %1 characters.", "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 characters.", "too-many-posts": "You can only post once every %1 seconds - please wait before posting again", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index a227f62340..44f8b127e1 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -11,6 +11,7 @@ "user.followers": "ผู้ใช้ที่ติดตาม %1", "user.posts": "กระทู้โดย %1", "user.topics": "Topics created by %1", + "user.groups": "%1's Groups", "user.favourites": "กระทู้ที่ %1 ชอบ", "user.settings": "ตั้งค่าผู้ใช้", "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", diff --git a/public/language/th/reset_password.json b/public/language/th/reset_password.json index 2b12834604..499f2f7136 100644 --- a/public/language/th/reset_password.json +++ b/public/language/th/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "กรุณาใส่อีเมลของคุณ เราจะส่งอีเมลให้คุณพร้อมคำแนะนำเกี่ยวกับวิธีการรีเซ็ตบัญชีของคุณ", "enter_email_address": "ใส่อีเมล์", "password_reset_sent": "รหัสรีเซ็ตถูกส่งออกไปแล้ว", - "invalid_email": "อีเมล์ไม่ถูกต้อง / อีเมล์ไม่มีอยู่!" + "invalid_email": "อีเมล์ไม่ถูกต้อง / อีเมล์ไม่มีอยู่!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/th/search.json b/public/language/th/search.json index 973ff03e13..4e865998e1 100644 --- a/public/language/th/search.json +++ b/public/language/th/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/th/users.json b/public/language/th/users.json index a3dddb41fd..542689e182 100644 --- a/public/language/th/users.json +++ b/public/language/th/users.json @@ -5,7 +5,7 @@ "search": "ค้นหา", "enter_username": "ใส่ชื่อผู้ใช้เพื่อค้นหา", "load_more": "โหลดเพิ่มเติม", - "users-found-search-took": "%1 user(s) found! Search took %2 ms.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/tr/category.json b/public/language/tr/category.json index f29f0c81d0..ba1c4f34ef 100644 --- a/public/language/tr/category.json +++ b/public/language/tr/category.json @@ -1,7 +1,7 @@ { "new_topic_button": "Yeni Başlık", "no_topics": " Bu kategoride hiç konu yok.
Yeni bir konu açmak istemez misiniz?", - "browsing": "dolaşıyor", + "browsing": "gözden geçiriliyor", "no_replies": "Kimse yanıtlamadı", "share_this_category": "Bu kategoriyi paylaş", "ignore": "Yoksay" diff --git a/public/language/tr/email.json b/public/language/tr/email.json index c69e7d0c8f..350df09f81 100644 --- a/public/language/tr/email.json +++ b/public/language/tr/email.json @@ -9,6 +9,9 @@ "reset.text1": "Şifrenizi değiştirmek istediğinize dair bir ileti aldık. Eğer böyle bir istek göndermediyseniz, lütfen bu e-postayı görmezden gelin.", "reset.text2": "Parola değiştirme işlemine devam etmek için aşağıdaki bağlantıya tıklayın:", "reset.cta": "Parolanızı değiştirmek için buraya tıklayın", + "reset.notify.subject": "Şifre başarıyla değiştirildi", + "reset.notify.text1": "Şifrenizin %1 zamanında başarı ile değiştirildiğini bildirmek isteriz.", + "reset.notify.text2": "Bunu siz yetkilendirmediyseniz, lütfen hiç vakit kaybetmeden site yöneticisine bu durumu bildiriniz.", "digest.notifications": "Okunmamış bazı bildirimleriniz var", "digest.latest_topics": "En güncel konular", "digest.cta": "Ziyaret etmek için buraya tıklayın", @@ -17,8 +20,8 @@ "notif.chat.subject": "Okunmamış bazı iletileriniz var", "notif.chat.cta": "Sohbete devam etmek için buraya tıklayın", "notif.chat.unsub.info": "Bu bildirim şectiğiniz ayarlar yüzünden gönderildi.", - "notif.post.cta": "Click here to read the full topic", - "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.post.cta": "Konunun tamamını okumak için buraya tıklayın", + "notif.post.unsub.info": "Bu yazı bildirimi size abonelik ayarlarınız nedeni ile gönderilmiştir.", "test.text1": "Bu ileti NodeBB e-posta ayarlarınızın doğru çalışıp çalışmadığını kontrol etmek için gönderildi.", "unsub.cta": "Buraya tıklayarak ayarlarınızı değiştirebilirsiniz.", "closing": "Teşekkürler!" diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 4ab34132fc..a18f42652b 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -18,7 +18,7 @@ "username-taken": "Kullanıcı İsmi Alınmış", "email-taken": "E-posta Alınmış", "email-not-confirmed": "E-postanız onaylanmamış, onaylamak için lütfen buraya tıklayın.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed", + "email-not-confirmed-chat": "Email adresiniz doğrulanmadan sohbet edemezsiniz.", "username-too-short": "Kullanıcı ismi çok kısa", "username-too-long": "Kullanıcı ismi çok uzun.", "user-banned": "Kullanıcı Yasaklı", @@ -35,6 +35,7 @@ "topic-locked": "Başlık Kilitli", "still-uploading": "Lütfen yüklemelerin bitmesini bekleyin.", "content-too-short": "Lütfen daha uzun bir ileti girin. En az %1 karakter.", + "content-too-long": "Lütfen daha kısa bir yayın girin. Yayınlar %1 karakterden uzun olamaz.", "title-too-short": "Lütfen daha uzun bir başlık girin. En az %1 karakter.", "title-too-long": "Lütfen daha kısa bir başlık girin. Başlıklar %1 karakterden uzun olamaz.", "too-many-posts": "Sadece %1 saniyede bir ileti gönderebilirsiniz.", @@ -44,13 +45,13 @@ "already-favourited": "Bu iletiyi zaten favorilerinize eklediniz", "already-unfavourited": "Bu iletiyi zaten favorilerinizden çıkardınız", "cant-ban-other-admins": "Başka yöneticileri yasaklayamazsınız!", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", + "invalid-image-type": "Geçersiz resim uzantısı. Izin verilen uzantılar: %1", + "invalid-image-extension": "Geçersiz resim uzantısı", "group-name-too-short": "Grup ismi çok kısa", "group-already-exists": "Grup zaten var", "group-name-change-not-allowed": "Grup ismini değiştiremezsiniz", - "group-already-member": "You are already part of this group", - "group-needs-owner": "This group requires at least one owner", + "group-already-member": "Bu grubun zaten bir parçasısınız.", + "group-needs-owner": "Bu grubu en az bir kişi sahiplenmesi gerekiyor", "post-already-deleted": "İleti zaten silinmiş", "post-already-restored": "İleti zaten geri getirilmiş", "topic-already-deleted": "Başlık zaten silinmiş", @@ -62,12 +63,12 @@ "signature-too-long": "İmza en fazla %1 karakter olabilir!", "cant-chat-with-yourself": "Kendinizle sohbet edemezsiniz!", "chat-restricted": "Bu kullanıcı sohbet ayarlarını kısıtlamış. Bu kişiye mesaj gönderebilmeniz için sizi takip etmeleri gerekiyor", - "too-many-messages": "You have sent too many messages, please wait awhile.", + "too-many-messages": "Ardı ardına çok fazla mesaj yolladınız, lütfen biraz bekleyiniz.", "reputation-system-disabled": "Saygınlık sistemi kapatılmış.", "downvoting-disabled": "Aşagı oylama kapatılmış", "not-enough-reputation-to-downvote": "Bu iletiyi aşagı oylamak için yeterince saygınlığınız yok.", "not-enough-reputation-to-flag": "Bu iletiyi bayraklamak için yeterince saygınlığınız yok", "reload-failed": "NodeBB tekrar yüklenirken bir sorunla karşılaştı: “%1“. NodeBB varolan dosyaları servis etmeye devam edecek.", "registration-error": "Kayıt Hatası", - "parse-error": "Something went wrong while parsing server response" + "parse-error": "Sunucu yanıtı çözümlemesi sırasında bir şeyler ters gitti" } \ No newline at end of file diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 152aba5d0e..cd2e8e18c9 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -3,10 +3,10 @@ "search": "Arama", "buttons.close": "Kapat", "403.title": "Erişim Engellendi", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "Erişim izniniz olmayan bir sayfaya denk gelmiş gibisiniz.", + "403.login": "Belki de tekrar giriş yapmayı denersiniz?", "404.title": "Bulunamadı", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "Erişim izniniz olmayan bir sayfaya denk gelmiş gibisiniz.Anasayfaya geri dönün.", "500.title": "Dahili hata.", "500.message": "Ups! Bir şeyler ters gitti sanki!", "register": "Kayıt Ol", @@ -27,7 +27,7 @@ "header.tags": "Etiketler", "header.popular": "Popüler", "header.users": "Kullanıcılar", - "header.groups": "Groups", + "header.groups": "Gruplar", "header.chats": "Sohbetler", "header.notifications": "Bildirimler", "header.search": "Arama", @@ -75,7 +75,7 @@ "updated.title": "Forum güncellendi", "updated.message": "Bu forum şu anda güncellendi. Sayfayı tekrar yüklemek için buraya tıklayın.", "privacy": "Gizlilik", - "follow": "Follow", - "unfollow": "Unfollow", + "follow": "Takip et", + "unfollow": "Takip etmeyi bırak", "delete_all": "Hepsini Sil" } \ No newline at end of file diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index d2c411228d..e174ef10ab 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -1,21 +1,21 @@ { "groups": "Guruplar", "view_group": "Grubu Gör", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "cover-instructions": "Drag and Drop a photo, drag to position, and hit Save", - "cover-change": "Change", - "cover-save": "Save", - "cover-saving": "Saving", + "owner": "Grup Kurucusu", + "new_group": "Yeni Grup Oluştur", + "no_groups_found": "Henüz hiç grup yok", + "cover-instructions": "Bir fotoğrafı Sürükleyin ve Bırakın, uygun yere sürükleyip Kaydet'e tıklayın.", + "cover-change": "Değiştir", + "cover-save": "Kaydet", + "cover-saving": "Kaydediliyor", "details.title": "Grup Detayları", "details.members": "Üye Listesi", - "details.pending": "Pending Members", + "details.pending": "Üyeler bekleniyor", "details.has_no_posts": "Bu grubun üyeleri henüz bir ileti göndermedi.", "details.latest_posts": "En son iletiler", - "details.private": "Private Group", - "details.public": "Public Group", - "details.owner_options": "Group Administration", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted" + "details.private": "Özel Grup", + "details.public": "Herkese Açık Grup", + "details.owner_options": "Grup Yöneticisi", + "event.updated": "Grup detayları güncellenmiştir", + "event.deleted": "\"%1\" grubu silinmiş" } \ No newline at end of file diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index e3d1cf9cf8..5171f4232f 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -11,6 +11,7 @@ "user.followers": "%1 takip edenler", "user.posts": "%1 tarafından gönderilen iletiler", "user.topics": "%1 tarafından gönderilen başlıklar", + "user.groups": "%1 Kişisine Ait Gruplar", "user.favourites": "%1'in Favori İletileri", "user.settings": "Kullanıcı Ayarları", "maintenance.text": "%1 şu anda bakımda. Lütfen bir süre sonra tekrar deneyin.", diff --git a/public/language/tr/recent.json b/public/language/tr/recent.json index 4773c22dfd..a1af8adb56 100644 --- a/public/language/tr/recent.json +++ b/public/language/tr/recent.json @@ -6,13 +6,13 @@ "year": "Yıl", "alltime": "Hepsi", "no_recent_topics": "Güncel konular yok.", - "there-is-a-new-topic": "There is a new topic.", - "there-is-a-new-topic-and-a-new-post": "There is a new topic and a new post.", - "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", - "there-are-new-topics": "There are %1 new topics.", - "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", - "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", - "there-is-a-new-post": "There is a new post.", - "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Click here to reload." + "there-is-a-new-topic": "Yeni bir konu mevcut.", + "there-is-a-new-topic-and-a-new-post": "Yeni bir konu ve yayın mevcut.", + "there-is-a-new-topic-and-new-posts": "Bir adet yeni konu ve %1 adet yeni yayın var.", + "there-are-new-topics": "%1 adet yeni konu mevcut.", + "there-are-new-topics-and-a-new-post": "%1 adet yeni konu ve bir adet yeni yayın mevcut.", + "there-are-new-topics-and-new-posts": "%1 adet yeni konu %2 adet yeni yayın mevcut.", + "there-is-a-new-post": "Yeni bir yayın mevcut.", + "there-are-new-posts": "%1 adet yeni yayın mevcut.", + "click-here-to-reload": "Yenilemek için buraya tıklayın." } \ No newline at end of file diff --git a/public/language/tr/reset_password.json b/public/language/tr/reset_password.json index 0eb0497ee3..60f0346516 100644 --- a/public/language/tr/reset_password.json +++ b/public/language/tr/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Lütfen e-posta adresinizi girin , size hesabınızı nasıl sıfırlayacağınızı anlatan bir e-posta gönderelim", "enter_email_address": "E-posta Adresinizi girin", "password_reset_sent": "Şifre Yenilemesi Gönderildi", - "invalid_email": "Geçersiz E-posta / E-posta mevcut değil!" + "invalid_email": "Geçersiz E-posta / E-posta mevcut değil!", + "password_too_short": "Girdiğiniz şifre çok kısa, lütfen farklı bir şifre seçiniz.", + "passwords_do_not_match": "Girdiğiniz iki şifre birbirine uymuyor." } \ No newline at end of file diff --git a/public/language/tr/search.json b/public/language/tr/search.json index d3c5da5c91..0d079ffe4a 100644 --- a/public/language/tr/search.json +++ b/public/language/tr/search.json @@ -1,7 +1,35 @@ { "results_matching": "%1 tane “%2“ bulundu (%3 saniye)", - "no-matches": "No matches found", - "in": "In", - "by": "By", - "posted-by": "Posted by" + "no-matches": "Hiç eşleşme bulunamadı", + "in": "Konum:", + "by": "Kim Tarafından :", + "titles": "Başlıklar", + "titles-posts": "Başlıklar ve Yayınlar", + "posted-by": "Gönderen", + "in-categories": "Kategorilerde", + "search-child-categories": "Alt kategorilerde arat", + "reply-count": "Cevap Sayısı", + "at-least": "En az", + "at-most": "En fazla", + "post-time": "Yayınlama zamanı", + "newer-than": "Daha yeni", + "older-than": "Daha eski", + "any-date": "Herhangi bir tarih", + "yesterday": "Dün", + "one-week": "Bir hafta", + "two-weeks": "İki hafta", + "one-month": "Bir ay", + "three-months": "Üç ay", + "six-months": "Altı ay", + "one-year": "Bir yıl", + "sort-by": "Şuna göre filtrele", + "last-reply-time": "En son cevaplama süresi", + "topic-title": "Konu başlığı", + "number-of-replies": "Cevap sayısı", + "number-of-views": "Görüntüleme sayısı", + "topic-start-date": "Başlık açılma tarihi", + "username": "Kullanıcı Adı", + "category": "Kategori", + "descending": "Azalan düzene göre", + "ascending": "Artan düzene göre" } \ No newline at end of file diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index aa6aa90855..6cd2424e0f 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -74,7 +74,7 @@ "fork_no_pids": "Hiç bir ileti seçilmedi!", "fork_success": "Başlık başarıyla ayrıldı!", "composer.title_placeholder": "Başlık ismini buraya girin...", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "İsim", "composer.discard": "Vazgeç", "composer.submit": "Gönder", "composer.replying_to": "Yanıtlanan Konu %1", @@ -94,5 +94,5 @@ "oldest_to_newest": "En eskiden en yeniye", "newest_to_oldest": "En yeniden en eskiye", "most_votes": "En çok oy", - "most_posts": "Most posts" + "most_posts": "En sık yayın" } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 90bd5eb06b..8fa7b4c5c9 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -2,8 +2,8 @@ "banned": "Yasaklı", "offline": "Çevrimdışı", "username": "Kullanıcı Adı", - "joindate": "Join Date", - "postcount": "Post Count", + "joindate": "Katılım Tarihi", + "postcount": "Yayın Sayısı", "email": "E-posta", "confirm_email": "E-posta onayla", "delete_account": "Hesabı Sil", @@ -18,7 +18,7 @@ "profile_views": "Profil Görüntülemeleri", "reputation": "Saygınlık", "favourites": "Favoriler", - "watched": "Watched", + "watched": "İzlendi", "followers": "Takipçiler", "following": "Takip Ediyor", "signature": "İmza", @@ -59,12 +59,12 @@ "digest_weekly": "Haftalık", "digest_monthly": "Aylık", "send_chat_notifications": "Çevrimiçi değilken gelen iletileri e-posta olarak gönder", - "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", + "send_post_notifications": "Abone olduğum konulara cevap gelince bana eposta yolla", "has_no_follower": "Bu kullanıcının hiç takipçisi yok :(", "follows_no_one": "Bu kullanıcı kimseyi takip etmiyor :(", "has_no_posts": "Bu kullanıcı henüz birşey göndermedi.", "has_no_topics": "Bu kullanıcı henüz bir konu yaratmadı.", - "has_no_watched_topics": "This user didn't watch any topics yet.", + "has_no_watched_topics": "Bu kullanıcı henüz hiçbir konuyu izlemedi.", "email_hidden": "E-posta gizli", "hidden": "gizli", "paginate_description": "Sonsuz yükleme yerine konu ve iletileri sayfalara böl.", diff --git a/public/language/tr/users.json b/public/language/tr/users.json index 8858e75ddd..9e38f04530 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -5,8 +5,8 @@ "search": "Ara", "enter_username": "Aramak için bir kullanıcı adı girin", "load_more": "Daha Fazla Yükle", - "users-found-search-took": "%1 kullanıcı bulundu! Arama %2 ms sürdü.", - "filter-by": "Filter By", - "online-only": "Online only", - "picture-only": "Picture only" + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", + "filter-by": "Şu şekilde filtrele", + "online-only": "Sadece çevrimiçi", + "picture-only": "Sadece resim" } \ No newline at end of file diff --git a/public/language/vi/email.json b/public/language/vi/email.json index 97bd7549e8..d0d376eb34 100644 --- a/public/language/vi/email.json +++ b/public/language/vi/email.json @@ -9,6 +9,9 @@ "reset.text1": "Chúng tôi nhận được yêu cầu khởi tạo lại mật khẩu của bạn, rất có thể vì bạn đã quên mất nó. Nếu bạn không gởi yêu cầu, hãy bỏ qua email này.", "reset.text2": "Để đặt lại mật khẩu, hãy click vào liên kết sau:", "reset.cta": "Click vào đây để khởi tạo lại mật khẩu", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "Bạn có thông báo chưa đọc từ %1", "digest.latest_topics": "Chủ đề mới nhất từ %1", "digest.cta": "Click vào đây để truy cập %1", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 8dd065f637..e8da82c330 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -35,6 +35,7 @@ "topic-locked": "Chủ đề bị khóa", "still-uploading": "Vui lòng chờ upload", "content-too-short": "Vui lòng tạo bài viết dài hơn. Bài viết phải có ít nhất %1 ký tự.", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "Vui lòng nhập tiêu đề dài hơn. Tiêu đề phải có ít nhất %1 ký tự", "title-too-long": "Yêu cầu tiêu đề ngắn hơn. Không dài quá %1 ký tự", "too-many-posts": "Bạn chỉ có thể gửi một bài viết mỗi %1 giây - Xin chờ trong giây lát trước khi gửi lại.", diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index 697490930b..153a1f31d8 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -11,6 +11,7 @@ "user.followers": "Người đang theo dõi %1", "user.posts": "Các bài được %1 viết", "user.topics": "Các chủ đề được %1 tạo", + "user.groups": "%1's Groups", "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", "maintenance.text": "%1 đang được bảo trì. Xin vui lòng quay lại sau.", diff --git a/public/language/vi/reset_password.json b/public/language/vi/reset_password.json index edc196ba6c..32db56aab3 100644 --- a/public/language/vi/reset_password.json +++ b/public/language/vi/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "Xin hãy nhập địa chỉ email của bạn và chúng tôi sẽ gửi một email hướng dẫn cách thiết lập lại tài khoản cho bạn", "enter_email_address": "Nhập địa chỉ Email", "password_reset_sent": "Đã gửi mật khẩu được thiết lập lại", - "invalid_email": "Email không đúng / Email không tồn tại!" + "invalid_email": "Email không đúng / Email không tồn tại!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/vi/search.json b/public/language/vi/search.json index 254873ed38..a6450e408b 100644 --- a/public/language/vi/search.json +++ b/public/language/vi/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/vi/users.json b/public/language/vi/users.json index 405c9de32b..5e08193fd4 100644 --- a/public/language/vi/users.json +++ b/public/language/vi/users.json @@ -5,7 +5,7 @@ "search": "Tìm kiếm", "enter_username": "Gõ tên người dùng để tìm kiếm", "load_more": "Tải thêm", - "users-found-search-took": "%1 tài khoản(s) tìm thấy! Tìm trong %2 mili giây.", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/zh_CN/email.json b/public/language/zh_CN/email.json index 341874ec67..e81b810a9a 100644 --- a/public/language/zh_CN/email.json +++ b/public/language/zh_CN/email.json @@ -9,6 +9,9 @@ "reset.text1": "我们收到了重置您帐户密码的申请,可能是因为您遗忘了密码。如果不是,请忽略这封邮件。", "reset.text2": "如需继续重置密码,请点击下面的链接:", "reset.cta": "点击这里重置您的密码", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "您有来自 %1 的未读通知:", "digest.latest_topics": "来自 %1 的最新主题", "digest.cta": "点击这里访问 %1", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index eef3088946..cfcb33aee8 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -35,6 +35,7 @@ "topic-locked": "主题已锁定", "still-uploading": "请等待上传完成", "content-too-short": "请再输入一些内容,帖子至少要有 %1 个字符。", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "请再输入一些内容,标题至少要有 %1 个字符。", "title-too-long": "请输入更短的标题。不超过 %1 字。", "too-many-posts": "发帖间隔至少要 %1 秒 - 请稍候再发帖", diff --git a/public/language/zh_CN/pages.json b/public/language/zh_CN/pages.json index 924e8bdfa4..36d10c1cb3 100644 --- a/public/language/zh_CN/pages.json +++ b/public/language/zh_CN/pages.json @@ -11,6 +11,7 @@ "user.followers": "关注 %1 的人", "user.posts": "%1 发布的帖子", "user.topics": "%1 创建的主题", + "user.groups": "%1's Groups", "user.favourites": "%1 收藏的帖子", "user.settings": "用户设置", "maintenance.text": "%1 正在进行维护。请稍后再来。", diff --git a/public/language/zh_CN/reset_password.json b/public/language/zh_CN/reset_password.json index 701651dfb6..ca294f9dc7 100644 --- a/public/language/zh_CN/reset_password.json +++ b/public/language/zh_CN/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "请输入您的电子邮箱地址,我们会发送一份邮件指导您重置密码。", "enter_email_address": "输入邮箱地址", "password_reset_sent": "密码重置邮件已发送。", - "invalid_email": "无效的电子邮箱/电子邮箱不存在!" + "invalid_email": "无效的电子邮箱/电子邮箱不存在!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/zh_CN/search.json b/public/language/zh_CN/search.json index 338db4e61b..25cc3605e5 100644 --- a/public/language/zh_CN/search.json +++ b/public/language/zh_CN/search.json @@ -3,5 +3,33 @@ "no-matches": "No matches found", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/zh_CN/users.json b/public/language/zh_CN/users.json index bd19c53fa9..f56a4fb88e 100644 --- a/public/language/zh_CN/users.json +++ b/public/language/zh_CN/users.json @@ -5,7 +5,7 @@ "search": "搜索", "enter_username": "输入用户名搜索", "load_more": "加载更多", - "users-found-search-took": "找到 %1 位用户!搜索耗时 %2 毫秒。", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" diff --git a/public/language/zh_TW/email.json b/public/language/zh_TW/email.json index 6a5e3ef124..1062070b96 100644 --- a/public/language/zh_TW/email.json +++ b/public/language/zh_TW/email.json @@ -9,6 +9,9 @@ "reset.text1": "我們收到一個重設密碼的請求,你忘掉了密碼嗎?如果不是,請忽略這封郵件。", "reset.text2": "要繼續重置密碼,請點擊以下鏈接:", "reset.cta": "點擊這裡重置密碼", + "reset.notify.subject": "Password successfully changed", + "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", + "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", "digest.notifications": "你有來自$1的未讀通知:", "digest.latest_topics": "來自%1的最新話題", "digest.cta": "點擊這裡訪問%1", diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 5342050972..cb254c35aa 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -35,6 +35,7 @@ "topic-locked": "該主題已被鎖定", "still-uploading": "請等待上傳完成。", "content-too-short": "請輸入一個較長的帖子。 帖子需至少有 %1 個字。", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 characters.", "title-too-short": "請輸入一個較長的標題。 標題需至少有 %1 個字。", "title-too-long": "請輸入一個較短的主題名稱。 標題不能超過 %1 個字元。", "too-many-posts": "你必須間隔 %1 秒後才能發表文章-請稍後", diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index deaa502ffe..bcb655c3e2 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -11,6 +11,7 @@ "user.followers": "People who Follow %1", "user.posts": "文章由 %1 所張貼", "user.topics": "主題由 %1 所創建", + "user.groups": "%1's Groups", "user.favourites": "%1's 最喜愛的文章", "user.settings": "使用者設定", "maintenance.text": "%1目前正在進行維修。請稍後再來。", diff --git a/public/language/zh_TW/reset_password.json b/public/language/zh_TW/reset_password.json index b4c454d4da..9f0ab67aa1 100644 --- a/public/language/zh_TW/reset_password.json +++ b/public/language/zh_TW/reset_password.json @@ -10,5 +10,7 @@ "enter_email": "請輸入您的Email地址,我們會發送郵件告訴您如何重設密碼。", "enter_email_address": "輸入郵箱地址", "password_reset_sent": "密碼重設郵件已發送。", - "invalid_email": "非法的郵箱地址/郵箱不存在!" + "invalid_email": "非法的郵箱地址/郵箱不存在!", + "password_too_short": "The password entered is too short, please pick a different password.", + "passwords_do_not_match": "The two passwords you've entered do not match." } \ No newline at end of file diff --git a/public/language/zh_TW/search.json b/public/language/zh_TW/search.json index 426fa932b4..9fa8e84f2a 100644 --- a/public/language/zh_TW/search.json +++ b/public/language/zh_TW/search.json @@ -1,7 +1,35 @@ { "results_matching": "有%1個跟\"%2\"匹配的結果(%3秒)", - "no-matches": "No matches found", + "no-matches": "沒有找到匹配的主題", "in": "In", "by": "By", - "posted-by": "Posted by" + "titles": "Titles", + "titles-posts": "Titles and Posts", + "posted-by": "Posted by", + "in-categories": "In Categories", + "search-child-categories": "Search child categories", + "reply-count": "Reply Count", + "at-least": "At least", + "at-most": "At most", + "post-time": "Post time", + "newer-than": "Newer than", + "older-than": "Older than", + "any-date": "Any date", + "yesterday": "Yesterday", + "one-week": "One week", + "two-weeks": "Two weeks", + "one-month": "One month", + "three-months": "Three months", + "six-months": "Six months", + "one-year": "One year", + "sort-by": "Sort by", + "last-reply-time": "Last reply time", + "topic-title": "Topic title", + "number-of-replies": "Number of replies", + "number-of-views": "Number of views", + "topic-start-date": "Topic start date", + "username": "Username", + "category": "Category", + "descending": "In descending order", + "ascending": "In ascending order" } \ No newline at end of file diff --git a/public/language/zh_TW/users.json b/public/language/zh_TW/users.json index 249b34d36f..b3c22fb165 100644 --- a/public/language/zh_TW/users.json +++ b/public/language/zh_TW/users.json @@ -5,7 +5,7 @@ "search": "搜尋", "enter_username": "輸入想找的使用者帳號", "load_more": "載入更多", - "users-found-search-took": "找到%1個用戶!搜索時間%2毫秒。", + "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", "online-only": "Online only", "picture-only": "Picture only" From 57d45518bdc71e50654802116e189680ac478d16 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Feb 2015 11:16:24 -0500 Subject: [PATCH 51/73] added a preventDefault when href="#" or data-ajaxify="false", so page doesn't send user back to top (which is kind of annoying), but not sure if this may introduce side-effects. @barisusakli @psychobunny --- 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 cc7c0cbff1..d2af431176 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -276,7 +276,7 @@ $(document).ready(function() { // Enhancing all anchors to ajaxify... $(document.body).on('click', 'a', function (e) { if (hrefEmpty(this.href) || this.target !== '' || this.protocol === 'javascript:' || $(this).attr('data-ajaxify') === 'false') { - return; + return e.preventDefault(); } if (!window.location.pathname.match(/\/(403|404)$/g)) { From f16c37eeaf84a22ed27fbdbc929e5ddcc83f80b3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Feb 2015 11:17:25 -0500 Subject: [PATCH 52/73] #2692 --- public/src/client/groups/details.js | 13 +++++++++++++ src/socket.io/groups.js | 20 +++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 09826fb673..b40957af8a 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -39,6 +39,19 @@ define('forum/groups/details', ['iconSelect', 'vendor/colorpicker/colorpicker', }); break; + case 'kick': + socket.emit('groups.kick', { + uid: uid, + groupName: ajaxify.variables.get('group_name') + }, function(err) { + if (!err) { + userRow.slideUp().remove(); + } else { + app.alertError(err.message); + } + }); + break; + case 'update': Details.update(); break; diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index a99112eded..ba35e128c4 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -102,7 +102,7 @@ SocketGroups.reject = function(socket, data, callback) { }; SocketGroups.update = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } @@ -130,7 +130,7 @@ SocketGroups.create = function(socket, data, callback) { }; SocketGroups.delete = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } @@ -156,6 +156,20 @@ SocketGroups.search = function(socket, data, callback) { groups.search(data.query || '', data.options || {}, callback); }; +SocketGroups.kick = function(socket, data, callback) { + if (!data) { + return callback(new Error('[[error:invalid-data]]')); + } + + groups.ownership.isOwner(socket.uid, data.groupName, function(err, isOwner) { + if (!isOwner) { + return callback(new Error('[[error:no-privileges]]')); + } + + groups.leave(data.groupName, data.uid, callback); + }); +}; + SocketGroups.cover = {}; SocketGroups.cover.get = function(socket, data, callback) { @@ -163,7 +177,7 @@ SocketGroups.cover.get = function(socket, data, callback) { }; SocketGroups.cover.update = function(socket, data, callback) { - if(!data) { + if (!data) { return callback(new Error('[[error:invalid-data]]')); } else if (socket.uid === 0) { return callback(new Error('[[error:no-privileges]]')); From 9bfb7585ee9451f71e21f4ab6770dfaa630bc81c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Feb 2015 11:21:14 -0500 Subject: [PATCH 53/73] bundling emoji-extended with all installs, @frissdiegurke --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index cb00f143cc..013480d14d 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "morgan": "^1.3.2", "nconf": "~0.7.1", "nodebb-plugin-dbsearch": "^0.1.0", + "nodebb-plugin-emoji-extended": "^0.4.1-4", "nodebb-plugin-markdown": "^0.8.0", "nodebb-plugin-mentions": "^0.9.0", "nodebb-plugin-soundpack-default": "~0.1.1", From 0d9d9bf110d5a0a3f625261ac38cd56c74c57361 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Feb 2015 11:24:11 -0500 Subject: [PATCH 54/73] added two new language strings --- public/language/en_GB/groups.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/language/en_GB/groups.json b/public/language/en_GB/groups.json index eb9a45f994..964b5f42c6 100644 --- a/public/language/en_GB/groups.json +++ b/public/language/en_GB/groups.json @@ -17,6 +17,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", From 47964e8ff4408f6f66faa3133197ac05cf20ab95 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 10 Feb 2015 11:24:44 -0500 Subject: [PATCH 55/73] latest fallbacks --- public/language/ar/groups.json | 2 ++ public/language/bn/groups.json | 2 ++ public/language/cs/groups.json | 2 ++ public/language/de/groups.json | 2 ++ public/language/el/groups.json | 2 ++ public/language/en@pirate/groups.json | 2 ++ public/language/en_US/groups.json | 2 ++ public/language/es/groups.json | 2 ++ public/language/et/groups.json | 2 ++ public/language/fa_IR/groups.json | 2 ++ public/language/fi/groups.json | 2 ++ public/language/fr/groups.json | 2 ++ public/language/he/groups.json | 2 ++ public/language/hu/groups.json | 2 ++ public/language/id/groups.json | 2 ++ public/language/it/groups.json | 2 ++ public/language/ja/groups.json | 2 ++ public/language/ko/groups.json | 2 ++ public/language/lt/groups.json | 2 ++ public/language/ms/groups.json | 2 ++ public/language/nb/groups.json | 2 ++ public/language/nl/groups.json | 2 ++ public/language/pl/groups.json | 2 ++ public/language/pt_BR/groups.json | 2 ++ public/language/ro/groups.json | 2 ++ public/language/ru/groups.json | 2 ++ public/language/sc/groups.json | 2 ++ public/language/sk/groups.json | 2 ++ public/language/sv/groups.json | 2 ++ public/language/th/groups.json | 2 ++ public/language/tr/groups.json | 2 ++ public/language/vi/groups.json | 2 ++ public/language/zh_CN/groups.json | 2 ++ public/language/zh_TW/groups.json | 2 ++ 34 files changed, 68 insertions(+) diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index 5ca494a696..b006f74391 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "آخر المشاركات", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json index a9f9207a2f..fe8c9fed1d 100644 --- a/public/language/bn/groups.json +++ b/public/language/bn/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "সর্বশেষ পোষ্টসমূহ", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 980b41e1b7..95d083451f 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Nejnovější příspěvky", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/de/groups.json b/public/language/de/groups.json index 812b309dc3..375e09d9b5 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Aktuelle Beiträge", "details.private": "Private Gruppe", "details.public": "Öffentliche Gruppe", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Gruppenadministration", "event.updated": "Gruppendetails wurden aktualisiert", "event.deleted": "Die Gruppe \"% 1\" wurde gelöscht" diff --git a/public/language/el/groups.json b/public/language/el/groups.json index 5fa5a25877..9ad8583476 100644 --- a/public/language/el/groups.json +++ b/public/language/el/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Τελευταίες δημοσιεύσεις.", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/en@pirate/groups.json b/public/language/en@pirate/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/en@pirate/groups.json +++ b/public/language/en@pirate/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/en_US/groups.json b/public/language/en_US/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/en_US/groups.json +++ b/public/language/en_US/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/es/groups.json b/public/language/es/groups.json index bc91648d60..999550b671 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Últimas Publicaciones", "details.private": "Grupo Privado", "details.public": "Grupo Público", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Administración De Grupo", "event.updated": "Los detalles del grupo han sido actualizados", "event.deleted": "El grupo \"%1\" ha sido eliminado" diff --git a/public/language/et/groups.json b/public/language/et/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/fa_IR/groups.json b/public/language/fa_IR/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/fa_IR/groups.json +++ b/public/language/fa_IR/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/fi/groups.json b/public/language/fi/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/fi/groups.json +++ b/public/language/fi/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index e786d08dd0..d8c81570df 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Derniers messages", "details.private": "Groupe Privé", "details.public": "Groupe Public", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Administration du Groupe", "event.updated": "Les détails du groupe ont été mis à jour", "event.deleted": "Le groupe é%1\" a été supprimé" diff --git a/public/language/he/groups.json b/public/language/he/groups.json index 54f7936c08..6754a5611c 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "פוסטים אחרונים", "details.private": "קבוצה פרטית", "details.public": "קבוצה פומבית", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "ניהול הקבוצה", "event.updated": "פרטי הקבוצה עודכנו", "event.deleted": "קבוצת \"%1\" נמחקה" diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json index 3d8cddf1c1..09324055a0 100644 --- a/public/language/hu/groups.json +++ b/public/language/hu/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Legújabb bejegyzések", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/id/groups.json b/public/language/id/groups.json index bca990761d..3bae971661 100644 --- a/public/language/id/groups.json +++ b/public/language/id/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Posting Terkini", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 51f67ec593..f4e5f32787 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Ultimi Post", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index 8a788bebb2..344c35078b 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "최근 게시물", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json index 7578e96072..894bbc0a12 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Seneste innlegg", "details.private": "Privat grup", "details.public": "Offentlig grup", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Gruppeadministrasjon", "event.updated": "Gruppedetaljer har blitt oppgradert", "event.deleted": "Gruppen \"%1\" har blitt slettet" diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index a1d2ca868d..59681475d1 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Nieuwste Berichten", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index 9fdd6d6c79..0cd285b938 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Ostatnie posty", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/pt_BR/groups.json b/public/language/pt_BR/groups.json index 09abeb8bcd..4095f4c3ce 100644 --- a/public/language/pt_BR/groups.json +++ b/public/language/pt_BR/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Últimos Posts", "details.private": "Grupo Privado", "details.public": "Grupo Público.", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Administração do Grupo", "event.updated": "Os detalhes do grupo foram atualizados", "event.deleted": "O grupo \"%1\" foi deletado" diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index 816af582ea..03cacf8b36 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Ultimele Mesaje", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 55a2f35561..4b86076056 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Последние записи", "details.private": "Приватная группа", "details.public": "Открытая группа", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Настройки группы", "event.updated": "Настройки группы обновлены", "event.deleted": "Группа \"%1\" удалена" diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/sc/groups.json +++ b/public/language/sc/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index 92a4eeb90b..fdba1db1b1 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Senaste inlägg", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/th/groups.json b/public/language/th/groups.json index 6dfd71256b..950fe6dca3 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Latest Posts", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index e174ef10ab..3b765a2f7b 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "En son iletiler", "details.private": "Özel Grup", "details.public": "Herkese Açık Grup", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Grup Yöneticisi", "event.updated": "Grup detayları güncellenmiştir", "event.deleted": "\"%1\" grubu silinmiş" diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index c3a1d060d0..b649073d9b 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "Bài mới nhất", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index 10a70d94c2..5a4bdd5b1f 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "最新帖子", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" diff --git a/public/language/zh_TW/groups.json b/public/language/zh_TW/groups.json index 7e9ba9f239..a6c0d93c19 100644 --- a/public/language/zh_TW/groups.json +++ b/public/language/zh_TW/groups.json @@ -15,6 +15,8 @@ "details.latest_posts": "最新帖子", "details.private": "Private Group", "details.public": "Public Group", + "details.grant": "Grant/Rescind Ownership", + "details.kick": "Kick", "details.owner_options": "Group Administration", "event.updated": "Group details have been updated", "event.deleted": "The group \"%1\" has been deleted" From 34c1d69ed33fcc843f06291c4029c995667e1209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 10 Feb 2015 13:12:08 -0500 Subject: [PATCH 56/73] added filter:tags.search --- src/topics/tags.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/topics/tags.js b/src/topics/tags.js index be01380ef5..14982b4e1e 100644 --- a/src/topics/tags.js +++ b/src/topics/tags.js @@ -271,8 +271,10 @@ module.exports = function(Topics) { matches = matches.slice(0, 20).sort(function(a, b) { return a > b; }); - - callback(null, matches); + + plugins.fireHook('filter:tags.search', {data: data, matches: matches}, function(err, data) { + callback(err, data ? data.matches : []); + }); }); }; From b40b87dd360c28d7df0e6f49274a36cfdda7d0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 10 Feb 2015 13:45:29 -0500 Subject: [PATCH 57/73] dont add relative_path to uploads it is added on the way out --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index acb1a3baca..dcdf8e1819 100644 --- a/app.js +++ b/app.js @@ -116,7 +116,7 @@ function start() { nconf.set('use_port', !!urlObject.port); nconf.set('relative_path', relativePath); nconf.set('port', urlObject.port || nconf.get('port') || nconf.get('PORT') || 4567); - nconf.set('upload_url', relativePath + '/uploads/'); + nconf.set('upload_url', '/uploads/'); if (nconf.get('isPrimary') === 'true') { winston.info('Time: %s', (new Date()).toString()); From 57d6bb3b4c2a52668757ca3a067b0fd98e851cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 10 Feb 2015 14:30:01 -0500 Subject: [PATCH 58/73] filter:search.build hook --- src/controllers/search.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/controllers/search.js b/src/controllers/search.js index 0a26822699..93a7eccdc5 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -41,10 +41,9 @@ searchController.search = function(req, res, next) { req.query.categories = [req.query.categories]; } - req.query.in = req.query.in || 'posts'; - search.search({ + var data = { query: req.params.term, - searchIn: req.query.in, + searchIn: req.query.in || 'posts', postedBy: req.query.by, categories: req.query.categories, searchChildren: req.query.searchChildren, @@ -56,7 +55,9 @@ searchController.search = function(req, res, next) { sortDirection: req.query.sortDirection, page: page, uid: uid - }, function(err, results) { + }; + + search.search(data, function(err, results) { if (err) { return next(err); } @@ -67,7 +68,13 @@ searchController.search = function(req, res, next) { results.showAsTopics = req.query.showAs === 'topics'; results.breadcrumbs = breadcrumbs; results.categories = categories; - res.render('search', results); + + plugins.fireHook('filter:search.build', {data: data, results: results}, function(err, data) { + if (err) { + return next(err); + } + res.render('search', data.results); + }); }); }); }; From 6a55cdfbaf8b552e60cba21c6eb3a00a6f5fea06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 10 Feb 2015 14:47:01 -0500 Subject: [PATCH 59/73] fix relative_path image url for sub installs --- src/controllers/accounts.js | 2 +- src/user.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 84b0f96ad5..77cbe1008b 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -438,7 +438,7 @@ accountsController.uploadPicture = function (req, res, next) { user.setUserFields(updateUid, {uploadedpicture: image.url, picture: image.url}); - res.json([{name: userPhoto.name, url: image.url}]); + res.json([{name: userPhoto.name, url: nconf.get('relative_path') + image.url}]); } if (err) { diff --git a/src/user.js b/src/user.js index bd781432a0..035933154a 100644 --- a/src/user.js +++ b/src/user.js @@ -119,7 +119,7 @@ var async = require('async'), if (user.picture) { if (user.picture === user.uploadedpicture) { - user.picture = user.picture.indexOf('http') === -1 ? nconf.get('relative_path') + user.picture : user.picture; + user.picture = user.uploadedpicture = user.picture.indexOf('http') === -1 ? nconf.get('relative_path') + user.picture : user.picture; } else { user.picture = User.createGravatarURLFromEmail(user.email); } From 2c86ca59e6c75c7107b6d5c768cbb89987051f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 10 Feb 2015 15:23:11 -0500 Subject: [PATCH 60/73] fire filter:serch.build if query is empty --- src/controllers/search.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/controllers/search.js b/src/controllers/search.js index 93a7eccdc5..2020612094 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -24,7 +24,7 @@ searchController.search = function(req, res, next) { } if (!req.params.term) { - return res.render('search', { + var results = { time: 0, search_query: '', posts: [], @@ -32,7 +32,14 @@ searchController.search = function(req, res, next) { tags: [], categories: categories, breadcrumbs: breadcrumbs + }; + plugins.fireHook('filter:search.build', {data: {}, results: results}, function(err, data) { + if (err) { + return next(err); + } + res.render('search', data.results); }); + return; } req.params.term = validator.escape(req.params.term); From a0e98d5957e162bcec84fdbbe7d5368ac6386974 Mon Sep 17 00:00:00 2001 From: Timothy Fike Date: Tue, 10 Feb 2015 19:47:06 -0500 Subject: [PATCH 61/73] Make widget headers clickable anywhere. --- public/src/admin/extend/widgets.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/src/admin/extend/widgets.js b/public/src/admin/extend/widgets.js index 1bf4a043ec..9632bbfa68 100644 --- a/public/src/admin/extend/widgets.js +++ b/public/src/admin/extend/widgets.js @@ -46,8 +46,6 @@ define('admin/extend/widgets', function() { appendToggle(ui.item); }, connectWith: "div" - }).on('click', '.toggle-widget', function() { - $(this).parents('.widget-panel').children('.panel-body').toggleClass('hidden'); }).on('click', '.delete-widget', function() { var panel = $(this).parents('.widget-panel'); @@ -56,8 +54,10 @@ define('admin/extend/widgets', function() { panel.remove(); } }); - }).on('dblclick', '.panel-heading', function() { - $(this).parents('.widget-panel').children('.panel-body').toggleClass('hidden'); + }).on('mouseup', '.panel-heading', function(evt) { + if ( !( $(this).parents('.widget-panel').is('.ui-sortable-helper') || $(evt.target).closest('.delete-widget').length ) ) { + $(this).parents('.widget-panel').children('.panel-body').toggleClass('hidden'); + } }); $('#widgets .save').on('click', saveWidgets); From a5029d148ccd8ca45223a06c189a5c5c649d1e0a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 10 Feb 2015 20:20:52 -0500 Subject: [PATCH 62/73] open user links in new tab --- 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 e3231b0099..7eb2997ba5 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -10,7 +10,7 @@
#{events.eid} {events.type} - {events.user.username} (uid {events.user.uid}) (IP {events.ip}) + {events.user.username} (uid {events.user.uid}) (IP {events.ip}) {events.timestampISO}

{events.jsonString}
From 104393f5f7df13e6f0b178ccd411748c6f5e8c53 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 10 Feb 2015 21:54:35 -0500 Subject: [PATCH 63/73] closes #2712 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 013480d14d..8de4dbc58c 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "nodebb-plugin-mentions": "^0.9.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", - "nodebb-theme-lavender": "^0.2.0", + "nodebb-theme-lavender": "^1.0.0", "nodebb-theme-vanilla": "^1.0.0", "nodebb-widget-essentials": "~0.2.0", "npm": "^2.1.4", From 1142f7700f2c1337fefaa417f65fb67843e5802f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 10 Feb 2015 23:34:06 -0500 Subject: [PATCH 64/73] closes #2714 --- src/plugins.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/plugins.js b/src/plugins.js index bd00bb8b0a..0c8a4ba394 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -343,16 +343,18 @@ var fs = require('fs'), }).reduce(function(prev, cur) { return prev.concat(cur); }); - next(null, paths); - } - ], function(err, paths) { - for (var x=0,numPaths=paths.length;x Date: Wed, 11 Feb 2015 11:34:33 -0500 Subject: [PATCH 65/73] refactored the groups update method a bit, and now if a group has pending members and it becomes a public group, those users become members --- src/groups.js | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/groups.js b/src/groups.js index 7567c662f5..f82e452b96 100644 --- a/src/groups.js +++ b/src/groups.js @@ -503,7 +503,11 @@ var async = require('async'), 'private': values.private === false ? '0' : '1' }; - db.setObject('group:' + groupName, payload, function(err) { + async.series([ + async.apply(updatePrivacy, groupName, values.private), + async.apply(db.setObject, 'group:' + groupName, payload), + async.apply(renameGroup, groupName, values.name) + ], function(err) { if (err) { return callback(err); } @@ -512,11 +516,37 @@ var async = require('async'), name: groupName, values: values }); - renameGroup(groupName, values.name, callback); + callback(); }); }); }; + function updatePrivacy(groupName, newValue, callback) { + // Grab the group's current privacy value + Groups.getGroupFields(groupName, ['private'], function(err, currentValue) { + currentValue = currentValue.private === '1'; // Now a Boolean + + if (currentValue !== newValue && currentValue === true) { + // Group is now public, so all pending users are automatically considered members + db.getSetMembers('group:' + groupName + ':pending', function(err, uids) { + if (err) { return callback(err); } + else if (!uids) { return callback(); } // No pending users, we're good to go + + var now = Date.now(), + scores = uids.map(function() { return now; }); // There's probably a better way to initialise an Array of size x with the same value... + + winston.verbose('[groups.update] Group is now public, automatically adding ' + uids.length + ' new members, who were pending prior.'); + async.series([ + async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', scores, uids), + async.apply(db.delete, 'group:' + groupName + ':pending') + ], callback); + }); + } else { + callback(); + } + }); + } + function renameGroup(oldName, newName, callback) { if (oldName === newName || !newName || newName.length === 0) { return callback(); From 749ce5f8e5a9848c9fb462679a689f0da66df431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 12:01:46 -0500 Subject: [PATCH 66/73] dont crash if callback isnt supplied to list methods --- src/database/redis/list.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/database/redis/list.js b/src/database/redis/list.js index 115a56a767..7ebc068d53 100644 --- a/src/database/redis/list.js +++ b/src/database/redis/list.js @@ -2,34 +2,40 @@ module.exports = function(redisClient, module) { module.listPrepend = function(key, value, callback) { + callback = callback || function() {}; redisClient.lpush(key, value, function(err, res) { callback(err); }); }; module.listAppend = function(key, value, callback) { + callback = callback || function() {}; redisClient.rpush(key, value, function(err, res) { callback(err); }); }; module.listRemoveLast = function(key, callback) { + callback = callback || function() {}; redisClient.rpop(key, callback); }; module.listRemoveAll = function(key, value, callback) { + callback = callback || function() {}; redisClient.lrem(key, 0, value, function(err, res) { callback(err); }); }; module.listTrim = function(key, start, stop, callback) { + callback = callback || function() {}; redisClient.ltrim(key, start, stop, function(err, res) { callback(err); }); }; module.getListRange = function(key, start, stop, callback) { + callback = callback || function() {}; redisClient.lrange(key, start, stop, callback); }; }; \ No newline at end of file From f3d1e96c24554e04710a46cc462a9c010a5f8830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 12:12:37 -0500 Subject: [PATCH 67/73] filter deleted topics on popular --- src/topics/popular.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/topics/popular.js b/src/topics/popular.js index ce2182cabf..a1149914fc 100644 --- a/src/topics/popular.js +++ b/src/topics/popular.js @@ -34,10 +34,12 @@ module.exports = function(Topics) { function getTopics(tids, uid, count, callback) { async.waterfall([ function(next) { - Topics.getTopicsFields(tids, ['tid', 'postcount'], next); + Topics.getTopicsFields(tids, ['tid', 'postcount', 'deleted'], next); }, function(topics, next) { - tids = topics.sort(function(a, b) { + tids = topics.filter(function(topic) { + return topic && parseInt(topic.deleted, 10) !== 1; + }).sort(function(a, b) { return b.postcount - a.postcount; }).slice(0, count).map(function(topic) { return topic.tid; From 0c5c0bf08ab46d0a4de435c204f6fbda28bfe955 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Feb 2015 12:23:11 -0500 Subject: [PATCH 68/73] making userRow selector less specific, in group details.js --- public/src/client/groups/details.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index b40957af8a..1d651fad27 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -19,7 +19,7 @@ define('forum/groups/details', ['iconSelect', 'vendor/colorpicker/colorpicker', detailsPage.on('click', '[data-action]', function() { var btnEl = $(this), - userRow = btnEl.parents('tr'), + userRow = btnEl.parents('[data-uid]'), ownerFlagEl = userRow.find('.member-name i'), isOwner = !ownerFlagEl.hasClass('invisible') ? true : false, uid = userRow.attr('data-uid'), From 8a581ed1ddce50872b9d6f70be6603127f9c2ebc Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Feb 2015 12:30:48 -0500 Subject: [PATCH 69/73] fixes #2711 :rage2: --- public/src/ajaxify.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index d2af431176..cd87159420 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -275,7 +275,9 @@ $(document).ready(function() { // Enhancing all anchors to ajaxify... $(document.body).on('click', 'a', function (e) { - if (hrefEmpty(this.href) || this.target !== '' || this.protocol === 'javascript:' || $(this).attr('data-ajaxify') === 'false') { + if (this.target !== '') { + return; + } else if (hrefEmpty(this.href) || this.protocol === 'javascript:' || $(this).attr('data-ajaxify') === 'false') { return e.preventDefault(); } From d20628a8d4458e3dbde79c24fac82f7c15d452e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 12:54:54 -0500 Subject: [PATCH 70/73] closes #2539 --- public/src/app.js | 29 ++++++++------------------ public/src/client/account/edit.js | 4 ++-- public/src/client/account/settings.js | 2 +- public/src/client/chats.js | 2 +- public/src/client/footer.js | 2 +- public/src/client/topic.js | 2 +- public/src/client/topic/browsing.js | 2 +- public/src/client/topic/events.js | 2 +- public/src/client/topic/posts.js | 10 ++++----- public/src/client/topic/threadTools.js | 2 +- public/src/modules/chat.js | 2 +- public/src/modules/composer.js | 14 ++++++------- src/socket.io/index.js | 27 +++++++----------------- 13 files changed, 38 insertions(+), 62 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index 1e5b92cf4d..5010ead25d 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -10,10 +10,6 @@ app.currentRoom = null; app.widgets = {}; app.cacheBuster = null; -// TODO: deprecate in 0.7.0, use app.user -app.username = null; -app.uid = null; - (function () { var showWelcomeMessage = false; var reconnecting = false; @@ -29,14 +25,7 @@ app.uid = null; socket = io.connect(config.websocketAddress, ioParams); reconnecting = false; - socket.on('event:connect', function (data) { - // TODO : deprecate in 0.7.0, use app.user - app.username = data.username; - app.userslug = data.userslug; - app.picture = data.picture; - app.uid = data.uid; - app.isAdmin = data.isAdmin; - + socket.on('event:connect', function () { app.showLoginMessage(); app.replaceSelfLinks(); $(window).trigger('action:connected'); @@ -182,9 +171,9 @@ app.uid = null; socket.emit('meta.rooms.enter', { enter: room, - username: app.username, - userslug: app.userslug, - picture: app.picture + username: app.user.username, + userslug: app.user.userslug, + picture: app.user.picture }); app.currentRoom = room; @@ -232,8 +221,8 @@ app.uid = null; selector = selector || $('a'); selector.each(function() { var href = $(this).attr('href'); - if (href && app.userslug && href.indexOf('user/_self_') !== -1) { - $(this).attr('href', href.replace(/user\/_self_/g, 'user/' + app.userslug)); + if (href && app.user.userslug && href.indexOf('user/_self_') !== -1) { + $(this).attr('href', href.replace(/user\/_self_/g, 'user/' + app.user.userslug)); } }); }; @@ -261,7 +250,7 @@ app.uid = null; function showAlert() { app.alert({ type: 'success', - title: '[[global:welcome_back]] ' + app.username + '!', + title: '[[global:welcome_back]] ' + app.user.username + '!', message: '[[global:you_have_successfully_logged_in]]', timeout: 5000 }); @@ -278,11 +267,11 @@ app.uid = null; }; app.openChat = function (username, touid) { - if (username === app.username) { + if (username === app.user.username) { return app.alertError('[[error:cant-chat-with-yourself]]'); } - if (!app.uid) { + if (!app.user.uid) { return app.alertError('[[error:not-logged-in]]'); } diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index f85e00951c..dc8bfaeaf1 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -152,7 +152,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader'], function(head return; } - if ($('#confirm-username').val() !== app.username) { + if ($('#confirm-username').val() !== app.user.username) { app.alertError('[[error:invalid-username]]'); return false; } else { @@ -266,7 +266,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader'], function(head password_confirm.on('blur', onPasswordConfirmChanged); $('#changePasswordBtn').on('click', function() { - if ((passwordvalid && passwordsmatch) || app.isAdmin) { + if ((passwordvalid && passwordsmatch) || app.user.isAdmin) { socket.emit('user.changePassword', { 'currentPassword': currentPassword.val(), 'newPassword': password.val(), diff --git a/public/src/client/account/settings.js b/public/src/client/account/settings.js index 0b4bbbd00f..fef95fc495 100644 --- a/public/src/client/account/settings.js +++ b/public/src/client/account/settings.js @@ -44,7 +44,7 @@ define('forum/account/settings', ['forum/account/header'], function(header) { } app.exposeConfigToTemplates(); - if (parseInt(app.uid, 10) === parseInt(ajaxify.variables.get('theirid'), 10)) { + if (parseInt(app.user.uid, 10) === parseInt(ajaxify.variables.get('theirid'), 10)) { ajaxify.refresh(); } }); diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 607b84d4f3..994ddeb47a 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -193,7 +193,7 @@ define('forum/chats', ['string', 'sounds', 'forum/infinitescroll'], function(S, Chats.notifyTyping = function(toUid, typing) { socket.emit('modules.chats.user' + (typing ? 'Start' : 'Stop') + 'Typing', { touid: toUid, - fromUid: app.uid + fromUid: app.user.uid }); }; diff --git a/public/src/client/footer.js b/public/src/client/footer.js index 775686aaa2..ff44f25e1e 100644 --- a/public/src/client/footer.js +++ b/public/src/client/footer.js @@ -31,7 +31,7 @@ define('forum/footer', ['notifications', 'chat'], function(Notifications, Chat) if (data && data.posts && data.posts.length) { var post = data.posts[0]; - if (parseInt(post.uid, 10) !== parseInt(app.uid, 10) && !unreadTopics[post.topic.tid]) { + if (parseInt(post.uid, 10) !== parseInt(app.user.uid, 10) && !unreadTopics[post.topic.tid]) { increaseUnreadCount(); markTopicsUnread(post.topic.tid); unreadTopics[post.topic.tid] = true; diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 621521eaed..f5627a02d5 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -59,7 +59,7 @@ define('forum/topic', [ $(window).trigger('action:topic.loaded'); - if (app.uid) { + if (app.user.uid) { socket.emit('topics.enter', tid, function(err, data) { if (err) { return app.alertError(err.message); diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index 6541cdf68a..dd768391e1 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -74,7 +74,7 @@ define('forum/topic/browsing', function() { } var activeEl = $('.thread_active_users'); var userEl = createUserIcon(user.uid, user.picture, user.userslug, user.username); - var isSelf = parseInt(user.uid, 10) === parseInt(app.uid, 10); + var isSelf = parseInt(user.uid, 10) === parseInt(app.user.uid, 10); if (isSelf) { activeEl.prepend(userEl); } else { diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index f4c69a121e..c90dd149b5 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -156,7 +156,7 @@ define('forum/topic/events', [ var isDeleted = postEl.hasClass('deleted'); postTools.toggle(data.pid, isDeleted); - if (!app.isAdmin && parseInt(data.uid, 10) !== parseInt(app.uid, 10)) { + if (!app.user.isAdmin && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) { if (isDeleted) { postEl.find('.post-content').translateHtml('[[topic:post_is_deleted]]'); } else { diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 05bc505ae2..57bf5a1e15 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -34,7 +34,7 @@ define('forum/topic/posts', [ var posts = data.posts; if (pagination.currentPage === pagination.pageCount) { createNewPosts(data); - } else if(data.posts && data.posts.length && parseInt(data.posts[0].uid, 10) === parseInt(app.uid, 10)) { + } else if(data.posts && data.posts.length && parseInt(data.posts[0].uid, 10) === parseInt(app.user.uid, 10)) { pagination.loadPage(pagination.pageCount); } } @@ -134,7 +134,7 @@ define('forum/topic/posts', [ } function onNewPostsLoaded(html, pids) { - if (app.uid) { + if (app.user.uid) { socket.emit('posts.getPrivileges', pids, function(err, privileges) { if(err) { return app.alertError(err.message); @@ -163,8 +163,8 @@ define('forum/topic/posts', [ postEl.find('.move').remove(); } 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('hidden', isSelfPost || !app.uid); + var isSelfPost = parseInt(postEl.attr('data-uid'), 10) === parseInt(app.user.uid, 10); + postEl.find('.chat, .flag').toggleClass('hidden', isSelfPost || !app.user.uid); } Posts.loadMorePosts = function(direction) { @@ -202,7 +202,7 @@ define('forum/topic/posts', [ done(); }); } else { - if (app.uid) { + if (app.user.uid) { socket.emit('topics.markAsRead', [tid]); } navigator.update(); diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index b401a850ed..c3923e2720 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -99,7 +99,7 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move'], func ThreadTools.setLockedState = function(data) { var threadEl = $('#post-container'); if (parseInt(data.tid, 10) === parseInt(threadEl.attr('data-tid'), 10)) { - var isLocked = data.isLocked && !app.isAdmin; + var isLocked = data.isLocked && !app.user.isAdmin; $('.lock_thread').translateHtml(' [[topic:thread_tools.' + (data.isLocked ? 'un': '') + 'lock]]'); diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 02fcbba02e..06e8c75c7d 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -74,7 +74,7 @@ define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, } var username = data.message.fromUser.username; - var isSelf = parseInt(data.message.fromUser.uid, 10) === parseInt(app.uid, 10); + var isSelf = parseInt(data.message.fromUser.uid, 10) === parseInt(app.user.uid, 10); data.message.self = data.self; if (isSelf) { username = data.message.toUser.username; diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 2836967416..088cafe260 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -68,13 +68,13 @@ define('composer', [ }); // Construct a save_id - if (0 !== parseInt(app.uid, 10)) { + if (0 !== parseInt(app.user.uid, 10)) { if (post.hasOwnProperty('cid')) { - post.save_id = ['composer', app.uid, 'cid', post.cid].join(':'); + post.save_id = ['composer', app.user.uid, 'cid', post.cid].join(':'); } else if (post.hasOwnProperty('tid')) { - post.save_id = ['composer', app.uid, 'tid', post.tid].join(':'); + post.save_id = ['composer', app.user.uid, 'tid', post.tid].join(':'); } else if (post.hasOwnProperty('pid')) { - post.save_id = ['composer', app.uid, 'pid', post.pid].join(':'); + post.save_id = ['composer', app.user.uid, 'pid', post.pid].join(':'); } } @@ -183,7 +183,7 @@ define('composer', [ function emit() { socket.emit('modules.composer.notifyTyping', { tid: postData.tid, - uid: app.uid + uid: app.user.uid }); } @@ -203,7 +203,7 @@ define('composer', [ } socket.emit('modules.composer.stopNotifyTyping', { tid: postData.tid, - uid: app.uid + uid: app.user.uid }); } @@ -219,7 +219,7 @@ define('composer', [ isTopic = composer.posts[post_uuid] ? !!composer.posts[post_uuid].cid : false, isMain = composer.posts[post_uuid] ? !!composer.posts[post_uuid].isMain : false, isEditing = composer.posts[post_uuid] ? !!composer.posts[post_uuid].pid : false, - isGuestPost = composer.posts[post_uuid] ? composer.posts[post_uuid].uid === '0' : null; + isGuestPost = composer.posts[post_uuid] ? parseInt(composer.posts[post_uuid].uid, 10) === 0 : null; composer.bsEnvironment = utils.findBootstrapEnvironment(); diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 8144fbc835..98d1d6e2e8 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -66,32 +66,19 @@ function onConnect(socket) { socket.join('uid_' + socket.uid); socket.join('online_users'); - async.parallel({ - user: function(next) { - user.getUserFields(socket.uid, ['username', 'userslug', 'picture', 'status', 'email:confirmed'], next); - }, - isAdmin: function(next) { - user.isAdministrator(socket.uid, next); - } - }, function(err, userData) { - if (err || !userData.user) { + user.getUserFields(socket.uid, ['status'], function(err, userData) { + if (err || !userData) { return; } - userData.user.uid = socket.uid; - userData.user.isAdmin = userData.isAdmin; - userData.user['email:confirmed'] = parseInt(userData.user['email:confirmed'], 10) === 1; - socket.emit('event:connect', userData.user); - if (userData.user.status !== 'offline') { - socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: userData.user.status || 'online'}); + + socket.emit('event:connect'); + if (userData.status !== 'offline') { + socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: userData.status || 'online'}); } }); } else { socket.join('online_guests'); - socket.emit('event:connect', { - username: '[[global:guest]]', - isAdmin: false, - uid: 0 - }); + socket.emit('event:connect'); } } From 7d963e52cf4fcf45c7aa737942c8e9ad06385632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 13:44:54 -0500 Subject: [PATCH 71/73] closes #2686 --- public/src/client/account/profile.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/src/client/account/profile.js b/public/src/client/account/profile.js index 421fc006ef..89a555a702 100644 --- a/public/src/client/account/profile.js +++ b/public/src/client/account/profile.js @@ -41,6 +41,9 @@ define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll'] function processPage() { $('.user-recent-posts img, .post-signature img').addClass('img-responsive'); + + $('.user-recent-posts blockquote').prev('p').remove(); + $('.user-recent-posts blockquote').remove(); } function updateButtons() { From 329343686752d501dd18e735aa8cb2acc47b09e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 14:44:56 -0500 Subject: [PATCH 72/73] closes #2640 --- public/src/admin/manage/users.js | 13 +++++++++++++ src/emailer.js | 1 + src/socket.io/admin/user.js | 29 +++++++++++++++++++++++++++-- src/user/email.js | 15 ++++++++++++--- src/views/admin/manage/users.tpl | 1 + 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index fdd63556e4..dad64e35af 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -134,6 +134,19 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable) return false; }); + $('.send-validation-email').on('click', function() { + var uids = getSelectedUids(); + if (!uids.length) { + return; + } + socket.emit('admin.user.sendValidationEmail', uids, function(err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('[[notifications:email-confirm-sent]]'); + }); + }) + $('.password-reset-email').on('click', function() { var uids = getSelectedUids(); if (!uids.length) { diff --git a/src/emailer.js b/src/emailer.js index e7c92fa812..557de96f6e 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -64,6 +64,7 @@ var fs = require('fs'), uid: uid, pid: params.pid }); + callback(); } else { winston.warn('[emailer] No active email plugin found!'); callback(); diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index aab9eb02e8..0fa583d742 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -1,12 +1,13 @@ "use strict"; -var db = require('../../database'), +var async = require('async'), + db = require('../../database'), groups = require('../../groups'), user = require('../../user'), events = require('../../events'), + meta = require('../../meta'), websockets = require('../index'), - async = require('async'), User = {}; @@ -127,6 +128,30 @@ User.validateEmail = function(socket, uids, callback) { }, callback); }; +User.sendValidationEmail = function(socket, uids, callback) { + if (!Array.isArray(uids)) { + return callback(new Error('[[error:invalid-data]]')); + } + + if (parseInt(meta.config.requireEmailConfirmation, 10) !== 1) { + return callback(new Error('[[error:email-confirmations-are-disabled]]')); + } + + user.getMultipleUserFields(uids, ['uid', 'email'], function(err, usersData) { + if (err) { + return callback(err); + } + + async.eachLimit(usersData, 50, function(userData, next) { + if (userData.email && userData.uid) { + user.email.verify(userData.uid, userData.email, next); + } else { + next(); + } + }, callback); + }); +}; + User.sendPasswordResetEmail = function(socket, uids, callback) { if (!Array.isArray(uids)) { return callback(new Error('[[error:invalid-data]]')); diff --git a/src/user/email.js b/src/user/email.js index 9a4fd2cd73..74b86c0cfe 100644 --- a/src/user/email.js +++ b/src/user/email.js @@ -27,11 +27,16 @@ var async = require('async'), }); }; - UserEmail.verify = function(uid, email) { + UserEmail.verify = function(uid, email, callback) { + callback = callback || function() {}; var confirm_code = utils.generateUUID(), confirm_link = nconf.get('url') + '/confirm/' + confirm_code; plugins.fireHook('filter:user.verify.code', confirm_code, function(err, confirm_code) { + if (err) { + return callback(err); + } + async.series([ function(next) { db.setObject('confirm:' + confirm_code, { @@ -43,7 +48,9 @@ var async = require('async'), db.expireAt('confirm:' + confirm_code, Math.floor(Date.now() / 1000 + 60 * 60 * 2), next); } ], function(err) { - + if (err) { + return callback(err); + } user.getUserField(uid, 'username', function(err, username) { if (err) { return winston.error(err.stack); @@ -64,10 +71,12 @@ var async = require('async'), if (plugins.hasListeners('action:user.verify')) { plugins.fireHook('action:user.verify', {uid: uid, data: data}); + callback(); } else if (plugins.hasListeners('action:email.send')) { - emailer.send('welcome', uid, data); + emailer.send('welcome', uid, data, callback); } else { winston.warn('No emailer to send verification email!'); + callback(); } }); }); diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 1e034474b8..13aa80caa4 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -18,6 +18,7 @@
  • Remove Admin
  • Validate Email
  • +
  • Send Validation Email
  • Send Password Reset Email
  • Ban User
  • From 3f31098144c278b2834a2e7389f0e0c98a327dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 16:16:32 -0500 Subject: [PATCH 73/73] closes #2619 --- src/controllers/accounts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 77cbe1008b..13055ca852 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -521,9 +521,10 @@ accountsController.getChats = function(req, res, next) { async.waterfall([ async.apply(user.getUidByUserslug, req.params.userslug), function(toUid, next) { - if (!toUid) { + if (!toUid || parseInt(toUid, 10) === parseInt(req.user.uid, 10)) { return helpers.notFound(req, res); } + async.parallel({ toUser: async.apply(user.getUserFields, toUid, ['uid', 'username']), messages: async.apply(messaging.getMessages, req.user.uid, toUid, 'recent', false),