From 4c2f628baa50632dc0cb7cec55f07de3b9b653ea Mon Sep 17 00:00:00 2001 From: ahwayakchih Date: Wed, 25 Feb 2015 22:27:19 +0100 Subject: [PATCH 001/295] Added support for using `mongo:password` and `redis:password` from config, when no password is entered at setup. This allows for having "default" password and overrides from config. Added using `mongo:username` and `port` from config when running setup. --- src/database/mongo.js | 6 ++++-- src/database/redis.js | 3 ++- src/install.js | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 0e69c12380..a13cb5dedf 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -22,12 +22,14 @@ }, { name: 'mongo:username', - description: 'MongoDB username' + description: 'MongoDB username', + 'default': nconf.get('mongo:username') || '' }, { name: 'mongo:password', description: 'Password of your MongoDB database', - hidden: true + hidden: true, + before: function(value) { value = value || nconf.get('mongo:password') || ''; return value; } }, { name: "mongo:database", diff --git a/src/database/redis.js b/src/database/redis.js index 727705c130..156131a80d 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -28,7 +28,8 @@ { name: 'redis:password', description: 'Password of your Redis database', - hidden: true + hidden: true, + before: function(value) { value = value || nconf.get('redis:password') || ''; return value; } }, { name: "redis:database", diff --git a/src/install.js b/src/install.js index d3df90b267..a586f5f1b2 100644 --- a/src/install.js +++ b/src/install.js @@ -47,7 +47,7 @@ questions.main = [ questions.optional = [ { name: 'port', - default: 4567 + default: nconf.get('port') || 4567 } ]; From 7ed41a1f60497b2a4b7502862b7fd07c70816977 Mon Sep 17 00:00:00 2001 From: ahwayakchih Date: Thu, 26 Feb 2015 17:39:23 +0100 Subject: [PATCH 002/295] Set separator for loading environment variables to `nconf`, as discussed on https://github.com/NodeBB/NodeBB/pull/2778#issuecomment-76209393 --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index ef113e5ece..1299cfdf4a 100644 --- a/app.js +++ b/app.js @@ -21,7 +21,7 @@ /*global require, global, process*/ var nconf = require('nconf'); -nconf.argv().env(); +nconf.argv().env('__'); var fs = require('fs'), os = require('os'), From 1102f4087349f8fd4d78aed0ab5cc23fbb604555 Mon Sep 17 00:00:00 2001 From: yariplus Date: Fri, 6 Mar 2015 10:20:35 -0500 Subject: [PATCH 003/295] Add object setting plugin Allows objects to be added to a plugin's settings using a tag with a JSON-like syntax in data-attributes. A complex object can be created by using an array or another object as a parent, the object will be added to the parent array or the parent object's declared property instead of as it's own data-key. --- public/src/modules/settings.js | 3 +- public/src/modules/settings/object.js | 102 ++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 public/src/modules/settings/object.js diff --git a/public/src/modules/settings.js b/public/src/modules/settings.js index 8c7d74a448..17302ea1d1 100644 --- a/public/src/modules/settings.js +++ b/public/src/modules/settings.js @@ -9,7 +9,8 @@ define('settings', function () { 'settings/textarea', 'settings/select', 'settings/array', - 'settings/key' + 'settings/key', + 'settings/object' ]; var Settings, diff --git a/public/src/modules/settings/object.js b/public/src/modules/settings/object.js new file mode 100644 index 0000000000..eb81757cdd --- /dev/null +++ b/public/src/modules/settings/object.js @@ -0,0 +1,102 @@ +define('settings/object', function () { + + var Settings = null, + SettingsObject, + helper = null; + + /** + Creates a new child-element of given property with given data and calls given callback with elements to add. + @param field Any wrapper that contains all properties of the object. + @param key The key of the object. + @param attributes The attributes to call {@link Settings.helper.createElementOfType} with or to add as + element-attributes. + @param value The value to call {@link Settings.helper.fillField} with. + @param separator The separator to use. + @param insertCb The callback to insert the elements. + */ + function addObjectPropertyElement(field, key, attributes, prop, value, separator, insertCb) { + attributes = helper.deepClone(attributes); + var type = attributes['data-type'] || attributes.type || 'text', + element = $(helper.createElementOfType(type, attributes.tagName, attributes)); + element.attr('data-parent', '_' + key); + element.attr('data-prop', prop); + delete attributes['data-type']; + delete attributes['tagName']; + for (var name in attributes) { + var val = attributes[name]; + if (name.search('data-') === 0) { + element.data(name.substring(5), val); + } else if (name.search('prop-') === 0) { + element.prop(name.substring(5), val); + } else { + element.attr(name, val); + } + } + helper.fillField(element, value); + if ($('[data-parent="_' + key + '"]', field).length) { + insertCb(separator); + } + insertCb(element); + } + + SettingsObject = { + types: ['object'], + use: function () { + helper = (Settings = this).helper; + }, + create: function (ignored, tagName) { + return helper.createElement(tagName || 'div'); + }, + set: function (element, value) { + var properties = element.data('attributes') || element.data('properties'), + attributes = {}, + key = element.data('key') || element.data('parent'), + prop, + separator = element.data('split') || ', '; + separator = (function () { + try { + return $(separator); + } catch (_error) { + return $(document.createTextNode(separator)); + } + })(); + element.empty(); + if (typeof value !== 'object') { + value = {}; + } + if (typeof properties === 'object') { + for (prop in properties) { + attributes = properties[prop]; + if (typeof attributes !== 'object') { + attributes = {}; + } + addObjectPropertyElement(element, key, attributes, prop, value[prop], separator.clone(), function (el) { + element.append(el); + }); + } + } + }, + get: function (element, trim, empty) { + var key = element.data('key') || element.data('parent'), + properties = $('[data-parent="_' + key + '"]', element), + value = {}; + properties.each(function (i, property) { + property = $(property); + var val = helper.readValue(property), + prop = property.data('prop'), + empty = helper.isTrue(property.data('empty')); + if (empty || val !== void 0 && (val == null || val.length !== 0)) { + return value[prop] = val; + } + }); + if (empty || Object.keys(value).length) { + return value; + } else { + return void 0; + } + } + }; + + return SettingsObject; + +}); From 87d74abfc9b4d2f798f0579bc076970495c6b496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Mon, 9 Mar 2015 16:19:02 +0300 Subject: [PATCH 004/295] Add parameters for create categories --- src/categories/create.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/categories/create.js b/src/categories/create.js index a8bfaeb6fc..5838ea1dc3 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -19,19 +19,19 @@ module.exports = function(Categories) { var category = { cid: cid, name: data.name, - description: data.description, - icon: data.icon, - bgColor: data.bgColor, - color: data.color, + description: ( data.description ? data.description : '' ), + icon: ( data.icon ? data.icon : '' ), + bgColor: ( data.bgColor ? data.bgColor : '' ), + color: ( data.color ? data.color : '' ), slug: slug, - parentCid: 0, + parentCid: ( data.parentCid ? data.parentCid : 0 ), topic_count: 0, post_count: 0, disabled: 0, - order: order, + order: ( data.order ? data.order : cid ), link: '', numRecentReplies: 1, - class: 'col-md-3 col-xs-6', + class: ( data.class ? data.class : 'col-md-3 col-xs-6' ), imageClass: 'auto' }; From 3910f8bf28e6b2cab196edb50f06b6485e7ec3b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Mon, 9 Mar 2015 16:43:02 +0300 Subject: [PATCH 005/295] Add parameters for create categories --- src/categories/create.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/categories/create.js b/src/categories/create.js index a8bfaeb6fc..6d5147f97e 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -19,19 +19,19 @@ module.exports = function(Categories) { var category = { cid: cid, name: data.name, - description: data.description, - icon: data.icon, - bgColor: data.bgColor, - color: data.color, + description: ( data.description ? data.description : '' ), + icon: ( data.icon ? data.icon : '' ), + bgColor: ( data.bgColor ? data.bgColor : '' ), + color: ( data.color ? data.color : '' ), slug: slug, - parentCid: 0, + parentCid: ( data.parentCid ? data.parentCid : 0 ), topic_count: 0, post_count: 0, disabled: 0, - order: order, + order: ( data.order ? data.order : cid ), link: '', numRecentReplies: 1, - class: 'col-md-3 col-xs-6', + class: ( data.class ? data.class : 'col-md-3 col-xs-6' ), imageClass: 'auto' }; @@ -39,7 +39,7 @@ module.exports = function(Categories) { async.series([ async.apply(db.setObject, 'category:' + cid, category), - async.apply(db.sortedSetAdd, 'categories:cid', order, cid), + async.apply(db.sortedSetAdd, 'categories:cid', data.order, cid), async.apply(privileges.categories.give, defaultPrivileges, cid, 'administrators'), async.apply(privileges.categories.give, defaultPrivileges, cid, 'registered-users'), async.apply(privileges.categories.give, ['find', 'read'], cid, 'guests') From cc384cc4d6799f23c0803af6b8c817ae7e10acbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Mon, 9 Mar 2015 16:45:22 +0300 Subject: [PATCH 006/295] Update file for create categories --- src/categories/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/categories/create.js b/src/categories/create.js index 6d5147f97e..5838ea1dc3 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -39,7 +39,7 @@ module.exports = function(Categories) { async.series([ async.apply(db.setObject, 'category:' + cid, category), - async.apply(db.sortedSetAdd, 'categories:cid', data.order, cid), + async.apply(db.sortedSetAdd, 'categories:cid', order, cid), async.apply(privileges.categories.give, defaultPrivileges, cid, 'administrators'), async.apply(privileges.categories.give, defaultPrivileges, cid, 'registered-users'), async.apply(privileges.categories.give, ['find', 'read'], cid, 'guests') From 8a5b5936b7975b6605b0caa30d217a19b013327e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Mon, 9 Mar 2015 16:56:57 +0300 Subject: [PATCH 007/295] Revert line bgColor --- src/categories/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/categories/create.js b/src/categories/create.js index 5838ea1dc3..32b346264d 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -21,7 +21,7 @@ module.exports = function(Categories) { name: data.name, description: ( data.description ? data.description : '' ), icon: ( data.icon ? data.icon : '' ), - bgColor: ( data.bgColor ? data.bgColor : '' ), + bgColor: data.bgColor, color: ( data.color ? data.color : '' ), slug: slug, parentCid: ( data.parentCid ? data.parentCid : 0 ), From 6d03f5c9e81dfd1178bbab764c6cd894e0ad658d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Mon, 9 Mar 2015 17:04:30 +0300 Subject: [PATCH 008/295] Revert line order --- src/categories/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/categories/create.js b/src/categories/create.js index 32b346264d..b522f0750f 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -28,7 +28,7 @@ module.exports = function(Categories) { topic_count: 0, post_count: 0, disabled: 0, - order: ( data.order ? data.order : cid ), + order: order, link: '', numRecentReplies: 1, class: ( data.class ? data.class : 'col-md-3 col-xs-6' ), From 3831cd0e711d2a0d9e3d893c87f834894718c2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Mon, 9 Mar 2015 23:19:51 +0300 Subject: [PATCH 009/295] Adding the ability to use a different url --- src/categories/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/categories/create.js b/src/categories/create.js index b522f0750f..62f9d28266 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -13,7 +13,7 @@ module.exports = function(Categories) { return callback(err); } - var slug = cid + '/' + utils.slugify(data.name), + var slug = data.slug ? cid + '/' + data.slug : cid + '/' + utils.slugify(data.name), order = data.order || cid; // If no order provided, place it at the end var category = { From 8b48a1e3af75c5bba42f2f5f4e3a3362f8bcbf90 Mon Sep 17 00:00:00 2001 From: Mega Date: Fri, 27 Mar 2015 14:51:36 +0300 Subject: [PATCH 010/295] fix: category images (helpers.generateCategoryBackground) --- public/src/modules/helpers.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index a0201ed6cc..d9bc514aa3 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -57,19 +57,22 @@ helpers.generateCategoryBackground = function(category) { var style = []; - if (category.backgroundImage) { - style.push('background-image: url(' + category.backgroundImage + ')'); - } - if (category.bgColor) { - style.push('background-color: ' + category.bgColor + ';'); + style.push('background-color: ' + category.bgColor); } if (category.color) { - style.push('color: ' + category.color + ';'); + style.push('color: ' + category.color); } - return style.join(' '); + if (category.backgroundImage) { + style.push('background-image: url(' + category.backgroundImage + ')'); + if (category.imageClass) { + style.push('background-size: ' + category.imageClass); + } + } + + return style.join('; ') + ';'; }; helpers.generateTopicClass = function(topic) { From 7a3b4c08e0257592b2c86a85741edfd74ab31bad Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 31 Mar 2015 21:13:58 -0400 Subject: [PATCH 011/295] closes #2922 --- public/language/en_GB/pages.json | 3 ++- src/meta/title.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/language/en_GB/pages.json b/public/language/en_GB/pages.json index 74e24a2e79..d9825d5800 100644 --- a/public/language/en_GB/pages.json +++ b/public/language/en_GB/pages.json @@ -5,7 +5,8 @@ "recent": "Recent Topics", "users": "Registered Users", "notifications": "Notifications", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editing \"%1\"", "user.following": "People %1 Follows", "user.followers": "People who Follow %1", diff --git a/src/meta/title.js b/src/meta/title.js index d67c448343..7522dbe3a7 100644 --- a/src/meta/title.js +++ b/src/meta/title.js @@ -40,7 +40,7 @@ module.exports = function(Meta) { }; Meta.title.parseFragment = function (urlFragment, language, locals, callback) { - var translated = ['', 'recent', 'unread', 'users', 'notifications']; + var translated = ['', 'recent', 'unread', 'users', 'notifications', 'popular', 'tags']; if (translated.indexOf(urlFragment) !== -1) { if (!urlFragment.length) { urlFragment = 'home'; @@ -60,7 +60,7 @@ module.exports = function(Meta) { } else if (tests.isTag.test(urlFragment)) { var tag = urlFragment.match(/tags\/([\s\S]+)/)[1]; - translator.translate('[[pages:tags, ' + tag + ']]', language, function(translated) { + translator.translate('[[pages:tag, ' + tag + ']]', language, function(translated) { callback(null, translated); }); } else if (tests.isUserPage.test(urlFragment)) { From 27bab3330a0360f736abbf1328d212fda8ce036e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 31 Mar 2015 22:59:34 -0400 Subject: [PATCH 012/295] pass data to getCategoryTopics, renamed end to stop --- src/categories.js | 13 +++---------- src/controllers/categories.js | 4 ++-- src/routes/feeds.js | 2 +- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/categories.js b/src/categories.js index 3061ef8425..c57013f47f 100644 --- a/src/categories.js +++ b/src/categories.js @@ -38,14 +38,7 @@ var async = require('async'), async.parallel({ topics: function(next) { - Categories.getCategoryTopics({ - cid: data.cid, - set: data.set, - reverse: data.reverse, - start: data.start, - stop: data.end, - uid: data.uid - }, next); + Categories.getCategoryTopics(data, next); }, pageCount: function(next) { Categories.getPageCount(data.cid, data.uid, next); @@ -65,7 +58,7 @@ var async = require('async'), plugins.fireHook('filter:category.get', {category: category, uid: data.uid}, function(err, data) { callback(err, data ? data.category : null); - }); + }); }); }); }; @@ -120,7 +113,7 @@ var async = require('async'), }, function(cids, next) { Categories.getCategories(cids, uid, next); - } + } ], callback); }; diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 55c0122705..c0f99655c4 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -232,14 +232,14 @@ categoriesController.get = function(req, res, next) { } var start = (page - 1) * settings.topicsPerPage + topicIndex, - end = start + settings.topicsPerPage - 1; + stop = start + settings.topicsPerPage - 1; next(null, { cid: cid, set: set, reverse: reverse, start: start, - end: end, + stop: stop, uid: uid }); }, diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 86d9cbb82d..d58c68326d 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -128,7 +128,7 @@ function generateForCategory(req, res, next) { set: 'cid:' + cid + ':tids', reverse: true, start: 0, - end: 25, + stop: 25, uid: uid }, function (err, categoryData) { if (err) { From 878e5482969e0b01ba4a37de1b3eeace0a39a93d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 31 Mar 2015 23:40:58 -0400 Subject: [PATCH 013/295] renamed end to stop globally fixed getting favourites for admins --- public/src/client/account/favourites.js | 1 + src/batch.js | 8 ++-- src/controllers/admin.js | 14 +++---- src/controllers/categories.js | 8 ++-- src/controllers/tags.js | 6 +-- src/controllers/topics.js | 51 +++++++++++-------------- src/groups.js | 8 ++-- src/messaging.js | 8 ++-- src/posts.js | 12 +++--- src/posts/flags.js | 22 +++++------ src/posts/recent.js | 4 +- src/posts/topics.js | 4 +- src/socket.io/admin.js | 16 ++++---- src/socket.io/categories.js | 4 +- src/socket.io/modules.js | 4 +- src/socket.io/posts.js | 22 +++++------ src/socket.io/topics.js | 26 ++++++------- src/socket.io/user.js | 34 +++++++++-------- src/topics.js | 16 ++++---- src/topics/posts.js | 10 ++--- src/topics/recent.js | 14 +++---- src/topics/suggested.js | 4 +- src/topics/tags.js | 10 ++--- src/user/admin.js | 4 +- src/user/follow.js | 12 +++--- src/user/search.js | 4 +- 26 files changed, 160 insertions(+), 166 deletions(-) diff --git a/public/src/client/account/favourites.js b/public/src/client/account/favourites.js index f73e1d4f20..1e6e77e20b 100644 --- a/public/src/client/account/favourites.js +++ b/public/src/client/account/favourites.js @@ -19,6 +19,7 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol } infinitescroll.loadMore('posts.loadMoreFavourites', { + uid: ajaxify.variables.get('theirid'), after: $('.user-favourite-posts').attr('data-nextstart') }, function(data, done) { if (data.posts && data.posts.length) { diff --git a/src/batch.js b/src/batch.js index 096c1d7147..70ccd8df01 100644 --- a/src/batch.js +++ b/src/batch.js @@ -28,7 +28,7 @@ var async = require('async'), var batch = options.batch || DEFAULT_BATCH_SIZE; var start = 0; - var end = batch; + var stop = batch; var done = false; async.whilst( @@ -36,11 +36,11 @@ var async = require('async'), return !done; }, function(next) { - db.getSortedSetRange(setKey, start, end, function(err, ids) { + db.getSortedSetRange(setKey, start, stop, function(err, ids) { if (err) { return next(err); } - if (!ids.length || options.doneIf(start, end, ids)) { + if (!ids.length || options.doneIf(start, stop, ids)) { done = true; return next(); } @@ -49,7 +49,7 @@ var async = require('async'), return next(err); } start += utils.isNumber(options.alwaysStartAt) ? options.alwaysStartAt : batch + 1; - end = start + batch; + stop = start + batch; next(); }); }); diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 24332866f9..d24a80a180 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -179,20 +179,20 @@ adminController.flags.get = function(req, res, next) { if (err) { return next(err); } - res.render('admin/manage/flags', {posts: posts, next: end + 1, byUsername: byUsername}); + res.render('admin/manage/flags', {posts: posts, next: stop + 1, byUsername: byUsername}); } var uid = req.user ? parseInt(req.user.uid, 10) : 0; var sortBy = req.query.sortBy || 'count'; var byUsername = req.query.byUsername || ''; var start = 0; - var end = 19; + var stop = 19; if (byUsername) { - posts.getUserFlags(byUsername, sortBy, uid, start, end, done); + posts.getUserFlags(byUsername, sortBy, uid, start, stop, done); } else { var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; - posts.getFlags(set, uid, start, end, done); - } + posts.getFlags(set, uid, start, stop, done); + } }; adminController.database.get = function(req, res, next) { @@ -261,7 +261,7 @@ adminController.navigation.get = function(req, res, next) { if (err) { return next(err); } - + res.render('admin/general/navigation', data); }); }; @@ -374,7 +374,7 @@ adminController.extend.rewards = function(req, res, next) { if (err) { return next(err); } - + res.render('admin/extend/rewards', data); }); }; diff --git a/src/controllers/categories.js b/src/controllers/categories.js index c0f99655c4..8104a3f897 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -18,8 +18,8 @@ var categoriesController = {}, categoriesController.recent = function(req, res, next) { var uid = req.user ? req.user.uid : 0; - var end = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; - topics.getTopicsFromSet('topics:recent', uid, 0, end, function(err, data) { + var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + topics.getTopicsFromSet('topics:recent', uid, 0, stop, function(err, data) { if (err) { return next(err); } @@ -72,8 +72,8 @@ categoriesController.popular = function(req, res, next) { categoriesController.unread = function(req, res, next) { var uid = req.user ? req.user.uid : 0; - var end = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; - topics.getUnreadTopics(uid, 0, end, function (err, data) { + var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + topics.getUnreadTopics(uid, 0, stop, function (err, data) { if (err) { return next(err); } diff --git a/src/controllers/tags.js b/src/controllers/tags.js index 3d450e06a7..0e0bb2372d 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -11,9 +11,9 @@ var tagsController = {}, tagsController.getTag = function(req, res, next) { var tag = validator.escape(req.params.tag); var uid = req.user ? req.user.uid : 0; - var end = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; + var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; - topics.getTagTids(tag, 0, end, function(err, tids) { + topics.getTagTids(tag, 0, stop, function(err, tids) { if (err) { return next(err); } @@ -45,7 +45,7 @@ tagsController.getTag = function(req, res, next) { var data = { topics: topics, tag: tag, - nextStart: end + 1, + nextStart: stop + 1, breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]) }; res.render('tag', data); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 8429e19396..5fb4e31b36 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -106,9 +106,9 @@ topicsController.get = function(req, res, next) { } var start = (page - 1) * settings.postsPerPage + postIndex, - end = start + settings.postsPerPage - 1; + stop = start + settings.postsPerPage - 1; - topics.getTopicWithPosts(tid, set, uid, start, end, reverse, function (err, topicData) { + topics.getTopicWithPosts(tid, set, uid, start, stop, reverse, function (err, topicData) { if (err && err.message === '[[error:no-topic]]' && !topicData) { return helpers.notFound(req, res); } @@ -255,7 +255,7 @@ topicsController.get = function(req, res, next) { data['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; data['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; data['feeds:disableRSS'] = parseInt(meta.config['feeds:disableRSS'], 10) === 1; - data['rssFeedUrl'] = nconf.get('relative_path') + '/topic/' + data.tid + '.rss'; + data.rssFeedUrl = nconf.get('relative_path') + '/topic/' + data.tid + '.rss'; data.pagination = pagination.create(data.currentPage, data.pageCount); data.pagination.rel.forEach(function(rel) { res.locals.linkTags.push(rel); @@ -280,36 +280,31 @@ topicsController.teaser = function(req, res, next) { return next(new Error('[[error:invalid-tid]]')); } - privileges.topics.can('read', tid, uid, function(err, canRead) { - if (err) { - return next(err); - } - - if (!canRead) { - return res.status(403).json('[[error:no-privileges]]'); - } - - topics.getLatestUndeletedPid(tid, function(err, pid) { - if (err) { - return next(err); + async.waterfall([ + function(next) { + privileges.topics.can('read', tid, uid, next); + }, + function(canRead, next) { + if (!canRead) { + return res.status(403).json('[[error:no-privileges]]'); } - + topics.getLatestUndeletedPid(tid, next); + }, + function(pid, next) { if (!pid) { return res.status(404).json('not-found'); } + posts.getPostSummaryByPids([pid], uid, {stripTags: false}, next); + } + ], function(err, posts) { + if (err) { + return next(err); + } - posts.getPostSummaryByPids([pid], uid, {stripTags: false}, function(err, posts) { - if (err) { - return next(err); - } - - if (!Array.isArray(posts) || !posts.length) { - return res.status(404).json('not-found'); - } - - res.json(posts[0]); - }); - }); + if (!Array.isArray(posts) || !posts.length) { + return res.status(404).json('not-found'); + } + res.json(posts[0]); }); }; diff --git a/src/groups.js b/src/groups.js index c2257c9935..90053643d3 100644 --- a/src/groups.js +++ b/src/groups.js @@ -93,8 +93,8 @@ var async = require('async'), }); }; - Groups.getGroups = function(start, end, callback) { - db.getSortedSetRevRange('groups:createtime', start, end, callback); + Groups.getGroups = function(start, stop, callback) { + db.getSortedSetRevRange('groups:createtime', start, stop, callback); }; Groups.get = function(groupName, options, callback) { @@ -315,8 +315,8 @@ var async = require('async'), }); }; - Groups.getMembers = function(groupName, start, end, callback) { - db.getSortedSetRevRange('group:' + groupName + ':members', start, end, callback); + Groups.getMembers = function(groupName, start, stop, callback) { + db.getSortedSetRevRange('group:' + groupName + ':members', start, stop, callback); }; Groups.getMembersOfGroups = function(groupNames, callback) { diff --git a/src/messaging.js b/src/messaging.js index 4a367fbd38..33ec97f9b4 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -225,10 +225,10 @@ var db = require('./database'), db.sortedSetAdd('uid:' + uid + ':chats', Date.now(), toUid, callback); }; - Messaging.getRecentChats = function(uid, start, end, callback) { + Messaging.getRecentChats = function(uid, start, stop, callback) { var websockets = require('./socket.io'); - db.getSortedSetRevRange('uid:' + uid + ':chats', start, end, function(err, uids) { + db.getSortedSetRevRange('uid:' + uid + ':chats', start, stop, function(err, uids) { if (err) { return callback(err); } @@ -250,7 +250,7 @@ var db = require('./database'), }); if (!results.users.length) { - return callback(null, {users: [], nextStart: end + 1}); + return callback(null, {users: [], nextStart: stop + 1}); } results.users.forEach(function(user, index) { @@ -260,7 +260,7 @@ var db = require('./database'), } }); - callback(null, {users: results.users, nextStart: end + 1}); + callback(null, {users: results.users, nextStart: stop + 1}); }); }); }; diff --git a/src/posts.js b/src/posts.js index 53931d75f7..e81863e44d 100644 --- a/src/posts.js +++ b/src/posts.js @@ -26,11 +26,11 @@ var async = require('async'), db.isSortedSetMember('posts:pid', pid, callback); }; - Posts.getPidsFromSet = function(set, start, end, reverse, callback) { - if (isNaN(start) || isNaN(end)) { + Posts.getPidsFromSet = function(set, start, stop, reverse, callback) { + if (isNaN(start) || isNaN(stop)) { return callback(null, []); } - db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, end, callback); + db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, stop, callback); }; Posts.getPostsByPids = function(pids, uid, callback) { @@ -73,10 +73,10 @@ var async = require('async'), }); }; - Posts.getPostsFromSet = function(set, uid, start, end, callback) { + Posts.getPostsFromSet = function(set, uid, start, stop, callback) { async.waterfall([ function(next) { - db.getSortedSetRevRange(set, start, end, next); + db.getSortedSetRevRange(set, start, stop, next); }, function(pids, next) { privileges.posts.filter('read', pids, uid, next); @@ -85,7 +85,7 @@ var async = require('async'), Posts.getPostSummaryByPids(pids, uid, {stripTags: false}, next); }, function(posts, next) { - next(null, {posts: posts, nextStart: end + 1}); + next(null, {posts: posts, nextStart: stop + 1}); } ], callback); }; diff --git a/src/posts/flags.js b/src/posts/flags.js index 388b707d3d..cbfa1f832c 100644 --- a/src/posts/flags.js +++ b/src/posts/flags.js @@ -38,17 +38,17 @@ module.exports = function(Posts) { }, function(next) { if (parseInt(post.uid, 10)) { - db.sortedSetAdd('uid:' + post.uid + ':flag:pids', now, post.pid, next); + db.sortedSetAdd('uid:' + post.uid + ':flag:pids', now, post.pid, next); } else { next(); - } + } }, function(next) { if (parseInt(post.uid, 10)) { db.setAdd('uid:' + post.uid + ':flagged_by', uid, next); } else { next(); - } + } } ], function(err, results) { callback(err); @@ -69,8 +69,8 @@ module.exports = function(Posts) { } db.sortedSetsRemove([ - 'posts:flagged', - 'posts:flags:count', + 'posts:flagged', + 'posts:flags:count', 'uid:' + uid + ':flag:pids' ], pid, next); }); @@ -80,7 +80,7 @@ module.exports = function(Posts) { }, function(next) { db.delete('pid:' + pid + ':flag:uids', next); - } + } ], function(err, results) { callback(err); }); @@ -90,8 +90,8 @@ module.exports = function(Posts) { db.delete('posts:flagged', callback); }; - Posts.getFlags = function(set, uid, start, end, callback) { - db.getSortedSetRevRange(set, start, end, function(err, pids) { + Posts.getFlags = function(set, uid, start, stop, callback) { + db.getSortedSetRevRange(set, start, stop, function(err, pids) { if (err) { return callback(err); } @@ -100,7 +100,7 @@ module.exports = function(Posts) { }); }; - Posts.getUserFlags = function(byUsername, sortBy, callerUID, start, end, callback) { + Posts.getUserFlags = function(byUsername, sortBy, callerUID, start, stop, callback) { async.waterfall([ function(next) { user.getUidByUsername(byUsername, next); @@ -108,7 +108,7 @@ module.exports = function(Posts) { function(uid, next) { if (!uid) { return next(null, []); - } + } db.getSortedSetRevRange('uid:' + uid + ':flag:pids', 0, -1, next); }, function(pids, next) { @@ -120,7 +120,7 @@ module.exports = function(Posts) { return b.flags - a.flags; }); } - next(null, posts.slice(start, end)); + next(null, posts.slice(start, stop)); } ], callback); }; diff --git a/src/posts/recent.js b/src/posts/recent.js index d41ef5342e..f7d588acff 100644 --- a/src/posts/recent.js +++ b/src/posts/recent.js @@ -33,10 +33,10 @@ module.exports = function(Posts) { ], callback); }; - Posts.getRecentPosterUids = function(start, end, callback) { + Posts.getRecentPosterUids = function(start, stop, callback) { async.waterfall([ function(next) { - db.getSortedSetRevRange('posts:pid', start, end, next); + db.getSortedSetRevRange('posts:pid', start, stop, next); }, function(pids, next) { Posts.getPostsFields(pids, ['uid'], next); diff --git a/src/posts/topics.js b/src/posts/topics.js index 75577d2925..4e9f1f7213 100644 --- a/src/posts/topics.js +++ b/src/posts/topics.js @@ -6,8 +6,8 @@ var async = require('async'), module.exports = function(Posts) { - Posts.getPostsByTid = function(tid, set, start, end, uid, reverse, callback) { - Posts.getPidsFromSet(set, start, end, reverse, function(err, pids) { + Posts.getPostsByTid = function(tid, set, start, stop, uid, reverse, callback) { + Posts.getPidsFromSet(set, start, stop, reverse, function(err, pids) { if (err) { return callback(err); } diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 6b61d523f3..ecf63997e5 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -304,12 +304,12 @@ SocketAdmin.getMoreEvents = function(socket, next, callback) { if (start < 0) { return callback(null, {data: [], next: next}); } - var end = start + 10; - events.getEvents(start, end, function(err, events) { + var stop = start + 10; + events.getEvents(start, stop, function(err, events) { if (err) { return callback(err); } - callback(null, {events: events, next: end + 1}); + callback(null, {events: events, next: stop + 1}); }); }; @@ -336,15 +336,15 @@ SocketAdmin.getMoreFlags = function(socket, data, callback) { var sortBy = data.sortBy || 'count'; var byUsername = data.byUsername || ''; var start = parseInt(data.after, 10); - var end = start + 19; + var stop = start + 19; if (byUsername) { - posts.getUserFlags(byUsername, sortBy, socket.uid, start, end, function(err, posts) { - callback(err, {posts: posts, next: end + 1}); + posts.getUserFlags(byUsername, sortBy, socket.uid, start, stop, function(err, posts) { + callback(err, {posts: posts, next: stop + 1}); }); } else { var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; - posts.getFlags(set, socket.uid, start, end, function(err, posts) { - callback(err, {posts: posts, next: end + 1}); + posts.getFlags(set, socket.uid, start, stop, function(err, posts) { + callback(err, {posts: posts, next: stop + 1}); }); } }; diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index d98cb0c21f..8ed8881f68 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -58,7 +58,7 @@ SocketCategories.loadMore = function(socket, data, callback) { } var start = parseInt(data.after, 10), - end = start + results.settings.topicsPerPage - 1; + stop = start + results.settings.topicsPerPage - 1; if (results.targetUid) { set = 'cid:' + data.cid + ':uid:' + results.targetUid + ':tids'; @@ -69,7 +69,7 @@ SocketCategories.loadMore = function(socket, data, callback) { set: set, reverse: reverse, start: start, - stop: end, + stop: stop, uid: socket.uid, targetUid: results.targetUid }, function(err, data) { diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 2825b28656..8745efc72a 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -249,9 +249,9 @@ SocketModules.chats.getRecentChats = function(socket, data, callback) { return callback(new Error('[[error:invalid-data]]')); } var start = parseInt(data.after, 10), - end = start + 9; + stop = start + 9; - Messaging.getRecentChats(socket.uid, start, end, callback); + Messaging.getRecentChats(socket.uid, start, stop, callback); }; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 2fdf4425b5..21825fec07 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -511,27 +511,23 @@ SocketPosts.flag = function(socket, pid, callback) { }; SocketPosts.loadMoreFavourites = function(socket, data, callback) { - if(!data || !data.after) { - return callback(new Error('[[error:invalid-data]]')); - } - - var start = parseInt(data.after, 10), - end = start + 9; - - posts.getPostsFromSet('uid:' + socket.uid + ':favourites', socket.uid, start, end, callback); + loadMorePosts('uid:' + data.uid + ':favourites', socket.uid, data, callback); }; SocketPosts.loadMoreUserPosts = function(socket, data, callback) { - if(!data || !data.uid || !utils.isNumber(data.after)) { + loadMorePosts('uid:' + data.uid + ':posts', socket.uid, data, callback); +}; + +function loadMorePosts(set, uid, data, callback) { + if (!data || !utils.isNumber(data.uid) || !utils.isNumber(data.after)) { return callback(new Error('[[error:invalid-data]]')); } var start = Math.max(0, parseInt(data.after, 10)), - end = start + 9; - - posts.getPostsFromSet('uid:' + data.uid + ':posts', socket.uid, start, end, callback); -}; + stop = start + 9; + posts.getPostsFromSet(set, uid, start, stop, callback); +} SocketPosts.getRecentPosts = function(socket, data, callback) { if(!data || !data.count) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index c270082953..61ea05269f 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -470,11 +470,11 @@ SocketTopics.loadMore = function(socket, data, callback) { } } - var end = start + results.settings.postsPerPage - 1; + var stop = start + results.settings.postsPerPage - 1; async.parallel({ posts: function(next) { - topics.getTopicPosts(data.tid, set, start, end, socket.uid, reverse, next); + topics.getTopicPosts(data.tid, set, start, stop, socket.uid, reverse, next); }, privileges: function(next) { next(null, results.privileges); @@ -490,33 +490,33 @@ SocketTopics.loadMore = function(socket, data, callback) { }; SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) { - if(!data || !data.after) { + if (!data || !data.after) { return callback(new Error('[[error:invalid-data]]')); } var start = parseInt(data.after, 10), - end = start + 9; + stop = start + 9; - topics.getUnreadTopics(socket.uid, start, end, callback); + topics.getUnreadTopics(socket.uid, start, stop, callback); }; SocketTopics.loadMoreFromSet = function(socket, data, callback) { - if(!data || !data.after || !data.set) { + if (!data || !data.after || !data.set) { return callback(new Error('[[error:invalid-data]]')); } var start = parseInt(data.after, 10), - end = start + 9; + stop = start + 9; - topics.getTopicsFromSet(data.set, socket.uid, start, end, callback); + topics.getTopicsFromSet(data.set, socket.uid, start, stop, callback); }; SocketTopics.loadTopics = function(socket, data, callback) { - if(!data || !data.set || !utils.isNumber(data.start) || !utils.isNumber(data.end)) { + if (!data || !data.set || !utils.isNumber(data.start) || !utils.isNumber(data.stop)) { return callback(new Error('[[error:invalid-data]]')); } - topics.getTopicsFromSet(data.set, socket.uid, data.start, data.end, callback); + topics.getTopicsFromSet(data.set, socket.uid, data.start, data.stop, callback); }; SocketTopics.getPageCount = function(socket, tid, callback) { @@ -544,14 +544,14 @@ SocketTopics.loadMoreTags = function(socket, data, callback) { } var start = parseInt(data.after, 10), - end = start + 99; + stop = start + 99; - topics.getTags(start, end, function(err, tags) { + topics.getTags(start, stop, function(err, tags) { if (err) { return callback(err); } - callback(null, {tags: tags, nextStart: end + 1}); + callback(null, {tags: tags, nextStart: stop + 1}); }); }; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 807666ff18..5b4db66495 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -397,7 +397,7 @@ SocketUser.getUnreadChatCount = function(socket, data, callback) { }; SocketUser.loadMore = function(socket, data, callback) { - if(!data || !data.set || parseInt(data.after, 10) < 0) { + if (!data || !data.set || parseInt(data.after, 10) < 0) { return callback(new Error('[[error:invalid-data]]')); } @@ -406,28 +406,30 @@ SocketUser.loadMore = function(socket, data, callback) { } var start = parseInt(data.after, 10), - end = start + 19; + stop = start + 19; - user.getUsersFromSet(data.set, socket.uid, start, end, function(err, userData) { + async.parallel({ + isAdmin: function(next) { + user.isAdministrator(socket.uid, next); + }, + users: function(next) { + user.getUsersFromSet(data.set, socket.uid, start, stop, next); + } + }, function(err, results) { if (err) { return callback(err); } - user.isAdministrator(socket.uid, function (err, isAdministrator) { - if (err) { - return callback(err); - } - - if (!isAdministrator && data.set === 'users:online') { - userData = userData.filter(function(item) { - return item.status !== 'offline'; - }); - } - callback(null, { - users: userData, - nextStart: end + 1 + if (!results.isAdmin && data.set === 'users:online') { + results.users = results.users.filter(function(user) { + return user.status !== 'offline'; }); + } + + callback(null, { + users: results.users, + nextStart: stop + 1 }); }); }; diff --git a/src/topics.js b/src/topics.js index 0cc153e85e..f4a1918397 100644 --- a/src/topics.js +++ b/src/topics.js @@ -112,16 +112,16 @@ var async = require('async'), }); }; - Topics.getTopicsFromSet = function(set, uid, start, end, callback) { + Topics.getTopicsFromSet = function(set, uid, start, stop, callback) { async.waterfall([ function(next) { - db.getSortedSetRevRange(set, start, end, next); + db.getSortedSetRevRange(set, start, stop, next); }, function(tids, next) { Topics.getTopics(tids, uid, next); }, function(topics, next) { - next(null, {topics: topics, nextStart: end + 1}); + next(null, {topics: topics, nextStart: stop + 1}); } ], callback); }; @@ -209,14 +209,14 @@ var async = require('async'), }); }; - Topics.getTopicWithPosts = function(tid, set, uid, start, end, reverse, callback) { + Topics.getTopicWithPosts = function(tid, set, uid, start, stop, reverse, callback) { Topics.getTopicData(tid, function(err, topicData) { if (err || !topicData) { return callback(err || new Error('[[error:no-topic]]')); } async.parallel({ - posts: async.apply(getMainPostAndReplies, topicData, set, uid, start, end, reverse), + posts: async.apply(getMainPostAndReplies, topicData, set, uid, start, stop, reverse), category: async.apply(Topics.getCategoryData, tid), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), tags: async.apply(Topics.getTopicTagsObjects, tid), @@ -244,10 +244,10 @@ var async = require('async'), }); }; - function getMainPostAndReplies(topic, set, uid, start, end, reverse, callback) { + function getMainPostAndReplies(topic, set, uid, start, stop, reverse, callback) { async.waterfall([ function(next) { - posts.getPidsFromSet(set, start, end, reverse, next); + posts.getPidsFromSet(set, start, stop, reverse, next); }, function(pids, next) { if ((!Array.isArray(pids) || !pids.length) && !topic.mainPid) { @@ -268,7 +268,7 @@ var async = require('async'), posts[0].index = 0; } - var indices = Topics.calculatePostIndices(start, end, topic.postcount, reverse); + var indices = Topics.calculatePostIndices(start, stop, topic.postcount, reverse); for (var i=1; i b; }); - + plugins.fireHook('filter:tags.search', {data: data, matches: matches}, function(err, data) { callback(err, data ? data.matches : []); }); diff --git a/src/user/admin.js b/src/user/admin.js index 4693fe539d..4d559fcb34 100644 --- a/src/user/admin.js +++ b/src/user/admin.js @@ -15,8 +15,8 @@ module.exports = function(User) { } }; - User.getIPs = function(uid, end, callback) { - db.getSortedSetRevRange('uid:' + uid + ':ip', 0, end, function(err, ips) { + User.getIPs = function(uid, stop, callback) { + db.getSortedSetRevRange('uid:' + uid + ':ip', 0, stop, function(err, ips) { if(err) { return callback(err); } diff --git a/src/user/follow.js b/src/user/follow.js index b7bda96903..fc776bcef8 100644 --- a/src/user/follow.js +++ b/src/user/follow.js @@ -53,20 +53,20 @@ module.exports = function(User) { }); } - User.getFollowing = function(uid, start, end, callback) { - getFollow(uid, 'following:' + uid, start, end, callback); + User.getFollowing = function(uid, start, stop, callback) { + getFollow(uid, 'following:' + uid, start, stop, callback); }; - User.getFollowers = function(uid, start, end, callback) { - getFollow(uid, 'followers:' + uid, start, end, callback); + User.getFollowers = function(uid, start, stop, callback) { + getFollow(uid, 'followers:' + uid, start, stop, callback); }; - function getFollow(uid, set, start, end, callback) { + function getFollow(uid, set, start, stop, callback) { if (!parseInt(uid, 10)) { return callback(null, []); } - db.getSortedSetRevRange(set, start, end, function(err, uids) { + db.getSortedSetRevRange(set, start, stop, function(err, uids) { if (err) { return callback(err); } diff --git a/src/user/search.js b/src/user/search.js index 7545a6d3f3..08b2ebefa3 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -59,14 +59,14 @@ module.exports = function(User) { User.paginate = function(page, data) { var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; var start = Math.max(0, page - 1) * resultsPerPage; - var end = start + resultsPerPage; + var stop = start + resultsPerPage; var pageCount = Math.ceil(data.length / resultsPerPage); var currentPage = Math.max(1, Math.ceil((start + 1) / resultsPerPage)); return { pagination: pagination.create(currentPage, pageCount), - data: data.slice(start, end) + data: data.slice(start, stop) }; }; From 2fd4bcde3f3a1d6abe3022bb7c8d95deb641fcf1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Apr 2015 00:23:57 -0400 Subject: [PATCH 014/295] added req.uid user id for logged in users, 0 for guests --- src/controllers/accounts.js | 43 ++++++++++++++-------------------- src/controllers/admin.js | 11 ++++----- src/controllers/admin/users.js | 5 ++-- src/controllers/api.js | 3 +-- src/controllers/categories.js | 35 +++++++++++---------------- src/controllers/groups.js | 19 +++++++-------- src/controllers/helpers.js | 8 +++---- src/controllers/posts.js | 5 ++-- src/controllers/search.js | 5 ++-- src/controllers/tags.js | 3 +-- src/controllers/topics.js | 12 ++++------ src/controllers/users.js | 14 ++++------- src/middleware/admin.js | 6 ++--- src/middleware/middleware.js | 22 +++++++---------- src/routes/api.js | 6 ++--- src/routes/authentication.js | 5 ++++ src/routes/feeds.js | 25 +++++++------------- 17 files changed, 93 insertions(+), 134 deletions(-) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 51cc3daf82..3f5d23653a 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -120,8 +120,7 @@ accountsController.getUserByUID = function(req, res, next) { }; accountsController.getAccount = function(req, res, next) { - var lowercaseSlug = req.params.userslug.toLowerCase(), - callerUID = req.user ? parseInt(req.user.uid, 10) : 0; + var lowercaseSlug = req.params.userslug.toLowerCase(); if (req.params.userslug !== lowercaseSlug) { if (res.locals.isAPI) { @@ -131,7 +130,7 @@ accountsController.getAccount = function(req, res, next) { } } - getUserDataByUserSlug(req.params.userslug, callerUID, function (err, userData) { + getUserDataByUserSlug(req.params.userslug, req.uid, function (err, userData) { if (err) { return next(err); } @@ -140,19 +139,19 @@ accountsController.getAccount = function(req, res, next) { return helpers.notFound(req, res); } - if (callerUID !== parseInt(userData.uid, 10)) { + if (req.uid !== parseInt(userData.uid, 10)) { user.incrementUserFieldBy(userData.uid, 'profileviews', 1); } async.parallel({ isFollowing: function(next) { - user.isFollowing(callerUID, userData.theirid, next); + user.isFollowing(req.uid, userData.theirid, next); }, posts: function(next) { - posts.getPostsFromSet('uid:' + userData.theirid + ':posts', callerUID, 0, 9, next); + posts.getPostsFromSet('uid:' + userData.theirid + ':posts', req.uid, 0, 9, next); }, signature: function(next) { - postTools.parseSignature(userData, callerUID, next); + postTools.parseSignature(userData, req.uid, next); } }, function(err, results) { if(err) { @@ -170,7 +169,7 @@ accountsController.getAccount = function(req, res, next) { userData.profileviews = 1; } - plugins.fireHook('filter:user.account', {userData: userData, uid: callerUID}, function(err, data) { + plugins.fireHook('filter:user.account', {userData: userData, uid: req.uid}, function(err, data) { if (err) { return next(err); } @@ -189,12 +188,11 @@ accountsController.getFollowers = function(req, res, next) { }; function getFollow(tpl, name, req, res, next) { - var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; var userData; async.waterfall([ function(next) { - getUserDataByUserSlug(req.params.userslug, callerUID, next); + getUserDataByUserSlug(req.params.userslug, req.uid, next); }, function(data, next) { userData = data; @@ -205,7 +203,7 @@ function getFollow(tpl, name, req, res, next) { user[method](userData.uid, 0, 49, next); } ], function(err, users) { - if(err) { + if (err) { return next(err); } @@ -233,9 +231,7 @@ accountsController.getTopics = function(req, res, next) { }; accountsController.getGroups = function(req, res, next) { - var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; - - accountsController.getBaseUser(req.params.userslug, callerUID, function(err, userData) { + accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) { if (err) { return next(err); } @@ -257,9 +253,7 @@ accountsController.getGroups = function(req, res, next) { }; function getFromUserSet(tpl, set, method, type, req, res, next) { - var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; - - accountsController.getBaseUser(req.params.userslug, callerUID, function(err, userData) { + accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) { if (err) { return next(err); } @@ -268,7 +262,7 @@ function getFromUserSet(tpl, set, method, type, req, res, next) { return helpers.notFound(req, res); } - method('uid:' + userData.uid + ':' + set, callerUID, 0, 19, function(err, data) { + method('uid:' + userData.uid + ':' + set, req.uid, 0, 19, function(err, data) { if (err) { return next(err); } @@ -317,11 +311,10 @@ accountsController.getBaseUser = function(userslug, callerUID, callback) { }; accountsController.accountEdit = function(req, res, next) { - var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; var userData; async.waterfall([ function(next) { - getUserDataByUserSlug(req.params.userslug, callerUID, next); + getUserDataByUserSlug(req.params.userslug, req.uid, next); }, function(data, next) { userData = data; @@ -339,9 +332,7 @@ accountsController.accountEdit = function(req, res, next) { }; accountsController.accountSettings = function(req, res, next) { - var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; - - accountsController.getBaseUser(req.params.userslug, callerUID, function(err, userData) { + accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) { if (err) { return next(err); } @@ -380,7 +371,7 @@ accountsController.uploadPicture = function (req, res, next) { var userPhoto = req.files.files[0]; var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; var extension = path.extname(userPhoto.name); - var updateUid = req.user ? req.user.uid : 0; + var updateUid = req.uid; var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; @@ -412,7 +403,7 @@ accountsController.uploadPicture = function (req, res, next) { return next(); } - user.isAdministrator(req.user.uid, function(err, isAdmin) { + user.isAdministrator(req.uid, function(err, isAdmin) { if (err) { return next(err); } @@ -471,7 +462,7 @@ accountsController.uploadPicture = function (req, res, next) { }; accountsController.getNotifications = function(req, res, next) { - user.notifications.getAll(req.user.uid, 40, function(err, notifications) { + user.notifications.getAll(req.uid, 40, function(err, notifications) { if (err) { return next(err); } diff --git a/src/controllers/admin.js b/src/controllers/admin.js index d24a80a180..db88ae96ea 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -144,11 +144,10 @@ adminController.categories.get = function(req, res, next) { }; adminController.categories.getAll = function(req, res, next) { - var uid = req.user ? parseInt(req.user.uid, 10) : 0, - active = [], + var active = [], disabled = []; - categories.getAllCategories(uid, function (err, categoryData) { + categories.getAllCategories(req.uid, function (err, categoryData) { if (err) { return next(err); } @@ -181,17 +180,17 @@ adminController.flags.get = function(req, res, next) { } res.render('admin/manage/flags', {posts: posts, next: stop + 1, byUsername: byUsername}); } - var uid = req.user ? parseInt(req.user.uid, 10) : 0; + var sortBy = req.query.sortBy || 'count'; var byUsername = req.query.byUsername || ''; var start = 0; var stop = 19; if (byUsername) { - posts.getUserFlags(byUsername, sortBy, uid, start, stop, done); + posts.getUserFlags(byUsername, sortBy, req.uid, start, stop, done); } else { var set = sortBy === 'count' ? 'posts:flags:count' : 'posts:flagged'; - posts.getFlags(set, uid, start, stop, done); + posts.getFlags(set, req.uid, start, stop, done); } }; diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 283302b48e..7f884b79ce 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -31,8 +31,7 @@ usersController.banned = function(req, res, next) { }; function getUsers(set, req, res, next) { - var uid = req.user ? parseInt(req.user.uid, 10) : 0; - user.getUsersFromSet(set, uid, 0, 49, function(err, users) { + user.getUsersFromSet(set, req.uid, 0, 49, function(err, users) { if (err) { return next(err); } @@ -45,7 +44,7 @@ function getUsers(set, req, res, next) { search_display: 'hidden', loadmore_display: 'block', users: users, - yourid: req.user.uid, + yourid: req.uid, requireEmailConfirmation: parseInt(meta.config.requireEmailConfirmation, 10) === 1 }); }); diff --git a/src/controllers/api.js b/src/controllers/api.js index 8be2211ca1..e565963816 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -98,7 +98,6 @@ apiController.getConfig = function(req, res, next) { apiController.renderWidgets = function(req, res, next) { var async = require('async'), - uid = req.user ? req.user.uid : 0, areas = { template: req.query.template, locations: req.query.locations, @@ -110,7 +109,7 @@ apiController.renderWidgets = function(req, res, next) { return res.status(200).json({}); } - widgets.render(uid, { + widgets.render(req.uid, { template: areas.template, url: areas.url, locations: areas.locations diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 8104a3f897..5d67fd828f 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -17,9 +17,8 @@ var categoriesController = {}, utils = require('../../public/src/utils'); categoriesController.recent = function(req, res, next) { - var uid = req.user ? req.user.uid : 0; var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; - topics.getTopicsFromSet('topics:recent', uid, 0, stop, function(err, data) { + topics.getTopicsFromSet('topics:recent', req.uid, 0, stop, function(err, data) { if (err) { return next(err); } @@ -34,7 +33,6 @@ categoriesController.recent = function(req, res, next) { var anonCache = {}, lastUpdateTime = 0; categoriesController.popular = function(req, res, next) { - var uid = req.user ? req.user.uid : 0; var terms = { daily: 'day', weekly: 'week', @@ -43,13 +41,13 @@ categoriesController.popular = function(req, res, next) { }; var term = terms[req.params.term] || 'day'; - if (uid === 0) { + if (!req.uid) { if (anonCache[term] && (Date.now() - lastUpdateTime) < 60 * 60 * 1000) { return res.render('popular', anonCache[term]); } } - topics.getPopular(term, uid, meta.config.topicsPerList, function(err, topics) { + topics.getPopular(term, req.uid, meta.config.topicsPerList, function(err, topics) { if (err) { return next(err); } @@ -61,7 +59,7 @@ categoriesController.popular = function(req, res, next) { breadcrumbs: helpers.buildBreadcrumbs([{text: '[[global:header.popular]]'}]) }; - if (uid === 0) { + if (!req.uid) { anonCache[term] = data; lastUpdateTime = Date.now(); } @@ -71,9 +69,8 @@ categoriesController.popular = function(req, res, next) { }; categoriesController.unread = function(req, res, next) { - var uid = req.user ? req.user.uid : 0; var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; - topics.getUnreadTopics(uid, 0, stop, function (err, data) { + topics.getUnreadTopics(req.uid, 0, stop, function (err, data) { if (err) { return next(err); } @@ -84,10 +81,8 @@ categoriesController.unread = function(req, res, next) { }; categoriesController.unreadTotal = function(req, res, next) { - var uid = req.user ? req.user.uid : 0; - - topics.getTotalUnread(uid, function (err, data) { - if(err) { + topics.getTotalUnread(req.uid, function (err, data) { + if (err) { return next(err); } @@ -122,11 +117,10 @@ categoriesController.list = function(req, res, next) { next(null); }, categories: function (next) { - var uid = req.user ? req.user.uid : 0; var categoryData; async.waterfall([ function(next) { - categories.getCategoriesByPrivilege(uid, 'find', next); + categories.getCategoriesByPrivilege(req.uid, 'find', next); }, function(_categoryData, next) { categoryData = _categoryData; @@ -143,7 +137,7 @@ categoriesController.list = function(req, res, next) { return category && !category.parent; }); - categories.getRecentTopicReplies(allCategories, uid, next); + categories.getRecentTopicReplies(allCategories, req.uid, next); } ], function(err) { next(err, categoryData); @@ -166,7 +160,6 @@ categoriesController.list = function(req, res, next) { categoriesController.get = function(req, res, next) { var cid = req.params.category_id, page = req.query.page || 1, - uid = req.user ? req.user.uid : 0, userPrivileges; if (req.params.topic_index && !utils.isNumber(req.params.topic_index)) { @@ -183,10 +176,10 @@ categoriesController.get = function(req, res, next) { categories.getCategoryFields(cid, ['slug', 'disabled', 'topic_count'], next); }, privileges: function(next) { - privileges.categories.get(cid, uid, next); + privileges.categories.get(cid, req.uid, next); }, userSettings: function(next) { - user.getSettings(uid, next); + user.getSettings(req.uid, next); } }, next); }, @@ -240,7 +233,7 @@ categoriesController.get = function(req, res, next) { reverse: reverse, start: start, stop: stop, - uid: uid + uid: req.uid }); }, function(payload, next) { @@ -276,7 +269,7 @@ categoriesController.get = function(req, res, next) { }); }, function(categoryData, next) { - categories.getRecentTopicReplies(categoryData.children, uid, function(err) { + categories.getRecentTopicReplies(categoryData.children, req.uid, function(err) { next(err, categoryData); }); }, @@ -303,7 +296,7 @@ categoriesController.get = function(req, res, next) { } ]; - if(categoryData.backgroundImage) { + if (categoryData.backgroundImage) { res.locals.metaTags.push({ name: 'og:image', content: categoryData.backgroundImage diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 7371c924e7..e3bdd500a6 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -12,7 +12,7 @@ groupsController.list = function(req, res, next) { groups.list({ truncateUserList: true, expand: true, - uid: req.user ? parseInt(req.user.uid, 10) : 0 + uid: req.uid }, function(err, groups) { if (err) { return next(err); @@ -25,12 +25,12 @@ groupsController.list = function(req, res, next) { }; groupsController.details = function(req, res, next) { - var uid = req.user ? parseInt(req.user.uid, 10) : 0; - async.waterfall([ async.apply(groups.exists, res.locals.groupName), function(exists, next) { - if (!exists) { return next(undefined, null); } + if (!exists) { + return next(undefined, null); + } // Ensure the group isn't hidden either groups.isHidden(res.locals.groupName, next); @@ -43,8 +43,8 @@ groupsController.details = function(req, res, next) { } else { // If not, only members are granted access async.parallel([ - async.apply(groups.isMember, uid, res.locals.groupName), - async.apply(groups.isInvited, uid, res.locals.groupName) + async.apply(groups.isMember, req.uid, res.locals.groupName), + async.apply(groups.isInvited, req.uid, res.locals.groupName) ], function(err, checks) { next(err, checks[0] || checks[1]); }); @@ -63,11 +63,11 @@ groupsController.details = function(req, res, next) { group: function(next) { groups.get(res.locals.groupName, { expand: true, - uid: uid + uid: req.uid }, next); }, posts: function(next) { - groups.getLatestMemberPosts(res.locals.groupName, 10, uid, next); + groups.getLatestMemberPosts(res.locals.groupName, 10, req.uid, next); } }, function(err, results) { if (err) { @@ -84,13 +84,12 @@ 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', uid, 0, 49, next); + user.getUsersFromSet('group:' + groupName + ':members', req.uid, 0, 49, next); }, ], function(err, users) { if (err) { diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 0b100aad49..8d4ccb8895 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -26,13 +26,11 @@ helpers.notFound = function(req, res, error) { }; helpers.notAllowed = function(req, res, error) { - var uid = req.user ? req.user.uid : 0; - - if (uid) { + if (req.uid) { if (res.locals.isAPI) { - res.status(403).json({path: req.path.replace(/^\/api/, ''), loggedIn: !!uid, error: error}); + res.status(403).json({path: req.path.replace(/^\/api/, ''), loggedIn: !!req.uid, error: error}); } else { - res.status(403).render('403', {path: req.path, loggedIn: !!uid, error: error}); + res.status(403).render('403', {path: req.path, loggedIn: !!req.uid, error: error}); } } else { if (res.locals.isAPI) { diff --git a/src/controllers/posts.js b/src/controllers/posts.js index e5a32e9791..a2bbfab226 100644 --- a/src/controllers/posts.js +++ b/src/controllers/posts.js @@ -1,17 +1,16 @@ "use strict"; var async = require('async'), - + posts = require('../posts'), privileges = require('../privileges'), helpers = require('./helpers'), postsController = {}; postsController.getPost = function(req, res, next) { - var uid = req.user ? parseInt(req.user.uid) : 0; async.parallel({ canRead: function(next) { - privileges.posts.can('read', req.params.pid, uid, next); + privileges.posts.can('read', req.params.pid, req.uid, next); }, postData: function(next) { posts.getPostData(req.params.pid, next); diff --git a/src/controllers/search.js b/src/controllers/search.js index 7c1d20262b..55134c7ec6 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -15,10 +15,9 @@ searchController.search = function(req, res, next) { return helpers.notFound(req, res); } - var uid = req.user ? req.user.uid : 0; var breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]); - categories.getCategoriesByPrivilege(uid, 'read', function(err, categories) { + categories.getCategoriesByPrivilege(req.uid, 'read', function(err, categories) { if (err) { return next(err); } @@ -42,7 +41,7 @@ searchController.search = function(req, res, next) { sortBy: req.query.sortBy, sortDirection: req.query.sortDirection, page: page, - uid: uid + uid: req.uid }; search.search(data, function(err, results) { diff --git a/src/controllers/tags.js b/src/controllers/tags.js index 0e0bb2372d..aba1acae60 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -10,7 +10,6 @@ var tagsController = {}, tagsController.getTag = function(req, res, next) { var tag = validator.escape(req.params.tag); - var uid = req.user ? req.user.uid : 0; var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; topics.getTagTids(tag, 0, stop, function(err, tids) { @@ -23,7 +22,7 @@ tagsController.getTag = function(req, res, next) { return res.render('tag', {topics: [], tag: tag}); } - topics.getTopics(tids, uid, function(err, topics) { + topics.getTopics(tids, req.uid, function(err, topics) { if (err) { return next(err); } diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 5fb4e31b36..7436e86c8e 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -20,7 +20,6 @@ topicsController.get = function(req, res, next) { var tid = req.params.topic_id, page = 1, sort = req.query.sort, - uid = req.user ? req.user.uid : 0, userPrivileges; if (req.params.post_index && !utils.isNumber(req.params.post_index)) { @@ -31,10 +30,10 @@ topicsController.get = function(req, res, next) { function (next) { async.parallel({ privileges: function(next) { - privileges.topics.get(tid, uid, next); + privileges.topics.get(tid, req.uid, next); }, settings: function(next) { - user.getSettings(uid, next); + user.getSettings(req.uid, next); }, topic: function(next) { topics.getTopicFields(tid, ['slug', 'postcount', 'deleted'], next); @@ -108,7 +107,7 @@ topicsController.get = function(req, res, next) { var start = (page - 1) * settings.postsPerPage + postIndex, stop = start + settings.postsPerPage - 1; - topics.getTopicWithPosts(tid, set, uid, start, stop, reverse, function (err, topicData) { + topics.getTopicWithPosts(tid, set, req.uid, start, stop, reverse, function (err, topicData) { if (err && err.message === '[[error:no-topic]]' && !topicData) { return helpers.notFound(req, res); } @@ -274,7 +273,6 @@ topicsController.get = function(req, res, next) { topicsController.teaser = function(req, res, next) { var tid = req.params.topic_id; - var uid = req.user ? parseInt(req.user.uid, 10) : 0; if (!utils.isNumber(tid)) { return next(new Error('[[error:invalid-tid]]')); @@ -282,7 +280,7 @@ topicsController.teaser = function(req, res, next) { async.waterfall([ function(next) { - privileges.topics.can('read', tid, uid, next); + privileges.topics.can('read', tid, req.uid, next); }, function(canRead, next) { if (!canRead) { @@ -294,7 +292,7 @@ topicsController.teaser = function(req, res, next) { if (!pid) { return res.status(404).json('not-found'); } - posts.getPostSummaryByPids([pid], uid, {stripTags: false}, next); + posts.getPostSummaryByPids([pid], req.uid, {stripTags: false}, next); } ], function(err, posts) { if (err) { diff --git a/src/controllers/users.js b/src/controllers/users.js index a4cb36259b..6a3e02b252 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -11,18 +11,17 @@ var async = require('async'), usersController.getOnlineUsers = function(req, res, next) { var websockets = require('../socket.io'); - var uid = req.user ? req.user.uid : 0; async.parallel({ users: function(next) { - user.getUsersFromSet('users:online', uid, 0, 49, next); + user.getUsersFromSet('users:online', req.uid, 0, 49, next); }, count: function(next) { var now = Date.now(); db.sortedSetCount('users:online', now - 300000, now, next); }, isAdministrator: function(next) { - user.isAdministrator(uid, next); + user.isAdministrator(req.uid, next); } }, function(err, results) { if (err) { @@ -62,9 +61,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, uid, count, function(err, data) { + getUsersAndCount(set, req.uid, count, function(err, data) { if (err) { return next(err); } @@ -102,10 +99,9 @@ function getUsersAndCount(set, uid, count, callback) { } usersController.getUsersForSearch = function(req, res, next) { - var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20, - uid = req.user ? req.user.uid : 0; + var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20; - getUsersAndCount('users:joindate', uid, resultsPerPage, function(err, data) { + getUsersAndCount('users:joindate', req.uid, resultsPerPage, function(err, data) { if (err) { return next(err); } diff --git a/src/middleware/admin.js b/src/middleware/admin.js index 1d6c0dae6a..5b3f4c186d 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -53,19 +53,17 @@ middleware.buildHeader = function(req, res, next) { }; middleware.renderHeader = function(req, res, next) { - var uid = req.user ? req.user.uid : 0; - var custom_header = { 'plugins': [], 'authentication': [] }; - user.getUserFields(uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function(err, userData) { + user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function(err, userData) { if (err) { return next(err); } - userData.uid = uid; + userData.uid = req.uid; userData['email:confirmed'] = parseInt(userData['email:confirmed'], 10) === 1; async.parallel({ diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index cc3ae7cb5c..f542159c50 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -124,9 +124,7 @@ middleware.checkGlobalPrivacySettings = function(req, res, next) { middleware.checkAccountPermissions = function(req, res, next) { // This middleware ensures that only the requested user and admins can pass - var callerUID = req.user ? parseInt(req.user.uid, 10) : 0; - - if (callerUID === 0) { + if (!req.uid) { return controllers.helpers.notAllowed(req, res); } @@ -139,11 +137,11 @@ middleware.checkAccountPermissions = function(req, res, next) { return controllers.helpers.notFound(req, res); } - if (parseInt(uid, 10) === callerUID) { + if (parseInt(uid, 10) === req.uid) { return next(); } - user.isAdministrator(callerUID, function(err, isAdmin) { + user.isAdministrator(req.uid, function(err, isAdmin) { if (err || isAdmin) { return next(err); } @@ -201,8 +199,6 @@ middleware.buildHeader = function(req, res, next) { }; middleware.renderHeader = function(req, res, callback) { - var uid = req.user ? parseInt(req.user.uid, 10) : 0; - navigation.get(function(err, menuItems) { if (err) { return callback(err); @@ -284,8 +280,8 @@ middleware.renderHeader = function(req, res, callback) { next(null, templateValues.useCustomJS ? meta.config.customJS : ''); }, title: function(next) { - if (uid) { - user.getSettings(uid, function(err, settings) { + if (req.uid) { + user.getSettings(req.uid, function(err, settings) { if (err) { return next(err); } @@ -296,11 +292,11 @@ middleware.renderHeader = function(req, res, callback) { } }, isAdmin: function(next) { - user.isAdministrator(uid, next); + user.isAdministrator(req.uid, next); }, user: function(next) { - if (uid) { - user.getUserFields(uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next); + if (req.uid) { + user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next); } else { next(null, { username: '[[global:guest]]', @@ -527,7 +523,7 @@ middleware.exposeUid = function(req, res, next) { res.locals.uid = uid; next(); - }) + }); } else { next(); } diff --git a/src/routes/api.js b/src/routes/api.js index 88c3686850..d3a366dc5d 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -35,10 +35,8 @@ function getModerators(req, res, next) { function getRecentPosts(req, res, next) { - var uid = (req.user) ? req.user.uid : 0; - - posts.getRecentPosts(uid, 0, 19, req.params.term, function (err, data) { - if(err) { + posts.getRecentPosts(req.uid, 0, 19, req.params.term, function (err, data) { + if (err) { return next(err); } diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 6a5bc87723..eaf09f3e8b 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -23,6 +23,11 @@ app.use(passport.initialize()); app.use(passport.session()); + app.use(function(req, res, next) { + req.uid = req.user ? parseInt(req.user.uid) : 0; + next(); + }); + Auth.app = app; Auth.middleware = middleware; }; diff --git a/src/routes/feeds.js b/src/routes/feeds.js index d58c68326d..8e1da9ac7e 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -25,9 +25,7 @@ function hasCategoryPrivileges(req, res, next) { } function hasPrivileges(method, id, req, res, next) { - var uid = req.user ? req.user.uid || 0 : 0; - - method('read', id, uid, function(err, canRead) { + method('read', id, req.uid, function(err, canRead) { if (err) { return next(err); } @@ -42,14 +40,13 @@ function hasPrivileges(method, id, req, res, next) { function generateForTopic(req, res, next) { var tid = req.params.topic_id; - var uid = req.user ? req.user.uid : 0; - privileges.topics.get(tid, uid, function(err, userPrivileges) { + privileges.topics.get(tid, req.uid, function(err, userPrivileges) { if (err) { return next(err); } - topics.getTopicWithPosts(tid, 'tid:' + tid + ':posts', uid, 0, 25, false, function (err, topicData) { + topics.getTopicWithPosts(tid, 'tid:' + tid + ':posts', req.uid, 0, 25, false, function (err, topicData) { if (err) { return next(err); } @@ -122,14 +119,14 @@ function generateForUserTopics(req, res, next) { function generateForCategory(req, res, next) { var cid = req.params.category_id; - var uid = req.user ? req.user.uid : 0; + categories.getCategoryById({ cid: cid, set: 'cid:' + cid + ':tids', reverse: true, start: 0, stop: 25, - uid: uid + uid: req.uid }, function (err, categoryData) { if (err) { return next(err); @@ -159,7 +156,6 @@ function generateForRecent(req, res, next) { } function generateForPopular(req, res, next) { - var uid = req.user ? req.user.uid : 0; var terms = { daily: 'day', weekly: 'week', @@ -168,7 +164,7 @@ function generateForPopular(req, res, next) { }; var term = terms[req.params.term] || 'day'; - topics.getPopular(term, uid, 19, function(err, topics) { + topics.getPopular(term, req.uid, 19, function(err, topics) { if (err) { return next(err); } @@ -196,8 +192,7 @@ function disabledRSS(req, res, next) { } function generateForTopics(options, set, req, res, next) { - var uid = req.user ? req.user.uid : 0; - topics.getTopicsFromSet(set, uid, 0, 19, function (err, data) { + topics.getTopicsFromSet(set, req.uid, 0, 19, function (err, data) { if (err) { return next(err); } @@ -239,8 +234,7 @@ function generateTopicsFeed(feedOptions, feedTopics, callback) { } function generateForRecentPosts(req, res, next) { - var uid = req.user ? req.user.uid : 0; - posts.getRecentPosts(uid, 0, 19, 'month', function(err, posts) { + posts.getRecentPosts(req.uid, 0, 19, 'month', function(err, posts) { if (err) { return next(err); } @@ -257,7 +251,6 @@ function generateForRecentPosts(req, res, next) { } function generateForCategoryRecentPosts(req, res, next) { - var uid = req.user ? req.user.uid : 0; var cid = req.params.category_id; async.parallel({ @@ -265,7 +258,7 @@ function generateForCategoryRecentPosts(req, res, next) { categories.getCategoryData(cid, next); }, posts: function(next) { - categories.getRecentReplies(cid, uid, 20, next); + categories.getRecentReplies(cid, req.uid, 20, next); } }, function(err, results) { if (err) { From 621ae9c91ac03d99cd0a0993e19c872c53610fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Wed, 1 Apr 2015 15:11:15 +0300 Subject: [PATCH 015/295] Add admin hooks for get categories --- src/controllers/admin.js | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 24332866f9..48d8b112d2 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -135,11 +135,17 @@ adminController.categories.get = function(req, res, next) { if (err) { return next(err); } - - res.render('admin/manage/category', { - category: data.category[0], - privileges: data.privileges - }); + + plugins.fireHook('filter:admin.categories.get', {req: req, res: res, category: data.category[0], privileges: data.privileges}, function(err, data) { + if (err) { + return next(err); + } + + res.render('admin/manage/category', { + category: data.category, + privileges: data.privileges + }); + }); }); }; @@ -152,14 +158,20 @@ adminController.categories.getAll = function(req, res, next) { if (err) { return next(err); } - - categoryData.filter(Boolean).forEach(function(category) { - (category.disabled ? disabled : active).push(category); - }); - - res.render('admin/manage/categories', { - active: active, - disabled: disabled + + plugins.fireHook('filter:admin.categories.getAll', {req: req, res: res, categories: categoryData}, function(err, data) { + if (err) { + return next(err); + } + + data.categories.filter(Boolean).forEach(function(category) { + (category.disabled ? disabled : active).push(category); + }); + + res.render('admin/manage/categories', { + active: active, + disabled: disabled + }); }); }); }; From 6b3b44e2fc984e13e3049774a9594b6592c365f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Wed, 1 Apr 2015 18:22:55 +0300 Subject: [PATCH 016/295] Delete errors --- src/categories/create.js | 2 +- src/controllers/admin.js | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/categories/create.js b/src/categories/create.js index 57fb2875b9..ee752a4802 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -23,7 +23,7 @@ module.exports = function(Categories) { description: ( data.description ? data.description : '' ), icon: ( data.icon ? data.icon : '' ), bgColor: data.bgColor || colours[0], - color: ( data.color ? data.color : '' ), + color: data.color || colours[1], slug: slug, parentCid: ( data.parentCid ? data.parentCid : 0 ), topic_count: 0, diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 29fc0b185d..91e0a65972 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -136,16 +136,16 @@ adminController.categories.get = function(req, res, next) { return next(err); } - plugins.fireHook('filter:admin.categories.get', {req: req, res: res, category: data.category[0], privileges: data.privileges}, function(err, data) { + plugins.fireHook('filter:admin.category.get', {req: req, res: res, category: data.category[0], privileges: data.privileges}, function(err, data) { if (err) { return next(err); } - - res.render('admin/manage/category', { - category: data.category, - privileges: data.privileges - }); - }); + + res.render('admin/manage/category', { + category: data.category, + privileges: data.privileges + }); + }); }); }; @@ -158,19 +158,19 @@ adminController.categories.getAll = function(req, res, next) { return next(err); } - plugins.fireHook('filter:admin.categories.getAll', {req: req, res: res, categories: categoryData}, function(err, data) { + plugins.fireHook('filter:admin.categories.get', {req: req, res: res, categories: categoryData}, function(err, data) { if (err) { return next(err); } - + data.categories.filter(Boolean).forEach(function(category) { - (category.disabled ? disabled : active).push(category); - }); - - res.render('admin/manage/categories', { - active: active, - disabled: disabled - }); + (category.disabled ? disabled : active).push(category); + }); + + res.render('admin/manage/categories', { + active: active, + disabled: disabled + }); }); }); }; From ce743be779d43e7078897d9b27f221c4bde3eb5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=A1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=B5=D0=B2?= Date: Wed, 1 Apr 2015 18:25:27 +0300 Subject: [PATCH 017/295] Delete errors --- src/controllers/admin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 91e0a65972..c659c53446 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -158,15 +158,15 @@ adminController.categories.getAll = function(req, res, next) { return next(err); } - plugins.fireHook('filter:admin.categories.get', {req: req, res: res, categories: categoryData}, function(err, data) { + plugins.fireHook('filter:admin.categories.get', {req: req, res: res, categories: categoryData}, function(err, data) { if (err) { return next(err); } - + data.categories.filter(Boolean).forEach(function(category) { (category.disabled ? disabled : active).push(category); }); - + res.render('admin/manage/categories', { active: active, disabled: disabled From 7161972cc39638c07af293df288ccb945cec6b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 1 Apr 2015 11:40:20 -0400 Subject: [PATCH 018/295] up vanilla lavender versions --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 36eb5840ca..cf350935ce 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,8 @@ "nodebb-plugin-mentions": "^0.11.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", - "nodebb-theme-lavender": "^1.0.22", - "nodebb-theme-vanilla": "^1.0.80", + "nodebb-theme-lavender": "^1.0.28", + "nodebb-theme-vanilla": "^1.0.84", "nodebb-widget-essentials": "^1.0.0", "nodebb-rewards-essentials": "^0.0.1", "npm": "^2.1.4", From 4a9498e105441557d9d99453c8141c297a7edfbd Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 11:49:36 -0400 Subject: [PATCH 019/295] closes #2916 --- src/rewards/admin.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/rewards/admin.js b/src/rewards/admin.js index 30bed9e0e8..fac78bfeec 100644 --- a/src/rewards/admin.js +++ b/src/rewards/admin.js @@ -15,7 +15,7 @@ rewards.save = function(data, callback) { data.id = id; - async.waterfall([ + async.series([ function(next) { rewards.delete(data, next); }, @@ -97,7 +97,7 @@ function saveConditions(data, callback) { db.setAdd('conditions:active', conditions, callback); async.each(Object.keys(rewardsPerCondition), function(condition, next) { - db.setAdd('condition:' + condition + ':rewards', rewardsPerCondition[condition]); + db.setAdd('condition:' + condition + ':rewards', rewardsPerCondition[condition], next); }, callback); }); } @@ -114,8 +114,10 @@ function getActiveRewards(callback) { db.getObject('rewards:id:' + id + ':rewards', next); } }, function(err, data) { - data.main.rewards = data.rewards; - activeRewards.push(data.main); + if (data.main) { + data.main.rewards = data.rewards; + activeRewards.push(data.main); + } next(err); }); From ca332d23c037c72dab1e2bd8e6e20a8e322c4c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 1 Apr 2015 12:28:01 -0400 Subject: [PATCH 020/295] wait for createIndex errors --- src/database/mongo.js | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index e420f003b9..f0c45cbc12 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -40,6 +40,7 @@ module.helpers.mongo = require('./mongo/helpers'); module.init = function(callback) { + callback = callback || function() {}; try { var sessionStore; mongoClient = require('mongodb').MongoClient; @@ -85,10 +86,10 @@ db = _db; module.client = db; - + if (!nconf.get('redis')) { // TEMP: to fix connect-mongo, see https://github.com/kcbanner/connect-mongo/issues/161 - db.openCalled = true + db.openCalled = true; module.sessionStore = new sessionStore({ db: db }); @@ -119,29 +120,26 @@ } function createIndices() { - createIndex('objects', {_key: 1, score: -1}, {background:true}); - createIndex('objects', {_key: 1, value: -1}, {background:true}); - createIndex('objects', {expireAt: 1}, {expireAfterSeconds:0, background:true}); - - - createIndex('searchtopic', {content: 'text', uid: 1, cid: 1}, {background:true}); - createIndex('searchtopic', {id: 1}, {background:true}); - + async.parallel([ + async.apply(createIndex, 'objects', {_key: 1, score: -1}, {background: true}), + async.apply(createIndex, 'objects', {_key: 1, value: -1}, {background: true}), - createIndex('searchpost', {content: 'text', uid: 1, cid: 1}, {background:true}); - createIndex('searchpost', {id: 1}, {background:true}); + async.apply(createIndex, 'objects', {expireAt: 1}, {expireAfterSeconds: 0, background: true}), + async.apply(createIndex, 'searchtopic', {content: 'text', uid: 1, cid: 1}, {background: true}), + async.apply(createIndex, 'searchtopic', {id: 1}, {background: true}), - if (typeof callback === 'function') { - callback(); - } + async.apply(createIndex, 'searchpost', {content: 'text', uid: 1, cid: 1}, {background: true}), + async.apply(createIndex, 'searchpost', {id: 1}, {background: true}) + ], callback); } - function createIndex(collection, index, options) { + function createIndex(collection, index, options, callback) { db.collection(collection).ensureIndex(index, options, function(err) { if (err) { winston.error('Error creating index ' + err.message); } + callback(err); }); } }); From f734d47befbefa827871520b5f9a1127b178a189 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 12:54:09 -0400 Subject: [PATCH 021/295] closes https://github.com/NodeBB/nodebb-theme-vanilla/issues/21 and https://github.com/NodeBB/nodebb-theme-persona/issues/31 --- public/src/client/account/header.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index 6dcc0b27e4..92cc40a416 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -20,7 +20,8 @@ define('forum/account/header', function() { function selectActivePill() { $('.account-sub-links li').removeClass('active').each(function() { var href = $(this).find('a').attr('href'); - if (window.location.href.indexOf(href) !== -1) { + + if (href === window.location.pathname) { $(this).addClass('active'); return false; } From 80b308b9a697443010cfc1fb3e324ba2047c0583 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 12:56:40 -0400 Subject: [PATCH 022/295] [[user:more]] --- public/language/en_GB/user.json | 1 + 1 file changed, 1 insertion(+) diff --git a/public/language/en_GB/user.json b/public/language/en_GB/user.json index f7460a8821..7bdd569264 100644 --- a/public/language/en_GB/user.json +++ b/public/language/en_GB/user.json @@ -29,6 +29,7 @@ "chat": "Chat", "follow": "Follow", "unfollow": "Unfollow", + "more": "More", "profile_update_success": "Profile has been updated successfully!", "change_picture": "Change Picture", From 925b12ca2217264b8173905be79987901449e432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 1 Apr 2015 14:47:30 -0400 Subject: [PATCH 023/295] startsWith --- public/src/ajaxify.js | 6 +++--- public/src/client/category.js | 2 +- public/src/client/users.js | 2 +- src/routes/index.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 9f06d03cb3..57defca278 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -70,7 +70,7 @@ $(document).ready(function() { ajaxify.handleACPRedirect = function(url) { // If ajaxifying into an admin route from regular site, do a cold load. url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - if (url.indexOf('admin') === 0 && window.location.pathname.indexOf(RELATIVE_PATH + '/admin') !== 0) { + if (url.startsWith('admin') && window.location.pathname.indexOf(RELATIVE_PATH + '/admin') !== 0) { window.open(RELATIVE_PATH + '/' + url, '_blank'); return true; } @@ -79,7 +79,7 @@ $(document).ready(function() { ajaxify.handleNonAPIRoutes = function(url) { url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - if (url.indexOf('uploads') === 0) { + if (url.startsWith('uploads')) { window.open(RELATIVE_PATH + '/' + url, '_blank'); return true; } @@ -168,7 +168,7 @@ $(document).ready(function() { }; ajaxify.removeRelativePath = function(url) { - if (url.indexOf(RELATIVE_PATH.slice(1)) === 0) { + if (url.startsWith(RELATIVE_PATH.slice(1))) { url = url.slice(RELATIVE_PATH.length); } return url; diff --git a/public/src/client/category.js b/public/src/client/category.js index c74141feec..ec667a652f 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -92,7 +92,7 @@ define('forum/category', [ }; $(window).on('action:popstate', function(ev, data) { - if (data.url.indexOf('category/') === 0) { + if (data.url.startsWith('category/')) { var cid = data.url.match(/^category\/(\d+)/); if (cid && cid[1]) { cid = cid[1]; diff --git a/public/src/client/users.js b/public/src/client/users.js index 3e794a008a..11f1deb7bb 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -171,7 +171,7 @@ define('forum/users', ['translator'], function(translator) { function onUserStatusChange(data) { var section = getActiveSection(); - if((section.indexOf('online') === 0 || section.indexOf('users') === 0)) { + if ((section.startsWith('online') || section.startsWith('users'))) { updateUser(data); } } diff --git a/src/routes/index.js b/src/routes/index.js index 5efca3f067..862964dfbe 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -152,7 +152,7 @@ module.exports = function(app, middleware) { if (req.user || parseInt(meta.config.privateUploads, 10) !== 1) { return next(); } - if (req.path.indexOf('/uploads/files') === 0) { + if (req.path.startsWith('/uploads/files')) { return res.status(403).json('not-allowed'); } next(); From 27ad7e41c90e67e575b53fb26335d9f9fcae4f05 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 14:49:00 -0400 Subject: [PATCH 024/295] process.env is an object --- src/controllers/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 74cce358e5..ce50cc4c17 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -118,7 +118,7 @@ Controllers.register = function(req, res, next) { data.error = req.flash('error')[0]; plugins.fireHook('filter:register.build', {req: req, res: res, templateData: data}, function(err, data) { - if (err && process.env === 'development') { + if (err && global.env === 'development') { winston.warn(JSON.stringify(err)); return next(err); } From ca3e0b59b0f4a632f85bffed98c835710d19437c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 14:54:09 -0400 Subject: [PATCH 025/295] filter out illegitimate rewards --- src/rewards/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rewards/index.js b/src/rewards/index.js index fb4fc9d0e8..763a69afa8 100644 --- a/src/rewards/index.js +++ b/src/rewards/index.js @@ -76,6 +76,10 @@ function filterCompletedRewards(uid, rewards, callback) { }); rewards = rewards.filter(function(reward) { + if (!reward) { + return false; + } + var claimable = parseInt(reward.claimable, 10); if (claimable === 0) { From 458d9ab8a2be6a46cc069d2a837d6d633a9e614d Mon Sep 17 00:00:00 2001 From: CisMous Date: Thu, 2 Apr 2015 03:16:16 +0800 Subject: [PATCH 026/295] remove comma --- src/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins.js b/src/plugins.js index 3a9d1ff5fe..880265b755 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -339,7 +339,7 @@ var fs = require('fs'), winston.verbose('[plugins] Plugin libraries removed from Node.js cache'); next(); - }, + } ], next); }; From 5bb2f2bb624b410153283e0acb561cb20ca5c68f Mon Sep 17 00:00:00 2001 From: CisMous Date: Thu, 2 Apr 2015 03:16:33 +0800 Subject: [PATCH 027/295] fix type error --- install/data/categories.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/data/categories.json b/install/data/categories.json index 74b058e80f..048d995682 100644 --- a/install/data/categories.json +++ b/install/data/categories.json @@ -9,7 +9,7 @@ }, { "name": "General Discussion", - "description": "A place to talk about whateeeever you want", + "description": "A place to talk about whatever you want", "bgColor": "#59b3d0", "color": "#fff", "icon" : "fa-comments-o", From bb94c9c36b3b5b4ac366ce9f38d7e6c98b829a4d Mon Sep 17 00:00:00 2001 From: CisMous Date: Thu, 2 Apr 2015 03:17:06 +0800 Subject: [PATCH 028/295] remove unused code --- src/plugins.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/plugins.js b/src/plugins.js index 880265b755..4dee3a79d9 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -245,15 +245,6 @@ var fs = require('fs'), }); }; - function getLatestVersion(versions) { - for(var version in versions) { - if (versions.hasOwnProperty(version) && versions[version] === 'latest') { - return version; - } - } - return ''; - } - Plugins.showInstalled = function(callback) { var npmPluginPath = path.join(__dirname, '../node_modules'); From 232d1aae318ca0221c49fb8e8603cf547424ca87 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 15:22:02 -0400 Subject: [PATCH 029/295] helpers.getBookmarkFromIndex --- public/src/modules/helpers.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 04937895c5..0146a0aef1 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -93,6 +93,10 @@ return style.join(' '); }; + helpers.getBookmarkFromIndex = function(topic) { + return (topic.index || 0) + 1; + }; + // Groups helpers helpers.membershipBtn = function(groupObj) { if (groupObj.isMember) { From 5641e54192c1520a48e366d176d22e8e78573cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 1 Apr 2015 15:22:56 -0400 Subject: [PATCH 030/295] added route to /users --- src/controllers/users.js | 12 ++++-------- src/user.js | 6 ++++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/controllers/users.js b/src/controllers/users.js index 6a3e02b252..5c669d6e6d 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -34,14 +34,12 @@ usersController.getOnlineUsers = function(req, res, next) { }); } - var anonymousUserCount = websockets.getOnlineAnonCount(); - var userData = { + 'route_users:online': true, search_display: 'hidden', loadmore_display: results.count > 50 ? 'block' : 'hide', users: results.users, - anonymousUserCount: anonymousUserCount, - show_anon: anonymousUserCount ? '' : 'hide' + anonymousUserCount: websockets.getOnlineAnonCount() }; res.render('users', userData); @@ -70,10 +68,9 @@ usersController.getUsers = function(set, count, req, res, next) { search_display: 'hidden', loadmore_display: data.count > count ? 'block' : 'hide', users: data.users, - show_anon: 'hide', pagination: pagination.create(1, pageCount) }; - + userData['route_' + set] = true; res.render('users', userData); }); }; @@ -109,8 +106,7 @@ usersController.getUsersForSearch = function(req, res, next) { var userData = { search_display: 'block', loadmore_display: 'hidden', - users: data.users, - show_anon: 'hide' + users: data.users }; res.render('users', userData); diff --git a/src/user.js b/src/user.js index 86e0d904be..7ae0d17be4 100644 --- a/src/user.js +++ b/src/user.js @@ -9,7 +9,8 @@ var async = require('async'), meta = require('./meta'), topics = require('./topics'), groups = require('./groups'), - Password = require('./password'); + Password = require('./password'), + utils = require('../public/src/utils'); (function(User) { @@ -240,7 +241,7 @@ var async = require('async'), }; User.getUsers = function(uids, uid, callback) { - var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'postcount', 'reputation', 'email:confirmed']; + var fields = ['uid', 'username', 'userslug', 'picture', 'status', 'banned', 'joindate', 'postcount', 'reputation', 'email:confirmed']; plugins.fireHook('filter:users.addFields', {fields: fields}, function(err, data) { if (err) { return callback(err); @@ -268,6 +269,7 @@ var async = require('async'), return; } user.status = User.getStatus(user.status, results.isOnline[index]); + user.joindateISO = utils.toISOString(user.joindate); user.administrator = results.isAdmin[index]; user.banned = parseInt(user.banned, 10) === 1; user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1; From db1b70cccbcd1e6eefccd8d7bcd69798e171d06e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Apr 2015 15:34:26 -0400 Subject: [PATCH 031/295] updated italian language --- public/language/it/error.json | 12 ++++++------ public/language/it/groups.json | 30 +++++++++++++++--------------- public/language/it/login.json | 4 ++-- public/language/it/modules.json | 2 +- public/language/it/pages.json | 2 +- public/language/it/recent.json | 2 +- public/language/it/search.json | 14 +++++++------- public/language/it/tags.json | 2 +- public/language/it/user.json | 4 ++-- 9 files changed, 36 insertions(+), 36 deletions(-) diff --git a/public/language/it/error.json b/public/language/it/error.json index 6858916193..f67e6d6cbb 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -18,7 +18,7 @@ "username-taken": "Nome utente già preso", "email-taken": "Email già esistente", "email-not-confirmed": "La tua Email deve essere ancora confermata, per favore clicca qui per confermare la tua Email.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "Non potrai chattare finchè non avrai confermato la tua email, per favore clicca qui per farlo ora.", "no-email-to-confirm": "Questo forum richiede la conferma dell'indirizzo email, per favore clicca qui per inserirne uno", "email-confirm-failed": "Non possiamo confermare la tua email, per favore prova ancora più tardi.", "username-too-short": "Nome utente troppo corto", @@ -35,7 +35,7 @@ "no-emailers-configured": "Nessun plugin per le email è caricato, quindi la mail di test non può essere inviata", "category-disabled": "Categoria disabilitata", "topic-locked": "Discussione Bloccata", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Ti è consentito modificare un post per %1 secondi dopo averlo inviato", "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": "Per favore inserisci un post più breve. I post non possono essere più lunghi di %1 caratteri.", @@ -43,8 +43,8 @@ "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", "too-many-posts-newbie": "Come nuovo utente puoi postare solamente una volta ogni %1 secondi finché non hai raggiunto un livello di reputazione %2 - per favore attendi prima di inviare ancora", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", + "tag-too-short": "Per favore inserisci un tag più lungo. I tag dovrebbero avere almeno %1 caratteri", + "tag-too-long": "Per favore inserisci un tag più corto. I tags non dovrebbero essere più lunghi di %1 caratteri", "file-too-big": "La dimensione massima del file consentita è di % 1 kbs - si prega di caricare un file più piccolo", "cant-vote-self-post": "Non puoi votare il tuo stesso post", "already-favourited": "Hai già inserito tra i preferiti questo post", @@ -52,7 +52,7 @@ "cant-ban-other-admins": "Non puoi bannare altri amministratori!", "invalid-image-type": "Tipo dell'immagine non valido. I tipi permessi sono: %1", "invalid-image-extension": "Estensione immagine non valida", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-file-type": "Tipo di file non valido. I formati consentiti sono: %1", "group-name-too-short": "Nome del Gruppo troppo corto", "group-already-exists": "Il Gruppo esiste già", "group-name-change-not-allowed": "Il cambio di nome al Gruppo non è consentito", @@ -76,6 +76,6 @@ "reload-failed": "NodeBB ha incontrato un problema durante il ricaricamento: \"%1\". NodeBB continuerà a servire gli assets esistenti lato client, così puoi annullare quello che hai fatto prima di ricaricare.", "registration-error": "Errore nella registrazione", "parse-error": "Qualcosa è andato storto durante l'analisi della risposta proveniente dal server", - "wrong-login-type-email": "Please use your email to login", + "wrong-login-type-email": "Per favore usa la tua email per accedere", "wrong-login-type-username": "Per favore usa il tuo nome utente per accedere" } \ No newline at end of file diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 96b915d56e..2e9abbf24a 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -4,8 +4,8 @@ "owner": "Proprietario del Gruppo", "new_group": "Crea Nuovo Gruppo", "no_groups_found": "Non ci sono gruppi da vedere", - "pending.accept": "Accept", - "pending.reject": "Reject", + "pending.accept": "Accetta", + "pending.reject": "Rigetta", "cover-instructions": "Drag and Drop una fotografia, spostarla ad una posizione, e premere Salva", "cover-change": "Cambia", "cover-save": "Salva", @@ -15,20 +15,20 @@ "details.pending": "Membri in attesa", "details.has_no_posts": "I membri di questo gruppo non hanno ancora postato.", "details.latest_posts": "Ultimi Post", - "details.private": "Private", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", + "details.private": "Privato", + "details.grant": "Concedi / Rimuovi la Proprietà", + "details.kick": "Espelli", "details.owner_options": "Amministratore del Grupo", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", + "details.group_name": "Nome Gruppo", + "details.description": "Descrizione", + "details.badge_preview": "Anteprima del Badge", + "details.change_icon": "Cambia Icona", + "details.change_colour": "Cambia Colore", + "details.badge_text": "Testo del Badge", + "details.userTitleEnabled": "Visualizza il Badge", + "details.private_help": "Se abilitato, l'ingresso ai gruppi richiede l'approvazione di uno dei proprietari", + "details.hidden": "Nascosto", + "details.hidden_help": "Se abilitato, questo gruppo non sarà visibile nella lista dei gruppi e gli utenti dovranno essere invitati manualmente", "event.updated": "I dettagli del Gruppo sono stati aggiornati", "event.deleted": "Il gruppo \"%1\" è stato eliminato" } \ No newline at end of file diff --git a/public/language/it/login.json b/public/language/it/login.json index 75747e30d1..f04d6cdfb4 100644 --- a/public/language/it/login.json +++ b/public/language/it/login.json @@ -1,6 +1,6 @@ { - "username-email": "Username / Email", - "username": "Username", + "username-email": "Nome utente / Email", + "username": "Nome utente", "email": "Email", "remember_me": "Ricordami?", "forgot_password": "Password dimenticata?", diff --git a/public/language/it/modules.json b/public/language/it/modules.json index dc6d3dcf78..c018e2b7fe 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -18,5 +18,5 @@ "composer.user_said_in": "%1 ha detto in %2:", "composer.user_said": "%1 ha detto:", "composer.discard": "Sei sicuro di voler scartare questo post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Invia e Blocca" } \ No newline at end of file diff --git a/public/language/it/pages.json b/public/language/it/pages.json index f7395c9d50..3ab4886ae0 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -14,7 +14,7 @@ "user.groups": "%1's Gruppi", "user.favourites": "Post Favoriti da %1", "user.settings": "Impostazioni Utente", - "user.watched": "Topics watched by %1", + "user.watched": "Argomenti osservati da %1", "maintenance.text": "%1 è attualmente in manutenzione. Per favore ritorna più tardi.", "maintenance.messageIntro": "Inoltre, l'amministratore ha lasciato questo messaggio:" } \ No newline at end of file diff --git a/public/language/it/recent.json b/public/language/it/recent.json index bf4485644c..c61e51f150 100644 --- a/public/language/it/recent.json +++ b/public/language/it/recent.json @@ -6,7 +6,7 @@ "year": "Anno", "alltime": "Sempre", "no_recent_topics": "Non ci sono discussioni recenti.", - "no_popular_topics": "There are no popular topics.", + "no_popular_topics": "Non ci sono argomenti popolari.", "there-is-a-new-topic": "C'è un nuovo topic.", "there-is-a-new-topic-and-a-new-post": "C'è un nuovo topic e un nuovo post.", "there-is-a-new-topic-and-new-posts": "C'è una nuova discussione e %1 nuovi post.", diff --git a/public/language/it/search.json b/public/language/it/search.json index 14ddeaa98a..ec851b8966 100644 --- a/public/language/it/search.json +++ b/public/language/it/search.json @@ -7,7 +7,7 @@ "titles-posts": "Titoli e Messaggi", "posted-by": "Pubblicato da", "in-categories": "In Categorie", - "search-child-categories": "Search child categories", + "search-child-categories": "Cerca nelle sottocategorie", "reply-count": "Numero Risposte", "at-least": "Almeno", "at-most": "Al massimo", @@ -23,7 +23,7 @@ "six-months": "Sei mesi", "one-year": "Un anno", "sort-by": "Ordina per", - "last-reply-time": "Last reply time", + "last-reply-time": "Ora dell'ultima risposta", "topic-title": "Titolo argomento", "number-of-replies": "Numero di risposte", "number-of-views": "Numero di visite", @@ -32,9 +32,9 @@ "category": "Categoria", "descending": "In ordine decrescente", "ascending": "In ordine crescente", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "save-preferences": "Salva preferenze", + "clear-preferences": "Pulisci preferenze", + "search-preferences-saved": "Cerca nelle preferenze salvate", + "search-preferences-cleared": "Cerca nelle preferenze pulite", + "show-results-as": "Visualizza risultati come" } \ No newline at end of file diff --git a/public/language/it/tags.json b/public/language/it/tags.json index 5fcdf9ff47..9b2f9735e4 100644 --- a/public/language/it/tags.json +++ b/public/language/it/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Non ci sono discussioni con questo tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Inserisci qui i tag, tra %1 e %2 caratteri ognuno.", "enter_tags_here_short": "Inserisci i tags...", "no_tags": "Non ci sono ancora tags." } \ No newline at end of file diff --git a/public/language/it/user.json b/public/language/it/user.json index 3dd7971b11..5b31090325 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -60,7 +60,7 @@ "digest_monthly": "Mensile", "send_chat_notifications": "Invia una email se arriva un nuovo messaggio di chat e non sono online", "send_post_notifications": "Invia una email quando le risposte sono fatte a discussioni a cui sono sottoscritto", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "Alcuni cambiamenti di impostazioni richiedono un ricaricamento. Clicca qui per ricaricare la pagina.", "has_no_follower": "Questo utente non è seguito da nessuno :(", "follows_no_one": "Questo utente non segue nessuno :(", "has_no_posts": "Questo utente non ha ancora postato nulla.", @@ -78,5 +78,5 @@ "topic_search_help": "Se abilitata, la ricerca negli argomenti sovrascriverà la pagina di ricerca preimpostata del browser per consentirti di cercare all'interno delle discussioni, anziché soltanto nel contenuto visibile a schermo.", "follow_topics_you_reply_to": "Segui le discussioni in cui rispondi.", "follow_topics_you_create": "Segui le discussioni che crei.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Seleziona il titolo del gruppo che vorresti vedere" } \ No newline at end of file From 6c5c8ceeee84bdebd7566436fb9d382777f92946 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 16:32:57 -0400 Subject: [PATCH 032/295] closes #2859 --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index d28610fcb9..4684d5c73a 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,6 @@ Additional functionality is enabled through the use of third-party plugins. [](http://i.imgur.com/FLOUuIq.png) [](http://i.imgur.com/Ud1LrfI.png) [](http://i.imgur.com/ZC8W39a.png) [](http://i.imgur.com/o90kVPi.png) [](http://i.imgur.com/AaRRrU2.png) [](http://i.imgur.com/LmHtPho.png) [](http://i.imgur.com/paiJPJk.jpg) [](http://i.imgur.com/ZfavPHD.png) [](http://i.imgur.com/8OLssij.png) [](http://i.imgur.com/JKOc0LZ.png) -Credit: [Convoe](http://www.convoe.com), [Kano](http://www.kano.me), [Manchester United Forum](http://manutdforums.com/). - - ## How can I follow along/contribute? * Our feature roadmap is hosted on the project wiki's [Version History / Roadmap](https://github.com/NodeBB/NodeBB/wiki/Version-History-%26-Roadmap) From c294c3b342a03af5dbde28ec04258265f9c558c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 1 Apr 2015 16:41:14 -0400 Subject: [PATCH 033/295] fix inf scroll and timeago on users page --- public/src/client/users.js | 10 ++++++---- src/socket.io/user.js | 9 +++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/public/src/client/users.js b/public/src/client/users.js index 11f1deb7bb..0a08454ecb 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -62,7 +62,7 @@ define('forum/users', ['translator'], function(translator) { after: after }, function(err, data) { if (data && data.users.length) { - onUsersLoaded(data.users); + onUsersLoaded(data); $('#load-more-users-btn').removeClass('disabled'); } else { $('#load-more-users-btn').addClass('disabled'); @@ -71,13 +71,15 @@ define('forum/users', ['translator'], function(translator) { }); } - function onUsersLoaded(users) { - users = users.filter(function(user) { + function onUsersLoaded(data) { + data.users = data.users.filter(function(user) { return !$('.users-box[data-uid="' + user.uid + '"]').length; }); - templates.parse('users', 'users', {users: users}, function(html) { + templates.parse('users', 'users', data, function(html) { translator.translate(html, function(translated) { + translated = $(translated); + translated.find('span.timeago').timeago(); $('#users-container').append(translated); $('#users-container .anon-user').appendTo($('#users-container')); }); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 5b4db66495..850edff7d0 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -426,11 +426,12 @@ SocketUser.loadMore = function(socket, data, callback) { return user.status !== 'offline'; }); } - - callback(null, { + var result = { users: results.users, - nextStart: stop + 1 - }); + nextStart: stop + 1, + }; + result['route_' + data.set] = true; + callback(null, result); }); }; From 43502e041a18b56ba9aa8396b90d280d10fe8fda Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 17:03:15 -0400 Subject: [PATCH 034/295] don't send 5 million error messages during daily digest --- src/user/digest.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/user/digest.js b/src/user/digest.js index 02799c0bf3..97b408b910 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -9,6 +9,7 @@ var async = require('async'), user = require('../user'), topics = require('../topics'), batch = require('../batch'), + plugins = require('../plugins'), emailer = require('../emailer'), utils = require('../../public/src/utils'); @@ -19,6 +20,10 @@ var async = require('async'), return winston.verbose('[user/jobs] Did not send digests (' + interval + ') because subscription system is disabled.'); } + if (!plugins.hasListeners('action:email.send')) { + return winston.error('[user/jobs] Did not send digests (' + interval + ') because no active email plugin was found.'); + } + if (!interval) { // interval is one of: day, week, month, or year interval = 'day'; From 56fc9589399d9378b8dd85177dd439d902512782 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Apr 2015 17:26:22 -0400 Subject: [PATCH 035/295] closes #2891 --- public/language/en_GB/reset_password.json | 3 +- public/src/client/reset.js | 2 +- src/controllers/index.js | 3 ++ src/routes/authentication.js | 58 ++++++++++++++--------- src/user/create.js | 6 ++- src/user/profile.js | 5 +- src/user/reset.js | 37 ++++++++++----- src/views/admin/settings/user.tpl | 4 ++ 8 files changed, 79 insertions(+), 39 deletions(-) diff --git a/public/language/en_GB/reset_password.json b/public/language/en_GB/reset_password.json index 96ba318a8a..9f5b0dcc45 100644 --- a/public/language/en_GB/reset_password.json +++ b/public/language/en_GB/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Password Reset Sent", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } diff --git a/public/src/client/reset.js b/public/src/client/reset.js index 568d0739a1..fcf4098b68 100644 --- a/public/src/client/reset.js +++ b/public/src/client/reset.js @@ -11,7 +11,7 @@ define('forum/reset', function() { $('#reset').on('click', function() { if (inputEl.val() && inputEl.val().indexOf('@') !== -1) { - socket.emit('user.reset.send', inputEl.val(), function(err, data) { + socket.emit('user.reset.send', inputEl.val(), function(err) { if(err) { return app.alertError(err.message); } diff --git a/src/controllers/index.js b/src/controllers/index.js index ce50cc4c17..9500fca12c 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -57,9 +57,12 @@ Controllers.reset = function(req, res, next) { } res.render('reset_code', { valid: valid, + displayExpiryNotice: req.session.passwordExpired, code: req.params.code ? req.params.code : null, breadcrumbs: helpers.buildBreadcrumbs([{text: '[[reset_password:reset_password]]', url: '/reset'}, {text: '[[reset_password:update_password]]'}]) }); + + delete req.session.passwordExpired; }); } else { res.render('reset', { diff --git a/src/routes/authentication.js b/src/routes/authentication.js index eaf09f3e8b..fd27ac7419 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -87,7 +87,7 @@ } var userslug = utils.slugify(username); - var uid; + var uid, userData = {}; async.waterfall([ function(next) { @@ -101,9 +101,12 @@ user.auth.logAttempt(uid, req.ip, next); }, function(next) { - db.getObjectFields('user:' + uid, ['password', 'banned'], next); + db.getObjectFields('user:' + uid, ['password', 'banned', 'passwordExpiry'], next); }, - function(userData, next) { + function(_userData, next) { + userData = _userData; + userData.uid = uid; + if (!userData || !userData.password) { return next(new Error('[[error:invalid-user-data]]')); } @@ -117,7 +120,7 @@ return next(new Error('[[error:invalid-password]]')); } user.auth.clearLoginAttempts(uid); - next(null, {uid: uid}, '[[success:authentication-successful]]'); + next(null, userData, '[[success:authentication-successful]]'); } ], next); }; @@ -165,6 +168,8 @@ Auth.continueLogin = function(req, res, next) { passport.authenticate('local', function(err, userData, info) { + var passwordExpiry = userData.passwordExpiry !== undefined ? parseInt(userData.passwordExpiry, 10) : null; + if (err) { return res.status(403).send(err.message); } @@ -187,28 +192,35 @@ req.session.cookie.expires = false; } - req.login({ - uid: userData.uid - }, function(err) { - if (err) { - return res.status(403).send(err.message); - } - if (userData.uid) { - user.logIP(userData.uid, req.ip); - - plugins.fireHook('action:user.loggedIn', userData.uid); - } + if (passwordExpiry && passwordExpiry < Date.now()) { + winston.verbose('[auth] Triggering password reset for uid ' + userData.uid + ' due to password policy'); + req.session.passwordExpired = true; + user.reset.generate(userData.uid, function(err, code) { + res.status(200).send(nconf.get('relative_path') + '/reset/' + code); + }); + } else { + req.login({ + uid: userData.uid + }, function(err) { + if (err) { + return res.status(403).send(err.message); + } + if (userData.uid) { + user.logIP(userData.uid, req.ip); - if (!req.session.returnTo) { - res.status(200).send(nconf.get('relative_path') + '/'); - } else { + plugins.fireHook('action:user.loggedIn', userData.uid); + } - var next = req.session.returnTo; - delete req.session.returnTo; + if (!req.session.returnTo) { + res.status(200).send(nconf.get('relative_path') + '/'); + } else { + var next = req.session.returnTo; + delete req.session.returnTo; - res.status(200).send(next); - } - }); + res.status(200).send(next); + } + }); + } })(req, res, next); }; diff --git a/src/user/create.js b/src/user/create.js index 90bd39e7d1..d11669099f 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -126,12 +126,16 @@ module.exports = function(User) { if (!data.password) { return next(); } + User.hashPassword(data.password, function(err, hash) { if (err) { return next(err); } - User.setUserField(userData.uid, 'password', hash, next); + async.parallel([ + async.apply(User.setUserField, userData.uid, 'password', hash), + async.apply(User.reset.updateExpiry, userData.uid) + ], next); }); } ], function(err) { diff --git a/src/user/profile.js b/src/user/profile.js index f16046ee4a..a284165061 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -257,7 +257,10 @@ module.exports = function(User) { return callback(err); } - User.setUserField(data.uid, 'password', hash, callback); + async.parallel([ + async.apply(User.setUserField, data.uid, 'password', hash), + async.apply(User.reset.updateExpiry, data.uid) + ], callback); }); } diff --git a/src/user/reset.js b/src/user/reset.js index 9df72a8177..e9a5e46c1a 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -32,8 +32,17 @@ var async = require('async'), ], callback); }; + UserReset.generate = function(uid, callback) { + var code = utils.generateUUID(); + async.parallel([ + async.apply(db.setObjectField, 'reset:uid', code, uid), + async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code) + ], function(err) { + callback(err, code); + }); + }; + UserReset.send = function(email, callback) { - var reset_code = utils.generateUUID(); var uid; async.waterfall([ function(next) { @@ -45,18 +54,15 @@ var async = require('async'), } uid = _uid; - async.parallel([ - async.apply(db.setObjectField, 'reset:uid', reset_code, uid), - async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), reset_code) - ], next); + UserReset.generate(uid, next); }, - function(results, next) { + function(code, next) { translator.translate('[[email:password-reset-requested, ' + (meta.config.title || 'NodeBB') + ']]', meta.config.defaultLang, function(subject) { - next(null, subject); + next(null, subject, code); }); }, - function(subject, next) { - var reset_link = nconf.get('url') + '/reset/' + reset_code; + function(subject, code, next) { + var reset_link = nconf.get('url') + '/reset/' + code; emailer.send('reset', uid, { site_title: (meta.config.title || 'NodeBB'), reset_link: reset_link, @@ -64,9 +70,6 @@ var async = require('async'), template: 'reset', uid: uid }, next); - }, - function(next) { - next(null, reset_code); } ], callback); }; @@ -96,12 +99,22 @@ var async = require('async'), async.apply(user.setUserField, uid, 'password', hash), async.apply(db.deleteObjectField, 'reset:uid', code), async.apply(db.sortedSetRemove, 'reset:issueDate', code), + async.apply(user.reset.updateExpiry, uid), async.apply(user.auth.resetLockout, uid) ], next); } ], callback); }; + UserReset.updateExpiry = function(uid, callback) { + var oneDay = 1000*60*60*24, + expireDays = parseInt(meta.config.passwordExpiryDays || 0, 10), + expiry = Date.now() + (oneDay * expireDays); + + callback = callback || function() {}; + user.setUserField(uid, 'passwordExpiry', expireDays > 0 ? expiry : 0, callback); + }; + UserReset.clean = function(callback) { async.waterfall([ async.apply(db.getSortedSetRangeByScore, 'reset:issueDate', 0, -1, 0, Date.now() - twoHours), diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index c0c1ca8ab3..ab09e237c8 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -102,6 +102,10 @@ +
+ + +
From e1ff3deaf09b9101ef469a6880e13969e9f532a1 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 17:23:54 -0400 Subject: [PATCH 036/295] move preview toggle function into composer/preview.js --- public/src/modules/composer.js | 25 +++---------------------- public/src/modules/composer/preview.js | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index f6dc3b9b31..106ee6a8b6 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -382,15 +382,17 @@ define('composer', [ }); bodyEl.val(draft ? draft : postData.body); + preview.render(postContainer, function() { preview.matchScroll(postContainer); }); + preview.handleToggler(postContainer); + drafts.init(postContainer, postData); resize.handleResize(postContainer); handleHelp(postContainer); - handleTogglePreview(postContainer); $(window).trigger('action:composer.loaded', { post_uuid: post_uuid @@ -419,27 +421,6 @@ define('composer', [ }); } - function handleTogglePreview(postContainer) { - var showBtn = postContainer.find('.write-container .toggle-preview'), - hideBtn = postContainer.find('.preview-container .toggle-preview'); - - hideBtn.on('click', function() { - $('.preview-container').addClass('hide'); - $('.write-container').addClass('maximized'); - showBtn.removeClass('hide'); - - $('.write').focus(); - }); - - showBtn.on('click', function() { - $('.preview-container').removeClass('hide'); - $('.write-container').removeClass('maximized'); - showBtn.addClass('hide'); - - $('.write').focus(); - }); - } - function updateTitle(postData, postContainer) { var titleEl = postContainer.find('.title'); diff --git a/public/src/modules/composer/preview.js b/public/src/modules/composer/preview.js index 7efadc28c6..5c2361cfa6 100644 --- a/public/src/modules/composer/preview.js +++ b/public/src/modules/composer/preview.js @@ -44,5 +44,26 @@ define('composer/preview', function() { preview.scrollTop(Math.max(preview[0].scrollHeight - preview.height(), 0) * scrollPercent); }; + preview.handleToggler = function(postContainer) { + var showBtn = postContainer.find('.write-container .toggle-preview'), + hideBtn = postContainer.find('.preview-container .toggle-preview'); + + hideBtn.on('click', function() { + $('.preview-container').addClass('hide'); + $('.write-container').addClass('maximized'); + showBtn.removeClass('hide'); + + $('.write').focus(); + }); + + showBtn.on('click', function() { + $('.preview-container').removeClass('hide'); + $('.write-container').removeClass('maximized'); + showBtn.addClass('hide'); + + $('.write').focus(); + }); + }; + return preview; }); \ No newline at end of file From 7563e9aba17ee215711e3781f1da6756b395d8d6 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 1 Apr 2015 17:36:07 -0400 Subject: [PATCH 037/295] added localStorage for preview toggled state --- public/src/modules/composer.js | 2 +- public/src/modules/composer/preview.js | 35 ++++++++++++++++++-------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 106ee6a8b6..076a0102f0 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -305,6 +305,7 @@ define('composer', [ draft = drafts.getDraft(postData.save_id), submitBtn = postContainer.find('.composer-submit'); + preview.handleToggler(postContainer); tags.init(postContainer, composer.posts[post_uuid]); categoryList.init(postContainer, composer.posts[post_uuid]); @@ -386,7 +387,6 @@ define('composer', [ preview.render(postContainer, function() { preview.matchScroll(postContainer); }); - preview.handleToggler(postContainer); drafts.init(postContainer, postData); diff --git a/public/src/modules/composer/preview.js b/public/src/modules/composer/preview.js index 5c2361cfa6..58c0160584 100644 --- a/public/src/modules/composer/preview.js +++ b/public/src/modules/composer/preview.js @@ -45,24 +45,37 @@ define('composer/preview', function() { }; preview.handleToggler = function(postContainer) { - var showBtn = postContainer.find('.write-container .toggle-preview'), - hideBtn = postContainer.find('.preview-container .toggle-preview'); - - hideBtn.on('click', function() { - $('.preview-container').addClass('hide'); - $('.write-container').addClass('maximized'); + function hidePreview() { + previewContainer.addClass('hide'); + writeContainer.addClass('maximized'); showBtn.removeClass('hide'); $('.write').focus(); - }); + localStorage.setItem('composer:previewToggled', true); + } - showBtn.on('click', function() { - $('.preview-container').removeClass('hide'); - $('.write-container').removeClass('maximized'); + function showPreview() { + previewContainer.removeClass('hide'); + writeContainer.removeClass('maximized'); showBtn.addClass('hide'); $('.write').focus(); - }); + localStorage.removeItem('composer:previewToggled'); + } + + var showBtn = postContainer.find('.write-container .toggle-preview'), + hideBtn = postContainer.find('.preview-container .toggle-preview'), + previewContainer = $('.preview-container'), + writeContainer = $('.write-container'); + + hideBtn.on('click', hidePreview); + showBtn.on('click', showPreview); + + if (localStorage.getItem('composer:previewToggled')) { + hidePreview(); + } else { + showPreview(); + } }; return preview; From 0d839bdb2c4a7c87d2ed58433b28cccf9c8b0da1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Apr 2015 22:18:42 -0400 Subject: [PATCH 038/295] parantheses --- public/src/modules/helpers.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index d9bff81edb..f48a7e8c00 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -14,9 +14,9 @@ properties = item.properties; if (properties) { - if (properties.loggedIn && !data.loggedIn || - properties.adminOnly && !data.isAdmin || - properties.installed && properties.installed.search && !data.searchEnabled) { + if ((properties.loggedIn && !data.loggedIn) || + (properties.adminOnly && !data.isAdmin) || + (properties.installed && properties.installed.search && !data.searchEnabled)) { return false; } } From b3f66faa37f1da870f6b382279878fe6500745e7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Apr 2015 22:20:20 -0400 Subject: [PATCH 039/295] default is private --- src/middleware/middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index f542159c50..88c6dbfbd1 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -496,7 +496,7 @@ middleware.maintenanceMode = function(req, res, next) { }; middleware.publicTagListing = function(req, res, next) { - if (req.user || (!meta.config.hasOwnProperty('publicTagListing') || parseInt(meta.config.publicTagListing, 10) === 1)) { + if (req.user || parseInt(meta.config.publicTagListing, 10) === 1) { next(); } else { controllers.helpers.notAllowed(req, res); From e862f7186f57e7cf0d69cb410e04e711407a7787 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Apr 2015 23:01:55 -0400 Subject: [PATCH 040/295] recent doesnt need composer anymore --- public/src/client/recent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 909cec052e..dc4a949c4d 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -2,7 +2,7 @@ /* globals define, app, socket, utils */ -define('forum/recent', ['forum/infinitescroll', 'composer', 'components'], function(infinitescroll, composer, components) { +define('forum/recent', ['forum/infinitescroll', 'components'], function(infinitescroll, components) { var Recent = {}; var newTopicCount = 0, From 1745689317fa30a6d98939f52297bdaec04fb3a2 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 1 Apr 2015 23:28:21 -0400 Subject: [PATCH 041/295] require composer when its needed --- public/src/client/topic/postTools.js | 75 +++++++++++++++------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index b3686a7e3c..1c05fe66d3 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -2,7 +2,7 @@ /* globals define, app, ajaxify, bootbox, socket, templates, utils */ -define('forum/topic/postTools', ['composer', 'share', 'navigator', 'components', 'translator'], function(composer, share, navigator, components, translator) { +define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator'], function(share, navigator, components, translator) { var PostTools = {}, topicName; @@ -117,7 +117,10 @@ define('forum/topic/postTools', ['composer', 'share', 'navigator', 'components', }); postContainer.on('click', '[component="post/edit"]', function(e) { - composer.editPost(getData($(this), 'data-pid')); + var btn = $(this); + require(['composer'], function(composer) { + composer.editPost(getData(btn, 'data-pid')); + }); }); postContainer.on('click', '[component="post/delete"]', function(e) { @@ -138,46 +141,50 @@ define('forum/topic/postTools', ['composer', 'share', 'navigator', 'components', } function onReplyClicked(button, tid, topicName) { - var selectionText = '', - selection = window.getSelection ? window.getSelection() : document.selection.createRange(); - - if ($(selection.baseNode).parents('[component="post/content"]').length > 0) { - var snippet = selection.toString(); - if (snippet.length) { - selectionText = '> ' + snippet.replace(/\n/g, '\n> ') + '\n\n'; + require(['composer'], function(composer) { + var selectionText = '', + selection = window.getSelection ? window.getSelection() : document.selection.createRange(); + + if ($(selection.baseNode).parents('[component="post/content"]').length > 0) { + var snippet = selection.toString(); + if (snippet.length) { + selectionText = '> ' + snippet.replace(/\n/g, '\n> ') + '\n\n'; + } } - } - var username = getUserName(selectionText ? $(selection.baseNode) : button); - if (getData(button, 'data-uid') === '0') { - username = ''; - } - if (selectionText.length) { - composer.addQuote(tid, ajaxify.variables.get('topic_slug'), getData(button, 'data-index'), getData(button, 'data-pid'), topicName, username, selectionText); - } else { - composer.newReply(tid, getData(button, 'data-pid'), topicName, username ? username + ' ' : ''); - } + var username = getUserName(selectionText ? $(selection.baseNode) : button); + if (getData(button, 'data-uid') === '0') { + username = ''; + } + if (selectionText.length) { + composer.addQuote(tid, ajaxify.variables.get('topic_slug'), getData(button, 'data-index'), getData(button, 'data-pid'), topicName, username, selectionText); + } else { + composer.newReply(tid, getData(button, 'data-pid'), topicName, username ? username + ' ' : ''); + } + }); } function onQuoteClicked(button, tid, topicName) { - var username = getUserName(button), - pid = getData(button, 'data-pid'); + require(['composer'], function(composer) { + var username = getUserName(button), + pid = getData(button, 'data-pid'); - socket.emit('posts.getRawPost', pid, function(err, post) { - if(err) { - return app.alertError(err.message); - } - var quoted = ''; - if(post) { - quoted = '> ' + post.replace(/\n/g, '\n> ') + '\n\n'; - } + socket.emit('posts.getRawPost', pid, function(err, post) { + if(err) { + return app.alertError(err.message); + } + var quoted = ''; + if(post) { + quoted = '> ' + post.replace(/\n/g, '\n> ') + '\n\n'; + } - if($('.composer').length) { - composer.addQuote(tid, ajaxify.variables.get('topic_slug'), getData(button, 'data-index'), pid, topicName, username, quoted); - } else { - composer.newReply(tid, pid, topicName, '[[modules:composer.user_said, ' + username + ']]\n' + quoted); - } + if($('.composer').length) { + composer.addQuote(tid, ajaxify.variables.get('topic_slug'), getData(button, 'data-index'), pid, topicName, username, quoted); + } else { + composer.newReply(tid, pid, topicName, '[[modules:composer.user_said, ' + username + ']]\n' + quoted); + } + }); }); } From f96f6d9e2e8fd8a503a19820e334c23bd1a3113b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 01:27:11 -0400 Subject: [PATCH 042/295] shorter --- public/src/ajaxify.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 57defca278..515ce037af 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -31,9 +31,7 @@ $(document).ready(function() { ajaxify.currentPage = null; ajaxify.go = function (url, callback, quiet) { - if (ajaxify.handleACPRedirect(url)) { - return true; - } else if (ajaxify.handleNonAPIRoutes(url)) { + if (ajaxify.handleACPRedirect(url) || ajaxify.handleNonAPIRoutes(url)) { return true; } From e5efec136165f0b6b2896e20e02c6ed70a6b3b1e Mon Sep 17 00:00:00 2001 From: CisMous Date: Thu, 2 Apr 2015 17:11:55 +0800 Subject: [PATCH 043/295] fixed post chat bug --- public/src/client/topic/postTools.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 1c05fe66d3..544b6dd897 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -135,7 +135,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator openMovePostModal($(this)); }); - postContainer.on('click', '[component="user/chat"]', function(e) { + postContainer.on('click', '[component="post/chat"]', function(e) { openChat($(this)); }); } @@ -357,7 +357,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator } function openChat(button) { - var post = button.parents('data-pid'); + var post = button.parents('[data-pid]'); app.openChat(post.attr('data-username'), post.attr('data-uid')); button.parents('.btn-group').find('.dropdown-toggle').click(); From e15f7902dd37cff02dc84d87b6d678b82648dce7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 14:09:19 -0400 Subject: [PATCH 044/295] closes #2930 --- package.json | 2 +- public/src/client/topic/move.js | 2 +- src/threadTools.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index cf350935ce..288a5ad02a 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "mmmagic": "^0.3.13", "morgan": "^1.3.2", "nconf": "~0.7.1", - "nodebb-plugin-dbsearch": "^0.2.1", + "nodebb-plugin-dbsearch": "^0.2.4", "nodebb-plugin-emoji-extended": "^0.4.1-4", "nodebb-plugin-markdown": "^2.1.0", "nodebb-plugin-mentions": "^0.11.0", diff --git a/public/src/client/topic/move.js b/public/src/client/topic/move.js index 21fcf999ff..648f9f3b27 100644 --- a/public/src/client/topic/move.js +++ b/public/src/client/topic/move.js @@ -78,7 +78,7 @@ define('forum/topic/move', function() { modal.modal('hide'); $('#move_thread_commit').prop('disabled', false); - if(err) { + if (err) { return app.alertError(err.message); } diff --git a/src/threadTools.js b/src/threadTools.js index 76ea84c9df..1d13440cad 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -193,6 +193,7 @@ var async = require('async'), toCid: cid, uid: uid }); + callback(); }); }); }; From 30df61e7a5ddd30b6967516789440d910904a02e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Apr 2015 15:56:32 -0400 Subject: [PATCH 045/295] infinite scrolling on category view, checkboxes weren't showing up --- public/src/client/category.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/src/client/category.js b/public/src/client/category.js index ec667a652f..e49e193c68 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -184,8 +184,11 @@ define('forum/category', [ $(window).trigger('filter:categories.new_topic', topic); + var editable = !!$('.thread-tools').length; + templates.parse('category', 'topics', { - privileges: {editable: !!$('.thread-tools').length}, + privileges: {editable: editable}, + showSelect: editable, topics: [topic] }, function(html) { translator.translate(html, function(translatedHTML) { @@ -276,6 +279,8 @@ define('forum/category', [ return; } + data.showSelect = data.privileges.editable; + findInsertionPoint(); templates.parse('category', 'topics', data, function(html) { From 63653662e0230c4932cd3eb6674cd07bb5cce1d7 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Thu, 2 Apr 2015 16:14:28 -0400 Subject: [PATCH 046/295] a should have the title, not img part 1 of https://github.com/NodeBB/nodebb-theme-persona/issues/38 --- public/src/client/topic/browsing.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index 5cb71960ea..2a0eb1eac5 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -83,14 +83,14 @@ define('forum/topic/browsing', ['translator'], function(translator) { activeEl.append(userEl); } - activeEl.find('a[data-uid] img').tooltip({ + activeEl.find('a[data-uid]').tooltip({ placement: 'top' }); } function createUserIcon(uid, picture, userslug, username) { if(!$('[component="topic/browsing/list"]').find('[data-uid="' + uid + '"]').length) { - return $('
'); + return $('
'); } } From 3efb1345e008410d392e37f0f1e67269cf4ecf93 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 17:33:28 -0400 Subject: [PATCH 047/295] use topic/header closes #2933 --- public/src/client/category.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/category.js b/public/src/client/category.js index e49e193c68..a42837d851 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -47,7 +47,7 @@ define('forum/category', [ navigator.init('[component="category/topic"]', ajaxify.variables.get('topic_count'), Category.toTop, Category.toBottom, Category.navigatorCallback); } - $('[component="category"]').on('click', '[component="post/header"]', function() { + $('[component="category"]').on('click', '[component="topic/header"]', function() { var clickedIndex = $(this).parents('[data-index]').attr('data-index'); $('[component="category/topic"]').each(function(index, el) { if ($(el).offset().top - $(window).scrollTop() > 0) { From 66422acea2dd7ef722e32890e8e8ae9248dc2844 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 2 Apr 2015 19:18:48 -0400 Subject: [PATCH 048/295] fixed #2934 --- src/routes/authentication.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/authentication.js b/src/routes/authentication.js index fd27ac7419..247d19777a 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -168,8 +168,6 @@ Auth.continueLogin = function(req, res, next) { passport.authenticate('local', function(err, userData, info) { - var passwordExpiry = userData.passwordExpiry !== undefined ? parseInt(userData.passwordExpiry, 10) : null; - if (err) { return res.status(403).send(err.message); } @@ -182,6 +180,8 @@ return res.status(403).send(info); } + var passwordExpiry = userData.passwordExpiry !== undefined ? parseInt(userData.passwordExpiry, 10) : null; + // Alter user cookie depending on passed-in option if (req.body.remember === 'on') { var duration = 1000*60*60*24*parseInt(meta.config.loginDays || 14, 10); From 04f536854c8c1f15b3d1fcee9a9db49a2ec7a108 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 2 Apr 2015 20:27:43 -0400 Subject: [PATCH 049/295] added some tests, fixed user reset tests --- tests/user.js | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/tests/user.js b/tests/user.js index 5c2f5bfd62..9a1ee4b90f 100644 --- a/tests/user.js +++ b/tests/user.js @@ -195,7 +195,8 @@ describe('User', function() { }); describe('passwordReset', function() { - var uid; + var uid, + code; before(function(done) { User.create({username: 'resetuser', password: '123456', email: 'reset@me.com'}, function(err, newUid) { assert.ifError(err); @@ -204,21 +205,49 @@ describe('User', function() { }); }); - it('should create a new reset code and reset password', function(done) { + it('.generate() should generate a new reset code', function(done) { + User.reset.generate(uid, function(err, _code) { + assert.ifError(err); + assert(_code); + + code = _code; + done(); + }); + }); + + it('.validate() should ensure that this new code is valid', function(done) { + User.reset.validate(code, function(err, valid) { + assert.ifError(err); + assert.strictEqual(valid, true); + done(); + }); + }); + + it('.validate() should correctly identify an invalid code', function(done) { + User.reset.validate(code + 'abcdef', function(err, valid) { + assert.ifError(err); + assert.strictEqual(valid, false); + done(); + }); + }); + + it('.send() should create a new reset code and reset password', function(done) { User.reset.send('reset@me.com', function(err, code) { assert.ifError(err); - assert(code); + done(); + }); + }); - User.reset.commit(code, 'newpassword', function(err) { - assert.ifError(err); + it('.commit() should update the user\'s password', function(done) { + User.reset.commit(code, 'newpassword', function(err) { + assert.ifError(err); - db.getObjectField('user:' + uid, 'password', function(err, newPassword) { + db.getObjectField('user:' + uid, 'password', function(err, newPassword) { + assert.ifError(err); + Password.compare('newpassword', newPassword, function(err, match) { assert.ifError(err); - Password.compare('newpassword', newPassword, function(err, match) { - assert.ifError(err); - assert(match); - done(); - }); + assert(match); + done(); }); }); }); From 9e3b2148bacac7ec3e7c787c4d47618cdeb486d5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 22:06:18 -0400 Subject: [PATCH 050/295] components --- public/src/client/topic/events.js | 17 ++-- public/src/client/topic/threadTools.js | 107 +++++++++++-------------- src/privileges/topics.js | 9 ++- src/threadTools.js | 1 + 4 files changed, 58 insertions(+), 76 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index f47108c7e1..eb64299dde 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -168,22 +168,16 @@ define('forum/topic/events', [ } function togglePostFavourite(data) { - var favBtn = $('[data-pid="' + data.post.pid + '"] .favourite'); + var favBtn = $('[data-pid="' + data.post.pid + '"] [component="post/favourite"]'); + if (!favBtn.length) { return; } - favBtn.addClass('btn-warning') - .attr('data-favourited', data.isFavourited); + favBtn.attr('data-favourited', data.isFavourited); - var icon = favBtn.find('i'); - var className = icon.attr('class'); - if (!className) { - return; - } - if (data.isFavourited ? className.indexOf('-o') !== -1 : className.indexOf('-o') === -1) { - icon.attr('class', data.isFavourited ? className.replace('-o', '') : className + '-o'); - } + favBtn.find('[component="post/favourite/on"]').toggleClass('hidden', !data.isFavourited); + favBtn.find('[component="post/favourite/off"]').toggleClass('hidden', data.isFavourited); } function togglePostVote(data) { @@ -192,7 +186,6 @@ define('forum/topic/events', [ post.find('[component="post/downvote"]').toggleClass('downvoted', data.downvote); } - function onNewNotification(data) { var tid = ajaxify.variables.get('topic_id'); if (data && data.tid && parseInt(data.tid, 10) === parseInt(tid, 10)) { diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index 46a20d19b9..6cf70b112c 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -9,20 +9,13 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp ThreadTools.init = function(tid, threadState) { ThreadTools.threadState = threadState; - if (threadState.locked) { - ThreadTools.setLockedState({tid: tid, isLocked: true}); - } - - if (threadState.deleted) { - ThreadTools.setDeleteState({tid: tid, isDelete: true}); - } - - if (threadState.pinned) { - ThreadTools.setPinnedState({tid: tid, isPinned: true}); - } - components.get('topic/delete').on('click', function() { - topicCommand(threadState.deleted ? 'restore' : 'delete', tid); + topicCommand('delete', tid); + return false; + }); + + components.get('topic/restore').on('click', function() { + topicCommand('restore', tid); return false; }); @@ -32,19 +25,29 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp }); components.get('topic/lock').on('click', function() { - socket.emit(threadState.locked ? 'topics.unlock' : 'topics.lock', {tids: [tid], cid: ajaxify.variables.get('category_id')}); + socket.emit('topics.lock', {tids: [tid], cid: ajaxify.variables.get('category_id')}); + return false; + }); + + components.get('topic/unlock').on('click', function() { + socket.emit('topics.unlock', {tids: [tid], cid: ajaxify.variables.get('category_id')}); return false; }); components.get('topic/pin').on('click', function() { - socket.emit(threadState.pinned ? 'topics.unpin' : 'topics.pin', {tids: [tid], cid: ajaxify.variables.get('category_id')}); + socket.emit('topics.pin', {tids: [tid], cid: ajaxify.variables.get('category_id')}); + return false; + }); + + components.get('topic/unpin').on('click', function() { + socket.emit('topics.unpin', {tids: [tid], cid: ajaxify.variables.get('category_id')}); return false; }); components.get('topic/mark-unread-for-all').on('click', function() { var btn = $(this); socket.emit('topics.markAsUnreadForAll', [tid], function(err) { - if(err) { + if (err) { return app.alertError(err.message); } app.alertSuccess('[[topic:markAsUnreadForAll.success]]'); @@ -60,12 +63,13 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp fork.init(); - components.get('topic').on('click', '[component="topic/follow"]', follow); + components.get('topic').on('click', '[component="topic/follow"], [component="topic/unfollow"]', follow); components.get('topic/follow').off('click').on('click', follow); + components.get('topic/unfollow').off('click').on('click', follow); function follow() { socket.emit('topics.toggleFollow', tid, function(err, state) { - if(err) { + if (err) { return app.alert({ type: 'danger', alert_id: 'topic_follow', @@ -101,21 +105,20 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp ThreadTools.setLockedState = function(data) { var threadEl = components.get('topic'); - if (parseInt(data.tid, 10) === parseInt(threadEl.attr('data-tid'), 10)) { - var isLocked = data.isLocked && !app.user.isAdmin; + if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) { + return; + } - components.get('topic/lock').translateHtml(' [[topic:thread_tools.' + (data.isLocked ? 'un': '') + 'lock]]'); + var isLocked = data.isLocked && !app.user.isAdmin; - translator.translate(isLocked ? '[[topic:locked]]' : '[[topic:reply]]', function(translated) { - var className = isLocked ? 'fa-lock' : 'fa-reply'; - threadEl.find('[component="post/reply"]').html(' ' + translated).attr('disabled', isLocked); - $('[component="topic/reply"]').attr('disabled', isLocked).html(isLocked ? ' ' + translated : translated); - }); + components.get('topic/lock').toggleClass('hidden', data.isLocked); + components.get('topic/unlock').toggleClass('hidden', !data.isLocked); + components.get('topic/reply').toggleClass('hidden', isLocked); + components.get('topic/reply/locked').toggleClass('hidden', !isLocked); - threadEl.find('[component="post/quote"], [component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked); - $('[component="post/header"] i.fa-lock').toggleClass('hide', !data.isLocked); - ThreadTools.threadState.locked = data.isLocked; - } + threadEl.find('[component="post/reply"], [component="post/quote"], [component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked); + $('[component="post/header"] i.fa-lock').toggleClass('hidden', !data.isLocked); + ThreadTools.threadState.locked = data.isLocked; }; ThreadTools.setDeleteState = function(data) { @@ -124,48 +127,30 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp return; } - components.get('topic/delete').translateHtml(' [[topic:thread_tools.' + (data.isDelete ? 'restore' : 'delete') + ']]'); + components.get('topic/delete').toggleClass('hidden', data.isDelete); + components.get('topic/restore').toggleClass('hidden', !data.isDelete); + components.get('topic/purge').toggleClass('hidden', !data.isDelete); + components.get('topic/deleted/message').toggleClass('hidden', !data.isDelete); threadEl.toggleClass('deleted', data.isDelete); ThreadTools.threadState.deleted = data.isDelete; - - components.get('topic/purge').toggleClass('hidden', !data.isDelete); - - if (data.isDelete) { - translator.translate('[[topic:deleted_message]]', function(translated) { - $('
' + translated + '
').insertBefore(threadEl); - }); - } else { - $('#thread-deleted').remove(); - } }; ThreadTools.setPinnedState = function(data) { var threadEl = components.get('topic'); - if (parseInt(data.tid, 10) === parseInt(threadEl.attr('data-tid'), 10)) { - translator.translate(' [[topic:thread_tools.' + (data.isPinned ? 'unpin' : 'pin') + ']]', function(translated) { - components.get('topic/pin').html(translated); - ThreadTools.threadState.pinned = data.isPinned; - }); - $('[component="post/header"] i.fa-thumb-tack').toggleClass('hide', !data.isPinned); + if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) { + return; } + + ThreadTools.threadState.pinned = data.isPinned; + components.get('topic/pin').toggleClass('hidden', data.isPinned); + components.get('topic/unpin').toggleClass('hidden', !data.isPinned); + $('[component="post/header"] i.fa-thumb-tack').toggleClass('hidden', !data.isPinned); }; function setFollowState(state) { - var title = state ? '[[topic:unwatch.title]]' : '[[topic:watch.title]]'; - var iconClass = state ? 'fa fa-eye-slash' : 'fa fa-eye'; - var text = state ? '[[topic:unwatch]]' : '[[topic:watch]]'; - - var followEl = components.get('topic/follow'); - - translator.translate(title, function(titleTranslated) { - followEl.attr('title', titleTranslated).find('i').attr('class', iconClass); - followEl.find('span').text(text); - - translator.translate(followEl.html(), function(translated) { - followEl.html(translated); - }); - }); + components.get('topic/follow').toggleClass('hidden', state); + components.get('topic/unfollow').toggleClass('hidden', !state); } diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 5820c0e7a6..01bdd6c4f1 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -16,9 +16,11 @@ module.exports = function(privileges) { privileges.topics = {}; privileges.topics.get = function(tid, uid, callback) { + var topic; async.waterfall([ - async.apply(topics.getTopicFields, tid, ['cid', 'uid']), - function(topic, next) { + async.apply(topics.getTopicFields, tid, ['cid', 'uid', 'locked']), + function(_topic, next) { + topic = _topic; async.parallel({ 'topics:reply': async.apply(helpers.isUserAllowedTo, 'topics:reply', uid, [topic.cid]), read: async.apply(helpers.isUserAllowedTo, 'read', uid, [topic.cid]), @@ -36,12 +38,13 @@ module.exports = function(privileges) { } var disabled = parseInt(results.disabled, 10) === 1; + var locked = parseInt(topic.locked, 10) === 1; var isAdminOrMod = results.isAdministrator || results.isModerator; var editable = isAdminOrMod; var deletable = isAdminOrMod || results.isOwner; plugins.fireHook('filter:privileges.topics.get', { - 'topics:reply': results['topics:reply'][0] || isAdminOrMod, + 'topics:reply': (results['topics:reply'][0] && !locked) || isAdminOrMod, read: results.read[0] || isAdminOrMod, view_thread_tools: editable || deletable, editable: editable, diff --git a/src/threadTools.js b/src/threadTools.js index 1d13440cad..aa83f99eb7 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -47,6 +47,7 @@ var async = require('async'), tid: tid, cid: topicData.cid, isDelete: isDelete, + isLocked: isDelete, uid: uid }; From 9dac6303bb804749a3f23fe69ca5b2a706508ec3 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 22:34:23 -0400 Subject: [PATCH 051/295] removed thread state fix bottom bar class --- public/src/client/topic.js | 11 +++-------- public/src/client/topic/postTools.js | 22 ++++++---------------- public/src/client/topic/posts.js | 2 +- public/src/client/topic/threadTools.js | 7 +------ 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 3e087879d2..14a3313f7b 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -30,12 +30,7 @@ define('forum/topic', [ }); Topic.init = function() { - var tid = ajaxify.variables.get('topic_id'), - thread_state = { - locked: ajaxify.variables.get('locked'), - deleted: ajaxify.variables.get('deleted'), - pinned: ajaxify.variables.get('pinned') - }; + var tid = ajaxify.variables.get('topic_id'); $(window).trigger('action:topic.loading'); @@ -43,8 +38,8 @@ define('forum/topic', [ posts.processPage($('.topic')); - postTools.init(tid, thread_state); - threadTools.init(tid, thread_state); + postTools.init(tid); + threadTools.init(tid); events.init(); sort.handleSort('topicPostSort', 'user.setTopicSort', 'topic/' + ajaxify.variables.get('topic_slug')); diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 544b6dd897..4612a4f25e 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -7,10 +7,10 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator var PostTools = {}, topicName; - PostTools.init = function(tid, threadState) { + PostTools.init = function(tid) { topicName = ajaxify.variables.get('topic_name'); - addPostHandlers(tid, threadState); + addPostHandlers(tid); share.addShareHandlers(topicName); @@ -71,29 +71,19 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator } } - function addPostHandlers(tid, threadState) { - function canPost() { - return !threadState.locked || app.user.isAdmin; - } - + function addPostHandlers(tid) { var postContainer = components.get('topic'); postContainer.on('click', '[component="post/quote"]', function() { - if (canPost()) { - onQuoteClicked($(this), tid, topicName); - } + onQuoteClicked($(this), tid, topicName); }); postContainer.on('click', '[component="post/reply"]', function() { - if (canPost()) { - onReplyClicked($(this), tid, topicName); - } + onReplyClicked($(this), tid, topicName); }); components.get('topic/reply').on('click', function() { - if (canPost()) { - onReplyClicked($(this), tid, topicName); - } + onReplyClicked($(this), tid, topicName); }); postContainer.on('click', '[component="post/favourite"]', function() { diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 1d7dcbe0df..0b8988bebf 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -267,7 +267,7 @@ define('forum/topic/posts', [ function showBottomPostBar() { if(components.get('post').length > 1 || !components.get('post', 'index', 0).length) { - $('.bottom-post-bar').removeClass('hide'); + $('.bottom-post-bar').removeClass('hidden'); } } diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index 6cf70b112c..3bf8d539b2 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -6,9 +6,7 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp var ThreadTools = {}; - ThreadTools.init = function(tid, threadState) { - ThreadTools.threadState = threadState; - + ThreadTools.init = function(tid) { components.get('topic/delete').on('click', function() { topicCommand('delete', tid); return false; @@ -118,7 +116,6 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp threadEl.find('[component="post/reply"], [component="post/quote"], [component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked); $('[component="post/header"] i.fa-lock').toggleClass('hidden', !data.isLocked); - ThreadTools.threadState.locked = data.isLocked; }; ThreadTools.setDeleteState = function(data) { @@ -133,7 +130,6 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp components.get('topic/deleted/message').toggleClass('hidden', !data.isDelete); threadEl.toggleClass('deleted', data.isDelete); - ThreadTools.threadState.deleted = data.isDelete; }; ThreadTools.setPinnedState = function(data) { @@ -142,7 +138,6 @@ define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'comp return; } - ThreadTools.threadState.pinned = data.isPinned; components.get('topic/pin').toggleClass('hidden', data.isPinned); components.get('topic/unpin').toggleClass('hidden', !data.isPinned); $('[component="post/header"] i.fa-thumb-tack').toggleClass('hidden', !data.isPinned); From b00ee4828f340855667332a6396e025a7a71debb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 22:54:09 -0400 Subject: [PATCH 052/295] removed hardcoded icons for post delete restore --- public/src/client/topic/postTools.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 4612a4f25e..14a54a30a8 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -23,9 +23,9 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator postEl.find('[component="post/quote"], [component="post/favourite"], [component="post/reply"], [component="post/flag"], [component="user/chat"]') .toggleClass('hidden', isDeleted); + postEl.find('[component="post/delete"]').toggleClass('hidden', isDeleted); + postEl.find('[component="post/restore"]').toggleClass('hidden', !isDeleted); postEl.find('[component="post/purge"]').toggleClass('hidden', !isDeleted); - postEl.find('[component="post/delete"] .i').toggleClass('fa-trash-o', !isDeleted).toggleClass('fa-history', isDeleted); - postEl.find('[component="post/delete"] span').translateHtml(isDeleted ? ' [[topic:restore]]' : ' [[topic:delete]]'); }; PostTools.updatePostCount = function() { @@ -114,7 +114,11 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator }); postContainer.on('click', '[component="post/delete"]', function(e) { - deletePost($(this), tid); + togglePostDelete($(this), tid); + }); + + postContainer.on('click', '[component="post/restore"]', function(e) { + togglePostDelete($(this), tid); }); postContainer.on('click', '[component="post/purge"]', function(e) { @@ -248,7 +252,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator return username; } - function deletePost(button, tid) { + function togglePostDelete(button, tid) { var pid = getData(button, 'data-pid'), postEl = components.get('post', 'pid', pid), action = !postEl.hasClass('deleted') ? 'delete' : 'restore'; From e7fa000fe0e87466db55daa208cf395c4905f296 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 2 Apr 2015 23:01:47 -0400 Subject: [PATCH 053/295] removed strict li selector --- public/src/client/topic/postTools.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 14a54a30a8..6296d47996 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -240,7 +240,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator function getUserName(button) { var username = '', - post = button.parents('li[data-pid]'); + post = button.parents('[data-pid]'); if (post.length) { username = post.attr('data-username').replace(/\s/g, '-'); @@ -275,7 +275,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator pid: pid, tid: tid }, function(err) { - if(err) { + if (err) { app.alertError(err.message); } }); @@ -319,7 +319,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator socket.emit('topics.movePost', {pid: pid, tid: tid}, function(err) { $('#move-post-modal').addClass('hide'); - if(err) { + if (err) { $('#topicId').val(''); return app.alertError(err.message); } @@ -337,15 +337,16 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator function flagPost(pid) { translator.translate('[[topic:flag_confirm]]', function(message) { bootbox.confirm(message, function(confirm) { - if (confirm) { - socket.emit('posts.flag', pid, function(err) { - if(err) { - return app.alertError(err.message); - } - - app.alertSuccess('[[topic:flag_success]]'); - }); + if (!confirm) { + return; } + socket.emit('posts.flag', pid, function(err) { + if (err) { + return app.alertError(err.message); + } + + app.alertSuccess('[[topic:flag_success]]'); + }); }); }); } From 70bf518a02ff2193eb5a7bc4b6595aec297efd86 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 3 Apr 2015 00:58:34 -0400 Subject: [PATCH 054/295] define all required data at top of fn --- src/topics/create.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/topics/create.js b/src/topics/create.js index f7af1d0c5e..e81e07c9ed 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -19,7 +19,8 @@ module.exports = function(Topics) { Topics.create = function(data, callback) { var uid = data.uid, title = data.title, - cid = data.cid; + cid = data.cid, + tags = data.tags; db.incrObjectField('global', 'nextTid', function(err, tid) { if (err) { @@ -78,7 +79,7 @@ module.exports = function(Topics) { db.incrObjectField('global', 'topicCount', next); }, function(next) { - Topics.createTags(data.tags, tid, timestamp, next); + Topics.createTags(tags, tid, timestamp, next); } ], function(err) { if (err) { @@ -95,7 +96,8 @@ module.exports = function(Topics) { var uid = data.uid, title = data.title, content = data.content, - cid = data.cid; + cid = data.cid, + tags = data.tags; if (title) { title = title.trim(); @@ -131,7 +133,7 @@ module.exports = function(Topics) { }, function(filteredData, next) { content = filteredData.content || data.content; - Topics.create({uid: uid, title: title, cid: cid, thumb: data.thumb, tags: data.tags}, next); + Topics.create({uid: uid, title: title, cid: cid, thumb: data.thumb, tags: tags}, next); }, function(tid, next) { Topics.reply({uid:uid, tid:tid, handle: data.handle, content:content, req: data.req}, next); From e443d1451905280f0de777a7b0a3c71dbe440af4 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 3 Apr 2015 11:17:58 -0400 Subject: [PATCH 055/295] fixes acp/categories/x menu selection @julianlam --- public/src/admin/admin.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/admin/admin.js b/public/src/admin/admin.js index 73201a2db6..8a4c6b56b2 100644 --- a/public/src/admin/admin.js +++ b/public/src/admin/admin.js @@ -114,6 +114,8 @@ } function selectMenuItem(url) { + url = url.replace(/\/\d+$/, ''); + $('#main-menu .nav-list > li').removeClass('active').each(function() { var menu = $(this), category = menu.parents('.sidebar-nav'), From f81e3ad3582501bbdee3fb1afe58d4fd5c2a7863 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Apr 2015 13:57:15 -0400 Subject: [PATCH 056/295] categoryTools componets --- public/src/client/categoryTools.js | 58 +++++++++++++++++++++--------- src/socket.io/topics.js | 1 + 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/public/src/client/categoryTools.js b/public/src/client/categoryTools.js index d5e69d1312..348ff684f8 100644 --- a/public/src/client/categoryTools.js +++ b/public/src/client/categoryTools.js @@ -13,38 +13,58 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect', 'components', topicSelect.init(updateDropdownOptions); - $('.delete_thread').on('click', function(e) { - var tids = topicSelect.getSelectedTids(); - categoryCommand(isAny(isTopicDeleted, tids) ? 'restore' : 'delete', tids); + components.get('topic/delete').on('click', function() { + categoryCommand('delete', topicSelect.getSelectedTids()); return false; }); - $('.purge_thread').on('click', function() { + components.get('topic/restore').on('click', function() { + categoryCommand('restore', topicSelect.getSelectedTids()); + return false; + }); + + components.get('topic/purge').on('click', function() { categoryCommand('purge', topicSelect.getSelectedTids()); return false; }); - $('.lock_thread').on('click', function() { + components.get('topic/lock').on('click', function() { + var tids = topicSelect.getSelectedTids(); + if (tids.length) { + socket.emit('topics.lock', {tids: tids, cid: CategoryTools.cid}, onCommandComplete); + } + return false; + }); + + components.get('topic/unlock').on('click', function() { var tids = topicSelect.getSelectedTids(); if (tids.length) { - socket.emit(isAny(isTopicLocked, tids) ? 'topics.unlock' : 'topics.lock', {tids: tids, cid: CategoryTools.cid}, onCommandComplete); + socket.emit('topics.unlock', {tids: tids, cid: CategoryTools.cid}, onCommandComplete); } return false; }); - $('.pin_thread').on('click', function() { + components.get('topic/pin').on('click', function() { var tids = topicSelect.getSelectedTids(); if (tids.length) { - socket.emit(isAny(isTopicPinned, tids) ? 'topics.unpin' : 'topics.pin', {tids: tids, cid: CategoryTools.cid}, onCommandComplete); + socket.emit('topics.pin', {tids: tids, cid: CategoryTools.cid}, onCommandComplete); } return false; }); - $('.markAsUnreadForAll').on('click', function() { + components.get('topic/unpin').on('click', function() { + var tids = topicSelect.getSelectedTids(); + if (tids.length) { + socket.emit('topics.unpin', {tids: tids, cid: CategoryTools.cid}, onCommandComplete); + } + return false; + }); + + components.get('topic/mark-unread-for-all').on('click', function() { var tids = topicSelect.getSelectedTids(); if (tids.length) { socket.emit('topics.markAsUnreadForAll', tids, function(err) { - if(err) { + if (err) { return app.alertError(err.message); } app.alertSuccess('[[topic:markAsUnreadForAll.success]]'); @@ -56,7 +76,7 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect', 'components', return false; }); - $('.move_thread').on('click', function() { + components.get('topic/move').on('click', function() { var tids = topicSelect.getSelectedTids(); if (tids.length) { @@ -65,7 +85,7 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect', 'components', return false; }); - $('.move_all_threads').on('click', function() { + components.get('topic/move-all').on('click', function() { move.init(null, cid, function(err) { ajaxify.refresh(); }); @@ -130,16 +150,22 @@ define('forum/categoryTools', ['forum/topic/move', 'topicSelect', 'components', } function updateDropdownOptions() { + var tids = topicSelect.getSelectedTids(); var isAnyDeleted = isAny(isTopicDeleted, tids); var areAllDeleted = areAll(isTopicDeleted, tids); var isAnyPinned = isAny(isTopicPinned, tids); var isAnyLocked = isAny(isTopicLocked, tids); - $('.delete_thread span').translateHtml(' [[topic:thread_tools.' + (isAnyDeleted ? 'restore' : 'delete') + ']]'); - $('.pin_thread').translateHtml(' [[topic:thread_tools.' + (isAnyPinned ? 'unpin' : 'pin') + ']]'); - $('.lock_thread').translateHtml(' [[topic:thread_tools.' + (isAnyLocked ? 'un': '') + 'lock]]'); - $('.purge_thread').toggleClass('hidden', !areAllDeleted); + components.get('topic/delete').toggleClass('hidden', isAnyDeleted); + components.get('topic/restore').toggleClass('hidden', !isAnyDeleted); + components.get('topic/purge').toggleClass('hidden', !areAllDeleted); + + components.get('topic/lock').toggleClass('hidden', isAnyLocked); + components.get('topic/unlock').toggleClass('hidden', !isAnyLocked); + + components.get('topic/pin').toggleClass('hidden', isAnyPinned); + components.get('topic/unpin').toggleClass('hidden', !isAnyPinned); } function isAny(method, tids) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 61ea05269f..d4bb12a993 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -204,6 +204,7 @@ SocketTopics.markAsUnreadForAll = function(socket, tids, callback) { return callback(err); } topics.pushUnreadCount(socket.uid); + callback(); }); }); }; From 5f2271e4e04d0289a747f4c9f4d5fef6947b0887 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Apr 2015 15:07:36 -0400 Subject: [PATCH 057/295] closes #2903 --- public/src/modules/composer.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 076a0102f0..b7171cfeea 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -37,7 +37,7 @@ define('composer', [ if (confirm) { discard(composer.active); } else { - history.pushState({}, '', '#compose'); + history.pushState({}, ''); } }); }); @@ -48,8 +48,16 @@ define('composer', [ localStorage.removeItem('category:' + data.data.cid + ':bookmark'); localStorage.removeItem('category:' + data.data.cid + ':bookmark:clicked'); ajaxify.go('topic/' + data.data.slug); + removeComposerHistory(); }); + function removeComposerHistory() { + var env = utils.findBootstrapEnvironment(); + if (env === 'xs' || env ==='sm') { + history.back(); + } + } + // Query server for formatting options socket.emit('modules.composer.getFormattingOptions', function(err, options) { composer.formatting = options; @@ -118,7 +126,7 @@ define('composer', [ var env = utils.findBootstrapEnvironment(); if (env === 'xs' || env ==='sm') { - history.pushState({}, '', '#compose'); + history.pushState({}, ''); } } @@ -354,6 +362,7 @@ define('composer', [ postContainer.find('.composer-discard').on('click', function() { if (!composer.posts[post_uuid].modified) { + removeComposerHistory(); discard(post_uuid); return; } @@ -361,6 +370,7 @@ define('composer', [ translator.translate('[[modules:composer.discard]]', function(translated) { bootbox.confirm(translated, function(confirm) { if (confirm) { + removeComposerHistory(); discard(post_uuid); } btn.prop('disabled', false); @@ -559,6 +569,7 @@ define('composer', [ $('html').removeClass('composing mobile'); + } } From 188a48059067bb5b00e12a897a0d46ffd6b1c977 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Apr 2015 18:22:18 -0400 Subject: [PATCH 058/295] use post-count component --- public/src/client/topic/postTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 6296d47996..6adf07d13e 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -31,7 +31,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator PostTools.updatePostCount = function() { socket.emit('topics.postcount', ajaxify.variables.get('topic_id'), function(err, postCount) { if (!err) { - var postCountEl = $('.topic-post-count'); + var postCountEl = components.get('topic/post-count'); postCountEl.html(postCount).attr('title', postCount); utils.makeNumbersHumanReadable(postCountEl); navigator.setCount(postCount); From 1ade973e5661428290dbe90168738d8a5ea90b9c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 3 Apr 2015 21:15:15 -0400 Subject: [PATCH 059/295] added missing radix :rage3: --- src/routes/authentication.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 247d19777a..a0f420458d 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -24,7 +24,7 @@ app.use(passport.session()); app.use(function(req, res, next) { - req.uid = req.user ? parseInt(req.user.uid) : 0; + req.uid = req.user ? parseInt(req.user.uid, 10) : 0; next(); }); From 40834cc010982b952bbb865d0230447f9108da08 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 3 Apr 2015 21:15:22 -0400 Subject: [PATCH 060/295] updated checkAccountPermissions to call requireUser, and added new hook for plugins to handle auth login --- src/middleware/middleware.js | 38 ++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 88c6dbfbd1..ced0f40674 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -32,6 +32,12 @@ var app, middleware.authenticate = function(req, res, next) { if (req.user) { return next(); + } else if (plugins.hasListeners('action:middleware.authenticate')) { + return plugins.fireHook('action:middleware.authenticate', { + req: req, + res: res, + next: next + }); } controllers.helpers.notAllowed(req, res); @@ -124,29 +130,31 @@ middleware.checkGlobalPrivacySettings = function(req, res, next) { middleware.checkAccountPermissions = function(req, res, next) { // This middleware ensures that only the requested user and admins can pass - if (!req.uid) { - return controllers.helpers.notAllowed(req, res); - } - - user.getUidByUserslug(req.params.userslug, function (err, uid) { + middleware.authenticate(req, res, function(err) { if (err) { return next(err); } - if (!uid) { - return controllers.helpers.notFound(req, res); - } + user.getUidByUserslug(req.params.userslug, function (err, uid) { + if (err) { + return next(err); + } - if (parseInt(uid, 10) === req.uid) { - return next(); - } + if (!uid) { + return controllers.helpers.notFound(req, res); + } - user.isAdministrator(req.uid, function(err, isAdmin) { - if (err || isAdmin) { - return next(err); + if (parseInt(uid, 10) === req.uid) { + return next(); } - controllers.helpers.notAllowed(req, res); + user.isAdministrator(req.uid, function(err, isAdmin) { + if (err || isAdmin) { + return next(err); + } + + controllers.helpers.notAllowed(req, res); + }); }); }); }; From 1bf6c1fd46cec60809efbeceb798cf0ede8dc0db Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 4 Apr 2015 14:23:50 -0400 Subject: [PATCH 061/295] latest translations and fallbacks --- public/language/ar/pages.json | 3 +- public/language/ar/reset_password.json | 3 +- public/language/ar/user.json | 1 + public/language/bn/pages.json | 3 +- public/language/bn/reset_password.json | 3 +- public/language/bn/user.json | 1 + public/language/cs/pages.json | 3 +- public/language/cs/reset_password.json | 3 +- public/language/cs/user.json | 1 + public/language/de/error.json | 2 +- public/language/de/modules.json | 2 +- public/language/de/pages.json | 5 +- public/language/de/reset_password.json | 3 +- public/language/de/tags.json | 2 +- public/language/de/user.json | 5 +- public/language/el/pages.json | 3 +- public/language/el/reset_password.json | 3 +- public/language/el/user.json | 1 + public/language/en@pirate/pages.json | 3 +- public/language/en@pirate/reset_password.json | 3 +- public/language/en@pirate/user.json | 1 + public/language/en_US/pages.json | 3 +- public/language/en_US/reset_password.json | 3 +- public/language/en_US/user.json | 1 + public/language/es/pages.json | 3 +- public/language/es/reset_password.json | 3 +- public/language/es/user.json | 1 + public/language/et/category.json | 2 +- public/language/et/email.json | 8 +- public/language/et/error.json | 94 +++++++++---------- public/language/et/global.json | 16 ++-- public/language/et/groups.json | 64 ++++++------- public/language/et/login.json | 6 +- public/language/et/modules.json | 8 +- public/language/et/notifications.json | 22 ++--- public/language/et/pages.json | 7 +- public/language/et/recent.json | 20 ++-- public/language/et/reset_password.json | 5 +- public/language/et/search.json | 2 +- public/language/et/tags.json | 2 +- public/language/et/topic.json | 6 +- public/language/et/user.json | 19 ++-- public/language/et/users.json | 8 +- public/language/fa_IR/category.json | 4 +- public/language/fa_IR/email.json | 34 +++---- public/language/fa_IR/error.json | 92 +++++++++--------- public/language/fa_IR/global.json | 18 ++-- public/language/fa_IR/groups.json | 64 ++++++------- public/language/fa_IR/login.json | 6 +- public/language/fa_IR/modules.json | 10 +- public/language/fa_IR/notifications.json | 24 ++--- public/language/fa_IR/pages.json | 13 +-- public/language/fa_IR/recent.json | 24 ++--- public/language/fa_IR/reset_password.json | 5 +- public/language/fa_IR/search.json | 76 +++++++-------- public/language/fa_IR/tags.json | 4 +- public/language/fa_IR/topic.json | 28 +++--- public/language/fa_IR/user.json | 35 +++---- public/language/fa_IR/users.json | 8 +- public/language/fi/pages.json | 3 +- public/language/fi/reset_password.json | 3 +- public/language/fi/user.json | 1 + public/language/fr/error.json | 2 +- public/language/fr/modules.json | 2 +- public/language/fr/pages.json | 5 +- public/language/fr/reset_password.json | 3 +- public/language/fr/tags.json | 2 +- public/language/fr/user.json | 5 +- public/language/he/pages.json | 3 +- public/language/he/reset_password.json | 3 +- public/language/he/user.json | 1 + public/language/hu/pages.json | 3 +- public/language/hu/reset_password.json | 3 +- public/language/hu/user.json | 1 + public/language/id/pages.json | 3 +- public/language/id/reset_password.json | 3 +- public/language/id/user.json | 1 + public/language/it/pages.json | 3 +- public/language/it/reset_password.json | 3 +- public/language/it/user.json | 1 + public/language/ja/pages.json | 3 +- public/language/ja/reset_password.json | 3 +- public/language/ja/user.json | 1 + public/language/ko/pages.json | 3 +- public/language/ko/reset_password.json | 3 +- public/language/ko/user.json | 1 + public/language/lt/pages.json | 3 +- public/language/lt/reset_password.json | 3 +- public/language/lt/user.json | 1 + public/language/ms/pages.json | 3 +- public/language/ms/reset_password.json | 3 +- public/language/ms/user.json | 1 + public/language/nb/pages.json | 3 +- public/language/nb/reset_password.json | 3 +- public/language/nb/user.json | 1 + public/language/nl/pages.json | 3 +- public/language/nl/reset_password.json | 3 +- public/language/nl/user.json | 1 + public/language/pl/pages.json | 3 +- public/language/pl/reset_password.json | 3 +- public/language/pl/user.json | 1 + public/language/pt_BR/error.json | 4 +- public/language/pt_BR/modules.json | 2 +- public/language/pt_BR/pages.json | 5 +- public/language/pt_BR/reset_password.json | 3 +- public/language/pt_BR/search.json | 2 +- public/language/pt_BR/tags.json | 2 +- public/language/pt_BR/user.json | 5 +- public/language/ro/pages.json | 3 +- public/language/ro/reset_password.json | 3 +- public/language/ro/user.json | 1 + public/language/ru/error.json | 2 +- public/language/ru/groups.json | 2 +- public/language/ru/modules.json | 2 +- public/language/ru/pages.json | 3 +- public/language/ru/reset_password.json | 3 +- public/language/ru/tags.json | 2 +- public/language/ru/user.json | 5 +- public/language/sc/pages.json | 3 +- public/language/sc/reset_password.json | 3 +- public/language/sc/user.json | 1 + public/language/sk/pages.json | 3 +- public/language/sk/reset_password.json | 3 +- public/language/sk/user.json | 1 + public/language/sv/pages.json | 3 +- public/language/sv/reset_password.json | 3 +- public/language/sv/user.json | 1 + public/language/th/notifications.json | 12 +-- public/language/th/pages.json | 3 +- public/language/th/reset_password.json | 3 +- public/language/th/search.json | 44 ++++----- public/language/th/user.json | 1 + public/language/tr/pages.json | 3 +- public/language/tr/reset_password.json | 3 +- public/language/tr/user.json | 1 + public/language/vi/global.json | 4 +- public/language/vi/groups.json | 20 ++-- public/language/vi/pages.json | 3 +- public/language/vi/reset_password.json | 3 +- public/language/vi/user.json | 3 +- public/language/zh_CN/error.json | 2 +- public/language/zh_CN/modules.json | 2 +- public/language/zh_CN/pages.json | 5 +- public/language/zh_CN/reset_password.json | 3 +- public/language/zh_CN/tags.json | 2 +- public/language/zh_CN/user.json | 5 +- public/language/zh_TW/pages.json | 3 +- public/language/zh_TW/reset_password.json | 3 +- public/language/zh_TW/user.json | 1 + 149 files changed, 603 insertions(+), 501 deletions(-) diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index e4183220a2..793e2fd1dd 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -5,7 +5,8 @@ "recent": "المواضيع الحديثة", "users": "المستخدمون المسجلون", "notifications": "التنبيهات", - "tags": "المواضيع المرتبطة بالوسم %1", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "تعديل \"%1\"", "user.following": "المستخدمون الذين يتبعهم %1", "user.followers": "المستخدمون الذين يتبعون %1", diff --git a/public/language/ar/reset_password.json b/public/language/ar/reset_password.json index b4f95dd780..cdd2b378a0 100644 --- a/public/language/ar/reset_password.json +++ b/public/language/ar/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "إعادة تعيين كلمة السر أرسلت", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 11e27d0fdb..a58b91915a 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -27,6 +27,7 @@ "chat": "محادثة", "follow": "تابع", "unfollow": "إلغاء المتابعة", + "more": "More", "profile_update_success": "تم تحديث الملف الشخصي بنجاح", "change_picture": "تغيير الصورة", "edit": "تعديل", diff --git a/public/language/bn/pages.json b/public/language/bn/pages.json index 0da3b3b4a7..3226cc5431 100644 --- a/public/language/bn/pages.json +++ b/public/language/bn/pages.json @@ -5,7 +5,8 @@ "recent": "সাম্প্রতিক টপিক", "users": "নিবন্ধিত সদস্যগণ", "notifications": "বিজ্ঞপ্তি", - "tags": "\"%1\" এ ট্যগকৃত টপিকসমূহ", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "সম্পাদনা \"%1\"", "user.following": "%1 যাদের অনুসরণ করেন", "user.followers": "যারা %1 কে অনুসরণ করেন", diff --git a/public/language/bn/reset_password.json b/public/language/bn/reset_password.json index 5643e1c427..dd99dd4db3 100644 --- a/public/language/bn/reset_password.json +++ b/public/language/bn/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "পাসওয়ার্ড রিসেট মেইল পাঠানো হয়েছে", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/bn/user.json b/public/language/bn/user.json index b9acb70ad0..01f9dfcef4 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -27,6 +27,7 @@ "chat": "বার্তালাপ", "follow": "অনুসরন করুন", "unfollow": "অনুসরন করা থেকে বিরত থাকুন", + "more": "More", "profile_update_success": "প্রোফাইল আপডেট সফল হয়েছে", "change_picture": "ছবি পরিবর্তন", "edit": "সম্পাদনা", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index 1bcf760876..afe6d74248 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -5,7 +5,8 @@ "recent": "Recent Topics", "users": "Registered Users", "notifications": "Notifications", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editing \"%1\"", "user.following": "People %1 Follows", "user.followers": "People who Follow %1", diff --git a/public/language/cs/reset_password.json b/public/language/cs/reset_password.json index ba87244661..566b746435 100644 --- a/public/language/cs/reset_password.json +++ b/public/language/cs/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Obnova hesla odeslána", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 46bf40cc1c..32199ae6f6 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Follow", "unfollow": "Unfollow", + "more": "More", "profile_update_success": "Profil byl úspěšně aktualizován!", "change_picture": "Změnit obrázek", "edit": "Upravit", diff --git a/public/language/de/error.json b/public/language/de/error.json index 821060aa25..5819a2ee17 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -18,7 +18,7 @@ "username-taken": "Der Benutzername ist bereits vergeben", "email-taken": "Die E-Mail-Adresse ist bereits vergeben", "email-not-confirmed": "Deine E-Mail wurde noch nicht bestätigt. Bitte klicke hier, um deine E-Mail zu bestätigen.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "Deine E-Mail wurde noch nicht bestätigt. Bitte klicke hier, um deine E-Mail zu bestätigen.", "no-email-to-confirm": "Dieses Forum setzt E-Mail-Bestätigung voraus, bitte klick hier um eine E-Mail-Adresse einzugeben", "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", "username-too-short": "Benutzername ist zu kurz", diff --git a/public/language/de/modules.json b/public/language/de/modules.json index d1c1e61f4f..8cafe4419b 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -18,5 +18,5 @@ "composer.user_said_in": "%1 sagte in %2:", "composer.user_said": "%1 sagte:", "composer.discard": "Bist du sicher, dass du diesen Post verwerfen möchtest?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Einreichen und Sperren" } \ No newline at end of file diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 1fee71d136..3bc86eb03a 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -5,7 +5,8 @@ "recent": "Neueste Themen", "users": "Registrierte User", "notifications": "Benachrichtigungen", - "tags": "Themen markiert unter \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Bearbeite \"%1\"", "user.following": "Nutzer, die %1 folgt", "user.followers": "Nutzer, die %1 folgen", @@ -14,7 +15,7 @@ "user.groups": "%1's Gruppen", "user.favourites": "Von %1 favorisierte Beiträge", "user.settings": "Benutzer-Einstellungen", - "user.watched": "Topics watched by %1", + "user.watched": "Themen angeschaut von %1", "maintenance.text": "%1 befindet sich derzeit in der Wartung. Bitte komm später wieder.", "maintenance.messageIntro": "Zusätzlich hat der Administrator diese Nachricht hinterlassen:" } \ No newline at end of file diff --git a/public/language/de/reset_password.json b/public/language/de/reset_password.json index 02d9329f7d..f7c06bb2ff 100644 --- a/public/language/de/reset_password.json +++ b/public/language/de/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Passwortzurücksetzung beantragt.", "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." + "passwords_do_not_match": "Die eingegebenen Passwörter stimmen nicht überein.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/de/tags.json b/public/language/de/tags.json index dc1c643266..0e0b1d3566 100644 --- a/public/language/de/tags.json +++ b/public/language/de/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Es gibt keine Themen mit diesem Stichwort.", "tags": "Stichwörter", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Gib hier Stichwörter ein. %1-%2 Zeichen. Drücke Enter nach jedem Stichwort", "enter_tags_here_short": "Gib Stichwörter ein...", "no_tags": "Es gibt bisher keine Stichwörter." } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 5eaf971ab8..2f069d06f4 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Folgen", "unfollow": "Nicht mehr folgen", + "more": "More", "profile_update_success": "Profil erfolgreich aktualisiert!", "change_picture": "Profilbild ändern", "edit": "Ändern", @@ -60,7 +61,7 @@ "digest_monthly": "Monatlich", "send_chat_notifications": "Sende eine E-Mail, wenn eine neue Chat-Nachricht eingeht und ich nicht online bin", "send_post_notifications": "Sende eine E-Mail wenn auf Themen die ich abonniert habe geantwortet wird", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "Manche Einstellungsänderung benötigt ein aktualisieren. Drücke hier um die Seite neu zu laden.", "has_no_follower": "Dieser User hat noch keine Follower.", "follows_no_one": "Dieser User folgt noch niemandem :(", "has_no_posts": "Dieser Nutzer hat noch nichts gepostet.", @@ -78,5 +79,5 @@ "topic_search_help": "Falls aktiviert, wird die Suche im Thema das Standardsuchverhalten des Browsers überschreiben und es Ihnen erlauben, das ganze Thema statt dessen, was sich auf dem Bildschirm befindet, zu durchsuchen.", "follow_topics_you_reply_to": "Folge Themen, auf die du antwortest.", "follow_topics_you_create": "Folge Themen, die du erstellst.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Wähle den anzuzeigenden Gruppen Titel aus" } \ No newline at end of file diff --git a/public/language/el/pages.json b/public/language/el/pages.json index 1c2deb4489..c1fc315a96 100644 --- a/public/language/el/pages.json +++ b/public/language/el/pages.json @@ -5,7 +5,8 @@ "recent": "Πρόσφατα Θέματα", "users": "Εγγεγραμμένοι Χρήστες", "notifications": "Ειδοποιήσεις", - "tags": "Θέματα με ετικέτα \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Επεξεργασία του \"%1\"", "user.following": "Άτομα που ακολουθεί ο/η %1", "user.followers": "Άτομα που ακολουθούν τον/την %1", diff --git a/public/language/el/reset_password.json b/public/language/el/reset_password.json index 1ceecfd014..7af6489001 100644 --- a/public/language/el/reset_password.json +++ b/public/language/el/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Η Επαναφορά Κωδικού Εστάλη", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/el/user.json b/public/language/el/user.json index 19a6d78974..c6eabf9362 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -27,6 +27,7 @@ "chat": "Συνομιλία", "follow": "Ακολούθησε", "unfollow": "Μην Ακολουθείς", + "more": "More", "profile_update_success": "Το προφίλ ανανεώθηκε επιτυχώς!", "change_picture": "Αλλαγή Φωτογραφίας", "edit": "Επεξεργασία", diff --git a/public/language/en@pirate/pages.json b/public/language/en@pirate/pages.json index 1bcf760876..afe6d74248 100644 --- a/public/language/en@pirate/pages.json +++ b/public/language/en@pirate/pages.json @@ -5,7 +5,8 @@ "recent": "Recent Topics", "users": "Registered Users", "notifications": "Notifications", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editing \"%1\"", "user.following": "People %1 Follows", "user.followers": "People who Follow %1", diff --git a/public/language/en@pirate/reset_password.json b/public/language/en@pirate/reset_password.json index ba9f012ea6..8f727f0b92 100644 --- a/public/language/en@pirate/reset_password.json +++ b/public/language/en@pirate/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Password Reset Sent", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/en@pirate/user.json b/public/language/en@pirate/user.json index f0467e46e3..7dfbd79589 100644 --- a/public/language/en@pirate/user.json +++ b/public/language/en@pirate/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Follow", "unfollow": "Unfollow", + "more": "More", "profile_update_success": "Profile has been updated successfully!", "change_picture": "Change Picture", "edit": "Edit", diff --git a/public/language/en_US/pages.json b/public/language/en_US/pages.json index ca0cb61e2e..8f3c442101 100644 --- a/public/language/en_US/pages.json +++ b/public/language/en_US/pages.json @@ -5,7 +5,8 @@ "recent": "Recent Topics", "users": "Registered Users", "notifications": "Notifications", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editing \"%1\"", "user.following": "People %1 Follows", "user.followers": "People who Follow %1", diff --git a/public/language/en_US/reset_password.json b/public/language/en_US/reset_password.json index ba9f012ea6..8f727f0b92 100644 --- a/public/language/en_US/reset_password.json +++ b/public/language/en_US/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Password Reset Sent", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/en_US/user.json b/public/language/en_US/user.json index b6209de55a..5551959ce5 100644 --- a/public/language/en_US/user.json +++ b/public/language/en_US/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Follow", "unfollow": "Unfollow", + "more": "More", "profile_update_success": "Profile has been updated successfully!", "change_picture": "Change Picture", "edit": "Edit", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index f8beed5e43..80662c845a 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -5,7 +5,8 @@ "recent": "Temas recientes", "users": "Usuarios registrados", "notifications": "Notificaciones", - "tags": "Temas etiquetados bajo \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editando \"%1\"", "user.following": "Gente que sigue %1 ", "user.followers": "Seguidores de %1", diff --git a/public/language/es/reset_password.json b/public/language/es/reset_password.json index da269f5448..397064aec8 100644 --- a/public/language/es/reset_password.json +++ b/public/language/es/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Restablecimiento de contraseña enviado", "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." + "passwords_do_not_match": "Las dos contraseñas introducidas no concuerdan.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/es/user.json b/public/language/es/user.json index 7accd46f09..b6f415a725 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Seguir", "unfollow": "Dejar de seguir", + "more": "More", "profile_update_success": "¡El perfil ha sido actualizado correctamente!", "change_picture": "Cambiar imágen", "edit": "Editar", diff --git a/public/language/et/category.json b/public/language/et/category.json index d3c0f6e6bd..0e02820329 100644 --- a/public/language/et/category.json +++ b/public/language/et/category.json @@ -1,6 +1,6 @@ { "new_topic_button": "Uus teema", - "guest-login-post": "Log in to post", + "guest-login-post": "Postitamiseks logi sisse", "no_topics": "Kahjuks ei leidu siin kategoorias ühtegi teemat.
Soovid postitada?", "browsing": "vaatab", "no_replies": "Keegi pole vastanud", diff --git a/public/language/et/email.json b/public/language/et/email.json index f290435e75..9f3a49318e 100644 --- a/public/language/et/email.json +++ b/public/language/et/email.json @@ -1,8 +1,8 @@ { - "password-reset-requested": "Password Reset Requested - %1!", - "welcome-to": "Welcome to %1", - "greeting_no_name": "Hello", - "greeting_with_name": "Hello %1", + "password-reset-requested": "Parooli muutmise taotlus - %1!", + "welcome-to": "Tere tulemast %1", + "greeting_no_name": "Tere", + "greeting_with_name": "Tere %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", diff --git a/public/language/et/error.json b/public/language/et/error.json index 0bbf35bd3a..c58f87f6b8 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -12,70 +12,70 @@ "invalid-title": "Vigane pealkiri!", "invalid-user-data": "Vigased kasutaja andmed", "invalid-password": "Vigane parool", - "invalid-username-or-password": "Please specify both a username and password", - "invalid-search-term": "Invalid search term", + "invalid-username-or-password": "Palun täpsusta kasutajanime ja parooli", + "invalid-search-term": "Vigane otsingusõna", "invalid-pagination-value": "Vigane lehe väärtus", "username-taken": "Kasutajanimi on juba võetud", "email-taken": "Email on võetud", - "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, please click here to confirm your email.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "email-not-confirmed": "Su emaili aadress ei ole kinnitatud, vajuta siia et kinnitada.", + "email-not-confirmed-chat": "Sõnumeid ei ole võimalik enne saata kui sinu email on kinnitatud. Kinnitamiseks vajuta siia.", + "no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email", + "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.", "username-too-short": "Kasutajanimi on liiga lühike", - "username-too-long": "Username too long", + "username-too-long": "Kasutajanimi on liiga pikk", "user-banned": "Kasutaja bannitud", - "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": "Vabandame, enne esimese postituse loomist pead ootama %1 sekundit", + "no-category": "Kategooriat ei eksisteeri", + "no-topic": "Teemat ei eksisteeri", + "no-post": "Postitust ei eksisteeri", + "no-group": "Gruppi ei eksisteeri", + "no-user": "Kasutajat ei eksisteeri", + "no-teaser": "Eelvaadet ei eksisteeri", + "no-privileges": "Sul pole piisavalt õigusi.", + "no-emailers-configured": "Emaili rakendust ei ole laetud, seega test emaili ei ole võimalik saata", "category-disabled": "Kategooria keelatud", "topic-locked": "Teema lukustatud", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Postituse muutmine on lubatud vaid %1 sekundit peale postitamist", "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.", + "content-too-short": "Palun sisesta pikem vastus. Vähemalt %1 tähemärki.", + "content-too-long": "Palun lühenda oma vastust. Postitus ei saa olla pikem kui %1 tähemärki.", + "title-too-short": "Palun sisesta pikem pealkiri. Pealkiri peaks koosnema vähemalt %1 tähemärgist.", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kbs - please upload a smaller file", + "too-many-posts": "Sa saad postitada iga %1 sekundi tagant - palun oota enne uue postituse tegemist", + "too-many-posts-newbie": "Uue kasutajana saad postitada vaid iga %1 sekundi tagant, seniks kuni oled teeninud vähemalt %2 reputatsiooni - palun oota enne uue postituse tegemist", + "tag-too-short": "Palun sisesta pikem märksõna. Märksõna peaks koosnema vähemalt %1 tähemärgist", + "tag-too-long": "Palun sisesta lühem märksõna. Märksõnad ei saa olla pikemad kui %1 tähemärki", + "file-too-big": "Maksimaalne üleslaetava faili suurus on %1 kb - vali väiksema mahuga fail", "cant-vote-self-post": "Sa ei saa hääletada enda postituse poolt", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", + "already-favourited": "Sa juba märkisid selle postituse lemmikuks", + "already-unfavourited": "Sa juba eemaldasid selle postituse lemmikute hulgast", "cant-ban-other-admins": "Sa ei saa bannida teisi administraatoreid!", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", - "invalid-file-type": "Invalid file type. Allowed types are: %1", + "invalid-image-type": "Vigane pildi formaat. Lubatud formaadid on: %1", + "invalid-image-extension": "Vigane pildi formaat", + "invalid-file-type": "Vigane faili formaat. Lubatud formaadid on: %1", "group-name-too-short": "Grupi nimi liiga lühike", "group-already-exists": "Grupp juba eksisteerib", "group-name-change-not-allowed": "Grupi nimevahetus ei ole lubatud", - "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": "Sa oled juba selle grupi liige", + "group-needs-owner": "See grupp nõuab vähemalt ühte omanikku", + "post-already-deleted": "Postitus on juba kustutatud", + "post-already-restored": "Postitus on juba taastatud", + "topic-already-deleted": "Teema on juba kustutatud", + "topic-already-restored": "Teema on juba taastatud", "topic-thumbnails-are-disabled": "Teema thumbnailid on keelatud.", "invalid-file": "Vigane fail", "uploads-are-disabled": "Üleslaadimised on keelatud", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Allkiri ei saa olla pikem kui %1 tähemärki.", "cant-chat-with-yourself": "Sa ei saa endaga vestelda!", - "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": "Kasutaja on piiranud sõnumite saatmist. Privaatsõnumi saatmiseks peab kasutaja sind jälgima", + "too-many-messages": "Oled saatnud liiga palju sõnumeid, oota natukene.", + "reputation-system-disabled": "Reputatsiooni süsteem ei ole aktiveeritud", + "downvoting-disabled": "Negatiivsete häälte andmine ei ole võimaldatud", "not-enough-reputation-to-downvote": "Sul ei ole piisavalt reputatsiooni, et anda negatiivset hinnangut sellele postitusele.", - "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", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "not-enough-reputation-to-flag": "Sul ei ole piisavalt reputatsiooni, et seda postitust raporteerida", + "reload-failed": "\"%1\" värskendamisel tekkis süsteemne viga. Foorum ei lakka töötamast, kuid peaksid kindlasti eemaldama enne värskendamist tehtud muudatused.", + "registration-error": "Viga registreerimisel", + "parse-error": "Midagi läks valesti...", + "wrong-login-type-email": "Sisse logimiseks kasuta oma emaili", + "wrong-login-type-username": "Sisse logimiseks kasuta oma kasutajanime" } \ No newline at end of file diff --git a/public/language/et/global.json b/public/language/et/global.json index 5e14fb2623..c321458196 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -3,10 +3,10 @@ "search": "Otsi", "buttons.close": "Sulge", "403.title": "Ligipääs puudub", - "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": "Tundub, et sul pole piisvalt õigusi selle lehe vaatamiseks. ", + "403.login": "Äkki peaksid sisse logima?", "404.title": "Ei leitud", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "Tundub, et lehte mida otsid, ei eksisteeri. Mine tagasi avalehele.", "500.title": "Süsteemi viga", "500.message": "Oih! Midagi läks valesti!", "register": "Registreeri", @@ -27,7 +27,7 @@ "header.tags": "Märksõnad", "header.popular": "Populaarne", "header.users": "Kasutajad", - "header.groups": "Groups", + "header.groups": "Grupid", "header.chats": "Vestlused", "header.notifications": "Teated", "header.search": "Otsi", @@ -46,8 +46,8 @@ "online": "Sees", "users": "Kasutajad", "topics": "Teemad", - "posts": "Postitused", - "views": "Vaatamised", + "posts": "Postitust", + "views": "Vaatamist", "reputation": "Reputatsioon", "read_more": "loe veel", "posted_ago_by_guest": "postitas %1 külaline", @@ -75,7 +75,7 @@ "updated.title": "Foorum on uuendatud", "updated.message": "See foorum uuendati just kõige uuemale versioonile. Vajuta siia et värskendada veebilehte.", "privacy": "Privaatsus", - "follow": "Follow", - "unfollow": "Unfollow", + "follow": "Jälgi", + "unfollow": "Ära jälgi", "delete_all": "Kustuta kõik" } \ No newline at end of file diff --git a/public/language/et/groups.json b/public/language/et/groups.json index d2314fdc29..b89b3f5c4a 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -1,34 +1,34 @@ { - "groups": "Groups", - "view_group": "View Group", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", - "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", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", - "details.owner_options": "Group Administration", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted" + "groups": "Grupid", + "view_group": "Vaata gruppi", + "owner": "Grupi omanik", + "new_group": "Loo uus grupp", + "no_groups_found": "Ei ole ühtegi gruppi", + "pending.accept": "Aktsepteeri", + "pending.reject": "Lükka tagasi", + "cover-instructions": "Lohista kaanepilt siia ning vajuta salvesta", + "cover-change": "Muuda", + "cover-save": "Salvesta", + "cover-saving": "Salvestamine", + "details.title": "Grupi detailid", + "details.members": "Liikmete nimekiri", + "details.pending": "Otsust ootavad liikmed", + "details.has_no_posts": "Selle grupi liikmed ei ole teinud ühtegi postitust.", + "details.latest_posts": "Viimased postitused", + "details.private": "Privaatne", + "details.grant": "Anna/võta omanikuõigused", + "details.kick": "Viska välja", + "details.owner_options": "Grupi haldamine", + "details.group_name": "Grupi nimi", + "details.description": "Kirjeldus", + "details.badge_preview": "Embleemi eelvaade", + "details.change_icon": "Vaheta ikooni", + "details.change_colour": "Vaheta värvi", + "details.badge_text": "Embleemi kiri", + "details.userTitleEnabled": "Näita embleemi", + "details.private_help": "Kui sisse lülitatud, siis grupiga liitumine nõuab grupi omaniku nõusolekut", + "details.hidden": "Peidetud", + "details.hidden_help": "Kui sisse lülitatud, siis seda gruppi ei kuvata gruppide nimekirjas ning liikmed tuleb lisada manuaalselt", + "event.updated": "Grupi lisainformatsiooni on uuendatud", + "event.deleted": "Grupp \"%1\" on kustutatud" } \ No newline at end of file diff --git a/public/language/et/login.json b/public/language/et/login.json index 20bd7e3f0d..6c283a8b83 100644 --- a/public/language/et/login.json +++ b/public/language/et/login.json @@ -1,7 +1,7 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "Kasutajanimi / E-mail", + "username": "Kasutajanimi", + "email": "E-mail.", "remember_me": "Mäleta mind?", "forgot_password": "Unustasid parooli?", "alternative_logins": "Alternatiivsed sisse logimise võimalused", diff --git a/public/language/et/modules.json b/public/language/et/modules.json index 2ddda85058..962558d47f 100644 --- a/public/language/et/modules.json +++ b/public/language/et/modules.json @@ -12,11 +12,11 @@ "chat.message-history": "Sõnumite ajalugu", "chat.pop-out": "Pop-out vestlus", "chat.maximize": "Suurenda", - "chat.seven_days": "7 Days", - "chat.thirty_days": "30 Days", - "chat.three_months": "3 Months", + "chat.seven_days": "7 Päeva", + "chat.thirty_days": "30 Päeva", + "chat.three_months": "3 Kuud", "composer.user_said_in": "%1 ütles %2:", "composer.user_said": "%1 ütles:", "composer.discard": "Oled kindel, et soovid selle postituse tühistada?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Kinnita ja Lukusta" } \ No newline at end of file diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 46718ce1d4..24c90fce91 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -2,24 +2,24 @@ "title": "Teated", "no_notifs": "Sul pole uusi teateid", "see_all": "Vaata kõiki teateid", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "Märgi kõik teavitused loetuks", "back_to_home": "Tagasi %1", "outgoing_link": "Väljaminev link", - "outgoing_link_message": "You are now leaving %1.", - "continue_to": "Continue to %1", - "return_to": "Return to %1", + "outgoing_link_message": "Lahkud foorumist %1.", + "continue_to": "Jätka %1", + "return_to": "Pöördu tagasi %1", "new_notification": "Uus teade", "you_have_unread_notifications": "Sul ei ole lugemata teateid.", "new_message_from": "Uus sõnum kasutajalt %1", - "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "user_flagged_post_in": "%1 flagged a post in %2", + "upvoted_your_post_in": "%1 hääletas sinu postituse poolt teemas %2.", + "moved_your_post": "%1 liigutas sinu postitust.", + "moved_your_topic": "%1 liigutas sinu teemat.", + "favourited_your_post_in": "%1 märgistas sinu postituse lemmikuks teemas %2.", + "user_flagged_post_in": "%1 raporteeris postitust %2", "user_posted_to": "Kasutaja %1 postitas vastuse teemasse %2", - "user_posted_topic": "%1 has posted a new topic: %2", + "user_posted_topic": "%1 on postitanud uue teema: %2", "user_mentioned_you_in": "%1 mainis sind postituses %2", - "user_started_following_you": "%1 started following you.", + "user_started_following_you": "%1 hakkas sind jälgima.", "email-confirmed": "Emaili aadress kinnitatud", "email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja omn nüüd täielikult aktiveeritud.", "email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index d5cffc9d46..136b1463db 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -5,16 +5,17 @@ "recent": "Hiljutised teemad", "users": "Registreeritud kasutajad", "notifications": "Teated", - "tags": "Teemad märksõnadega \"%1\"", + "tags": "Märksõnad", + "tag": "Teemad märksõnadega \"%1\"", "user.edit": "Muudan \"%1\"", "user.following": "Kasutaja %1 jälgib", "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.groups": "%1's grupid", "user.favourites": "%1's lemmikud postitused", "user.settings": "Kasutaja sätted", - "user.watched": "Topics watched by %1", + "user.watched": "Teemasid jälgib %1 kasutajat", "maintenance.text": "%1 foorumil on käimas hooldustööd. Palun külastage meid mõne aja pärast uuesti.", "maintenance.messageIntro": "Administraator on jätnud ka omaltpoolt sõnumi:" } \ No newline at end of file diff --git a/public/language/et/recent.json b/public/language/et/recent.json index 272a2b9131..96882af6a3 100644 --- a/public/language/et/recent.json +++ b/public/language/et/recent.json @@ -6,14 +6,14 @@ "year": "Aasta", "alltime": "Kogu aja vältel", "no_recent_topics": "Hetkel ei ole hiljutisi teemasid.", - "no_popular_topics": "There are no popular 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." + "no_popular_topics": "Ühtegi populaarset teemat ei leidu.", + "there-is-a-new-topic": "On loodud uus teema.", + "there-is-a-new-topic-and-a-new-post": "On loodud uus teema ning postitus.", + "there-is-a-new-topic-and-new-posts": "On loodud uus teema ning %1 uut postitust.", + "there-are-new-topics": "On loodud %1 uut teemat.", + "there-are-new-topics-and-a-new-post": "On loodud %1 uut teemat ning uus postitus.", + "there-are-new-topics-and-new-posts": "On loodud %1 uut teemat ning %2 uut postitust.", + "there-is-a-new-post": "On loodud uus postitus.", + "there-are-new-posts": "On loodud %1 uut postitust.", + "click-here-to-reload": "Värskendamiseks vajuta siia." } \ No newline at end of file diff --git a/public/language/et/reset_password.json b/public/language/et/reset_password.json index 98e4fe4fae..dec7d5ab7d 100644 --- a/public/language/et/reset_password.json +++ b/public/language/et/reset_password.json @@ -11,6 +11,7 @@ "enter_email_address": "Sisesta emaili aadress", "password_reset_sent": "Saadetud", "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." + "password_too_short": "Sisestatud parool on liiga lühike, palun vali teine parool.", + "passwords_do_not_match": "Sisestatud paroolid ei ühti.", + "password_expired": "Sinu parool on aegunud, palun vali uus parool" } \ No newline at end of file diff --git a/public/language/et/search.json b/public/language/et/search.json index 661cebbacd..b11f2d84bc 100644 --- a/public/language/et/search.json +++ b/public/language/et/search.json @@ -1,6 +1,6 @@ { "results_matching": "%1 tulemus(t) mis vastavad otsingule \"%2\", (%3 sekundit)", - "no-matches": "No matches found", + "no-matches": "Vasteid ei leitud", "in": "In", "by": "By", "titles": "Titles", diff --git a/public/language/et/tags.json b/public/language/et/tags.json index 87b8332fad..ac6ee268c0 100644 --- a/public/language/et/tags.json +++ b/public/language/et/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Teemasid, mis sisaldaksid seda märksõna, ei eksisteeri.", "tags": "Märksõnad", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Sisesta märksõnad siia, %1 kuni %2 tähemärki märksõna kohta.", "enter_tags_here_short": "Sisesta märksõnu...", "no_tags": "Siin ei ole veel ühtegi märksõna." } \ No newline at end of file diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 8992993fb9..4bb1266fdb 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -12,7 +12,7 @@ "notify_me": "Saa teateid uutest postitustest selles teemas", "quote": "Tsiteeri", "reply": "Vasta", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Logi sisse, et vastata", "edit": "Muuda", "delete": "Kustuta", "purge": "Kustuta", @@ -75,7 +75,7 @@ "fork_no_pids": "Sa ei ole postitusi valinud!", "fork_success": "Edukalt ''forkisid'' teema! Vajuta siia, et vaadata loodud teemat.", "composer.title_placeholder": "Sisesta teema pealkiri siia...", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "Nimi", "composer.discard": "Katkesta", "composer.submit": "Postita", "composer.replying_to": "Vastad %1'le", @@ -95,5 +95,5 @@ "oldest_to_newest": "Vanematest uuemateni", "newest_to_oldest": "Uuematest vanemateni", "most_votes": "Kõige rohkem hääli", - "most_posts": "Most posts" + "most_posts": "Kõige rohkem postitusi" } \ No newline at end of file diff --git a/public/language/et/user.json b/public/language/et/user.json index 2e2b7a37fa..74ffd88cf6 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -2,8 +2,8 @@ "banned": "Banned", "offline": "Väljas", "username": "Kasutajanimi", - "joindate": "Join Date", - "postcount": "Post Count", + "joindate": "Liitumiskuupäev", + "postcount": "Postitusi", "email": "Email", "confirm_email": "Kinnita email", "delete_account": "Kustuta kasutaja", @@ -18,7 +18,7 @@ "profile_views": "Vaatamisi", "reputation": "Reputatsioon", "favourites": "Lemmikud", - "watched": "Watched", + "watched": "Vaadatud", "followers": "Jälgijad", "following": "Jälgimised", "signature": "Allkiri", @@ -27,6 +27,7 @@ "chat": "Vestlus", "follow": "Jälgi", "unfollow": "Ära jälgi enam", + "more": "Rohkem", "profile_update_success": "Profiil edukalt uuendatud!", "change_picture": "Vaheta pilti", "edit": "Muuda", @@ -59,13 +60,13 @@ "digest_weekly": "Iga nädal", "digest_monthly": "Iga kuu", "send_chat_notifications": "Saada mulle email kui mulle saabub uus sõnum ja ma ei ole antud hetkel online", - "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "send_post_notifications": "Saada e-mail kui minu poolt jälgitavatele teemadele vastatakse", + "settings-require-reload": "Muudatused seadetes nõuavad lehe uuesti laadimist. Lehe värskendamiseks vajuta siia.", "has_no_follower": "Sellel kasutajal pole ühtegi jälgijat :(", "follows_no_one": "See kasutaja ei jälgi kedagi :(", "has_no_posts": "See kasutaja pole midagi postitanud veel.", "has_no_topics": "See kasutaja pole vele ühtegi teemat postitanud.", - "has_no_watched_topics": "This user didn't watch any topics yet.", + "has_no_watched_topics": "See kasutaja pole vaadanud ühtegi teemat veel.", "email_hidden": "Peidetud email", "hidden": "peidetud", "paginate_description": "Nummerda leheküljed ja postitused ning ära kasuta ''lõputut scrolli''.", @@ -74,9 +75,9 @@ "notification_sounds": "Tee häält, kui saabub teade.", "browsing": "Sirvimis sätted", "open_links_in_new_tab": "Ava väljaminevad lingid uues vaheaknas?", - "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.", + "enable_topic_searching": "Võimalda teemasisene otsing", + "topic_search_help": "Kui sisse lülitatud, siis teemasisisene otsing võtab üle brauseri tavapärase lehe otsingu käitumise ning võimaldab otsida terve teema ulatuses ainult ekraanile mahtuva teema asemel.", "follow_topics_you_reply_to": "Järgi teemasid millele vastuse kirjutad.", "follow_topics_you_create": "Järgi teemasid, mis on sinu loodud.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Vali grupile tiitel mida kuvada soovid" } \ No newline at end of file diff --git a/public/language/et/users.json b/public/language/et/users.json index ac83e6b160..40d9110d57 100644 --- a/public/language/et/users.json +++ b/public/language/et/users.json @@ -5,8 +5,8 @@ "search": "Otsi", "enter_username": "Sisesta kasutajanimi, keda soovid otsida", "load_more": "Lae veel", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", - "filter-by": "Filter By", - "online-only": "Online only", - "picture-only": "Picture only" + "users-found-search-took": "%1 kasutaja(t) leiti! Otsing kestis %2 sekundit.", + "filter-by": "Filtreeri", + "online-only": "Ainult seesolevad", + "picture-only": "Ainult pilt" } \ No newline at end of file diff --git a/public/language/fa_IR/category.json b/public/language/fa_IR/category.json index b5b2749c70..c11280e51b 100644 --- a/public/language/fa_IR/category.json +++ b/public/language/fa_IR/category.json @@ -1,9 +1,9 @@ { "new_topic_button": "جستار تازه", - "guest-login-post": "Log in to post", + "guest-login-post": "برای فرستادن دیدگاه وارد شوید", "no_topics": "هیچ جستاری در این دسته نیست.
چرا شما یکی نفرستید؟", "browsing": "بیننده‌ها", "no_replies": "هیچ کسی پاسخ نداده است.", "share_this_category": "به اشتراک‌گذاری این دسته", - "ignore": "Ignore" + "ignore": "نادیده گرفتن" } \ No newline at end of file diff --git a/public/language/fa_IR/email.json b/public/language/fa_IR/email.json index 206fe1823b..1ed97a0d8c 100644 --- a/public/language/fa_IR/email.json +++ b/public/language/fa_IR/email.json @@ -1,28 +1,28 @@ { - "password-reset-requested": "Password Reset Requested - %1!", + "password-reset-requested": "درخواست گذرواژه مجدد- %1!", "welcome-to": "به 1% خوش آمدید", "greeting_no_name": "سلام", "greeting_with_name": "سلام 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.text1": "متشکر بابت ثبت نام در %1!", + "welcome.text2": "برای فعال کردن کامل اکانت شما، ما نیاز داریم تا اطمینان حاصل کنیم که شما مالک ایمیلی که با ان ثبت نام کردید هستید.", "welcome.cta": "برای تأیید آدرس ایمیل خود اینجا کلیک کنید", - "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.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": "You have unread notifications from %1:", - "digest.latest_topics": "Latest topics from %1", + "reset.notify.subject": "گذرواژه با موفقیت تغییر کرد", + "reset.notify.text1": "به شما اعلام میداریم که در %1، گذرواژه شما با موفقیت بازنشانی شد.", + "reset.notify.text2": "اگر این را تایید نمیکنید، لطفا بلافاصله به یک مدیر اطلاع دهید.", + "digest.notifications": "شما دارای اطلاعیه نخوانده ای از %1 هستید: ", + "digest.latest_topics": "آخرین دیدگاه های %1:", "digest.cta": "برای دیدن 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", + "digest.unsub.info": "این اعداد که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", + "digest.no_topics": "در %1 گذشته هیچ جستاری فعال نبوده است", + "notif.chat.subject": "پیام گفتگوی جدیدی از %1 دریافت شد", "notif.chat.cta": "برای ادامه‌ی گفتگو اینجا کلیک کنید", - "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.", + "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/fa_IR/error.json b/public/language/fa_IR/error.json index cc32d1873e..0a1f675ef7 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -12,70 +12,70 @@ "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, please click here to confirm your email.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", + "email-not-confirmed": "پست الکترونیک شما تاکنون تایید نشده است، برای تایید ایمیل خود را اینجا را کلیک کنید.", + "email-not-confirmed-chat": "شما تا قبل از تایید رایانامه قادر به گفتگو نیستید، لطفا برای تایید رایانامه خود اینجا کلیک کنید", + "no-email-to-confirm": "این انجمن نیاز به تایید رایانامه دارد، لطفا برای وارد کردن رایانامه اینجا کلیک کنید", + "email-confirm-failed": "ما نتوانستیم رایانامه شما را تایید کنیم، لطفا بعدا دوباره سعی کنید", "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", + "user-too-new": "با عرض پوزش، شما باید ٪ 1 ثانیه قبل از ساخت اولین دیدگاه خود صبر کنید", "no-category": "دسته بندی وجود ندارد", - "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", + "no-topic": "جستار وجود ندارد.", + "no-post": "دیدگاه وجود ندارد", + "no-group": "گروه وجود ندارد", + "no-user": "کاربر وجود ندارد", + "no-teaser": "تیزر وجود ندارد", + "no-privileges": "شما دسترسی کافی برای این کار را ندارید", + "no-emailers-configured": "افزونه ایمیلی بارگیری نشده است، پس رایانامه امتحانی نمیتواند فرستاده شود", "category-disabled": "دسته غیر‌فعال شد.", "topic-locked": "جستار بسته شد.", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "شما تنها می توانید پس از 1٪ ثانیه از ارسال دیدگاه انرا ویرایش نمایید", "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.", + "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "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 اعتبار بدست آورید - لطفا قبل از ارسالِ دوباره صبر کنید", + "tag-too-short": "لطفا برچسب بلندتری را وارد کنید. برچسب هاباید حداقل شامل 1% نویسه باشند.", + "tag-too-long": "لطفا برچسب کوتاه تری را وارد کنید. برچسب ها نمیتوانند بیشتر از 1% نویسه باشند.", + "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-file-type": "Invalid file type. Allowed types are: %1", + "invalid-image-type": "نوع تصویر نامعتبر است. نوعهای قابل قبول اینها هستند: %1", + "invalid-image-extension": "پسوند عکس نامعتبر است", + "invalid-file-type": "نوع پرونده نامعتبر است. نوعهای قابل قبول اینها هستند: %1", "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": "امکان بارگذاری غیرفعال شده است.", - "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", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "not-enough-reputation-to-flag": "شما اعتبار کافی برای نشاندار کردن این دیدگاه ندارید", + "reload-failed": "NodeBB در هنگام بارگذاری مجدد با یک مشکل مواجه شده است: \"%1\". NodeBB سرویس رسانی به کلاینت های سرویس گیرنده را ادامه خواهد داد، اگرچه شما کاری را قبل از بارگیری مجدد انجام دادید بازگردانی کنید", + "registration-error": "خطای ثبت نام", + "parse-error": "هنگام تجزیه پاسخ سرور اشتباهی پیش امد", + "wrong-login-type-email": "لطفا از رایانامه خود برای ورود استفاده کنید", + "wrong-login-type-username": "لطفا از نام کاربری خود برای ورود استفاده کنید" } \ No newline at end of file diff --git a/public/language/fa_IR/global.json b/public/language/fa_IR/global.json index 6ef5ffe217..b68c1d212d 100644 --- a/public/language/fa_IR/global.json +++ b/public/language/fa_IR/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": "جستجو", @@ -39,7 +39,7 @@ "nextpage": "برگهٔ پسین", "alert.success": "موفقیت", "alert.error": "خطا", - "alert.banned": "Banned", + "alert.banned": "بن شده ها", "alert.banned.message": "دسترسی شما مسدود شد. اکنون خارج خواهید شد.", "alert.unfollow": "شما دیگر %1 را دنبال نمی‌کنید!", "alert.follow": "اکنون %1 را دنبال می‌کنید.", @@ -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/fa_IR/groups.json b/public/language/fa_IR/groups.json index d2314fdc29..25be273bbe 100644 --- a/public/language/fa_IR/groups.json +++ b/public/language/fa_IR/groups.json @@ -1,34 +1,34 @@ { - "groups": "Groups", - "view_group": "View Group", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", - "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", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", - "details.owner_options": "Group Administration", - "details.group_name": "Group Name", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted" + "groups": "گروه ها", + "view_group": "مشاهده گروه", + "owner": "مالک گروه", + "new_group": "ساخت گروه جدید", + "no_groups_found": "گروهی برای دیدن وجود ندارد", + "pending.accept": "قبول", + "pending.reject": "رد", + "cover-instructions": "کشیدن و انداختن عکس، به محل بکشید، و ذخیره را بزنید", + "cover-change": "تغییر", + "cover-save": "ذخیره", + "cover-saving": "در حال ذخیره کردن", + "details.title": "جزئیات گروه", + "details.members": "لیست اعضا", + "details.pending": "اعضای در انتظار", + "details.has_no_posts": "اعضای این گروه هیچ دیدگاهی ایجاد نکرده اند", + "details.latest_posts": "آخرین دیدگاه ها", + "details.private": "خصوصی", + "details.grant": "اعطاء/خلع مالکیت", + "details.kick": "لگد", + "details.owner_options": "مدیر گروه", + "details.group_name": "نام گروه", + "details.description": "توضیحات", + "details.badge_preview": "پیش نمایشِ نشان", + "details.change_icon": "تغییر آیکن", + "details.change_colour": "تغییر رنگ", + "details.badge_text": "نوشته ای نشان", + "details.userTitleEnabled": "نمایش نشان", + "details.private_help": "اگر فعال باشد، پیوستن به گروه مستلزم موافقت صاحب گروه است", + "details.hidden": "پنهان", + "details.hidden_help": "اگر فعال باشد، ایم گروه در فهرست گروه ها پیدا نمیشود، و کاربر باید دستی دعوت شود", + "event.updated": "جزییات گروه با موفقیت به روز گردید", + "event.deleted": "گروه \"%1\" حدف شد" } \ No newline at end of file diff --git a/public/language/fa_IR/login.json b/public/language/fa_IR/login.json index 07012aad28..7a7c99fd6b 100644 --- a/public/language/fa_IR/login.json +++ b/public/language/fa_IR/login.json @@ -1,7 +1,7 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", + "username-email": "نام کاربری / رایانامه", + "username": "نام کاربری", + "email": "رایانامه", "remember_me": "مرا به یاد بسپار؟", "forgot_password": "گذرواژه را فراموش کرده‌اید؟", "alternative_logins": "روش‌های درون آمدن جایگزین", diff --git a/public/language/fa_IR/modules.json b/public/language/fa_IR/modules.json index 0456ff2842..6c542534c3 100644 --- a/public/language/fa_IR/modules.json +++ b/public/language/fa_IR/modules.json @@ -10,13 +10,13 @@ "chat.recent-chats": "گفتگوهای اخیر", "chat.contacts": "تماس‌ها", "chat.message-history": "تاریخچه پیام‌ها", - "chat.pop-out": "Pop out chat", + "chat.pop-out": "پاپ آپ گفتگو", "chat.maximize": "تمام صفحه", - "chat.seven_days": "7 Days", - "chat.thirty_days": "30 Days", - "chat.three_months": "3 Months", + "chat.seven_days": "7 روز", + "chat.thirty_days": "30 روز", + "chat.three_months": "3 ماه", "composer.user_said_in": "%1 در %2 گفته است:", "composer.user_said": "%1 گفته است:", "composer.discard": "آیا از دور انداختن این دیدگاه اطمینان دارید؟", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "ارسال و قفل" } \ No newline at end of file diff --git a/public/language/fa_IR/notifications.json b/public/language/fa_IR/notifications.json index e56553bba6..0775c24103 100644 --- a/public/language/fa_IR/notifications.json +++ b/public/language/fa_IR/notifications.json @@ -2,24 +2,24 @@ "title": "آگاه‌سازی‌ها", "no_notifs": "هیچ آگاه‌سازی تازه‌ای ندارید", "see_all": "دیدن همهٔ آگاه‌سازی‌ها", - "mark_all_read": "Mark all notifications read", + "mark_all_read": "همه اطلاعیه ها را خوانده شده علامت بزن", "back_to_home": "بازگشت به %1", "outgoing_link": "پیوند برون‌رو", - "outgoing_link_message": "You are now leaving %1.", - "continue_to": "Continue to %1", - "return_to": "Return to %1", + "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 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", + "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": "پاسخ دادن به %2 از سوی %1", - "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.", + "user_posted_topic": "%1 یک جستار جدید ارسال کرده: %2", + "user_mentioned_you_in": "%1 در \n%1 mentioned you in %2 از شما نام برده", + "user_started_following_you": "%1 شروع به دنبال کردن شما کرده", "email-confirmed": "رایانامه تایید شد", "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", "email-confirm-error-message": "خطایی در تایید آدرس ایمیل شما پیش آمده است. ممکن است کد نا‌معتبر و یا منقضی شده باشد.", diff --git a/public/language/fa_IR/pages.json b/public/language/fa_IR/pages.json index 0daf56c95b..488fffe146 100644 --- a/public/language/fa_IR/pages.json +++ b/public/language/fa_IR/pages.json @@ -5,16 +5,17 @@ "recent": "جستارهای تازه", "users": "کاربران نام‌نویسی شده", "notifications": "آگاه‌سازی‌ها", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "ویرایش \"%1\"", - "user.following": "%1 کاربر دنبال می‌کنند", + "user.following": "کاربرانی که %1 دنبال می‌کند", "user.followers": "کاربرانی که %1 را دنبال می‌کنند", "user.posts": "دیدگاه‌های %1", "user.topics": "%1 این جستار را ساخت.", - "user.groups": "%1's Groups", + "user.groups": "گروه های %1", "user.favourites": "دیدگاه‌های پسندیدهٔ %1", "user.settings": "تنظیمات کاربر", - "user.watched": "Topics watched by %1", - "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", - "maintenance.messageIntro": "Additionally, the administrator has left this message:" + "user.watched": "جستارهای پاییده شده توسط %1", + "maintenance.text": "1% در حال حاضر تحت تعمیر و نگهدارییست. لطفا زمان دیگری مراجعه کنید.", + "maintenance.messageIntro": "علاوه بر این، مدیر این پیام را گذاشته است:" } \ No newline at end of file diff --git a/public/language/fa_IR/recent.json b/public/language/fa_IR/recent.json index 2a9060fad9..8000095b63 100644 --- a/public/language/fa_IR/recent.json +++ b/public/language/fa_IR/recent.json @@ -4,16 +4,16 @@ "week": "هفته", "month": "ماه", "year": "سال", - "alltime": "All Time", - "no_recent_topics": "There are no recent topics.", - "no_popular_topics": "There are no popular 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." + "alltime": "همه زمانها", + "no_recent_topics": "هیچ جستار تازه‌ای نیست.", + "no_popular_topics": "هیچ جستار محبوبی نیست.", + "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/fa_IR/reset_password.json b/public/language/fa_IR/reset_password.json index 5e6ea61461..8c1d2befec 100644 --- a/public/language/fa_IR/reset_password.json +++ b/public/language/fa_IR/reset_password.json @@ -11,6 +11,7 @@ "enter_email_address": "نوشتن نشانی رایانامه", "password_reset_sent": "رایانامهٔ بازیابی گذرواژه فرستاده شد", "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." + "password_too_short": "گذرواژه وارد شده خیلی کوتاه است، لطفا یک گذر واژه طولانی تر انتخاب کنید.", + "passwords_do_not_match": "دو گذرواژه ای که وارد کرده اید مطابقت ندارند.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/fa_IR/search.json b/public/language/fa_IR/search.json index 9dad8b6eab..6ed7f642e2 100644 --- a/public/language/fa_IR/search.json +++ b/public/language/fa_IR/search.json @@ -1,40 +1,40 @@ { - "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", - "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", - "reply-count": "Reply Count", - "at-least": "At least", - "at-most": "At most", - "post-time": "Post time", - "newer-than": "Newer than", - "older-than": "Older than", - "any-date": "Any date", - "yesterday": "Yesterday", - "one-week": "One week", - "two-weeks": "Two weeks", - "one-month": "One month", - "three-months": "Three months", - "six-months": "Six months", - "one-year": "One year", - "sort-by": "Sort by", - "last-reply-time": "Last reply time", - "topic-title": "Topic title", - "number-of-replies": "Number of replies", - "number-of-views": "Number of views", - "topic-start-date": "Topic start date", - "username": "Username", - "category": "Category", - "descending": "In descending order", - "ascending": "In ascending order", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "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": "به ترتیب سعودی", + "save-preferences": "ذخیره تنظیمات", + "clear-preferences": "پاک کردن تنظیمات", + "search-preferences-saved": "تنظیمات جستحو ذخیره شد", + "search-preferences-cleared": "تنظیمات جستجو پاک شد", + "show-results-as": "نمایش نتایج به عنوان" } \ No newline at end of file diff --git a/public/language/fa_IR/tags.json b/public/language/fa_IR/tags.json index 26a393396b..c373aaa4ad 100644 --- a/public/language/fa_IR/tags.json +++ b/public/language/fa_IR/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "جُستاری با این برچسب وجود ندارد.", "tags": "برچسب‌ها", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", - "enter_tags_here_short": "Enter tags...", + "enter_tags_here": "برچسب‌ها را اینجا وارد کنید. هر کدام بین %1 و %2 نویسه", + "enter_tags_here_short": "برچسب ها را وارد کنید ...", "no_tags": "هنوز برچسبی وجود ندارد." } \ No newline at end of file diff --git a/public/language/fa_IR/topic.json b/public/language/fa_IR/topic.json index f523bee5b6..2ed30ffa38 100644 --- a/public/language/fa_IR/topic.json +++ b/public/language/fa_IR/topic.json @@ -12,9 +12,9 @@ "notify_me": "از پاسخ‌های تازه در جستار آگاه شوید", "quote": "نقل قول", "reply": "پاسخ", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "وارد شوید تا دیدگاه بفرستید", "edit": "ویرایش", - "delete": "Delete", + "delete": "حذف", "purge": "پاک کردن", "restore": "برگرداندن", "move": "جابه‌جا کردن", @@ -28,17 +28,17 @@ "flag_title": "پرچم‌گذاری این جستار برای بررسی ناظران", "flag_confirm": "آیا مطمئنید که می‌خواهید روی این دیدگاه پرچم بگذارید.", "flag_success": "این جستار برای بررسی ناظران پرچم گذاشته شد.", - "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", + "deleted_message": "این جستار پاک شده است. تنها کاربرانِ با حق مدیریت جستار می‌توانند آن را ببینند.", "following_topic.message": "از این پس اگر کسی در این جستار دیدگاه بگذارد، شما آگاه خواهید شد.", "not_following_topic.message": "شما دیگر آگاه‌سازی‌های این جستار را دریافت نخواهید کرد.", "login_to_subscribe": "برای دنبال کردن این جستار، لطفا نام‌نویسی کنید یا به درون بیایید.", "markAsUnreadForAll.success": "جستار برای همگان نخوانده در نظر گرفته شد.", - "watch": "تماشا کردن", - "unwatch": "Unwatch", + "watch": "پاییدن", + "unwatch": "نپاییدن", "watch.title": "از پاسخ‌های تازه به این جستار آگاه شوید.", - "unwatch.title": "Stop watching this topic", + "unwatch.title": "توقف پاییدن این جستار", "share_this_post": "به اشتراک‌گذاری این جستار", - "thread_tools.title": "Topic Tools", + "thread_tools.title": "ابزارهای جستار", "thread_tools.markAsUnreadForAll": "نخوانده بگیر", "thread_tools.pin": "سنجاق زدن جستار", "thread_tools.unpin": "برداشتن سنجاق جستار", @@ -48,11 +48,11 @@ "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.restore_confirm": "آیا مطمئنید که می خواهید این جستار را بازگردانی کنید؟", "thread_tools.purge": "پاک کردن جستار", - "thread_tools.purge_confirm": "Are you sure you want to purge this topic?", + "thread_tools.purge_confirm": "آیا مطمئنید که می خواهید این حستار را پاکسازی کنید؟", "topic_move_success": "جابه‌جایی این جستار به %1 باموفقیت انجام شد.", "post_delete_confirm": "آیا از پاک کردن این دیدگاه اطمینان دارید؟", "post_restore_confirm": "آیا از بازگردانی این دیدگاه اطمینان دارید؟", @@ -73,9 +73,9 @@ "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": "پاسخ به %1", @@ -90,10 +90,10 @@ "more_users_and_guests": "%1 کاربر() و %2 مهمان()", "more_users": "1% کاربر()", "more_guests": "1% مهمان()", - "users_and_others": "%1 and %2 others", + "users_and_others": "%1 و %2 دیگر", "sort_by": "مرتب‌سازی بر اساس", "oldest_to_newest": "قدیمی‌ترین به جدید‌ترین", "newest_to_oldest": "جدید‌ترین به قدیمی‌ترین", "most_votes": "بیشترین رای‌ها", - "most_posts": "Most posts" + "most_posts": "بیشتر دیدگاه ها" } \ No newline at end of file diff --git a/public/language/fa_IR/user.json b/public/language/fa_IR/user.json index c2b90d3c4c..29bb70f4e9 100644 --- a/public/language/fa_IR/user.json +++ b/public/language/fa_IR/user.json @@ -1,13 +1,13 @@ { - "banned": "مسدود", + "banned": "اخراج شده", "offline": "آفلاین", "username": "نام کاربری", - "joindate": "Join Date", - "postcount": "Post Count", + "joindate": "زمان عضویت", + "postcount": "تعداد دیدگاه ها", "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.", + "delete_account": "حذف حساب کاربری", + "delete_account_confirm": "آیا مطمئنید که میخواهید حساب کاربری خود را حذف کنید؟
این عمل غیر قابل بازگشت است و شما قادر نخواهید بود هیچ کدام از اطلاعات خود را بازیابی کنید./strong>

برای تایید حذف این حساب کاربری، نام کاربری خود را وارد کنید", "fullname": "نام کامل", "website": "تارنما", "location": "محل سکونت", @@ -18,7 +18,7 @@ "profile_views": "بازدیدهای نمایه", "reputation": "اعتبار", "favourites": "پسندها", - "watched": "Watched", + "watched": "پاییده شده", "followers": "دنبال‌کننده‌ها", "following": "دنبال‌شونده‌ها", "signature": "امضا", @@ -27,12 +27,13 @@ "chat": "گفتگو", "follow": "دنبال کن", "unfollow": "دنبال نکن", + "more": "More", "profile_update_success": "نمایه باموفقیت به روز شده است!", "change_picture": "تغییر تصویر", "edit": "ویرایش", "uploaded_picture": "تصویر بارشده", "upload_new_picture": "بارگذاری تصویر تازه", - "upload_new_picture_from_url": "Upload New Picture From URL", + "upload_new_picture_from_url": "بارگذاری تصویر جدید از نشانی وب", "current_password": "گذرواژه کنونی", "change_password": "تغیر گذرواژه", "change_password_error": "گذرواژهٔ نامعتبر!", @@ -51,21 +52,21 @@ "settings": "تنظیمات", "show_email": "نمایش رایانامه‌ام", "show_fullname": "نام کامل من را نشان بده", - "restrict_chats": "Only allow chat messages from users I follow", + "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", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "send_chat_notifications": " اگر من پیام جدیدی داشتم و آنلاین نبودم یک ایمیل به من بفرست", + "send_post_notifications": "اگر به جستارهای مورد اشتراک من پاسخی داده شد یک رایانامه به من ارسال کن", + "settings-require-reload": "تغییر برخی تنظیمات مستلزم بارگذاری مجدد هستند. برای بارگذاری مجدد صفحه اینجا کلیک کنید.", "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": "محدود کردن شمار جستارها و دیدگاه‌ها در هر برگه به جای مرور بی‌پایان برگه‌ها", @@ -74,9 +75,9 @@ "notification_sounds": "پخش صدا هنگامی که شما یک آگاه‌سازی دریافت می‌کنید.", "browsing": "تنظیمات مرور", "open_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.", - "grouptitle": "Select the group title you would like to display" + "enable_topic_searching": "فعال کردن جستجوی داخل-جستار ", + "topic_search_help": "اگر فعال باشد، جستجوی داخل-جستار قابلیت جستجوی مرورگر را تغییر داده و به شما اجازه میدهد تا در کل جستار، به جای انچه در حال نمایش است جستجو کنید", + "follow_topics_you_reply_to": "دنبال کردن جستارهایی که پاسخ داده اید", + "follow_topics_you_create": "دنبال کردن جستارهایی که ساخته اید.", + "grouptitle": "عنوان گروهی که میخواهید نشان داده شود را انتخاب کنید." } \ No newline at end of file diff --git a/public/language/fa_IR/users.json b/public/language/fa_IR/users.json index b164bd0839..c313b79dd8 100644 --- a/public/language/fa_IR/users.json +++ b/public/language/fa_IR/users.json @@ -5,8 +5,8 @@ "search": "جستجو", "enter_username": "یک نام کاربری برای جستجو وارد کنید", "load_more": "بارگذاری بیش‌تر", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", - "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/fi/pages.json b/public/language/fi/pages.json index d2fc4993d6..c47769bd90 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -5,7 +5,8 @@ "recent": "Viimeisimmät aiheet", "users": "Rekisteröityneet käyttäjät", "notifications": "Ilmoitukset", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Muokataan \"%1\"", "user.following": "Käyttäjät, joita %1 seuraa", "user.followers": "Käyttäjät, jotka seuraavat käyttäjää %1", diff --git a/public/language/fi/reset_password.json b/public/language/fi/reset_password.json index 9b523e7e2b..5836ce801b 100644 --- a/public/language/fi/reset_password.json +++ b/public/language/fi/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Salasanan palautuskoodi lähetetty", "invalid_email": "Virheellinen sähköpostiosoite / Sähköpostiosoitetta ei ole olemassa!", "password_too_short": "Salasana on liian lyhyt, käytä pidempää salasanaa.", - "passwords_do_not_match": "Salasana ja sen vahvistus eivät täsmää." + "passwords_do_not_match": "Salasana ja sen vahvistus eivät täsmää.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 771ea13132..83f2888f29 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -27,6 +27,7 @@ "chat": "Keskustele", "follow": "Seuraa", "unfollow": "Älä seuraa", + "more": "More", "profile_update_success": "Profiili päivitettiin onnistuneesti!", "change_picture": "Vaihda kuva", "edit": "Muokkaa", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index b2892fde19..05a4510e95 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -18,7 +18,7 @@ "username-taken": "Nom d’utilisateur déjà utilisé", "email-taken": "Email déjà utilisé", "email-not-confirmed": "Votre adresse email n'est pas confirmée, cliquez ici pour la valider.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "Il ne vous est pas possible d'utiliser le chat tant que votre adresse email n'a pas été vérifiée. Veuillez cliquer ici pour confirmer votre adresse email.", "no-email-to-confirm": "Ce forum requiert une vérification de votre adresse email. Veuillez cliquer ici pour entrer une adresse.", "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", "username-too-short": "Nom d'utilisateur trop court", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index 8589d50ca7..b09cccdeda 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -18,5 +18,5 @@ "composer.user_said_in": "%1 a dit dans %2 :", "composer.user_said": "%1 a dit :", "composer.discard": "Êtes-vous sûr de bien vouloir supprimer ce message ?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Soumettre et Verrouiller" } \ No newline at end of file diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 9d57e1d68c..6751e2be1b 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -5,7 +5,8 @@ "recent": "Sujets récents", "users": "Utilisateurs enregistrés", "notifications": "Notifications", - "tags": "Sujets contenant le mot-clé \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Edite \"%1\"", "user.following": "Personnes que %1 suit", "user.followers": "Personnes qui suivent %1", @@ -14,7 +15,7 @@ "user.groups": "Les Groupes de %1", "user.favourites": "Messages favoris de %1", "user.settings": "Préférences utilisateur", - "user.watched": "Topics watched by %1", + "user.watched": "Sujets surveillés par %1", "maintenance.text": "%1 est en maintenance. Veuillez revenir un peu plus tard.", "maintenance.messageIntro": "De plus, l'administrateur a laissé ce message:" } \ No newline at end of file diff --git a/public/language/fr/reset_password.json b/public/language/fr/reset_password.json index f21186c870..a59fdabeb9 100644 --- a/public/language/fr/reset_password.json +++ b/public/language/fr/reset_password.json @@ -12,5 +12,6 @@ "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 !", "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." + "passwords_do_not_match": "Les deux mots de passe saisient ne correspondent pas.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/fr/tags.json b/public/language/fr/tags.json index 477f1a0b56..14881863d7 100644 --- a/public/language/fr/tags.json +++ b/public/language/fr/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Il n'y a aucun sujet ayant ce mot-clé", "tags": "Mots-clés", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Entrez les mots-clés ici. Chaque mot doit faire entre %1 et %2 caractères.", "enter_tags_here_short": "Entrez des mots-clés...", "no_tags": "Il n'y a pas encore de mots-clés." } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 2f60041e7e..0180457b25 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "S'abonner", "unfollow": "Se désabonner", + "more": "More", "profile_update_success": "Le profil a bien été mis à jour !", "change_picture": "Changer d'image", "edit": "Éditer", @@ -60,7 +61,7 @@ "digest_monthly": "Mensuel", "send_chat_notifications": "Envoyer un e-mail si un nouveau message de chat arrive lorsque je ne suis pas en ligne", "send_post_notifications": "Envoyer un email lors de réponses envoyées aux sujets auxquels je suis abonné.", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "Certains réglages nécessitent un rechargement. Cliquez ici pour recharger la page.", "has_no_follower": "Cet utilisateur n'est suivi par personne :(", "follows_no_one": "Cet utilisateur ne suit personne :(", "has_no_posts": "Ce membre n'a rien posté pour le moment", @@ -78,5 +79,5 @@ "topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts chargés.", "follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez.", "follow_topics_you_create": "Suivre les sujets que vous créez.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Sélectionnez le titre de groupe que vous souhaitez afficher" } \ No newline at end of file diff --git a/public/language/he/pages.json b/public/language/he/pages.json index 8a39e4fa58..892ba1a918 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -5,7 +5,8 @@ "recent": "נושאים אחרונים", "users": "משתמשים רשומים", "notifications": "התראות", - "tags": "נושאים שתויגו תחת \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "עורך את %1", "user.following": "אנשים ש%1 עוקב אחריהם", "user.followers": "אנשים שעוקבים אחרי %1", diff --git a/public/language/he/reset_password.json b/public/language/he/reset_password.json index 2ed1435b18..854ae07ffe 100644 --- a/public/language/he/reset_password.json +++ b/public/language/he/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "קוד איפוס סיסמה נשלח", "invalid_email": "מייל שגוי / כתובת מייל לא נמצאה", "password_too_short": "הסיסמה שבחרת קצרה מדי, אנא בחר סיסמה שונה.", - "passwords_do_not_match": "הסיסמאות שהזנת אינן תואמות." + "passwords_do_not_match": "הסיסמאות שהזנת אינן תואמות.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/he/user.json b/public/language/he/user.json index 61a45f3c5c..b57074521f 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -27,6 +27,7 @@ "chat": "צ'אט", "follow": "עקוב", "unfollow": "הפסק לעקוב", + "more": "More", "profile_update_success": "הפרופיל עודכן בהצלחה!", "change_picture": "שנה תמונה", "edit": "ערוך", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index 547e924217..e628721286 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -5,7 +5,8 @@ "recent": "Friss Topikok", "users": "Regisztrált Felhasználók", "notifications": "Értesítések", - "tags": "Témák feliratú alatt \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Szerkesztés \"%1\"", "user.following": "Tagok akiket %1 követ", "user.followers": "Tagok akik követik %1 -t", diff --git a/public/language/hu/reset_password.json b/public/language/hu/reset_password.json index 3f5721d6d6..e7183f81cc 100644 --- a/public/language/hu/reset_password.json +++ b/public/language/hu/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Jelszó-visszaállítás elküldve", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/hu/user.json b/public/language/hu/user.json index ba7f403c7c..544cda9db5 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Követés", "unfollow": "Nem követem", + "more": "More", "profile_update_success": "Profil sikeresen frissítve!", "change_picture": "Kép megváltoztatása", "edit": "Szerkeszt", diff --git a/public/language/id/pages.json b/public/language/id/pages.json index 08872d82de..43e2e94e40 100644 --- a/public/language/id/pages.json +++ b/public/language/id/pages.json @@ -5,7 +5,8 @@ "recent": "Topik Terkini", "users": "Pengguna Terdaftar", "notifications": "Pemberitahuan", - "tags": "Topik ditag dalam \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Sedang merubah \"%1\"", "user.following": "Mengikuti Pengguna %1", "user.followers": "Pengguna yang mengikuti %1", diff --git a/public/language/id/reset_password.json b/public/language/id/reset_password.json index ec65c5ca68..ddbcd319fe 100644 --- a/public/language/id/reset_password.json +++ b/public/language/id/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Pengaturan Kembali Kata Sandi telah DIkirim", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/id/user.json b/public/language/id/user.json index e7a7112465..7b9fc2346c 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -27,6 +27,7 @@ "chat": "Percakapan", "follow": "Ikuti", "unfollow": "Tinggalkan", + "more": "More", "profile_update_success": "Profil berhasil diperbarui!", "change_picture": "Ganti Gambar/Foto", "edit": "Perbarui", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index 3ab4886ae0..f76f3dec66 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -5,7 +5,8 @@ "recent": "Discussioni Recenti", "users": "Utenti Registrati", "notifications": "Notifiche", - "tags": "Discussioni taggate \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Modificando \"%1\"", "user.following": "Persone seguite da %1", "user.followers": "Persone che seguono %1", diff --git a/public/language/it/reset_password.json b/public/language/it/reset_password.json index d89642e43b..75c0cef364 100644 --- a/public/language/it/reset_password.json +++ b/public/language/it/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Password Reset Inviata", "invalid_email": "Email invalida / L'email non esiste!", "password_too_short": "La password inserita è troppo corta, inserisci una password differente.", - "passwords_do_not_match": "Le due password che hai inserito non corrispondono." + "passwords_do_not_match": "Le due password che hai inserito non corrispondono.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/it/user.json b/public/language/it/user.json index 5b31090325..9618dc572b 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Segui", "unfollow": "Smetti di seguire", + "more": "More", "profile_update_success": "Profilo aggiornato correttamente!", "change_picture": "Cambia Foto", "edit": "Modifica", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index fda23c6d35..581b33a33d 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -5,7 +5,8 @@ "recent": "最新スレッド", "users": "登録したユーザー", "notifications": "通知", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "編集中 \"%1\"", "user.following": "%1がフォロー中", "user.followers": "%1のフォロワー", diff --git a/public/language/ja/reset_password.json b/public/language/ja/reset_password.json index 7e31c22720..e446d505e6 100644 --- a/public/language/ja/reset_password.json +++ b/public/language/ja/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "パスワードリセットのメールを送信しました", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 9f94a46a32..586125e599 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -27,6 +27,7 @@ "chat": "チャット", "follow": "フォロー", "unfollow": "フォローしない", + "more": "More", "profile_update_success": "プロフィールを更新しました!", "change_picture": "画像を変更", "edit": "編集", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index d5cd1ed4a4..d3197be70b 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -5,7 +5,8 @@ "recent": "최근 주제", "users": "사용자", "notifications": "알림", - "tags": "\"%1\"로 태그된 주제", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "%1님의 프로필 수정", "user.following": "%1님이 팔로우하는 사용자", "user.followers": "%1님을 팔로우하는 사용자", diff --git a/public/language/ko/reset_password.json b/public/language/ko/reset_password.json index 60fe18c8e5..6efe6dcf01 100644 --- a/public/language/ko/reset_password.json +++ b/public/language/ko/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "이메일이 발송되었습니다.", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index bf10413609..c5186b7ce5 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -27,6 +27,7 @@ "chat": "채팅", "follow": "팔로우", "unfollow": "팔로우 취소", + "more": "More", "profile_update_success": "성공적으로 프로필을 저장했습니다.", "change_picture": "사진 변경", "edit": "프로필 수정", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index c7cd3f490f..933fd00512 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -5,7 +5,8 @@ "recent": "Paskutinės temos", "users": "Registruoti vartotojai", "notifications": "Pranešimai", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Redaguojama \"%1\"", "user.following": "Vartotojas %1 seka", "user.followers": "Žmonės, kurie seka %1", diff --git a/public/language/lt/reset_password.json b/public/language/lt/reset_password.json index b95f3800be..870d8563d0 100644 --- a/public/language/lt/reset_password.json +++ b/public/language/lt/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Slaptažodžio atstatymas išsiųstas", "invalid_email": "Klaidingas arba neegzistuojantis el. pašto adresas!", "password_too_short": "Įvestas slaptažodis yra per trumpas, prašome pasirinkti kitą slaptažodį.", - "passwords_do_not_match": "Du slaptažodžiai, kuriuos įvedėte, nesutampa." + "passwords_do_not_match": "Du slaptažodžiai, kuriuos įvedėte, nesutampa.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 3146ac252f..dfac8074b6 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -27,6 +27,7 @@ "chat": "Susirašinėti", "follow": "Sekti", "unfollow": "Nesekti", + "more": "More", "profile_update_success": "Profilis sėkmingai atnaujintas!", "change_picture": "Pakeisti paveikslėlį", "edit": "Redaguoti", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index 439217122f..d7b4bb0b72 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -5,7 +5,8 @@ "recent": "Topik Baru", "users": "Pengguna Berdaftar", "notifications": "Makluman", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Menyunting \"%1\"", "user.following": "Pengguna yang %1 Ikuti", "user.followers": "Pengguna yang Mengikuti %1", diff --git a/public/language/ms/reset_password.json b/public/language/ms/reset_password.json index 2951ed5007..596b035386 100644 --- a/public/language/ms/reset_password.json +++ b/public/language/ms/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Penetapan semula password telah dihantar", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 89969347e8..c92a2e4d4a 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -27,6 +27,7 @@ "chat": "Bersembang", "follow": "Ikuti", "unfollow": "Henti ikuti", + "more": "More", "profile_update_success": "Profil telah dikemaskini", "change_picture": "Tukar gambar", "edit": "Edit", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 4f424ec5d6..2fbcf61d29 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -5,7 +5,8 @@ "recent": "Seneste emner", "users": "Registrerte brukere", "notifications": "Varsler", - "tags": "Emner merket \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Endrer \"%1\"", "user.following": "Personer %1 følger", "user.followers": "Personer som følger %1", diff --git a/public/language/nb/reset_password.json b/public/language/nb/reset_password.json index ed6659abdf..f9cd7bdf72 100644 --- a/public/language/nb/reset_password.json +++ b/public/language/nb/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Passord-tilbakestilling sendt", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index c64972929d..dd380635b0 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -27,6 +27,7 @@ "chat": "Chatt", "follow": "Følg", "unfollow": "Avfølg", + "more": "More", "profile_update_success": "Profilen ble oppdatert!", "change_picture": "Bytt bilde", "edit": "Endre", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 3f6abeb9af..955675f48d 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -5,7 +5,8 @@ "recent": "Recente Onderwerpen", "users": "Geregistreerde Gebruikers", "notifications": "Notificaties", - "tags": "Onderwerpen getagd onder \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "\"%1\" aanpassen", "user.following": "Mensen %1 Volgt", "user.followers": "Mensen die %1 Volgen", diff --git a/public/language/nl/reset_password.json b/public/language/nl/reset_password.json index 1813eab2fe..3844bbb12f 100644 --- a/public/language/nl/reset_password.json +++ b/public/language/nl/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Wachtwoord Reset Verzonden", "invalid_email": "Fout Email Adres / Email Adres bestaat niet!", "password_too_short": "Het ingegeven wachtwoord is te kort. Kiest u alstublieft een ander wachtwoord.", - "passwords_do_not_match": "De twee wachtwoorden die u heeft ingegeven komen niet overeen." + "passwords_do_not_match": "De twee wachtwoorden die u heeft ingegeven komen niet overeen.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 6726bf11ba..95c9b61e6a 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Volgen", "unfollow": "Ontvolgen", + "more": "More", "profile_update_success": "Uw profiel is succesvol geüpdatet", "change_picture": "Afbeelding Aanpassen", "edit": "Aanpassen", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 91e9e5efe4..c566406d1a 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -5,7 +5,8 @@ "recent": "Ostatnie wątki", "users": "Zarejestrowani użytkownicy", "notifications": "Powiadomienia", - "tags": "Tematy oznaczone \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Edytowanie \"%1\"", "user.following": "Obserwowani przez %1", "user.followers": "Obserwujący %1", diff --git a/public/language/pl/reset_password.json b/public/language/pl/reset_password.json index 57b58f35e3..c152bb1aae 100644 --- a/public/language/pl/reset_password.json +++ b/public/language/pl/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Instrukcje zostały wysłane", "invalid_email": "Niepoprawny adres e-mail.", "password_too_short": "Wprowadzone hasło jest zbyt krótkie, proszę wybierz inne hasło.", - "passwords_do_not_match": "Wprowadzone hasła nie pasują do siebie" + "passwords_do_not_match": "Wprowadzone hasła nie pasują do siebie", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/pl/user.json b/public/language/pl/user.json index b0c031f94c..c02fcd355d 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -27,6 +27,7 @@ "chat": "Rozmawiaj", "follow": "Śledź", "unfollow": "Przestań śledzić", + "more": "More", "profile_update_success": "Profil został zaktualizowany pomyślnie!", "change_picture": "Zmień zdjęcie", "edit": "Edytuj", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index cb218a3d43..ec4c9c1ba5 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -18,7 +18,7 @@ "username-taken": "Nome de usuário já existe", "email-taken": "Email já cadastrado", "email-not-confirmed": "O seu email ainda não foi confirmado, por favor clique aqui para confirmar seu email.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "Você não está habilitado a conversar até que seu email seja confirmado, por favor clique aqui para confirmar seu email.", "no-email-to-confirm": "Este fórum exige confirmação de email, por gentileza clique aqui para digitar um email", "email-confirm-failed": "Nós não pudemos confirmar seu email, por gentileza tente novamente mais tarde.", "username-too-short": "Nome de usuário muito curto", @@ -35,7 +35,7 @@ "no-emailers-configured": "Nenhum plugin de email foi carregado, por isso um email de teste não pôde ser enviado", "category-disabled": "Categoria desativada", "topic-locked": "Tópico Trancado", - "post-edit-duration-expired": "Você pode editar posts por %1 segundos após postar", + "post-edit-duration-expired": "Você pode editar posts apenas %1 segundos após postar", "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": "Por favor entre com um post mais curto. Posts não podem ser maiores do que %1 caracteres.", diff --git a/public/language/pt_BR/modules.json b/public/language/pt_BR/modules.json index c899137cd6..5c93cff9cc 100644 --- a/public/language/pt_BR/modules.json +++ b/public/language/pt_BR/modules.json @@ -18,5 +18,5 @@ "composer.user_said_in": "%1 disse em %2:", "composer.user_said": "%1 disse:", "composer.discard": "Tem certeza que deseja descartar essa postagem?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Envie e Tranque" } \ No newline at end of file diff --git a/public/language/pt_BR/pages.json b/public/language/pt_BR/pages.json index edcc280f4b..d474437f75 100644 --- a/public/language/pt_BR/pages.json +++ b/public/language/pt_BR/pages.json @@ -5,7 +5,8 @@ "recent": "Tópicos Recentes", "users": "Usuários Registrados", "notifications": "Notificações", - "tags": "Tópicos com a tag \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editando \"%1\"", "user.following": "Pessoas que %1 Segue", "user.followers": "Pessoas que Seguem %1", @@ -14,7 +15,7 @@ "user.groups": "%1's Grupos", "user.favourites": "Posts Favoritos de %1", "user.settings": "Configurações de Usuário", - "user.watched": "Topics watched by %1", + "user.watched": "Topicos acompanhados por %1", "maintenance.text": "%1 está atualmente sob manutenção. Por favor retorne em outro momento.", "maintenance.messageIntro": "Adicionalmente, o administrador deixou esta mensagem:" } \ No newline at end of file diff --git a/public/language/pt_BR/reset_password.json b/public/language/pt_BR/reset_password.json index 3aa6f341b4..accc9ca98a 100644 --- a/public/language/pt_BR/reset_password.json +++ b/public/language/pt_BR/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Reconfiguração de Senha Enviada", "invalid_email": "Email Inválido / Email não existe!", "password_too_short": "A senha entrada é muito curta, por favor escolha uma senha diferente.", - "passwords_do_not_match": "As duas senhas que você digitou não combinam." + "passwords_do_not_match": "As duas senhas que você digitou não combinam.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/pt_BR/search.json b/public/language/pt_BR/search.json index 9c48e1dfc0..467fb274f4 100644 --- a/public/language/pt_BR/search.json +++ b/public/language/pt_BR/search.json @@ -13,7 +13,7 @@ "at-most": "No máximo", "post-time": "Hora da Postagem", "newer-than": "Mais novo que", - "older-than": "Mais velho que", + "older-than": "Mais antigo que", "any-date": "Qualquer data", "yesterday": "Ontem", "one-week": "Uma semana", diff --git a/public/language/pt_BR/tags.json b/public/language/pt_BR/tags.json index 1150d12f7f..90c59ec619 100644 --- a/public/language/pt_BR/tags.json +++ b/public/language/pt_BR/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Não há tópicos com esta tag.", "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Digite tags aqui, entre %1 e %2 caracteres cada.", "enter_tags_here_short": "Digite tags...", "no_tags": "Ainda não há tags." } \ No newline at end of file diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index be3033d1c3..5769ca8b25 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Seguir", "unfollow": "Deixar de Seguir", + "more": "More", "profile_update_success": "O Perfil foi atualizado com sucesso!", "change_picture": "Alterar Foto", "edit": "Editar", @@ -60,7 +61,7 @@ "digest_monthly": "Mensalmente", "send_chat_notifications": "Enviar-me um email se uma nova mensagem de chat chegar quando eu não estiver online.", "send_post_notifications": "Enviar um email quando respostas forem dadas à tópicos que eu assino", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "Algumas mudanças de configuração exigem atualizar o navegador. Clique aqui para atualizar a página.", "has_no_follower": "Este usuário não possui seguidores :(", "follows_no_one": "Este usuário não está seguindo ninguém :(", "has_no_posts": "Este usuário não postou nada ainda.", @@ -78,5 +79,5 @@ "topic_search_help": "Se habilitado, a pesquisa dentro de tópico irá substituir o funcionamento padrão de pesquisa de página do navegador e permitir que você pesquise pelo tópico todo, ao invés de apenas o que é mostrado na tela.", "follow_topics_you_reply_to": "Seguir tópicos que você responde.", "follow_topics_you_create": "Seguir tópicos que você cria.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Escolha o título do grupo que você deseja exibir" } \ No newline at end of file diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 86deca16e0..a90cdc9d1a 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -5,7 +5,8 @@ "recent": "Subiecte Noi", "users": "Utilizatori înregistrați", "notifications": "Notificări", - "tags": "Subiecte tăguite cu \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Editează \"%1\"", "user.following": "Utilizatori urmăriți de %1", "user.followers": "Utilizatori care îl urmăresc pe %1", diff --git a/public/language/ro/reset_password.json b/public/language/ro/reset_password.json index d9edc5c856..15800e2b55 100644 --- a/public/language/ro/reset_password.json +++ b/public/language/ro/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Emailul pentru resetarea parolei a fost trimis", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 7c5abe0840..2826e2a3e0 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -27,6 +27,7 @@ "chat": "Conversație", "follow": "Urmărește", "unfollow": "Oprește urmărirea", + "more": "More", "profile_update_success": "Profilul tău a fost actualizat cu succes!", "change_picture": "Schimbă Poza", "edit": "Editează", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index e4be1447a2..e3fb637e64 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -18,7 +18,7 @@ "username-taken": "Имя пользователя занято", "email-taken": "Email занят", "email-not-confirmed": "Ваш email не подтвержден, нажмите для подтверждения.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "Вы не можете оставлять сообщения, пока Ваш email не подтверждён. Нажмите на это сообщение чтобы получить письмо повторно.", "no-email-to-confirm": "Этот форум требует подтверждения по E-mail. Нажмите здесь для ввода E-mail.", "email-confirm-failed": "Мы не можем подтвердить Ваш E-mail, попробуйте позже.", "username-too-short": "Слишком короткое имя пользователя", diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 87d1f1c98e..a6c616b8eb 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -15,7 +15,7 @@ "details.pending": "Заявки в группу", "details.has_no_posts": "Пользователями этой группы не публиковали никаких записей", "details.latest_posts": "Последние записи", - "details.private": "Частный (ая)", + "details.private": "Приватная", "details.grant": "Выдать/забрать администратора", "details.kick": "Исключить", "details.owner_options": "Настройки группы", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index c707341577..7e3a1fd6dd 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -18,5 +18,5 @@ "composer.user_said_in": "%1 сказал %2:", "composer.user_said": "%1 сказал:", "composer.discard": "Вы уверены, что хотите отказаться от этого поста?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Отправить и закрыть" } \ No newline at end of file diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index b7b35fa25e..513a18cd5e 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -5,7 +5,8 @@ "recent": "Последние темы", "users": "Зарегистрированные пользователи", "notifications": "Уведомления", - "tags": "Темы с тегом \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Редактирование \"%1\"", "user.following": "%1 читает", "user.followers": "Читают %1", diff --git a/public/language/ru/reset_password.json b/public/language/ru/reset_password.json index a2226d5e60..7c88137bd6 100644 --- a/public/language/ru/reset_password.json +++ b/public/language/ru/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Пароль отправлен", "invalid_email": "Неверный Email / Email не существует!", "password_too_short": "Введенный пароль слишком короткий, пожалуйста, введите более длинный пароль.", - "passwords_do_not_match": "Введенные пароли не совпадают." + "passwords_do_not_match": "Введенные пароли не совпадают.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/ru/tags.json b/public/language/ru/tags.json index e923cccf2c..8d0ced97f2 100644 --- a/public/language/ru/tags.json +++ b/public/language/ru/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Нет топиков с таким тегом.", "tags": "Теги", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Укажите теги здесь. %1-%2 символов. Нажимайте Enter после каждого тэга.", "enter_tags_here_short": "Введите теги...", "no_tags": "Здесь еще нет тегов." } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 12797aef20..3767b2bdcc 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -27,6 +27,7 @@ "chat": "Чат", "follow": "Читать", "unfollow": "Не читать", + "more": "More", "profile_update_success": "Профиль обновлен!", "change_picture": "Изменить фотографию", "edit": "Редактировать", @@ -60,7 +61,7 @@ "digest_monthly": "За месяц", "send_chat_notifications": "Уведомлять на E-mail при поступлении нового сообщения чата, когда я оффлайн", "send_post_notifications": "Отправлять email, когда отвечают в темы, на которые я подписан(а)", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "Для отображения некоторых изменений необходимо обновить страницу. Нажмите здесь чтобы продолжить.", "has_no_follower": "Этого пользователя никто не читает :(", "follows_no_one": "Этот пользователь никого не читает :(", "has_no_posts": "Этот пользователь еще ничего не написал.", @@ -78,5 +79,5 @@ "topic_search_help": "Если включено, то стандартный \"Поиск на странице\" Вашего браузера будет осуществлять поиск по всей теме вместо одной её страницы.", "follow_topics_you_reply_to": "Следить за темами, в которых Вы отвечали.", "follow_topics_you_create": "Следить за темами, которые Вы создали.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Выберите бейдж группы для отображения" } \ No newline at end of file diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index f087a77706..96de17a0e8 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -5,7 +5,8 @@ "recent": "Ùrtimas Arresonadas", "users": "Impitadores Registrados", "notifications": "Notìficas", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Acontzende \"%1\"", "user.following": "Gente chi %1 Sighit", "user.followers": "Gente chi Sighit %1", diff --git a/public/language/sc/reset_password.json b/public/language/sc/reset_password.json index d86b716c31..5662fb238f 100644 --- a/public/language/sc/reset_password.json +++ b/public/language/sc/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Còdighe pro Torrare a Assentare sa Password Imbiadu", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 01f88d738a..42ebc279b0 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -27,6 +27,7 @@ "chat": "Tzarra", "follow": "Sighi", "unfollow": "Non sighes prus", + "more": "More", "profile_update_success": "Profile has been updated successfully!", "change_picture": "Muda Immàgine", "edit": "Acontza", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index bbf7ebeebb..12bf4b817d 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -5,7 +5,8 @@ "recent": "Najnovšie príspevky", "users": "Prihlásení uživatelia", "notifications": "Notifikácie", - "tags": "Topics tagged under \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Uprav \"%1\"", "user.following": "Užívatelia %1 následujú", "user.followers": "Užívatelia následujúci %1", diff --git a/public/language/sk/reset_password.json b/public/language/sk/reset_password.json index 2391c09cae..cafdfccd4e 100644 --- a/public/language/sk/reset_password.json +++ b/public/language/sk/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Obnova hesla odoslaná", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/sk/user.json b/public/language/sk/user.json index db1541864f..d5b3ca46b0 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Nasleduj", "unfollow": "Nenasledovať", + "more": "More", "profile_update_success": "Profil bol úspešne aktualizovaný!", "change_picture": "Zmeniť obrázok", "edit": "Upraviť", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 61fb23b776..94c6a26d0e 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -5,7 +5,8 @@ "recent": "Senaste ämnena", "users": "Registrerade användare", "notifications": "Notiser", - "tags": "Ämnen märkta med \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Ändrar \"%1\"", "user.following": "Personer %1 Följer", "user.followers": "Personer som följer %1", diff --git a/public/language/sv/reset_password.json b/public/language/sv/reset_password.json index a3771a31b4..17c4447925 100644 --- a/public/language/sv/reset_password.json +++ b/public/language/sv/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Lösenordsåterställning skickad", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index 14ceb0336a..cee28e812f 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -27,6 +27,7 @@ "chat": "Chatta", "follow": "Följ", "unfollow": "Sluta följ", + "more": "More", "profile_update_success": "Profilen uppdaterades.", "change_picture": "Ändra bild", "edit": "Ändra", diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index 53d7dc8ea7..f7383690c5 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -8,8 +8,8 @@ "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_notification": "ข้อความเตือนใหม่", + "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.", @@ -20,8 +20,8 @@ "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-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", - "email-confirm-sent": "Confirmation email sent." + "email-confirmed": "Email ได้รับการยืนยันแล้ว", + "email-confirmed-message": "ขอบคุณที่ยืนยัน Email ของคุณ บัญชีของคุณสามารถใช้งานได้แล้ว", + "email-confirm-error-message": "มีปัญหาในการยืนยัน Email ของคุณ บางทีรหัสไม่ถูกต้องหรือหมดอายุแล้ว", + "email-confirm-sent": "Email เพื่อยืนยันได้ส่งไปแล้ว" } \ No newline at end of file diff --git a/public/language/th/pages.json b/public/language/th/pages.json index 91fe3f989a..2f253c17a6 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -5,7 +5,8 @@ "recent": "กระทู้ล่าสุด", "users": "ผู้ใช้ที่ลงทะเบียน", "notifications": "แจ้งเตือน", - "tags": "หัวข้อที่ถูก Tag อยู่ภายใต้ \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "แก้ไข \"%1\"", "user.following": "ผู้ใช้ที่ %1 ติดตาม", "user.followers": "ผู้ใช้ที่ติดตาม %1", diff --git a/public/language/th/reset_password.json b/public/language/th/reset_password.json index 1b66d7dd33..b2a61b08d7 100644 --- a/public/language/th/reset_password.json +++ b/public/language/th/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "รหัสรีเซ็ตถูกส่งออกไปแล้ว", "invalid_email": "อีเมล์ไม่ถูกต้อง / อีเมล์ไม่มีอยู่!", "password_too_short": "รหัสผ่านที่คุณกำหนดยังสั้นเกินไป กรุณากำหนดรหัสผ่านของคุณใหม่", - "passwords_do_not_match": "รหัสผ่านทั้ง 2 ที่ใส่ไม่ตรงกัน" + "passwords_do_not_match": "รหัสผ่านทั้ง 2 ที่ใส่ไม่ตรงกัน", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/th/search.json b/public/language/th/search.json index 167d50d0de..b9297a6a5a 100644 --- a/public/language/th/search.json +++ b/public/language/th/search.json @@ -1,40 +1,40 @@ { "results_matching": "%1 ผลลัพธ์ ตรงตามที่ระบุ \"%2\", (%3 วินาที)", - "no-matches": "No matches found", + "no-matches": "ไม่พบผลลัพธ์ที่สอดคล้อง", "in": "In", - "by": "By", - "titles": "Titles", - "titles-posts": "Titles and Posts", - "posted-by": "Posted by", + "by": "โดย", + "titles": "หัวข้อ", + "titles-posts": "หัวข้อ และ ข้อความ", + "posted-by": "บันทึกโดย", "in-categories": "In Categories", "search-child-categories": "Search child categories", - "reply-count": "Reply Count", - "at-least": "At least", - "at-most": "At most", + "reply-count": "จำนวนข้อความตอบกลับ", + "at-least": "อย่างน้อยที่สุด", + "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", + "yesterday": "เมื่อวาน", + "one-week": "1 สัปดาห์", + "two-weeks": "2 สัปดาห์", + "one-month": "1 เดือน", + "three-months": "3 เดือน", + "six-months": "6 เดือน", + "one-year": "1 ปี", + "sort-by": "จัดเรียงโดย", + "last-reply-time": "เวลาตอบกลับล่าสุด", "topic-title": "Topic title", - "number-of-replies": "Number of replies", - "number-of-views": "Number of views", + "number-of-replies": "จำนวนข้อความตอบกลับ", + "number-of-views": "จำนวนดู", "topic-start-date": "Topic start date", "username": "Username", "category": "Category", - "descending": "In descending order", - "ascending": "In ascending order", + "descending": "เรียงจากมากไปน้อย", + "ascending": "เรียงจากน้อยไปมาก", "save-preferences": "Save preferences", "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "แสดงผลลัพธ์แบบ" } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index 5fc906103c..f4d61b4567 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -27,6 +27,7 @@ "chat": "แชท", "follow": "ติดตาม", "unfollow": "เลิกติดตาม", + "more": "More", "profile_update_success": "ข้อมูลประวัติส่วนตัวได้รับการแก้ไขแล้ว", "change_picture": "เปลี่ยนรูป", "edit": "แก้ไข", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 84f3ef0148..75f109da8f 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -5,7 +5,8 @@ "recent": "Güncel Konular", "users": "Kayıtlı Kullanıcılar", "notifications": "Bildirimler", - "tags": "“%1“ ile etiketlenmiş konular", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "\"% 1\" düzenleniyor", "user.following": "İnsanlar %1 Takip Ediyor", "user.followers": "%1 takip edenler", diff --git a/public/language/tr/reset_password.json b/public/language/tr/reset_password.json index 60f0346516..8cec7cce71 100644 --- a/public/language/tr/reset_password.json +++ b/public/language/tr/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Şifre Yenilemesi Gönderildi", "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." + "passwords_do_not_match": "Girdiğiniz iki şifre birbirine uymuyor.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index cfca7130fb..6a916492c2 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -27,6 +27,7 @@ "chat": "Sohbet", "follow": "Takip Et", "unfollow": "Takip etme", + "more": "More", "profile_update_success": "Profiliniz başarıyla güncellendi!", "change_picture": "Resmi Değiştir", "edit": "Düzenle", diff --git a/public/language/vi/global.json b/public/language/vi/global.json index a7dc6ce134..a0d3fee9b0 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -75,7 +75,7 @@ "updated.title": "Cập nhật diễn đàn", "updated.message": "Diễn đàn đã được cập nhật bản mới nhất. Click vào đây để tải lại trang.", "privacy": "Quyền riêng tư", - "follow": "Follow", - "unfollow": "Unfollow", + "follow": "Theo dõi", + "unfollow": "Huỷ theo dõi", "delete_all": "Xóa hết" } \ No newline at end of file diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index 511c942133..214fbefec9 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -1,15 +1,15 @@ { "groups": "Nhóm", "view_group": "Xem nhóm", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", + "owner": "Trưởng nhóm", + "new_group": "Tạo nhóm mới", + "no_groups_found": "Không có nhóm nào để hiển thị", + "pending.accept": "Chấp nhận", + "pending.reject": "Từ chối", "cover-instructions": "Drag and Drop a photo, drag to position, and hit Save", - "cover-change": "Change", - "cover-save": "Save", - "cover-saving": "Saving", + "cover-change": "Thay đổi", + "cover-save": "Lưu", + "cover-saving": "Đang lưu", "details.title": "Thông tin nhóm", "details.members": "Danh sách thành viên", "details.pending": "Pending Members", @@ -19,7 +19,7 @@ "details.grant": "Grant/Rescind Ownership", "details.kick": "Kick", "details.owner_options": "Group Administration", - "details.group_name": "Group Name", + "details.group_name": "Tên nhóm", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", @@ -29,6 +29,6 @@ "details.private_help": "If enabled, joining of groups requires approval from a group owner", "details.hidden": "Hidden", "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "event.updated": "Group details have been updated", + "event.updated": "Thông tin nhóm đã được cập nhật", "event.deleted": "The group \"%1\" has been deleted" } \ No newline at end of file diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index 717907a267..aa2afcd916 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -5,7 +5,8 @@ "recent": "Chủ đề gần đây", "users": "Số người dùng đã đăng ký", "notifications": "Thông báo", - "tags": "Chủ đề được tag theo \"%1\"", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "Chỉnh sửa \"%1\"", "user.following": "Người mà %1 theo dõi", "user.followers": "Người đang theo dõi %1", diff --git a/public/language/vi/reset_password.json b/public/language/vi/reset_password.json index 32db56aab3..7e3ce09565 100644 --- a/public/language/vi/reset_password.json +++ b/public/language/vi/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "Đã gửi mật khẩu được thiết lập lại", "invalid_email": "Email không đúng / Email không tồn tại!", "password_too_short": "The password entered is too short, please pick a different password.", - "passwords_do_not_match": "The two passwords you've entered do not match." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 64fa5b6cdd..9072a900d9 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -15,7 +15,7 @@ "joined": "Đã gia nhập", "lastonline": "Online lần cuối vào", "profile": "Hồ sơ", - "profile_views": "Khung hiển thị hồ sơ", + "profile_views": "Số lượt người ghé thăm", "reputation": "Mức uy tín", "favourites": "Yêu thích", "watched": "Watched", @@ -27,6 +27,7 @@ "chat": "Chat", "follow": "Theo dõi", "unfollow": "Hủy theo dõi", + "more": "More", "profile_update_success": "Hồ sơ đã được cập nhật thành công", "change_picture": "Thay đổi hình ảnh", "edit": "Chỉnh sửa", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index 0488353541..ab5ead86b5 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -18,7 +18,7 @@ "username-taken": "用户名已被占用", "email-taken": "电子邮箱已被占用", "email-not-confirmed": "您的电子邮箱尚未确认,请点击这里确认您的电子邮箱。", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "您的电子邮箱尚未确认,无法聊天,请点击这里确认您的电子邮箱。", "no-email-to-confirm": "本论坛需要电子邮箱确认,请点击这里输入一个电子邮箱地址", "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", "username-too-short": "用户名太短", diff --git a/public/language/zh_CN/modules.json b/public/language/zh_CN/modules.json index e309d83bbc..07f3cacb46 100644 --- a/public/language/zh_CN/modules.json +++ b/public/language/zh_CN/modules.json @@ -18,5 +18,5 @@ "composer.user_said_in": "%1 在 %2 中说:", "composer.user_said": "%1 说:", "composer.discard": "确定想要取消此帖?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "提交并锁定" } \ No newline at end of file diff --git a/public/language/zh_CN/pages.json b/public/language/zh_CN/pages.json index 298f183f74..422456e4f8 100644 --- a/public/language/zh_CN/pages.json +++ b/public/language/zh_CN/pages.json @@ -5,7 +5,8 @@ "recent": "最新主题", "users": "已注册用户", "notifications": "提醒", - "tags": "话题为 \"%1\" 的主题", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "正在编辑 \"%1\"", "user.following": "%1 关注", "user.followers": "关注 %1 的人", @@ -14,7 +15,7 @@ "user.groups": "%1 的用户组", "user.favourites": "%1 收藏的帖子", "user.settings": "用户设置", - "user.watched": "Topics watched by %1", + "user.watched": "主题已被 %1 关注", "maintenance.text": "%1 正在进行维护。请稍后再来。", "maintenance.messageIntro": "此外,管理员留下的消息:" } \ No newline at end of file diff --git a/public/language/zh_CN/reset_password.json b/public/language/zh_CN/reset_password.json index 9b0ca29dbe..a88d55d74f 100644 --- a/public/language/zh_CN/reset_password.json +++ b/public/language/zh_CN/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "密码重置邮件已发送。", "invalid_email": "无效的电子邮箱/电子邮箱不存在!", "password_too_short": "密码太短,请选择其他密码。", - "passwords_do_not_match": "您输入两个密码不一致。" + "passwords_do_not_match": "您输入两个密码不一致。", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/zh_CN/tags.json b/public/language/zh_CN/tags.json index 9802f9c79a..9ffbfbfb82 100644 --- a/public/language/zh_CN/tags.json +++ b/public/language/zh_CN/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "此话题还没有主题帖。", "tags": "话题", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "在这里输入话题,每个话题 %1 到 %2 个字符。", "enter_tags_here_short": "输入话题...", "no_tags": "尚无话题。" } \ No newline at end of file diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index 6d29052981..45958bda9e 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -27,6 +27,7 @@ "chat": "聊天", "follow": "关注", "unfollow": "取消关注", + "more": "More", "profile_update_success": "资料已经成功更新。", "change_picture": "更改头像", "edit": "编辑", @@ -60,7 +61,7 @@ "digest_monthly": "每月", "send_chat_notifications": "当我不在线,并受到新的聊天消息时给我发邮件", "send_post_notifications": "我订阅的主题有回复时发送邮件", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "一些设置变更需要刷新页面。点击这里刷新页面。", "has_no_follower": "此用户还没有粉丝 :(", "follows_no_one": "此用户尚未关注任何人 :(", "has_no_posts": "此用户尚未发布任何帖子。", @@ -78,5 +79,5 @@ "topic_search_help": "启用后,主题内搜索会替代浏览器默认的页面搜索,你可以在整个主题的全部内容进行搜索,而不是仅限于屏幕显示的内容。", "follow_topics_you_reply_to": "关注您回复的主题。", "follow_topics_you_create": "关注您创建的主题。", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "选择展现的组内称号" } \ No newline at end of file diff --git a/public/language/zh_TW/pages.json b/public/language/zh_TW/pages.json index 20af148f85..43825b4004 100644 --- a/public/language/zh_TW/pages.json +++ b/public/language/zh_TW/pages.json @@ -5,7 +5,8 @@ "recent": "近期的主題", "users": "已註冊的使用者", "notifications": "新訊息通知", - "tags": "符合\"%1\"標籤的主題", + "tags": "Tags", + "tag": "Topics tagged under \"%1\"", "user.edit": "編輯中 \"%1\"", "user.following": "People %1 Follows", "user.followers": "People who Follow %1", diff --git a/public/language/zh_TW/reset_password.json b/public/language/zh_TW/reset_password.json index 9f0ab67aa1..af7cbce277 100644 --- a/public/language/zh_TW/reset_password.json +++ b/public/language/zh_TW/reset_password.json @@ -12,5 +12,6 @@ "password_reset_sent": "密碼重設郵件已發送。", "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." + "passwords_do_not_match": "The two passwords you've entered do not match.", + "password_expired": "Your password has expired, please choose a new password" } \ No newline at end of file diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index 008808ae6f..5555900498 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -27,6 +27,7 @@ "chat": "聊天", "follow": "關注", "unfollow": "取消關注", + "more": "More", "profile_update_success": "您的個人資料已更新成功!", "change_picture": "改變頭像", "edit": "編輯", From 4af8a5ec02abbd650d9a474616889002d7dfbeb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 6 Apr 2015 14:31:19 -0400 Subject: [PATCH 062/295] closes #2940 --- src/controllers/tags.js | 74 +++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/src/controllers/tags.js b/src/controllers/tags.js index aba1acae60..c63e220cc8 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -5,6 +5,7 @@ var tagsController = {}, nconf = require('nconf'), validator = require('validator'), meta = require('../meta'), + user = require('../user'), topics = require('../topics'), helpers = require('./helpers'); @@ -12,43 +13,58 @@ tagsController.getTag = function(req, res, next) { var tag = validator.escape(req.params.tag); var stop = (parseInt(meta.config.topicsPerList, 10) || 20) - 1; - topics.getTagTids(tag, 0, stop, function(err, tids) { + async.waterfall([ + function(next) { + topics.getTagTids(tag, 0, stop, next); + }, + function(tids, next) { + if (Array.isArray(tids) && !tids.length) { + topics.deleteTag(tag); + return res.render('tag', { + topics: [], + tag: tag, + breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]) + }); + } + + async.parallel({ + isAdmin: async.apply(user.isAdministrator, req.uid), + topics: async.apply(topics.getTopics, tids, req.uid) + }, next); + } + ], function(err, results) { if (err) { return next(err); } - if (Array.isArray(tids) && !tids.length) { - topics.deleteTag(tag); - return res.render('tag', {topics: [], tag: tag}); + if (!results.isAdmin) { + results.topics = results.topics.filter(function(topic) { + return topic && !topic.deleted; + }); } - topics.getTopics(tids, req.uid, function(err, topics) { - if (err) { - return next(err); + res.locals.metaTags = [ + { + name: 'title', + content: tag + }, + { + property: 'og:title', + content: tag + }, + { + property: 'og:url', + content: nconf.get('url') + '/tags/' + tag } + ]; - res.locals.metaTags = [ - { - name: 'title', - content: tag - }, - { - property: 'og:title', - content: tag - }, - { - property: 'og:url', - content: nconf.get('url') + '/tags/' + tag - } - ]; - var data = { - topics: topics, - tag: tag, - nextStart: stop + 1, - breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]) - }; - res.render('tag', data); - }); + var data = { + topics: results.topics, + tag: tag, + nextStart: stop + 1, + breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]) + }; + res.render('tag', data); }); }; From b1560388a64b784f42f77d74defe7fecac797e1e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 6 Apr 2015 14:36:06 -0400 Subject: [PATCH 063/295] hint --- src/user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user.js b/src/user.js index 7ae0d17be4..281000ccc0 100644 --- a/src/user.js +++ b/src/user.js @@ -432,7 +432,7 @@ var async = require('async'), } var isMembers = checks.user.map(function(isMember, idx) { - return isMember || checks.group[idx] + return isMember || checks.group[idx]; }), map = {}; @@ -451,7 +451,7 @@ var async = require('async'), async.apply(groups.isMembers, uid, 'cid:' + cid + ':privileges:groups:moderate') ], function(err, checks) { var isModerator = checks[0].map(function(isMember, idx) { - return isMember || checks[1][idx] + return isMember || checks[1][idx]; }); filterIsModerator(null, isModerator); }); From aa1f56b31681f07177d77cc9eb79514e81c20922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 6 Apr 2015 15:15:23 -0400 Subject: [PATCH 064/295] update deps --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 288a5ad02a..990af41f21 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "mmmagic": "^0.3.13", "morgan": "^1.3.2", "nconf": "~0.7.1", - "nodebb-plugin-dbsearch": "^0.2.4", + "nodebb-plugin-dbsearch": "^0.2.5", "nodebb-plugin-emoji-extended": "^0.4.1-4", "nodebb-plugin-markdown": "^2.1.0", "nodebb-plugin-mentions": "^0.11.0", @@ -54,11 +54,11 @@ "passport-local": "1.0.0", "prompt": "^0.2.14", "request": "^2.44.0", - "rimraf": "~2.2.6", + "rimraf": "~2.3.2", "rss": "^1.0.0", - "semver": "^4.0.3", + "semver": "^4.3.3", "serve-favicon": "^2.1.5", - "sitemap": "^0.7.4", + "sitemap": "^0.8.1", "socket.io": "^1.2.1", "socket.io-client": "^1.2.1", "socket.io-redis": "^0.1.3", @@ -66,7 +66,7 @@ "string": "^3.0.0", "templates.js": "^0.1.30", "uglify-js": "git+https://github.com/julianlam/UglifyJS2.git", - "underscore": "~1.7.0", + "underscore": "~1.8.3", "validator": "^3.30.0", "winston": "^0.9.0", "xregexp": "~2.0.0" From ed57a41d177e396d9f1e655b9d12e6e62d67efe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 6 Apr 2015 16:17:29 -0400 Subject: [PATCH 065/295] #2943 --- src/controllers/admin.js | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/controllers/admin.js b/src/controllers/admin.js index c659c53446..91f8310a94 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -135,12 +135,12 @@ adminController.categories.get = function(req, res, next) { if (err) { return next(err); } - + plugins.fireHook('filter:admin.category.get', {req: req, res: res, category: data.category[0], privileges: data.privileges}, function(err, data) { if (err) { return next(err); } - + res.render('admin/manage/category', { category: data.category, privileges: data.privileges @@ -153,24 +153,27 @@ adminController.categories.getAll = function(req, res, next) { var active = [], disabled = []; - categories.getAllCategories(req.uid, function (err, categoryData) { + async.waterfall([ + function(next) { + db.getSortedSetRange('categories:cid', 0, -1, next); + }, + function(cids, next) { + categories.getCategoriesData(cids, next); + }, + function(categories, next) { + plugins.fireHook('filter:admin.categories.get', {req: req, res: res, categories: categories}, next); + } + ], function(err, data) { if (err) { return next(err); } - - plugins.fireHook('filter:admin.categories.get', {req: req, res: res, categories: categoryData}, function(err, data) { - if (err) { - return next(err); - } - - data.categories.filter(Boolean).forEach(function(category) { - (category.disabled ? disabled : active).push(category); - }); - - res.render('admin/manage/categories', { - active: active, - disabled: disabled - }); + data.categories.filter(Boolean).forEach(function(category) { + (category.disabled ? disabled : active).push(category); + }); + + res.render('admin/manage/categories', { + active: active, + disabled: disabled }); }); }; From c7c420e8698571155942f7666d278afc91e67a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 7 Apr 2015 11:44:45 -0400 Subject: [PATCH 066/295] closes #2947 --- public/src/client/login.js | 41 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/public/src/client/login.js b/public/src/client/login.js index 3032e3b35d..34fde568c8 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -13,37 +13,36 @@ define('forum/login', ['csrf', 'translator'], function(csrf, translator) { e.preventDefault(); if (!$('#username').val() || !$('#password').val()) { - translator.translate('[[error:invalid-username-or-password]]', function(translated) { - errorEl.find('p').text(translated); - errorEl.show(); - }); + errorEl.find('p').translateText('[[error:invalid-username-or-password]]'); + errorEl.show(); } else { errorEl.hide(); - if (!submitEl.hasClass('disabled')) { - submitEl.addClass('disabled'); - formEl.ajaxSubmit({ - headers: { - 'x-csrf-token': csrf.get() - }, - success: function(data, status) { - window.location.href = data; - }, - error: function(data, status) { - translator.translate(data.responseText, config.defaultLang, function(translated) { - errorEl.find('p').text(translated); - errorEl.show(); - submitEl.removeClass('disabled'); - }); - } - }); + if (submitEl.hasClass('disabled')) { + return; } + + submitEl.addClass('disabled'); + formEl.ajaxSubmit({ + headers: { + 'x-csrf-token': csrf.get() + }, + success: function(data, status) { + window.location.href = data; + }, + error: function(data, status) { + errorEl.find('p').translateText(data.responseText); + errorEl.show(); + submitEl.removeClass('disabled'); + } + }); } }); $('#login-error-notify button').on('click', function(e) { e.preventDefault(); errorEl.hide(); + return false; }); $('#content #username').focus(); From cb9a30081132a0c6e226d3d6f409c468909f2c49 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 7 Apr 2015 12:01:18 -0400 Subject: [PATCH 067/295] closed #2945 --- loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader.js b/loader.js index 0407c18302..d94afb669c 100644 --- a/loader.js +++ b/loader.js @@ -230,7 +230,7 @@ Loader.notifyWorkers = function(msg, worker_pid) { }); }; -nconf.argv().file({ +nconf.argv().env().file({ file: path.join(__dirname, '/config.json') }); From 7abbbbfccf549c6f82bc589be74013fd7e240fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 7 Apr 2015 12:19:23 -0400 Subject: [PATCH 068/295] closes #2946 --- public/src/ajaxify.js | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 515ce037af..426bac83e7 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -31,7 +31,7 @@ $(document).ready(function() { ajaxify.currentPage = null; ajaxify.go = function (url, callback, quiet) { - if (ajaxify.handleACPRedirect(url) || ajaxify.handleNonAPIRoutes(url)) { + if (ajaxify.handleRedirects(url)) { return true; } @@ -65,24 +65,17 @@ $(document).ready(function() { return true; }; - ajaxify.handleACPRedirect = function(url) { - // If ajaxifying into an admin route from regular site, do a cold load. - url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - if (url.startsWith('admin') && window.location.pathname.indexOf(RELATIVE_PATH + '/admin') !== 0) { + ajaxify.handleRedirects = function(url) { + url = ajaxify.removeRelativePath(url.replace(/\/$/, '')).toLowerCase(); + var isAdminRoute = url.startsWith('admin') && window.location.pathname.indexOf(RELATIVE_PATH + '/admin') !== 0; + var uploadsOrApi = url.startsWith('uploads') || url.startsWith('api'); + if (isAdminRoute || uploadsOrApi) { window.open(RELATIVE_PATH + '/' + url, '_blank'); return true; } return false; }; - ajaxify.handleNonAPIRoutes = function(url) { - url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); - if (url.startsWith('uploads')) { - window.open(RELATIVE_PATH + '/' + url, '_blank'); - return true; - } - return false; - }; ajaxify.start = function(url, quiet, search) { url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); From 641c8991f9055f5c44d7df76386abc4f36e10a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 7 Apr 2015 12:52:48 -0400 Subject: [PATCH 069/295] closes #2944 if going to users page wait for updateOnlineUsers to complete --- src/middleware/middleware.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index ced0f40674..6c03674483 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -48,14 +48,19 @@ middleware.applyCSRF = csrf(); middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login'); middleware.pageView = function(req, res, next) { + analytics.pageView(req.ip); + if (req.user) { user.updateLastOnlineTime(req.user.uid); - user.updateOnlineUsers(req.user.uid); + if (req.path.startsWith('/api/users') || req.path.startsWith('/users')) { + user.updateOnlineUsers(req.user.uid, next); + } else { + user.updateOnlineUsers(req.user.uid); + next(); + } + } else { + next(); } - - analytics.pageView(req.ip); - - next(); }; middleware.redirectToAccountIfLoggedIn = function(req, res, next) { From dadbda98b703454b2524a07e4c5c6bbc1c6bee59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 7 Apr 2015 13:45:46 -0400 Subject: [PATCH 070/295] closes https://github.com/NodeBB/nodebb-theme-persona/issues/52 --- public/src/app.js | 13 +++++++++++++ public/src/client/account/profile.js | 11 ++--------- public/src/client/chats.js | 11 +---------- public/src/client/topic/browsing.js | 13 ++----------- public/src/client/users.js | 13 ++----------- public/src/modules/chat.js | 12 ++---------- 6 files changed, 22 insertions(+), 51 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index 4f2c848c0b..0460e440d7 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -473,6 +473,19 @@ app.cacheBuster = null; }); } + app.updateUserStatus = function(el, status) { + if (!el.length) { + return; + } + + translator.translate('[[global:' + status + ']]', function(translated) { + el.removeClass('online offline dnd away') + .addClass(status) + .attr('title', translated) + .attr('data-original-title', translated); + }); + }; + function handleNewTopic() { $('#content').on('click', '#new_topic', function() { require(['composer'], function(composer) { diff --git a/public/src/client/account/profile.js b/public/src/client/account/profile.js index b65b998d60..263b1ae873 100644 --- a/public/src/client/account/profile.js +++ b/public/src/client/account/profile.js @@ -69,18 +69,11 @@ define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll', } function onUserStatusChange(data) { - var onlineStatus = $('.account-online-status'); - - if(parseInt(ajaxify.variables.get('theirid'), 10) !== parseInt(data.uid, 10)) { + if (parseInt(ajaxify.variables.get('theirid'), 10) !== parseInt(data.uid, 10)) { return; } - translator.translate('[[global:' + data.status + ']]', function(translated) { - onlineStatus.attr('class', 'account-online-status fa fa-circle status ' + data.status) - .attr('title', translated) - .attr('data-original-title', translated); - }); - + app.updateUserStatus($('.account [component="user/status"]'), data.status); } function loadMorePosts(direction) { diff --git a/public/src/client/chats.js b/public/src/client/chats.js index d506d81654..2e9221023f 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -163,16 +163,7 @@ define('forum/chats', ['string', 'sounds', 'forum/infinitescroll', 'translator'] }); socket.on('event:user_status_change', function(data) { - var userEl = $('.chats-list li[data-uid="' + data.uid +'"]'); - - if (userEl.length) { - var statusEl = userEl.find('.status'); - translator.translate('[[global:' + data.status + ']]', function(translated) { - statusEl.attr('class', 'fa fa-circle status ' + data.status) - .attr('title', translated) - .attr('data-original-title', translated); - }); - } + app.updateUserStatus($('.chats-list [data-uid="' + data.uid + '"] [component="user/status"]'), data.status); }); }; diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index 2a0eb1eac5..2c125ba4ec 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -12,7 +12,7 @@ define('forum/topic/browsing', ['translator'], function(translator) { if (data && data.room.indexOf('topic_' + ajaxify.variables.get('topic_id')) !== -1) { $('[component="topic/browsing/list"]').parent().toggleClass('hidden', !data.users.length); for(var i=0; i Date: Tue, 7 Apr 2015 14:15:35 -0400 Subject: [PATCH 071/295] waterfall getPostsByPids --- src/posts.js | 57 ++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/src/posts.js b/src/posts.js index e81863e44d..97c490f015 100644 --- a/src/posts.js +++ b/src/posts.js @@ -36,41 +36,36 @@ var async = require('async'), Posts.getPostsByPids = function(pids, uid, callback) { var keys = []; - for(var x=0, numPids=pids.length; x Date: Tue, 7 Apr 2015 15:37:20 -0400 Subject: [PATCH 072/295] fix image url in relative_path install in post --- src/controllers/uploads.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index 79ae6fae19..1c99026463 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -5,6 +5,7 @@ var uploadsController = {}, fs = require('fs'), path = require('path'), async = require('async'), + nconf = require('nconf'), validator = require('validator'), meta = require('../meta'), @@ -118,7 +119,7 @@ function uploadFile(uid, uploadedFile, callback) { if (uploadedFile.size > parseInt(meta.config.maximumFileSize, 10) * 1024) { return callback(new Error('[[error:file-too-big, ' + meta.config.maximumFileSize + ']]')); } - + var filename = uploadedFile.name || 'upload'; filename = Date.now() + '-' + validator.escape(filename).substr(0, 255); @@ -128,7 +129,7 @@ function uploadFile(uid, uploadedFile, callback) { } callback(null, { - url: upload.url, + url: nconf.get('relative_path') + upload.url, name: uploadedFile.name }); }); From e0996d67cac0b3fa65e591f0a7bf4bfa17954844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 7 Apr 2015 15:44:30 -0400 Subject: [PATCH 073/295] more rel_path upload fixes --- src/controllers/admin/uploads.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 193b20b6d5..88509df0a0 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -2,6 +2,7 @@ var fs = require('fs'), path = require('path'), + nconf = require('nconf'), file = require('../../file'), plugins = require('../../plugins'); @@ -37,7 +38,7 @@ uploadsController.uploadFavicon = function(req, res, next) { return next(err); } - res.json([{name: uploadedFile.name, url: image.url}]); + res.json([{name: uploadedFile.name, url: nconf.get('relative_path') + image.url}]); }); } }; @@ -76,8 +77,7 @@ function uploadImage(filename, folder, uploadedFile, req, res, next) { if (err) { return next(err); } - - res.json([{name: uploadedFile.name, url: image.url}]); + res.json([{name: uploadedFile.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url}]); } if (plugins.hasListeners('filter:uploadImage')) { From 9d026919ac90a63496a63623af5bbdd2ca9d6de3 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 7 Apr 2015 17:23:44 -0400 Subject: [PATCH 074/295] closes #2953 --- public/src/modules/composer.js | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index b7171cfeea..37ce00ecfc 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -285,9 +285,10 @@ define('composer', [ composer.bsEnvironment = utils.findBootstrapEnvironment(); var data = { + title: postData.title, mobile: composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm', allowTopicsThumbnail: allowTopicsThumbnail, - showTags: isTopic || isMain, + isTopicOrMain: isTopic || isMain, minimumTagLength: config.minimumTagLength, maximumTagLength: config.maximumTagLength, isTopic: isTopic, @@ -317,8 +318,6 @@ define('composer', [ tags.init(postContainer, composer.posts[post_uuid]); categoryList.init(postContainer, composer.posts[post_uuid]); - updateTitle(postData, postContainer); - activate(post_uuid); resize.reposition(postContainer); @@ -431,27 +430,6 @@ define('composer', [ }); } - function updateTitle(postData, postContainer) { - var titleEl = postContainer.find('.title'); - - if (parseInt(postData.tid, 10) > 0) { - titleEl.translateVal('[[topic:composer.replying_to, "' + postData.title + '"]]'); - titleEl.prop('disabled', true); - } else if (parseInt(postData.pid, 10) > 0) { - titleEl.val(postData.title); - titleEl.prop('disabled', true); - socket.emit('modules.composer.editCheck', postData.pid, function(err, editCheck) { - if (!err && editCheck.titleEditable) { - titleEl.prop('disabled', false); - } - }); - - } else { - titleEl.val(postData.title); - titleEl.prop('disabled', false); - } - } - function activate(post_uuid) { if(composer.active && composer.active !== post_uuid) { composer.minimize(composer.active); From 01542647d44f78b6f6c94545a4473ea4532e39aa Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 7 Apr 2015 18:06:42 -0400 Subject: [PATCH 075/295] no need to add img-responsive to all images anymore --- public/src/client/topic/posts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 0b8988bebf..2104bc04fa 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -253,7 +253,7 @@ define('forum/topic/posts', [ utils.addCommasToNumbers(element.find('.formatted-number')); utils.makeNumbersHumanReadable(element.find('.human-readable-number')); element.find('.timeago').timeago(); - element.find('[component="post/content"] img:not(.emoji)').addClass('img-responsive').each(function() { + element.find('[component="post/content"] img:not(.emoji)').each(function() { var $this = $(this); if (!$this.parent().is('a')) { $this.wrap(''); From 0d515803e448ce097d574cd1112ffd4a00496603 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 7 Apr 2015 20:46:11 -0400 Subject: [PATCH 076/295] fix post edit --- public/src/modules/composer.js | 2 +- src/postTools.js | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 37ce00ecfc..3a0e9d2d57 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -465,7 +465,7 @@ define('composer', [ thumbEl.val(thumbEl.val().trim()); } - var checkTitle = parseInt(postData.cid, 10) || parseInt(postData.pid, 10); + var checkTitle = (parseInt(postData.cid, 10) || parseInt(postData.pid, 10)) && postContainer.find('input.title').length; if (uploads.inProgress[post_uuid] && uploads.inProgress[post_uuid].length) { return composerAlert(post_uuid, '[[error:still-uploading]]'); diff --git a/src/postTools.js b/src/postTools.js index cb3b1da938..41f0a4b6ed 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -89,10 +89,14 @@ var cache = LRU({ tid: tid, cid: results.cid, uid: postData.uid, - mainPid: data.pid, - title: title, - slug: tid + '/' + utils.slugify(title) + mainPid: data.pid }; + + if (title) { + topicData.title = title; + topicData.slug = tid + '/' + utils.slugify(title); + } + if (options.topic_thumb) { topicData.thumb = options.topic_thumb; } From e33a905f55c44e1c5717fe6c8e1dc02af7a1feb0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 7 Apr 2015 20:46:20 -0400 Subject: [PATCH 077/295] missing change --- src/socket.io/posts.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 21825fec07..d1a5bb7e39 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -276,13 +276,13 @@ SocketPosts.getRawPost = function(socket, pid, callback) { }; SocketPosts.edit = function(socket, data, callback) { - if(!socket.uid) { + if (!socket.uid) { return callback(new Error('[[error:not-logged-in]]')); - } else if(!data || !data.pid || !data.title || !data.content) { + } else if (!data || !data.pid || !data.content) { return callback(new Error('[[error:invalid-data]]')); - } else if (!data.title || data.title.length < parseInt(meta.config.minimumTitleLength, 10)) { + } else if (data.title && data.title.length < parseInt(meta.config.minimumTitleLength, 10)) { return callback(new Error('[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]')); - } else if (data.title.length > parseInt(meta.config.maximumTitleLength, 10)) { + } else if (data.title && data.title.length > parseInt(meta.config.maximumTitleLength, 10)) { return callback(new Error('[[error:title-too-long, ' + meta.config.maximumTitleLength + ']]')); } else if (!data.content || data.content.length < parseInt(meta.config.minimumPostLength, 10)) { return callback(new Error('[[error:content-too-short, ' + meta.config.minimumPostLength + ']]')); From b8156016497e3f9b07462a6aa74df0487eb5dd22 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 7 Apr 2015 21:57:19 -0400 Subject: [PATCH 078/295] https://github.com/NodeBB/nodebb-theme-persona/issues/59 --- public/src/client/topic/events.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index eb64299dde..77690dc9d9 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -98,11 +98,11 @@ define('forum/topic/events', [ function onPostEdited(data) { var editedPostEl = components.get('post/content', data.pid), - editedPostHeader = components.get('post/header', data.pid); + topicTitle = components.get('topic/title'); - if (editedPostHeader.length) { - editedPostHeader.fadeOut(250, function() { - editedPostHeader.html(data.title).fadeIn(250); + if (topicTitle.length) { + topicTitle.fadeOut(250, function() { + topicTitle.html(data.title).fadeIn(250); }); } From 3c0c80678025151eddc821ddc3d1921d125fb5a8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 7 Apr 2015 21:58:08 -0400 Subject: [PATCH 079/295] updated latest translations --- public/language/de/pages.json | 4 ++-- public/language/de/reset_password.json | 2 +- public/language/de/user.json | 2 +- public/language/et/global.json | 2 +- public/language/et/topic.json | 2 +- public/language/fr/pages.json | 4 ++-- public/language/fr/reset_password.json | 6 +++--- public/language/fr/user.json | 2 +- public/language/ru/pages.json | 4 ++-- public/language/ru/reset_password.json | 2 +- public/language/ru/user.json | 2 +- public/language/vi/global.json | 4 ++-- public/language/vi/recent.json | 8 ++++---- public/language/vi/topic.json | 8 ++++---- public/language/vi/user.json | 16 ++++++++-------- public/language/zh_CN/pages.json | 4 ++-- public/language/zh_CN/reset_password.json | 2 +- public/language/zh_CN/user.json | 2 +- 18 files changed, 38 insertions(+), 38 deletions(-) diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 3bc86eb03a..781ccb7962 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -5,8 +5,8 @@ "recent": "Neueste Themen", "users": "Registrierte User", "notifications": "Benachrichtigungen", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "Markierungen", + "tag": "Themen markiert unter \"%1\"", "user.edit": "Bearbeite \"%1\"", "user.following": "Nutzer, die %1 folgt", "user.followers": "Nutzer, die %1 folgen", diff --git a/public/language/de/reset_password.json b/public/language/de/reset_password.json index f7c06bb2ff..3428ad3375 100644 --- a/public/language/de/reset_password.json +++ b/public/language/de/reset_password.json @@ -13,5 +13,5 @@ "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.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "Dein Passwort ist abgelaufen, bitte wähle ein neues Passwort" } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 2f069d06f4..dcd3570fdd 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -27,7 +27,7 @@ "chat": "Chat", "follow": "Folgen", "unfollow": "Nicht mehr folgen", - "more": "More", + "more": "Mehr", "profile_update_success": "Profil erfolgreich aktualisiert!", "change_picture": "Profilbild ändern", "edit": "Ändern", diff --git a/public/language/et/global.json b/public/language/et/global.json index c321458196..b383959064 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -54,7 +54,7 @@ "posted_ago_by": "postitas %1 kasutaja %2", "posted_ago": "postitatud %1", "posted_in_ago_by_guest": "külaline postitas kategooriasse %1 %2 ", - "posted_in_ago_by": "%3 postitatas %2 kategooriasse %1", + "posted_in_ago_by": "%3 postitas %2 kategooriasse %1", "posted_in_ago": "postitas kategooriasse %1 %2", "replied_ago": "vastas %1", "user_posted_ago": "%1 postitas %2", diff --git a/public/language/et/topic.json b/public/language/et/topic.json index 4bb1266fdb..f5d72479c9 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -27,7 +27,7 @@ "bookmark_instructions": "Vajuta siia, et pöörduda tagasi oma viimasesse asukohta või sulge.", "flag_title": "Märgista see postitus modereerimiseks", "flag_confirm": "Oled kindel, et soovid märgistada antud postituse?", - "flag_success": "See posits on nüüd märgistatud modereerimiseks.", + "flag_success": "See postitus on nüüd märgistatud modereerimiseks.", "deleted_message": "See teema on kustutatud. Ainult kasutajad kellel on piisavalt õigusi saavad seda näha.", "following_topic.message": "Sulle ei edastata enam teateid uutest postitustest kui keegi postitab siia teemasse.", "not_following_topic.message": "Sulle ei edastata enam teateid uutest postitustest siin teemas.", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 6751e2be1b..d78cf504d6 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -5,8 +5,8 @@ "recent": "Sujets récents", "users": "Utilisateurs enregistrés", "notifications": "Notifications", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "Mots-clés", + "tag": "Sujets ayant le mot-clé \"%1\"", "user.edit": "Edite \"%1\"", "user.following": "Personnes que %1 suit", "user.followers": "Personnes qui suivent %1", diff --git a/public/language/fr/reset_password.json b/public/language/fr/reset_password.json index a59fdabeb9..055aec4b60 100644 --- a/public/language/fr/reset_password.json +++ b/public/language/fr/reset_password.json @@ -11,7 +11,7 @@ "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 !", - "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.", - "password_expired": "Your password has expired, please choose a new password" + "password_too_short": "Le mot de passe est trop court, veuillez entrer un mot de passe différent.", + "passwords_do_not_match": "Les deux mots de passe saisis ne correspondent pas.", + "password_expired": "Votre mot de passe a expiré, veuillez choisir un nouveau mot de passe." } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 0180457b25..1159ffb60f 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -27,7 +27,7 @@ "chat": "Chat", "follow": "S'abonner", "unfollow": "Se désabonner", - "more": "More", + "more": "Plus", "profile_update_success": "Le profil a bien été mis à jour !", "change_picture": "Changer d'image", "edit": "Éditer", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 513a18cd5e..7f1fa6684f 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -5,8 +5,8 @@ "recent": "Последние темы", "users": "Зарегистрированные пользователи", "notifications": "Уведомления", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "Теги", + "tag": "Темы с тегом \"%1\"", "user.edit": "Редактирование \"%1\"", "user.following": "%1 читает", "user.followers": "Читают %1", diff --git a/public/language/ru/reset_password.json b/public/language/ru/reset_password.json index 7c88137bd6..ee6b29edb7 100644 --- a/public/language/ru/reset_password.json +++ b/public/language/ru/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "Неверный Email / Email не существует!", "password_too_short": "Введенный пароль слишком короткий, пожалуйста, введите более длинный пароль.", "passwords_do_not_match": "Введенные пароли не совпадают.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "Ваш пароль устарел, пожалуйста выберите новый пароль" } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 3767b2bdcc..ec22a1bd41 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -27,7 +27,7 @@ "chat": "Чат", "follow": "Читать", "unfollow": "Не читать", - "more": "More", + "more": "Ещё", "profile_update_success": "Профиль обновлен!", "change_picture": "Изменить фотографию", "edit": "Редактировать", diff --git a/public/language/vi/global.json b/public/language/vi/global.json index a0d3fee9b0..a1a8420d6e 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -26,8 +26,8 @@ "header.unread": "Chưa đọc", "header.tags": "Tags", "header.popular": "Nổi bật", - "header.users": "Số người dùng", - "header.groups": "Groups", + "header.users": "Thành viên", + "header.groups": "Nhóm", "header.chats": "Phần Chat", "header.notifications": "Thông báo", "header.search": "Tìm kiếm", diff --git a/public/language/vi/recent.json b/public/language/vi/recent.json index b97df0e137..12a131279d 100644 --- a/public/language/vi/recent.json +++ b/public/language/vi/recent.json @@ -7,13 +7,13 @@ "alltime": "Tất cả thời gian", "no_recent_topics": "Không có chủ đề nào gần đây", "no_popular_topics": "There are no popular topics.", - "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": "Có chủ đề mới", + "there-is-a-new-topic-and-a-new-post": "Có chủ đề mới và bài viết mới", "there-is-a-new-topic-and-new-posts": "There is a new topic and %1 new posts.", "there-are-new-topics": "There are %1 new topics.", "there-are-new-topics-and-a-new-post": "There are %1 new topics and a new post.", "there-are-new-topics-and-new-posts": "There are %1 new topics and %2 new posts.", - "there-is-a-new-post": "There is a new post.", + "there-is-a-new-post": "Có bài viết mới", "there-are-new-posts": "There are %1 new posts.", - "click-here-to-reload": "Click here to reload." + "click-here-to-reload": "Nhấn vào đây để tải lại" } \ No newline at end of file diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 8c9f8cdfce..9d0ca5e82d 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -12,7 +12,7 @@ "notify_me": "Được thông báo khi có trả lời mới trong chủ đề này", "quote": "Trích dẫn", "reply": "Trả lời", - "guest-login-reply": "Log in to reply", + "guest-login-reply": "Hãy đăng nhập để trả lời", "edit": "Chỉnh sửa", "delete": "Xóa", "purge": "Xóa hẳn", @@ -33,7 +33,7 @@ "not_following_topic.message": "Bạn sẽ không còn nhận được thông báo từ chủ đề này", "login_to_subscribe": "Xin hãy đăng ký hoặc đăng nhập để theo dõi topic này", "markAsUnreadForAll.success": "Chủ đề đã được đánh dấu là chưa đọc toàn bộ", - "watch": "Xem", + "watch": "Theo dõi", "unwatch": "Ngừng theo dõi", "watch.title": "Được thông báo khi có trả lời mới trong chủ đề này", "unwatch.title": "Ngừng theo dõi chủ đề này", @@ -75,7 +75,7 @@ "fork_no_pids": "Chưa chọn bài gửi nào!", "fork_success": "Tạo bản sao thành công! Nhấn vào đây để chuyển tới chủ đề vừa tạo.", "composer.title_placeholder": "Nhập tiêu đề cho chủ đề của bạn tại đây...", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "Tên", "composer.discard": "Loại bỏ", "composer.submit": "Gửi", "composer.replying_to": "Đang trả lời %1", @@ -95,5 +95,5 @@ "oldest_to_newest": "Cũ đến mới", "newest_to_oldest": "Mới đến cũ", "most_votes": "Bình chọn nhiều nhất", - "most_posts": "Most posts" + "most_posts": "Có nhiều bài viết nhất" } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 9072a900d9..76ce150b05 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -2,8 +2,8 @@ "banned": "Bị cấm", "offline": "Offline", "username": "Tên truy cập", - "joindate": "Join Date", - "postcount": "Post Count", + "joindate": "Ngày gia nhập", + "postcount": "Số bài viết", "email": "Email", "confirm_email": "Xác nhận email", "delete_account": "Xóa tài khoản", @@ -18,7 +18,7 @@ "profile_views": "Số lượt người ghé thăm", "reputation": "Mức uy tín", "favourites": "Yêu thích", - "watched": "Watched", + "watched": "Đã theo dõi", "followers": "Số người theo dõi", "following": "Đang theo dõi", "signature": "Chữ ký", @@ -27,7 +27,7 @@ "chat": "Chat", "follow": "Theo dõi", "unfollow": "Hủy theo dõi", - "more": "More", + "more": "Xem thêm", "profile_update_success": "Hồ sơ đã được cập nhật thành công", "change_picture": "Thay đổi hình ảnh", "edit": "Chỉnh sửa", @@ -60,13 +60,13 @@ "digest_weekly": "Hàng tuần", "digest_monthly": "Hàng tháng", "send_chat_notifications": "Gửi một email nếu có tin nhắn chat mới đến và tôi không online", - "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "send_post_notifications": "Gửi email khi có trả lời mới trong chủ đề mà tôi subscribe", + "settings-require-reload": "Một số thay đổi trong cài đặt đòi hỏi tải lại. Nhấn vào đây để tải lại trang.", "has_no_follower": "Người dùng này hiện chưa có ai theo dõi :(", "follows_no_one": "Người dùng này hiện chưa theo dõi ai :(", "has_no_posts": "Người dùng này chưa viết bài nào", "has_no_topics": "Người dùng này chưa tạo một chủ đề nào", - "has_no_watched_topics": "This user didn't watch any topics yet.", + "has_no_watched_topics": "Thành viên này chưa theo dõi chủ đề nào. ", "email_hidden": "Ẩn Email", "hidden": "Đã ẩn", "paginate_description": "Phân trang cho chủ đề và bài viết thay vì cuộn liên tục", @@ -79,5 +79,5 @@ "topic_search_help": "Nếu được bật, in-topic searching sẽ thay thế tính năng tìm kiếu mặc định của trình duyệt và giúp bạn tìm trong toàn bộ nội dung bài viết, thay vì chỉ tìm trong những gì đang có trên màn hình.", "follow_topics_you_reply_to": "Theo dõi chủ đề mà bạn trả lời", "follow_topics_you_create": "Theo dõi chủ đề bạn tạo", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Chọn tên nhóm mà bạn muốn hiển thị" } \ No newline at end of file diff --git a/public/language/zh_CN/pages.json b/public/language/zh_CN/pages.json index 422456e4f8..1ec319a476 100644 --- a/public/language/zh_CN/pages.json +++ b/public/language/zh_CN/pages.json @@ -5,8 +5,8 @@ "recent": "最新主题", "users": "已注册用户", "notifications": "提醒", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "话题", + "tag": "\"%1\" 下的主题", "user.edit": "正在编辑 \"%1\"", "user.following": "%1 关注", "user.followers": "关注 %1 的人", diff --git a/public/language/zh_CN/reset_password.json b/public/language/zh_CN/reset_password.json index a88d55d74f..5ade84926c 100644 --- a/public/language/zh_CN/reset_password.json +++ b/public/language/zh_CN/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "无效的电子邮箱/电子邮箱不存在!", "password_too_short": "密码太短,请选择其他密码。", "passwords_do_not_match": "您输入两个密码不一致。", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "您的密码已过期,请选择新密码" } \ No newline at end of file diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index 45958bda9e..c72367e4a5 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -27,7 +27,7 @@ "chat": "聊天", "follow": "关注", "unfollow": "取消关注", - "more": "More", + "more": "更多", "profile_update_success": "资料已经成功更新。", "change_picture": "更改头像", "edit": "编辑", From 3c6d154a274549cd6dfaefa644b1e40f532510d2 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 8 Apr 2015 10:43:59 -0400 Subject: [PATCH 080/295] translation strings for #2960 --- public/language/en_GB/modules.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/language/en_GB/modules.json b/public/language/en_GB/modules.json index 12eeb0f660..f24cfcb8dd 100644 --- a/public/language/en_GB/modules.json +++ b/public/language/en_GB/modules.json @@ -16,8 +16,13 @@ "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown", + } \ No newline at end of file From 436a9a61b829ea72f521209e51488607d92a49a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 8 Apr 2015 11:32:36 -0400 Subject: [PATCH 081/295] fix language file --- public/language/en_GB/modules.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/language/en_GB/modules.json b/public/language/en_GB/modules.json index f24cfcb8dd..68d305cfa4 100644 --- a/public/language/en_GB/modules.json +++ b/public/language/en_GB/modules.json @@ -23,6 +23,5 @@ "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", "composer.submit_and_lock": "Submit and Lock", - "composer.toggle_dropdown": "Toggle Dropdown", - + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file From 5fda8422c553f023d21dddccd6c16686f26fd649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 8 Apr 2015 11:37:02 -0400 Subject: [PATCH 082/295] fix focus --- public/src/modules/composer.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 3a0e9d2d57..7e2721f3aa 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -439,13 +439,11 @@ define('composer', [ } function focusElements(postContainer) { - var title = postContainer.find('.title'), - bodyEl = postContainer.find('textarea'); - - if (title.is(':disabled')) { - bodyEl.focus().putCursorAtEnd(); - } else { + var title = postContainer.find('input.title'); + if (title.length) { title.focus(); + } else { + postContainer.find('textarea').focus().putCursorAtEnd(); } } From 0ed46c3bae81434ed82b11b70eb62e7d3a054c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 8 Apr 2015 11:54:38 -0400 Subject: [PATCH 083/295] closes #2963, closes #2957 --- public/src/admin/general/languages.js | 8 ++++++-- src/controllers/admin.js | 6 ++++++ src/views/admin/general/languages.tpl | 8 +++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/public/src/admin/general/languages.js b/public/src/admin/general/languages.js index 8720f96df2..24d6a418c9 100644 --- a/public/src/admin/general/languages.js +++ b/public/src/admin/general/languages.js @@ -2,7 +2,11 @@ /*global define*/ define('admin/general/languages', ['admin/settings'], function(Settings) { - $(function() { + var Languages = {} + + Languages.init = function() { Settings.prepare(); - }); + }; + + return Languages; }); diff --git a/src/controllers/admin.js b/src/controllers/admin.js index 91f8310a94..8b1e3f7d35 100644 --- a/src/controllers/admin.js +++ b/src/controllers/admin.js @@ -250,6 +250,12 @@ adminController.plugins.get = function(req, res, next) { adminController.languages.get = function(req, res, next) { languages.list(function(err, languages) { + if (err) { + return next(err); + } + languages.forEach(function(language) { + language.selected = language.code === meta.config.defaultLang; + }); res.render('admin/general/languages', { languages: languages }); diff --git a/src/views/admin/general/languages.tpl b/src/views/admin/general/languages.tpl index b2365e91a3..6075647d77 100644 --- a/src/views/admin/general/languages.tpl +++ b/src/views/admin/general/languages.tpl @@ -14,13 +14,13 @@ - + @@ -35,6 +35,4 @@ - + From 885b36bb50cb4e49da26926c238ec8b8ab85caf6 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 8 Apr 2015 17:28:08 -0400 Subject: [PATCH 084/295] closes #2965 --- public/src/client/unread.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/src/client/unread.js b/public/src/client/unread.js index fa97312c27..406116e9f1 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -124,7 +124,9 @@ define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', ' function createCategoryLinks(categories) { for (var i=0; i Date: Wed, 8 Apr 2015 18:03:19 -0400 Subject: [PATCH 085/295] #2967 --- src/socket.io/user.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 850edff7d0..dffed2730f 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -29,7 +29,9 @@ SocketUser.deleteAccount = function(socket, data, callback) { if (err || isAdmin) { return callback(err || new Error('[[error:cant-delete-admin]]')); } + user.deleteAccount(socket.uid, callback); + socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); }); } }; From 56d1b521c55bdfd089026a4aa2f78761d1ffe032 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 8 Apr 2015 18:11:17 -0400 Subject: [PATCH 086/295] closes #2967 @barisusakli there was a return; if user is offline, don't see any reason why it should be so I removed it, just FYI --- public/src/client/users.js | 5 +---- src/socket.io/user.js | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/public/src/client/users.js b/public/src/client/users.js index 5572c05cb1..eaa9467a00 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -173,16 +173,13 @@ define('forum/users', ['translator'], function(translator) { function onUserStatusChange(data) { var section = getActiveSection(); + if ((section.startsWith('online') || section.startsWith('users'))) { updateUser(data); } } function updateUser(data) { - if (data.status === 'offline') { - return; - } - app.updateUserStatus($('#users-container [data-uid="' + data.uid +'"] [component="user/status"]'), data.status); } diff --git a/src/socket.io/user.js b/src/socket.io/user.js index dffed2730f..3005d42c7d 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -29,9 +29,9 @@ SocketUser.deleteAccount = function(socket, data, callback) { if (err || isAdmin) { return callback(err || new Error('[[error:cant-delete-admin]]')); } - - user.deleteAccount(socket.uid, callback); + socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); + user.deleteAccount(socket.uid, callback); }); } }; From 0c851d864eced7a9c920efff3d4fe371c9495602 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 8 Apr 2015 21:05:56 -0400 Subject: [PATCH 087/295] latest fallbacks --- public/language/ar/modules.json | 6 +++++- public/language/bn/modules.json | 6 +++++- public/language/cs/modules.json | 6 +++++- public/language/de/modules.json | 6 +++++- public/language/el/modules.json | 6 +++++- public/language/en@pirate/modules.json | 6 +++++- public/language/en_US/modules.json | 6 +++++- public/language/es/modules.json | 6 +++++- public/language/et/modules.json | 6 +++++- public/language/fa_IR/modules.json | 6 +++++- public/language/fi/modules.json | 6 +++++- public/language/fr/modules.json | 6 +++++- public/language/he/modules.json | 6 +++++- public/language/hu/modules.json | 6 +++++- public/language/id/modules.json | 6 +++++- public/language/it/modules.json | 6 +++++- public/language/ja/modules.json | 6 +++++- public/language/ko/modules.json | 6 +++++- public/language/lt/modules.json | 6 +++++- public/language/ms/modules.json | 6 +++++- public/language/nb/modules.json | 6 +++++- public/language/nl/modules.json | 6 +++++- public/language/pl/modules.json | 6 +++++- public/language/pt_BR/modules.json | 6 +++++- public/language/ro/modules.json | 6 +++++- public/language/ru/modules.json | 6 +++++- public/language/sc/modules.json | 6 +++++- public/language/sk/modules.json | 6 +++++- public/language/sv/modules.json | 6 +++++- public/language/th/modules.json | 6 +++++- public/language/tr/modules.json | 6 +++++- public/language/vi/modules.json | 6 +++++- public/language/zh_CN/modules.json | 6 +++++- public/language/zh_TW/modules.json | 6 +++++- 34 files changed, 170 insertions(+), 34 deletions(-) diff --git a/public/language/ar/modules.json b/public/language/ar/modules.json index 4d644f6938..3fdf629895 100644 --- a/public/language/ar/modules.json +++ b/public/language/ar/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 أيام", "chat.thirty_days": "30 يومًا", "chat.three_months": "3 أشهر", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 كتب في %2", "composer.user_said": "%1 كتب:", "composer.discard": "هل أنت متأكد أنك تريد التخلي عن التغييرات؟", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/bn/modules.json b/public/language/bn/modules.json index 3dd01df610..eca6afb7cb 100644 --- a/public/language/bn/modules.json +++ b/public/language/bn/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "৭ দিন", "chat.thirty_days": "৩০ দিন", "chat.three_months": "৩ মাস", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 বলেছেন %2:", "composer.user_said": "%1 বলেছেনঃ", "composer.discard": "আপনি কি নিশ্চিত যে আপনি এই পোস্ট বাতিল করতে ইচ্ছুক?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index 800f56a62a..ebda99d83e 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 dní", "chat.thirty_days": "30 dní", "chat.three_months": "3 měsíce", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 8cafe4419b..46aa412d54 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Tage", "chat.thirty_days": "30 Tage", "chat.three_months": "3 Monate", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 sagte in %2:", "composer.user_said": "%1 sagte:", "composer.discard": "Bist du sicher, dass du diesen Post verwerfen möchtest?", - "composer.submit_and_lock": "Einreichen und Sperren" + "composer.submit_and_lock": "Einreichen und Sperren", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/el/modules.json b/public/language/el/modules.json index 5646e812eb..4c82c03d4f 100644 --- a/public/language/el/modules.json +++ b/public/language/el/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Ημέρες", "chat.thirty_days": "30 Ημέρες", "chat.three_months": "3 Μήνες", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "Ο/Η %1 είπε στο %2:", "composer.user_said": "Ο/Η %1 είπε:", "composer.discard": "Είσαι σίγουρος/η πως θέλεις να πετάξεις αυτή την δημοσίευση;", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/en@pirate/modules.json b/public/language/en@pirate/modules.json index e43e497da3..f8e2e49f0b 100644 --- a/public/language/en@pirate/modules.json +++ b/public/language/en@pirate/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/en_US/modules.json b/public/language/en_US/modules.json index 7cdd9b4c48..e86a8ce480 100644 --- a/public/language/en_US/modules.json +++ b/public/language/en_US/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/es/modules.json b/public/language/es/modules.json index a63418d2c6..23c805dddd 100644 --- a/public/language/es/modules.json +++ b/public/language/es/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 días", "chat.thirty_days": "30 días", "chat.three_months": "3 meses", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 dijo en %2:", "composer.user_said": "%1 dijo:", "composer.discard": "¿Estás seguro de que deseas descartar este mensaje?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/et/modules.json b/public/language/et/modules.json index 962558d47f..b4206b4183 100644 --- a/public/language/et/modules.json +++ b/public/language/et/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Päeva", "chat.thirty_days": "30 Päeva", "chat.three_months": "3 Kuud", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 ütles %2:", "composer.user_said": "%1 ütles:", "composer.discard": "Oled kindel, et soovid selle postituse tühistada?", - "composer.submit_and_lock": "Kinnita ja Lukusta" + "composer.submit_and_lock": "Kinnita ja Lukusta", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/fa_IR/modules.json b/public/language/fa_IR/modules.json index 6c542534c3..a99a2b1aff 100644 --- a/public/language/fa_IR/modules.json +++ b/public/language/fa_IR/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 روز", "chat.thirty_days": "30 روز", "chat.three_months": "3 ماه", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 در %2 گفته است:", "composer.user_said": "%1 گفته است:", "composer.discard": "آیا از دور انداختن این دیدگاه اطمینان دارید؟", - "composer.submit_and_lock": "ارسال و قفل" + "composer.submit_and_lock": "ارسال و قفل", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/fi/modules.json b/public/language/fi/modules.json index 7823638f1b..a789f8dd91 100644 --- a/public/language/fi/modules.json +++ b/public/language/fi/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 päivää", "chat.thirty_days": "30 päivää", "chat.three_months": "3 kuukautta", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 sanoi:", "composer.discard": "Oletko varma, että haluat hylätä viestin?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index b09cccdeda..b3cc1f54a3 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Jours", "chat.thirty_days": "30 Jours", "chat.three_months": "3 Mois", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 a dit dans %2 :", "composer.user_said": "%1 a dit :", "composer.discard": "Êtes-vous sûr de bien vouloir supprimer ce message ?", - "composer.submit_and_lock": "Soumettre et Verrouiller" + "composer.submit_and_lock": "Soumettre et Verrouiller", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/he/modules.json b/public/language/he/modules.json index f4fe8cd0ef..d0661a98fa 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 ימים", "chat.thirty_days": "30 ימים", "chat.three_months": "3 חודשים", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 אמר ב%2:", "composer.user_said": "%1 אמר:", "composer.discard": "האם למחוק פוסט זה?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/hu/modules.json b/public/language/hu/modules.json index c708c09d98..6c1d50915a 100644 --- a/public/language/hu/modules.json +++ b/public/language/hu/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 nap", "chat.thirty_days": "30 nap", "chat.three_months": "3 hónap", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 válasza erre %2:", "composer.user_said": "%1 válasza:", "composer.discard": "Biztosan elvetjük ezt a hozzászólást?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/id/modules.json b/public/language/id/modules.json index 5bd4fe85c6..9c412d98fe 100644 --- a/public/language/id/modules.json +++ b/public/language/id/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Hari", "chat.thirty_days": "30 Hari", "chat.three_months": "3 Bulan", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 berkata di %2: ", "composer.user_said": "%1 berkata:", "composer.discard": "Kamu yakin akan membuang posting ini?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/it/modules.json b/public/language/it/modules.json index c018e2b7fe..f1245894d9 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Giorni", "chat.thirty_days": "30 Giorni", "chat.three_months": "3 Mesi", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 ha detto in %2:", "composer.user_said": "%1 ha detto:", "composer.discard": "Sei sicuro di voler scartare questo post?", - "composer.submit_and_lock": "Invia e Blocca" + "composer.submit_and_lock": "Invia e Blocca", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/ja/modules.json b/public/language/ja/modules.json index 1a30c49b7d..57daaef1c1 100644 --- a/public/language/ja/modules.json +++ b/public/language/ja/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index fbdd01a7ae..5b25ee1201 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7일", "chat.thirty_days": "30일", "chat.three_months": "3개월", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1님이 %2에서 한 말:", "composer.user_said": "%1님의 말:", "composer.discard": "이 게시물을 지우겠습니까?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/lt/modules.json b/public/language/lt/modules.json index e6ddbe663e..1ad666d77e 100644 --- a/public/language/lt/modules.json +++ b/public/language/lt/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 dienos", "chat.thirty_days": "30 dienų", "chat.three_months": "3 mėnesiai", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 parašė į %2:", "composer.user_said": "%1 parašė:", "composer.discard": "Ar tikrai norite sunaikinti šį pranešimą?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/ms/modules.json b/public/language/ms/modules.json index 9cae9f7b74..5e83239dcb 100644 --- a/public/language/ms/modules.json +++ b/public/language/ms/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index e5656f83d1..1044a6d677 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 dager", "chat.thirty_days": "30 dager", "chat.three_months": "3 måneder", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 sa i %2: ", "composer.user_said": "%1 sa: ", "composer.discard": "Er du sikker på at du vil forkaste dette innlegget?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index 4feffb4096..b4ff78710f 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Dagen", "chat.thirty_days": "30 Dagen", "chat.three_months": "3 Maanden", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 zegt in %2:", "composer.user_said": "%1 zegt:", "composer.discard": "Weet u het zeker dat u dit bericht niet wilt plaatsen?", - "composer.submit_and_lock": "Plaatsen en vergrendelen" + "composer.submit_and_lock": "Plaatsen en vergrendelen", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index f4a7f34c86..f4df7edb9c 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 dni", "chat.thirty_days": "30 dni", "chat.three_months": "3 miesiące", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 powiedział w %2:", "composer.user_said": "%1 powiedział:", "composer.discard": "Na pewno chcesz porzucić ten post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/pt_BR/modules.json b/public/language/pt_BR/modules.json index 5c93cff9cc..346005d4c7 100644 --- a/public/language/pt_BR/modules.json +++ b/public/language/pt_BR/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Dias", "chat.thirty_days": "30 Dias", "chat.three_months": "3 Meses", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 disse em %2:", "composer.user_said": "%1 disse:", "composer.discard": "Tem certeza que deseja descartar essa postagem?", - "composer.submit_and_lock": "Envie e Tranque" + "composer.submit_and_lock": "Envie e Tranque", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/ro/modules.json b/public/language/ro/modules.json index 585309d2ea..fcba85c55e 100644 --- a/public/language/ro/modules.json +++ b/public/language/ro/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Zile", "chat.thirty_days": "30 de zile", "chat.three_months": "3 Luni", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 a spus în %2:", "composer.user_said": "%1 a spus:", "composer.discard": "Ești sigur că vrei să renunți la acest mesaj?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 7e3a1fd6dd..1ad5769258 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 дней", "chat.thirty_days": "30 дней", "chat.three_months": "3 месяца", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 сказал %2:", "composer.user_said": "%1 сказал:", "composer.discard": "Вы уверены, что хотите отказаться от этого поста?", - "composer.submit_and_lock": "Отправить и закрыть" + "composer.submit_and_lock": "Отправить и закрыть", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/sc/modules.json b/public/language/sc/modules.json index c34b686af0..d22538edac 100644 --- a/public/language/sc/modules.json +++ b/public/language/sc/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/sk/modules.json b/public/language/sk/modules.json index e8a242aba7..f4ebca7595 100644 --- a/public/language/sk/modules.json +++ b/public/language/sk/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/sv/modules.json b/public/language/sv/modules.json index 05d12e9247..008af93bc0 100644 --- a/public/language/sv/modules.json +++ b/public/language/sv/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Dagar", "chat.thirty_days": "30 Dagar", "chat.three_months": "3 Månader", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 sa i %2:", "composer.user_said": "%1 sa:", "composer.discard": "Är du säker på att du vill förkasta det här inlägget?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/th/modules.json b/public/language/th/modules.json index 21cb9a564d..7af8cf639b 100644 --- a/public/language/th/modules.json +++ b/public/language/th/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Days", "chat.thirty_days": "30 Days", "chat.three_months": "3 Months", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 said in %2:", "composer.user_said": "%1 said:", "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index af25aa3d20..ed7b534740 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 Gün", "chat.thirty_days": "30 Gün", "chat.three_months": "3 Ay", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 %2 içinde söyledi:", "composer.user_said": "%1 söyledi:", "composer.discard": "Bu iletiyi iptal etmek istediğinizden eminmisiniz?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index ecf53d1f0f..2d54413f69 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7 ngày", "chat.thirty_days": "30 ngày", "chat.three_months": "3 tháng", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 đã nói trong %2:", "composer.user_said": "%1 đã nói:", "composer.discard": "Bạn có chắc chắn hủy bỏ bài viết này?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/zh_CN/modules.json b/public/language/zh_CN/modules.json index 07f3cacb46..7d8bba08f2 100644 --- a/public/language/zh_CN/modules.json +++ b/public/language/zh_CN/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7天", "chat.thirty_days": "30天", "chat.three_months": "3个月", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1 在 %2 中说:", "composer.user_said": "%1 说:", "composer.discard": "确定想要取消此帖?", - "composer.submit_and_lock": "提交并锁定" + "composer.submit_and_lock": "提交并锁定", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file diff --git a/public/language/zh_TW/modules.json b/public/language/zh_TW/modules.json index 3e7d758914..7e39342ebf 100644 --- a/public/language/zh_TW/modules.json +++ b/public/language/zh_TW/modules.json @@ -15,8 +15,12 @@ "chat.seven_days": "7日", "chat.thirty_days": "30日", "chat.three_months": "3個月", + "composer.compose": "Compose", + "composer.show_preview": "Show Preview", + "composer.hide_preview": "Hide Preview", "composer.user_said_in": "%1在%2裡說:", "composer.user_said": "%1說:", "composer.discard": "你確定要放棄這帖子嗎?", - "composer.submit_and_lock": "Submit and Lock" + "composer.submit_and_lock": "Submit and Lock", + "composer.toggle_dropdown": "Toggle Dropdown" } \ No newline at end of file From 835d4db48198ffc5fdf6da3d9b55407a14983bf5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 8 Apr 2015 21:16:06 -0400 Subject: [PATCH 088/295] dont add category/topic slug if user doesnt have read permission or category is disabled etc. --- src/controllers/categories.js | 6 +++++- src/controllers/topics.js | 6 +++++- src/middleware/middleware.js | 21 --------------------- src/routes/index.js | 4 ++-- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 5d67fd828f..d3bc62d6a3 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -188,7 +188,7 @@ categoriesController.get = function(req, res, next) { return helpers.notFound(req, res); } - if (cid + '/' + req.params.slug !== results.categoryData.slug) { + if (req.params.slug && cid + '/' + req.params.slug !== results.categoryData.slug) { return helpers.notFound(req, res); } @@ -196,6 +196,10 @@ categoriesController.get = function(req, res, next) { return helpers.notAllowed(req, res); } + if (!req.params.slug && results.categoryData.slug && results.categoryData.slug !== cid + '/') { + return helpers.redirect(res, '/category/' + encodeURI(results.categoryData.slug)); + } + var topicIndex = utils.isNumber(req.params.topic_index) ? parseInt(req.params.topic_index, 10) - 1 : 0; var topicCount = parseInt(results.categoryData.topic_count, 10); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 7436e86c8e..b7c27324ee 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -43,7 +43,7 @@ topicsController.get = function(req, res, next) { function (results, next) { userPrivileges = results.privileges; - if (userPrivileges.disabled || tid + '/' + req.params.slug !== results.topic.slug) { + if (userPrivileges.disabled || (req.params.slug && tid + '/' + req.params.slug !== results.topic.slug)) { return helpers.notFound(req, res); } @@ -51,6 +51,10 @@ topicsController.get = function(req, res, next) { return helpers.notAllowed(req, res); } + if (!req.params.slug && results.topic.slug && results.topic.slug !== tid + '/') { + return helpers.redirect(res, '/topic/' + encodeURI(results.topic.slug)); + } + var settings = results.settings; var postCount = parseInt(results.topic.postcount, 10); var pageCount = Math.max(1, Math.ceil((postCount - 1) / settings.postsPerPage)); diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 6c03674483..92313916ce 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -84,27 +84,6 @@ middleware.redirectToLoginIfGuest = function(req, res, next) { } }; -middleware.addSlug = function(req, res, next) { - function redirect(method, id, name) { - method(id, 'slug', function(err, slug) { - if (err || !slug || slug === id + '/') { - return next(err); - } - - controllers.helpers.redirect(res, name + encodeURI(slug)); - }); - } - - if (!req.params.slug) { - if (req.params.category_id) { - return redirect(categories.getCategoryField, req.params.category_id, '/category/'); - } else if (req.params.topic_id) { - return redirect(topics.getTopicField, req.params.topic_id, '/topic/'); - } - } - next(); -}; - middleware.validateFiles = function(req, res, next) { if (!Array.isArray(req.files.files) || !req.files.files.length) { return next(new Error(['[[error:invalid-files]]'])); diff --git a/src/routes/index.js b/src/routes/index.js index 862964dfbe..56bd177205 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -42,7 +42,7 @@ function topicRoutes(app, middleware, controllers) { app.get('/api/topic/teaser/:topic_id', controllers.topics.teaser); setupPageRoute(app, '/topic/:topic_id/:slug/:post_index?', middleware, [], controllers.topics.get); - setupPageRoute(app, '/topic/:topic_id/:slug?', middleware, [middleware.addSlug], controllers.topics.get); + setupPageRoute(app, '/topic/:topic_id/:slug?', middleware, [], controllers.topics.get); } function tagRoutes(app, middleware, controllers) { @@ -58,7 +58,7 @@ function categoryRoutes(app, middleware, controllers) { app.get('/api/unread/total', middleware.authenticate, controllers.categories.unreadTotal); setupPageRoute(app, '/category/:category_id/:slug/:topic_index', middleware, [], controllers.categories.get); - setupPageRoute(app, '/category/:category_id/:slug?', middleware, [middleware.addSlug], controllers.categories.get); + setupPageRoute(app, '/category/:category_id/:slug?', middleware, [], controllers.categories.get); } function accountRoutes(app, middleware, controllers) { From df3e007120084bd464f83fa73c154e2b74fa9f44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 9 Apr 2015 14:53:59 -0400 Subject: [PATCH 089/295] closes #2969 --- public/src/client/topic/events.js | 2 +- src/socket.io/posts.js | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 77690dc9d9..0090e37af9 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -100,7 +100,7 @@ define('forum/topic/events', [ var editedPostEl = components.get('post/content', data.pid), topicTitle = components.get('topic/title'); - if (topicTitle.length) { + if (topicTitle.length && data.title) { topicTitle.fadeOut(250, function() { topicTitle.html(data.title).fadeIn(250); }); diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index d1a5bb7e39..d8a3104397 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -306,16 +306,41 @@ SocketPosts.edit = function(socket, data, callback) { return callback(err); } - websockets.in('topic_' + results.topic.tid).emit('event:post_edited', { + var result = { pid: data.pid, handle: data.handle, title: results.topic.title, isMainPost: results.topic.isMainPost, tags: results.topic.tags, content: results.content - }); + }; + if (parseInt(results.postData.deleted) !== 1) { + websockets.in('topic_' + results.topic.tid).emit('event:post_edited', result); + callback(); + return; + } + + socket.emit('event:post_edited', result); callback(); + + async.parallel({ + admins: async.apply(groups.getMembers, 'administrators', 0, -1), + moderators: async.apply(groups.getMembers, 'cid:' + results.topic.cid + ':privileges:mods', 0, -1), + uidsInTopic: async.apply(websockets.getUidsInRoom, 'topic_' + results.topic.tid) + }, function(err, results) { + if (err) { + return winston.error(err); + } + + var uids = results.uidsInTopic.filter(function(uid) { + return results.admins.indexOf(uid) !== -1 || results.moderators.indexOf(uid) !== -1; + }); + + uids.forEach(function(uid) { + websockets.in('uid_' + uid).emit('event:post_edited', result); + }); + }); }); }; From 9c7c87fd3b49f3e097d05671580d2df5fb05370d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 9 Apr 2015 15:37:20 -0400 Subject: [PATCH 090/295] closes #2972 --- src/user/delete.js | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/user/delete.js b/src/user/delete.js index 1c1e9c2974..c1d67bd92f 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -131,16 +131,39 @@ module.exports = function(User) { } function deleteUserFromFollowers(uid, callback) { - db.getSetMembers('followers:' + uid, function(err, uids) { + async.parallel({ + followers: async.apply(db.getSortedSetRange, 'followers:' + uid, 0, -1), + following: async.apply(db.getSortedSetRange, 'following:' + uid, 0, -1) + }, function(err, results) { + function updateCount(uids, name, fieldName, next) { + async.each(uids, function(uid, next) { + db.sortedSetCard(name + uid, function(err, count) { + if (err) { + return next(err); + } + count = parseInt(count, 10) || 0; + db.setObjectField('user:' + uid, fieldName, count, next); + }); + }, next); + } + if (err) { return callback(err); } - var sets = uids.map(function(uid) { + var followingSets = results.followers.map(function(uid) { return 'following:' + uid; }); - db.setsRemove(sets, uid, callback); + var followerSets = results.following.map(function(uid) { + return 'followers:' + uid; + }); + + async.parallel([ + async.apply(db.sortedSetsRemove, followerSets.concat(followingSets), uid), + async.apply(updateCount, results.following, 'followers:', 'followerCount'), + async.apply(updateCount, results.followers, 'following:', 'followingCount') + ], callback); }); } }; From b2fad172e5e96e62481fc9a200f2fbb89c1683e7 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 9 Apr 2015 17:37:24 -0400 Subject: [PATCH 091/295] closes #2966 --- public/src/modules/notifications.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index 3f342a1207..c3a9b984de 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -39,12 +39,15 @@ define('notifications', ['sounds', 'translator'], function(sound, translator) { }); notifList.on('click', '[data-nid]', function() { - var nid = this.getAttribute('data-nid'); - - socket.emit('notifications.markRead', nid, function(err) { + var unread = $(this).hasClass('unread'); + if (!unread) { + return; + } + socket.emit('notifications.markRead', $(this).attr('data-nid'), function(err) { if (err) { - app.alertError(err.message); + return app.alertError(err.message); } + increaseNotifCount(-1); }); }); @@ -58,14 +61,13 @@ define('notifications', ['sounds', 'translator'], function(sound, translator) { }); notifList.on('click', '.mark-read', function(e) { - var liEl = $(this.parentNode), - nid = liEl.attr('data-nid'), + var liEl = $(this).parent(), unread = liEl.hasClass('unread'); e.preventDefault(); e.stopPropagation(); - socket.emit('notifications.mark' + (unread ? 'Read' : 'Unread'), nid, function(err) { + socket.emit('notifications.mark' + (unread ? 'Read' : 'Unread'), liEl.attr('data-nid'), function(err) { if (err) { app.alertError(err.message); } From 0b76ed90aa9567ab6108fe55b9d338a486e81912 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 9 Apr 2015 17:59:26 -0400 Subject: [PATCH 092/295] no group title --- public/language/en_GB/user.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/language/en_GB/user.json b/public/language/en_GB/user.json index 7bdd569264..730feaabac 100644 --- a/public/language/en_GB/user.json +++ b/public/language/en_GB/user.json @@ -92,5 +92,6 @@ "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } From 8069cbda6980d3e1565323e226ec7059873c9c43 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 9 Apr 2015 18:15:31 -0400 Subject: [PATCH 093/295] closes #2979 if all is selected search in all categories --- src/search.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/search.js b/src/search.js index 063ebfa142..7d76666f7e 100644 --- a/src/search.js +++ b/src/search.js @@ -363,10 +363,22 @@ function sortPosts(posts, data) { } function getSearchCids(data, callback) { - if (!Array.isArray(data.categories) || !data.categories.length || data.categories.indexOf('all') !== -1) { + if (!Array.isArray(data.categories) || !data.categories.length) { return callback(null, []); } + if (data.categories.indexOf('all') !== -1) { + async.waterfall([ + function(next) { + db.getSortedSetRange('categories:cid', 0, -1, next); + }, + function(cids, next) { + privileges.categories.filterCids('read', cids, data.uid, next); + } + ], callback); + return; + } + async.parallel({ watchedCids: function(next) { if (data.categories.indexOf('watched') !== -1) { From 97419bbdd962bcbd7b5ea2b9293c75ce16adeec1 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Apr 2015 12:00:18 -0400 Subject: [PATCH 094/295] closes #2980 --- public/src/modules/sort.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/src/modules/sort.js b/public/src/modules/sort.js index e063fceda3..6033b9680a 100644 --- a/public/src/modules/sort.js +++ b/public/src/modules/sort.js @@ -1,16 +1,16 @@ 'use strict'; /* globals define, config, socket, app, ajaxify, templates */ -define('sort', function() { +define('sort', ['components'], function(components) { var module = {}; module.handleSort = function (field, method, gotoOnSave) { - var threadSort = $('.thread-sort'); + var threadSort = components.get('thread/sort'); threadSort.find('i').removeClass('fa-check'); var currentSetting = threadSort.find('a[data-sort="' + config[field] + '"]'); currentSetting.find('i').addClass('fa-check'); - $('.thread-sort').on('click', 'a', function() { + threadSort.on('click', 'a', function() { var newSetting = $(this).attr('data-sort'); socket.emit(method, newSetting, function(err) { if (err) { From 59909894fcba034e31a7d799c19ff8e683feac93 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Apr 2015 12:35:49 -0400 Subject: [PATCH 095/295] closes #2981 --- public/src/modules/composer.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 7e2721f3aa..8c2c58ec68 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -557,6 +557,8 @@ define('composer', [ stopNotifyInterval(composer.posts[post_uuid]); stopNotifyTyping(composer.posts[post_uuid]); + + $('body').css({'margin-bottom': '0px'}); }; return composer; From 13b4e446bfbb7383452d75879dd26e2083358518 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Apr 2015 12:40:05 -0400 Subject: [PATCH 096/295] closes #2984 --- 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 426bac83e7..ec1c1d03a7 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -78,7 +78,7 @@ $(document).ready(function() { ajaxify.start = function(url, quiet, search) { - url = ajaxify.removeRelativePath(url.replace(/\/$/, '')); + url = ajaxify.removeRelativePath(url.replace(/^\/|\/$/g, '')); var hash = window.location.hash; search = search || ''; From cc6f37ac4ecd0f9673045cf0bbe07630152f7439 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 10 Apr 2015 13:29:04 -0400 Subject: [PATCH 097/295] added category bgColor/color to getPostSummary --- src/posts/summary.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/posts/summary.js b/src/posts/summary.js index 15f2f645ad..4b972dfec2 100644 --- a/src/posts/summary.js +++ b/src/posts/summary.js @@ -120,7 +120,7 @@ module.exports = function(Posts) { return topic && array.indexOf(topic) === index; }); - categories.getMultipleCategoryFields(cids, ['cid', 'name', 'icon', 'slug', 'parentCid'], function(err, categories) { + categories.getMultipleCategoryFields(cids, ['cid', 'name', 'icon', 'slug', 'parentCid', 'bgColor', 'color'], function(err, categories) { callback(err, {topics: topics, categories: categories}); }); }); From 799cc9397aa472836ab5da1fc78b6e3c23850c93 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Apr 2015 13:37:44 -0400 Subject: [PATCH 098/295] closes #2973 also fixes some UX issues and enforces password length check on both client and server --- public/src/client/account/edit.js | 39 ++++++++++++++++++++++++------- src/socket.io/user.js | 2 +- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index d090b0282a..b3c8c0af6a 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -240,25 +240,30 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], var successIcon = ''; function onPasswordChanged() { - passwordvalid = utils.isPasswordValid(password.val()); if (password.val().length < config.minimumPasswordLength) { showError(password_notify, '[[user:change_password_error_length]]'); - } else if (!passwordvalid) { + passwordvalid = false; + } else if (!utils.isPasswordValid(password.val())) { showError(password_notify, '[[user:change_password_error]]'); + passwordvalid = false; } else { showSuccess(password_notify, successIcon); + passwordvalid = true; } } function onPasswordConfirmChanged() { - if(password.val()) { - if (password.val() !== password_confirm.val()) { - showError(password_confirm_notify, '[[user:change_password_error_match]]'); - passwordsmatch = false; - } else { + if (password.val() !== password_confirm.val()) { + showError(password_confirm_notify, '[[user:change_password_error_match]]'); + passwordsmatch = false; + } else { + if (password.val()) { showSuccess(password_confirm_notify, successIcon); - passwordsmatch = true; + } else { + removeAlert(password_confirm_notify); } + + passwordsmatch = true; } } @@ -266,6 +271,9 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], password_confirm.on('blur', onPasswordConfirmChanged); $('#changePasswordBtn').on('click', function() { + onPasswordChanged(); + onPasswordConfirmChanged(); + var btn = $(this); if ((passwordvalid && passwordsmatch) || app.user.isAdmin) { btn.addClass('disabled').find('i').removeClass('hide'); @@ -282,11 +290,21 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], passwordvalid = false; if (err) { + onPasswordChanged(); + onPasswordConfirmChanged(); return app.alertError(err.message); } app.alertSuccess('[[user:change_password_success]]'); }); + } else { + if (!passwordsmatch) { + app.alertError('[[user:change_password_error_match]]'); + } + + if (!passwordvalid) { + app.alertError('[[user:change_password_error]]'); + } } return false; }); @@ -349,5 +367,10 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], }); } + function removeAlert(element) { + element.html(''); + element.parent().removeClass('alert-success alert-danger'); + } + return AccountEdit; }); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 3005d42c7d..3cd15c9b92 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -138,7 +138,7 @@ SocketUser.checkStatus = function(socket, uid, callback) { }; SocketUser.changePassword = function(socket, data, callback) { - if (!data || !data.uid) { + if (!data || !data.uid || data.newPassword.length < meta.config.minimumPasswordLength) { return callback(new Error('[[error:invalid-data]]')); } if (!socket.uid) { From 5c59aa77374b2f23ccda391f710bda4761c891bf Mon Sep 17 00:00:00 2001 From: psychobunny Date: Fri, 10 Apr 2015 14:23:40 -0400 Subject: [PATCH 099/295] closes #2986 --- public/less/admin/general/dashboard.less | 2 +- public/src/admin/general/dashboard.js | 2 ++ src/socket.io/admin.js | 5 ++++- src/views/admin/general/dashboard.tpl | 4 ++++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/public/less/admin/general/dashboard.less b/public/less/admin/general/dashboard.less index 71c2298d31..8cfad65459 100644 --- a/public/less/admin/general/dashboard.less +++ b/public/less/admin/general/dashboard.less @@ -130,7 +130,7 @@ } .monthly-pageviews { - width:50%; + width:33%; } .motd textarea { diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index a842c0d2af..513ee745c1 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -338,8 +338,10 @@ define('admin/general/dashboard', ['semver'], function(semver) { $('#pageViewsThisMonth').html(data.monthlyPageViews.thisMonth); $('#pageViewsLastMonth').html(data.monthlyPageViews.lastMonth); + $('#pageViewsPastDay').html(data.pastDay); utils.addCommasToNumbers($('#pageViewsThisMonth')); utils.addCommasToNumbers($('#pageViewsLastMonth')); + utils.addCommasToNumbers($('#pageViewsPastDay')); }); } diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index ecf63997e5..937f5637f6 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -234,7 +234,10 @@ SocketAdmin.analytics.get = function(socket, data, callback) { monthlyPageViews: function(next) { getMonthlyPageViews(next); } - }, callback); + }, function(err, data) { + data.pastDay = data.pageviews.reduce(function(a, b) {return parseInt(a, 10) + parseInt(b, 10);}); + callback(err, data); + }); } } else { callback(new Error('Invalid analytics call')); diff --git a/src/views/admin/general/dashboard.tpl b/src/views/admin/general/dashboard.tpl index db18b7cf02..af94ab2f19 100644 --- a/src/views/admin/general/dashboard.tpl +++ b/src/views/admin/general/dashboard.tpl @@ -19,6 +19,10 @@
Page views This Month
+
+
+
Page views in last 24 hours
+
From 45bf5de1e5ea91debaf4033879b1cbb9f3c8022b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 10 Apr 2015 15:01:36 -0400 Subject: [PATCH 100/295] closes #2982 update url with new slug on topic title edit --- public/src/client/topic/events.js | 5 ++++- src/postTools.js | 1 + src/socket.io/posts.js | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 0090e37af9..1013f49ff0 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -1,7 +1,7 @@ 'use strict'; -/* globals app, ajaxify, define, socket, templates */ +/* globals config, app, ajaxify, define, socket, templates */ define('forum/topic/events', [ 'forum/topic/browsing', @@ -101,6 +101,9 @@ define('forum/topic/events', [ topicTitle = components.get('topic/title'); if (topicTitle.length && data.title) { + var newUrl = 'topic/' + data.slug + (window.location.search ? window.location.search : ''); + history.replaceState({url: newUrl}, null, window.location.protocol + '//' + window.location.host + config.relative_path + '/' + newUrl); + topicTitle.fadeOut(250, function() { topicTitle.html(data.title).fadeIn(250); }); diff --git a/src/postTools.js b/src/postTools.js index 41f0a4b6ed..82f3e3604d 100644 --- a/src/postTools.js +++ b/src/postTools.js @@ -115,6 +115,7 @@ var cache = LRU({ cid: results.cid, uid: postData.uid, title: validator.escape(title), + slug: topicData.slug, isMainPost: results.isMain, tags: tags }); diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index d8a3104397..1dfe59bfb7 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -310,6 +310,7 @@ SocketPosts.edit = function(socket, data, callback) { pid: data.pid, handle: data.handle, title: results.topic.title, + slug: results.topic.slug, isMainPost: results.topic.isMainPost, tags: results.topic.tags, content: results.content From 3d0b50a9b70eb103e448c8a3737a58662cc7e552 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 10 Apr 2015 15:40:23 -0400 Subject: [PATCH 101/295] closes #2975 --- src/user/settings.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/user/settings.js b/src/user/settings.js index 20c16fceb8..7c12cbfd00 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -55,13 +55,16 @@ module.exports = function(User) { settings = data.settings; + var defaultTopicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20; + var defaultPostsPerPage = parseInt(meta.config.postsPerPage, 10) || 20; + settings.showemail = parseInt(settings.showemail, 10) === 1; settings.showfullname = parseInt(settings.showfullname, 10) === 1; settings.openOutgoingLinksInNewTab = parseInt(settings.openOutgoingLinksInNewTab, 10) === 1; settings.dailyDigestFreq = settings.dailyDigestFreq || 'off'; settings.usePagination = (settings.usePagination === null || settings.usePagination === undefined) ? parseInt(meta.config.usePagination, 10) === 1 : parseInt(settings.usePagination, 10) === 1; - settings.topicsPerPage = Math.min(settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : parseInt(meta.config.topicsPerPage, 10) || 20, 20); - settings.postsPerPage = Math.min(settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : parseInt(meta.config.postsPerPage, 10) || 10, 20); + settings.topicsPerPage = Math.min(settings.topicsPerPage ? parseInt(settings.topicsPerPage, 10) : defaultTopicsPerPage, defaultTopicsPerPage); + settings.postsPerPage = Math.min(settings.postsPerPage ? parseInt(settings.postsPerPage, 10) : defaultPostsPerPage, defaultPostsPerPage); settings.notificationSounds = parseInt(settings.notificationSounds, 10) === 1; settings.userLang = settings.userLang || meta.config.defaultLang || 'en_GB'; settings.topicPostSort = settings.topicPostSort || meta.config.topicPostSort || 'oldest_to_newest'; @@ -78,7 +81,7 @@ module.exports = function(User) { } User.saveSettings = function(uid, data, callback) { - if(!data.topicsPerPage || !data.postsPerPage || parseInt(data.topicsPerPage, 10) <= 0 || parseInt(data.postsPerPage, 10) <= 0) { + if (invalidPaginationSettings(data)) { return callback(new Error('[[error:invalid-pagination-value]]')); } @@ -94,8 +97,8 @@ module.exports = function(User) { openOutgoingLinksInNewTab: data.openOutgoingLinksInNewTab, dailyDigestFreq: data.dailyDigestFreq || 'off', usePagination: data.usePagination, - topicsPerPage: Math.min(data.topicsPerPage, 20), - postsPerPage: Math.min(data.postsPerPage, 20), + topicsPerPage: Math.min(data.topicsPerPage, parseInt(meta.config.topicsPerPage, 10) || 20), + postsPerPage: Math.min(data.postsPerPage, parseInt(meta.config.postsPerPage, 10) || 20), notificationSounds: data.notificationSounds, userLang: data.userLang || meta.config.defaultLang, followTopicsOnCreate: data.followTopicsOnCreate, @@ -116,6 +119,12 @@ module.exports = function(User) { ], callback); }; + function invalidPaginationSettings(data) { + return !data.topicsPerPage || !data.postsPerPage || + parseInt(data.topicsPerPage, 10) <= 0 || parseInt(data.postsPerPage, 10) <= 0 || + parseInt(data.topicsPerPage, 10) > meta.config.topicsPerPage || parseInt(data.postsPerPage, 10) > meta.config.postsPerPage; + } + function updateDigestSetting(uid, dailyDigestFreq, callback) { async.waterfall([ function(next) { From 729fb1d696c1e1278cd1e1721c39ef6ceda56d6e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 10 Apr 2015 16:13:45 -0400 Subject: [PATCH 102/295] advanced search change --- public/language/en_GB/search.json | 1 + public/src/client/search.js | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/public/language/en_GB/search.json b/public/language/en_GB/search.json index 8c73511bda..090b900eef 100644 --- a/public/language/en_GB/search.json +++ b/public/language/en_GB/search.json @@ -1,6 +1,7 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", "by": "By", "titles": "Titles", diff --git a/public/src/client/search.js b/public/src/client/search.js index 900a4d1d6d..e46a709e74 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -8,9 +8,9 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco Search.init = function() { var searchQuery = $('#results').attr('data-search-query'); - $('#advanced-search #search-input').val(searchQuery); + $('#search-input').val(searchQuery); - var searchIn = $('#advanced-search #search-in'); + var searchIn = $('#search-in'); fillOutForm(); @@ -23,7 +23,7 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco $('#advanced-search').off('submit').on('submit', function(e) { e.preventDefault(); - var input = $(this).find('#search-input'); + var input = $('#search-input'); var searchData = getSearchData(); searchData.term = input.val(); @@ -41,7 +41,7 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco function getSearchData() { var form = $('#advanced-search'); var searchData = { - in: form.find('#search-in').val() + in: $('#search-in').val() }; if (searchData.in === 'posts' || searchData.in === 'titlesposts' || searchData.in === 'titles') { From a14249dee6f07fde175692a90f9031420e48998b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 10 Apr 2015 16:45:37 -0400 Subject: [PATCH 103/295] removed tags --- public/less/admin/general/dashboard.less | 4 ---- public/src/admin/general/dashboard.js | 10 ++-------- src/socket.io/meta.js | 1 - src/views/admin/general/dashboard.tpl | 1 - 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/public/less/admin/general/dashboard.less b/public/less/admin/general/dashboard.less index 8cfad65459..cf44ceb176 100644 --- a/public/less/admin/general/dashboard.less +++ b/public/less/admin/general/dashboard.less @@ -102,10 +102,6 @@ border-color: #949FB1; background-color: #A8B3C5; } - &.tags { - border-color: #FDB45C; - background-color: #8FA633; - } } } } diff --git a/public/src/admin/general/dashboard.js b/public/src/admin/general/dashboard.js index 513ee745c1..3ae00b1e43 100644 --- a/public/src/admin/general/dashboard.js +++ b/public/src/admin/general/dashboard.js @@ -283,13 +283,8 @@ define('admin/general/dashboard', ['semver'], function(semver) { color: "#949FB1", highlight: "#A8B3C5", label: "Recent/Unread" - }, - { - value: 1, - color: "#8FA633", - highlight: "#3FA7B8", - label: "Tags" - }], { + } + ], { responsive: true }); @@ -356,7 +351,6 @@ define('admin/general/dashboard', ['semver'], function(semver) { graphs.presence.segments[1].value = users.topics; graphs.presence.segments[2].value = users.category; graphs.presence.segments[3].value = users.recent; - graphs.presence.segments[4].value = users.tags; graphs.presence.update(); } diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index 60bb51bd4e..12ac8279c8 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -89,7 +89,6 @@ SocketMeta.rooms.getAll = function(socket, data, callback) { users: { categories: roomClients.categories ? roomClients.categories.length : 0, recent: roomClients.recent_posts ? roomClients.recent_posts.length : 0, - tags: roomClients.tags ? roomClients.tags.length : 0, topics: 0, category: 0 }, diff --git a/src/views/admin/general/dashboard.tpl b/src/views/admin/general/dashboard.tpl index af94ab2f19..132797fb3e 100644 --- a/src/views/admin/general/dashboard.tpl +++ b/src/views/admin/general/dashboard.tpl @@ -115,7 +115,6 @@
  • Reading posts
  • Browsing topics
  • Recent / Unread
  • -
  • Tags
  • From 039dab829ae9897e0deb64b909059ce40d86cb0e Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 11 Apr 2015 15:50:44 -0400 Subject: [PATCH 104/295] downgrade autocomplete to 0.1.2 --- public/vendor/jquery/textcomplete/jquery.textcomplete.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js b/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js index 941ee008de..742b98a7b7 100644 --- a/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js +++ b/public/vendor/jquery/textcomplete/jquery.textcomplete.min.js @@ -1 +1 @@ -/*! jquery-textcomplete - v0.4.0 - 2015-03-10 */if("undefined"==typeof jQuery)throw new Error("jQuery.textcomplete requires jQuery");+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)};a.fn.textcomplete=function(c,d){var e=Array.prototype.slice.call(arguments);return this.each(function(){var f=a(this),g=f.data("textComplete");if(g||(g=new a.fn.textcomplete.Completer(this,d||{}),f.data("textComplete",g)),"string"==typeof c){if(!g)return;e.shift(),g[c].apply(g,e),"destroy"===c&&f.removeData("textComplete")}else a.each(c,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(g.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),g.register(a.fn.textcomplete.Strategy.parse(c))})}}(jQuery),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+f++,this.strategies=[],this.views=[],this.option=a.extend({},b._getDefaults(),d),!this.$el.is("input[type=text]")&&!this.$el.is("textarea")&&!c.isContentEditable&&"true"!=c.contentEditable)throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===document.activeElement)this.initialize();else{var e=this;this.$el.one("focus."+this.id,function(){e.initialize()})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return c=d,void 0;b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=function(a){return"[object Function]"===Object.prototype.toString.call(a)},f=0;b._getDefaults=function(){return b.DEFAULTS||(b.DEFAULTS={appendTo:a("body"),zIndex:"100"}),b.DEFAULTS},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,initialize:function(){var b=this.$el.get(0);this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var c,d;this.option.adapter?c=this.option.adapter:(d=this.$el.is("textarea")||this.$el.is("input[type=text]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",c=a.fn.textcomplete[d]),this.adapter=new c(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b){this.adapter.select(a,b),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(a){for(var b=0;b').css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c)),d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:10,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el=this.$inputEl=this.completer=null,delete d[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(this.data,function(a){return a.value});this.data.length?(this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._activateIndexedItem()),this._setScroll()):this.shown&&this.deactivate()},setPosition:function(b){this.$el.css(this._applyPlacement(b));var b="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b="fixed",!1):void 0}),this.$el.css({position:b}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy);var e=this;setTimeout(function(){e.deactivate()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(a){this.shown&&(this.isUp(a)?(a.preventDefault(),this._up()):this.isDown(a)?(a.preventDefault(),this._down()):this.isEnter(a)?(a.preventDefault(),this._enter()):this.isPageup(a)?(a.preventDefault(),this._pageup()):this.isPagedown(a)?(a.preventDefault(),this._pagedown()):this.isEscape(a)&&(a.preventDefault(),this.deactivate()))},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(){var a=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(a.value,a.strategy),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,d,e,f="";for(d=0;d
    ',f+=b.strategy.template(b.value),f+="");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('
  • ').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b}(jQuery),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c){return a.map(c,function(a){return new b(a)})},a.extend(b.prototype,{match:null,replace:null,search:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(jQuery),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var a=this._getCaretRelativePosition(),b=this.$el.offset();return a.top+=b.top,a.left+=b.left,a},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 13:case 40:case 38:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(jQuery),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}b.DIV_PROPERTIES={left:-9999,position:"absolute",top:0,whiteSpace:"pre-wrap"},b.COPY_PROPERTIES=["border-width","font-family","font-size","font-style","font-variant","font-weight","height","letter-spacing","word-spacing","line-height","text-decoration","text-align","width","padding-top","padding-right","padding-bottom","padding-left","margin-top","margin-right","margin-bottom","margin-left","border-style","box-sizing","tab-size"],a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c){var d=this.getTextFromHeadToCaret(),e=this.el.value.substring(this.el.selectionEnd),f=c.replace(b);a.isArray(f)&&(e=f[1]+e,f=f[0]),d=d.replace(c.match,f),this.$el.val(d+e),this.el.selectionStart=this.el.selectionEnd=d.length},_getCaretRelativePosition:function(){var b=a("
    ").css(this._copyCss()).text(this.getTextFromHeadToCaret()),c=a("").text(".").appendTo(b);this.$el.before(b);var d=c.position();return d.top+=c.height()-this.$el.scrollTop(),d.lineHeight=c.height(),b.remove(),d},_copyCss:function(){return a.extend({overflow:this.el.scrollHeight>this.el.offsetHeight?"scroll":"auto"},b.DIV_PROPERTIES,this._getStyles())},_getStyles:function(a){var c=a("
    ").css(["color"]).color;return"undefined"!=typeof c?function(){return this.$el.css(b.COPY_PROPERTIES)}:function(){var c=this.$el,d={};return a.each(b.COPY_PROPERTIES,function(a,b){d[b]=c.css(b)}),d}}(a),getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)}}),a.fn.textcomplete.Textarea=b}(jQuery),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a(""+c+"").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="吶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c){var d=this.getTextFromHeadToCaret(),e=this.el.value.substring(d.length),f=c.replace(b);a.isArray(f)&&(e=f[1]+e,f=f[0]),d=d.replace(c.match,f),this.$el.val(d+e),this.el.focus();var g=this.el.createTextRange();g.collapse(!0),g.moveEnd("character",d.length),g.moveStart("character",d.length),g.select()},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(jQuery),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c){var d=this.getTextFromHeadToCaret(),e=window.getSelection(),f=e.getRangeAt(0),g=f.cloneRange();g.selectNodeContents(f.startContainer);var h=g.toString(),i=h.substring(f.startOffset),j=c.replace(b);a.isArray(j)&&(i=j[1]+i,j=j[0]),d=d.replace(c.match,j),f.selectNodeContents(f.startContainer),f.deleteContents();var k=document.createTextNode(d+i);f.insertNode(k),f.setStart(k,d.length),f.collapse(!0),e.removeAllRanges(),e.addRange(f)},_getCaretRelativePosition:function(){var b=window.getSelection().getRangeAt(0).cloneRange(),c=document.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),d.remove();var f=this.$el.attr("dir")||this.$el.css("direction");return"rtl"===f&&(e.left-=this.listView.$el.width()),e},getTextFromHeadToCaret:function(){var a=window.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(jQuery); +/*! jquery-textcomplete - v0.1.2 - 2014-02-08 */!function(a){"use strict";var b=function(a){var b,d;return b=function(){d=!1},function(){var e;d||(d=!0,e=c(arguments),e.unshift(b),a.apply(this,e))}},c=function(a){var b;return b=Array.prototype.slice.call(a)},d=function(){var b;return b=a("
    ").css(["color"]).color,"undefined"!=typeof b?function(a,b){return a.css(b)}:function(b,c){var d;return d={},a.each(c,function(a,c){d[c]=b.css(c)}),d}}(),e=function(a){return a},f=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}},g=function(a,b){var c,d;if(a.indexOf)return-1!=a.indexOf(b);for(c=0,d=a.length;d>c;c++)if(a[c]===b)return!0;return!1},h=function(){function c(b){var c,d,e;d=h.clone(),this.el=b.get(0),this.$el=b,this.id="textComplete"+j++,c=k(this.$el),e=this.el===document.activeElement,this.$el.wrap(c).before(d),e&&this.el.focus(),this.listView=new i(d,this),this.strategies=[],this.$el.on({"keyup.textComplete":a.proxy(this.onKeyup,this),"keydown.textComplete":a.proxy(this.listView.onKeydown,this.listView)}),a(document).on("click."+this.id,a.proxy(this.onClickDocument,this)).on("keyup."+this.id,a.proxy(this.onKeyupDocument,this))}var e,f,g,h,j;e={wrapper:'
    ',list:''},f={wrapper:{position:"relative"},list:{position:"absolute",top:0,left:0,zIndex:"100",display:"none"}},g=a(e.wrapper).css(f.wrapper),h=a(e.list).css(f.list),j=0,a.extend(c.prototype,{register:function(a){this.strategies=this.strategies.concat(a)},renderList:function(a){this.clearAtNext&&(this.listView.clear(),this.clearAtNext=!1),a.length&&(this.listView.shown||(this.listView.setPosition(this.getCaretPosition()).clear().activate(),this.listView.strategy=this.strategy),a=a.slice(0,this.strategy.maxCount),this.listView.render(a)),!this.listView.data.length&&this.listView.shown&&this.listView.deactivate()},searchCallbackFactory:function(a){var b=this;return function(c,d){b.renderList(c),d||(a(),b.clearAtNext=!0)}},onKeyup:function(a){var b,c;if(!this.skipSearch(a))if(b=this.extractSearchQuery(this.getTextFromHeadToCaret()),b.length){if(c=b[1],this.term===c)return;this.term=c,this.search(b)}else this.term=null,this.listView.deactivate()},skipSearch:function(a){if(this.skipNextKeyup)return this.skipNextKeyup=!1,!0;switch(a.keyCode){case 40:case 38:return!0}},onSelect:function(b){var c,d,e;c=this.getTextFromHeadToCaret(),d=this.el.value.substring(this.el.selectionEnd),e=this.strategy.replace(b),a.isArray(e)&&(d=e[1]+d,e=e[0]),c=c.replace(this.strategy.match,e),this.$el.val(c+d).trigger("textComplete:select",b),this.el.focus(),this.el.selectionStart=this.el.selectionEnd=c.length,this.skipNextKeyup=!0},onClickDocument:function(a){a.originalEvent&&!a.originalEvent.keepTextCompleteDropdown&&this.listView.deactivate()},onKeyupDocument:function(a){this.listView.shown&&27===a.keyCode&&(this.listView.deactivate(),this.$el.focus())},destroy:function(){var b;this.$el.off("keyup.textComplete").off("keydown.textComplete"),a(document).off("click."+this.id).off("keyup."+this.id),this.listView.destroy(),b=this.$el.parent(),b.after(this.$el).remove(),this.$el.data("textComplete",void 0),this.$el=null},getCaretPosition:function(){if(0!==this.el.selectionEnd){var b,c,e,f,g;return b=["border-width","font-family","font-size","font-style","font-variant","font-weight","height","letter-spacing","word-spacing","line-height","text-decoration","width","padding-top","padding-right","padding-bottom","padding-left","margin-top","margin-right","margin-bottom","margin-left"],c=a.extend({position:"absolute",overflow:"auto","white-space":"pre-wrap",top:0,left:-9999},d(this.$el,b)),e=a("
    ").css(c).text(this.getTextFromHeadToCaret()),f=a("").text(" ").appendTo(e),this.$el.before(e),g=f.position(),g.top+=f.height()-this.$el.scrollTop(),e.remove(),g}},getTextFromHeadToCaret:function(){var a,b,c;return b=this.el.selectionEnd,"number"==typeof b?a=this.el.value.substring(0,b):document.selection&&(c=this.el.createTextRange(),c.moveStart("character",0),c.moveEnd("textedit"),a=c.text),a},extractSearchQuery:function(a){var b,c,d,e;for(b=0,c=this.strategies.length;c>b;b++)if(d=this.strategies[b],e=a.match(d.match))return[d,e[d.index]];return[]},search:b(function(a,b){var c;this.strategy=b[0],c=b[1],this.strategy.search(c,this.searchCallbackFactory(a))})});var k=function(a){return g.clone().css("display",a.css("display"))};return c}(),i=function(){function b(b,c){this.$el=b,this.index=0,this.completer=c,this.$el.on("click.textComplete","li.textcomplete-item",a.proxy(this.onClick,this))}return a.extend(b.prototype,{shown:!1,render:function(a){var b,c,d,e,f;for(b="",c=0,d=a.length;d>c&&(f=a[c],g(this.data,f)||(e=this.data.length,this.data.push(f),b+='
  • ',b+=this.strategy.template(f),b+="
  • ",this.data.length!==this.strategy.maxCount));c++);this.$el.append(b),this.data.length?this.activateIndexedItem():this.deactivate()},clear:function(){return this.data=[],this.$el.html(""),this.index=0,this},activateIndexedItem:function(){this.$el.find(".active").removeClass("active"),this.getActiveItem().addClass("active")},getActiveItem:function(){return a(this.$el.children().get(this.index))},activate:function(){return this.shown||(this.$el.show(),this.completer.$el.trigger("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.completer.$el.trigger("textComplete:hide"),this.shown=!1,this.data=this.index=null),this},setPosition:function(a){return this.$el.css(a),this},select:function(a){this.completer.onSelect(this.data[a]),this.deactivate()},onKeydown:function(a){this.shown&&(38===a.keyCode?(a.preventDefault(),0===this.index?this.index=this.data.length-1:this.index-=1,this.activateIndexedItem()):40===a.keyCode?(a.preventDefault(),this.index===this.data.length-1?this.index=0:this.index+=1,this.activateIndexedItem()):(13===a.keyCode||9===a.keyCode)&&(a.preventDefault(),this.select(parseInt(this.getActiveItem().data("index"),10))))},onClick:function(b){var c=a(b.target);b.originalEvent.keepTextCompleteDropdown=!0,c.hasClass("textcomplete-item")||(c=c.parents("li.textcomplete-item")),this.select(parseInt(c.data("index"),10))},destroy:function(){this.deactivate(),this.$el.off("click.textComplete").remove(),this.$el=null}}),b}();a.fn.textcomplete=function(b){var c,d,g,i;if(i="textComplete","destroy"===b)return this.each(function(){var b=a(this).data(i);b&&b.destroy()});for(c=0,d=b.length;d>c;c++)g=b[c],g.template||(g.template=e),null==g.index&&(g.index=2),g.cache&&(g.search=f(g.search)),g.maxCount||(g.maxCount=10);return this.each(function(){var c,d;c=a(this),d=c.data(i),d||(d=new h(c),c.data(i,d)),d.register(b)})}}(window.jQuery||window.Zepto); From 427dda654af8bdd3f879c4f436ab16cd4f248732 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 11 Apr 2015 16:13:19 -0400 Subject: [PATCH 105/295] temp fix for #2994 --- public/src/modules/composer.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 8c2c58ec68..06d97baf02 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -284,8 +284,15 @@ define('composer', [ composer.bsEnvironment = utils.findBootstrapEnvironment(); + // see + // https://github.com/NodeBB/NodeBB/issues/2994 and + // https://github.com/NodeBB/NodeBB/issues/1951 + // remove when 1951 is resolved + + var title = postData.title.replace(/%/g, '%').replace(/,/g, ','); + var data = { - title: postData.title, + title: title, mobile: composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm', allowTopicsThumbnail: allowTopicsThumbnail, isTopicOrMain: isTopic || isMain, From 1ce3d7284baaeb6394db317012f7e5fe9817b9e1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 11 Apr 2015 16:48:09 -0400 Subject: [PATCH 106/295] closes #2995 --- src/privileges/topics.js | 73 ++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 01bdd6c4f1..0f4a9babdb 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -72,35 +72,56 @@ module.exports = function(privileges) { return callback(null, []); } - topics.getTopicsFields(tids, ['tid', 'cid'], function(err, topics) { - if (err) { - return callback(err); - } - - var cids = topics.map(function(topic) { - return topic.cid; - }); - - privileges.categories.filterCids(privilege, cids, uid, function(err, cids) { - if (err) { - return callback(err); - } - - tids = topics.filter(function(topic) { - return cids.indexOf(topic.cid) !== -1; - }).map(function(topic) { - return topic.tid; + async.waterfall([ + function(next) { + topics.getTopicsFields(tids, ['tid', 'cid', 'deleted'], next); + }, + function(topicsData, next) { + var cids = topicsData.map(function(topic) { + return topic.cid; + }).filter(function(cid, index, array) { }); - plugins.fireHook('filter:privileges.topics.filter', { - privilege: privilege, - uid: uid, - tids: tids - }, function(err, data) { - callback(err, data ? data.tids : null); + async.parallel({ + categories: function(next) { + categories.getMultipleCategoryFields(cids, ['disabled'], next); + }, + allowedTo: function(next) { + helpers.isUserAllowedTo(privilege, uid, cids, next); + }, + isModerators: function(next) { + user.isModerator(uid, cids, next); + }, + isAdmin: function(next) { + user.isAdministrator(uid, next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + var isModOf = {}; + cids = cids.filter(function(cid, index) { + isModOf[cid] = results.isModerators[index]; + (results.allowedTo[index] || results.isAdmin || results.isModerators[index]); + }); + + tids = topicsData.filter(function(topic) { + return cids.indexOf(topic.cid) !== -1 && + (parseInt(topic.deleted, 10) !== 1 || results.isAdmin || isModOf[topic.cid]); + }).map(function(topic) { + return topic.tid; + }); + + plugins.fireHook('filter:privileges.topics.filter', { + privilege: privilege, + uid: uid, + tids: tids + }, function(err, data) { + next(err, data ? data.tids : null); + }); }); - }); - }); + } + ], callback); }; privileges.topics.canEdit = function(tid, uid, callback) { From 1b2da78fd80b4d7b18d3910bbb240e56b47af494 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 11 Apr 2015 16:50:55 -0400 Subject: [PATCH 107/295] missing lines --- src/privileges/topics.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 0f4a9babdb..174c078efc 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -80,6 +80,7 @@ module.exports = function(privileges) { var cids = topicsData.map(function(topic) { return topic.cid; }).filter(function(cid, index, array) { + return cid && array.indexOf(cid) === index; }); async.parallel({ @@ -102,6 +103,7 @@ module.exports = function(privileges) { var isModOf = {}; cids = cids.filter(function(cid, index) { isModOf[cid] = results.isModerators[index]; + return !results.categories[index].disabled && (results.allowedTo[index] || results.isAdmin || results.isModerators[index]); }); From 4d414d0b63221df8658c2f133035ffba1b9aee8c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Sun, 12 Apr 2015 11:19:22 -0400 Subject: [PATCH 108/295] .category-box and .post-preview now components --- public/src/client/categories.js | 12 ++++-------- public/src/modules/components.js | 6 +++++- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/src/client/categories.js b/public/src/client/categories.js index f3ec819130..33db4ef784 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -29,23 +29,19 @@ define('forum/categories', ['components', 'translator'], function(components, tr }; function renderNewPost(cid, post) { - var category = components.get('category/topic', 'cid', cid); - if (!category.length) { - return; - } - var categoryBox = category.find('.category-box'); + var category = components.get('categories/category', 'cid', cid); var numRecentReplies = category.attr('data-numRecentReplies'); if (!numRecentReplies || !parseInt(numRecentReplies, 10)) { return; } - var recentPosts = categoryBox.find('.post-preview'); + var recentPosts = category.find('[component="category/posts"]'); var insertBefore = recentPosts.first(); parseAndTranslate([post], function(html) { html.hide(); if(recentPosts.length === 0) { - html.appendTo(categoryBox); + html.appendTo(category); } else { html.insertBefore(recentPosts.first()); } @@ -54,7 +50,7 @@ define('forum/categories', ['components', 'translator'], function(components, tr app.createUserTooltips(); - if (categoryBox.find('.post-preview').length > parseInt(numRecentReplies, 10)) { + if (category.find('[component="category/posts"]').length > parseInt(numRecentReplies, 10)) { recentPosts.last().remove(); } diff --git a/public/src/modules/components.js b/public/src/modules/components.js index 85f8b04526..71ae09ab99 100644 --- a/public/src/modules/components.js +++ b/public/src/modules/components.js @@ -30,7 +30,11 @@ define('components', function() { }, 'category/topic': function(name, value) { - return $('[data-' + name + '="' + value + '"]'); + return $('[component="category/topic"][data-' + name + '="' + value + '"]'); + }, + + 'categories/category': function(name, value) { + return $('[component="categories/category"][data-' + name + '="' + value + '"]'); } }; From 5db4714ba850bfc829034123cccac8253002684b Mon Sep 17 00:00:00 2001 From: psychobunny Date: Sun, 12 Apr 2015 11:30:47 -0400 Subject: [PATCH 109/295] add success message to watch / ignore category methods --- public/language/en_GB/category.json | 6 +++++- public/src/client/category.js | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/public/language/en_GB/category.json b/public/language/en_GB/category.json index 3e131894bd..53a0eb3bc8 100644 --- a/public/language/en_GB/category.json +++ b/public/language/en_GB/category.json @@ -7,5 +7,9 @@ "no_replies": "No one has replied", "share_this_category": "Share this category", - "ignore": "Ignore" + "watch": "Watch", + "ignore": "Ignore", + + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } diff --git a/public/src/client/category.js b/public/src/client/category.js index a42837d851..5e64f4fc56 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -73,6 +73,8 @@ define('forum/category', [ $('.watch').toggleClass('hidden', command === 'watch'); $('.ignore').toggleClass('hidden', command === 'ignore'); + + app.alertSuccess('[[category:' + command + '.message]]') }); }); } From e78fc9814628176c9788cc2580401228079da600 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Sun, 12 Apr 2015 12:07:33 -0400 Subject: [PATCH 110/295] cross-browser support for composer resize animation --- public/src/modules/composer/resize.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 66f22462f3..614556c6bf 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -37,7 +37,14 @@ define('composer/resize', ['autosize'], function(autosize) { } if (env === 'md' || env === 'lg') { - postContainer.css('transform', 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'); + var transform = 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'; + postContainer.css({ + '-webkit-transform': transform + '-moz-transform': transform + '-ms-transform': transform + '-o-transform': transform + 'transform': transform + }); } else { postContainer.removeAttr('style'); } From 1201425db22f00a9779bcf02ff711f7ecc2a34be Mon Sep 17 00:00:00 2001 From: psychobunny Date: Sun, 12 Apr 2015 12:07:57 -0400 Subject: [PATCH 111/295] hint --- public/src/modules/composer/resize.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index 614556c6bf..23b5f67adb 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -39,10 +39,10 @@ define('composer/resize', ['autosize'], function(autosize) { if (env === 'md' || env === 'lg') { var transform = 'translate(0, ' + (Math.abs(1-percentage) * 100) + '%)'; postContainer.css({ - '-webkit-transform': transform - '-moz-transform': transform - '-ms-transform': transform - '-o-transform': transform + '-webkit-transform': transform, + '-moz-transform': transform, + '-ms-transform': transform, + '-o-transform': transform, 'transform': transform }); } else { From 3de083208dd489cb6c0269442dd4c9d95fd83640 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sun, 12 Apr 2015 22:12:22 -0400 Subject: [PATCH 112/295] closes #3002 --- src/controllers/search.js | 3 +-- src/search.js | 15 ++++++++------- src/user/search.js | 2 ++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/controllers/search.js b/src/controllers/search.js index 55134c7ec6..b1b1141a79 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -49,8 +49,7 @@ searchController.search = function(req, res, next) { return next(err); } - var pageCount = Math.max(1, Math.ceil(results.matchCount / 10)); - results.pagination = pagination.create(page, pageCount, req.query); + results.pagination = pagination.create(page, results.pageCount, req.query); results.showAsPosts = !req.query.showAs || req.query.showAs === 'posts'; results.showAsTopics = req.query.showAs === 'topics'; results.breadcrumbs = breadcrumbs; diff --git a/src/search.js b/src/search.js index 7d76666f7e..a0c156535a 100644 --- a/src/search.js +++ b/src/search.js @@ -27,6 +27,7 @@ search.search = function(data, callback) { } result[searchIn] = data.matches; result.matchCount = data.matchCount; + result.pageCount = data.pageCount; result.time = (process.elapsedTimeSince(start) / 1000).toFixed(2); callback(null, result); } @@ -45,7 +46,7 @@ search.search = function(data, callback) { if (searchIn === 'posts' || searchIn === 'titles' || searchIn === 'titlesposts') { searchInContent(data, done); } else if (searchIn === 'users') { - searchInUsers(query, data.uid, done); + searchInUsers(data, done); } else if (searchIn === 'tags') { searchInTags(query, done); } else { @@ -89,7 +90,7 @@ function searchInContent(data, callback) { var matchCount = 0; if (!results || (!results.pids.length && !results.tids.length)) { - return callback(null, {matches: [], matchCount: matchCount}); + return callback(null, {matches: [], matchCount: matchCount, pageCount: 1}); } async.waterfall([ @@ -116,7 +117,7 @@ function searchInContent(data, callback) { posts.getPostSummaryByPids(pids, data.uid, {stripTags: true, parse: false}, next); }, function(posts, next) { - next(null, {matches: posts, matchCount: matchCount}); + next(null, {matches: posts, matchCount: matchCount, pageCount: Math.max(1, Math.ceil(parseInt(matchCount, 10) / 10))}); } ], callback); }); @@ -432,12 +433,12 @@ function getSearchUids(data, callback) { } } -function searchInUsers(query, uid, callback) { - user.search({query: query, uid: uid}, function(err, results) { +function searchInUsers(data, callback) { + user.search(data, function(err, results) { if (err) { return callback(err); } - callback(null, {matches: results.users, matchCount: results.matchCount}); + callback(null, {matches: results.users, matchCount: results.matchCount, pageCount: results.pageCount}); }); } @@ -447,7 +448,7 @@ function searchInTags(query, callback) { return callback(err); } - callback(null, {matches: tags, matchCount: tags.length}); + callback(null, {matches: tags, matchCount: tags.length, pageCount: 1}); }); } diff --git a/src/user/search.js b/src/user/search.js index 08b2ebefa3..ec1420e676 100644 --- a/src/user/search.js +++ b/src/user/search.js @@ -43,6 +43,7 @@ module.exports = function(User) { var pagination = user.paginate(page, uids); uids = pagination.data; searchResult.pagination = pagination.pagination; + searchResult.pageCount = pagination.pageCount; } User.getUsers(uids, uid, next); @@ -66,6 +67,7 @@ module.exports = function(User) { return { pagination: pagination.create(currentPage, pageCount), + pageCount: pageCount, data: data.slice(start, stop) }; }; From 3ec99b802193ca5153ef45c929edc433ad9a79e5 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 13 Apr 2015 10:34:23 -0400 Subject: [PATCH 113/295] #3011 --- public/src/modules/helpers.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index f48a7e8c00..aa5e2413d4 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -44,13 +44,20 @@ }; helpers.escape = function(str) { - var utils = utils || require('../utils'); - return utils.escapeHTML(str); + if (typeof utils !== 'undefined') { + return utils.escapeHTML(str); + } else { + return require('../utils').escapeHTML(str); + } }; helpers.stripTags = function(str) { - var S = S || require('string'); - return S(str).stripTags().s; + if (typeof S !== 'undefined') { + return S(str).stripTags().s; + } else { + var S = require('string'); + return S(str).stripTags().s; + } }; helpers.generateCategoryBackground = function(category) { From bbef94ed2519eed4b20d69ee2191ec8d17e96963 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 13 Apr 2015 10:41:35 -0400 Subject: [PATCH 114/295] made the security vulnerability section a bit more obvious --- CONTRIBUTING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5223929285..d6d64a04a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,6 +13,11 @@ If you are writing contributions as part of employment from another company / in Chances are somebody has run into this problem before. After consulting our [documentation](https://docs.nodebb.org/en/latest/installing/os.html), please head over to our [community support forum](https://community.nodebb.org) for advice. +# Found a Security Vulnerability? + +If you believe you have identified a security vulnerability with NodeBB, report it as soon as possible via email to **security@nodebb.org**. +A member of the NodeBB security team will respond to the issue. +Please do not post it to the public bug tracker. # Issues & Bugs @@ -20,11 +25,6 @@ Thanks for reporting an issue with NodeBB! Please follow these guidelines in ord In general, if we can't reproduce it, we can't fix it! -> #### **Important** -> If you believe you have identified a security vulnerability with NodeBB, report it as soon as possible via email to **security@nodebb.org**. -> A member of the NodeBB security team will respond to the issue. -> Please do not post it to the public bug tracker. - ## Try the latest version of NodeBB There is a chance that the issue you are experiencing may have already been fixed. From c92ef6cf34d082d67bc7d6878eb043861fbb23ed Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 13 Apr 2015 10:57:34 -0400 Subject: [PATCH 115/295] closes #3012 --- 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 09b1509171..644bd6a4cb 100644 --- a/public/language/en_GB/groups.json +++ b/public/language/en_GB/groups.json @@ -24,6 +24,8 @@ "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", From cf825d02b79854ddb81bd53074e30521742e80fd Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 12:45:35 -0400 Subject: [PATCH 116/295] escape title --- public/src/modules/composer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 06d97baf02..6b871207f5 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -289,7 +289,7 @@ define('composer', [ // https://github.com/NodeBB/NodeBB/issues/1951 // remove when 1951 is resolved - var title = postData.title.replace(/%/g, '%').replace(/,/g, ','); + var title = $('
    ').text(postData.title).html().replace(/%/g, '%').replace(/,/g, ','); var data = { title: title, From 1910fdb977068d3f70f9b138175990bcc7910840 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 13:04:47 -0400 Subject: [PATCH 117/295] fix xss on guest handles, make sure guest handlers arent longer than max username length --- src/topics/create.js | 19 ++++++++++++++++++- src/topics/posts.js | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/topics/create.js b/src/topics/create.js index e81e07c9ed..ec1bf21d0d 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -126,6 +126,11 @@ module.exports = function(Topics) { if(!canCreate) { return next(new Error('[[error:no-privileges]]')); } + + if (!guestHandleValid(data)) { + return next(new Error('[[error:guest-handle-invalid]]')); + } + user.isReadyToPost(uid, next); }, function(next) { @@ -209,6 +214,10 @@ module.exports = function(Topics) { return next(new Error('[[error:no-privileges]]')); } + if (!guestHandleValid(data)) { + return next(new Error('[[error:guest-handle-invalid]]')); + } + user.isReadyToPost(uid, next); }, function(next) { @@ -257,7 +266,7 @@ module.exports = function(Topics) { // Username override for guests, if enabled if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postData.uid, 10) === 0 && data.handle) { - postData.user.username = data.handle; + postData.user.username = validator.escape(data.handle); } if (results.settings.followTopicsOnReply) { @@ -294,4 +303,12 @@ module.exports = function(Topics) { callback(); } + function guestHandleValid(data) { + if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(data.uid, 10) === 0 && + data.handle && data.handle.length > meta.config.maximumUsernameLength) { + return false; + } + return true; + } + }; diff --git a/src/topics/posts.js b/src/topics/posts.js index 88d106aa99..b80b0b4935 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -5,6 +5,7 @@ var async = require('async'), winston = require('winston'), _ = require('underscore'), + validator = require('validator'), db = require('../database'), user = require('../user'), @@ -141,7 +142,7 @@ module.exports = function(Topics) { // Username override for guests, if enabled if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) { - postObj.user.username = postObj.handle; + postObj.user.username = validator.escape(postObj.handle); } } }); From dd175ada671a893c46a448bb50078c2d0c0a343f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 13:07:20 -0400 Subject: [PATCH 118/295] closes #3003 --- src/controllers/search.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/controllers/search.js b/src/controllers/search.js index b1b1141a79..6637acbbc3 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -22,6 +22,10 @@ searchController.search = function(req, res, next) { return next(err); } + categories = categories.filter(function(category) { + return category && !category.link; + }); + 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)) { From 663ad38727ea3944a18b94c378c0bc0383e84199 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 13:17:24 -0400 Subject: [PATCH 119/295] closes #3004 --- public/language/en_GB/search.json | 1 - 1 file changed, 1 deletion(-) diff --git a/public/language/en_GB/search.json b/public/language/en_GB/search.json index 090b900eef..304134918b 100644 --- a/public/language/en_GB/search.json +++ b/public/language/en_GB/search.json @@ -3,7 +3,6 @@ "no-matches": "No matches found", "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", From 5501c0c759f44fcf0447f66ba1a7d2088ec0f8bb Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 15:01:38 -0400 Subject: [PATCH 120/295] closes #3005 --- public/src/client/account/edit.js | 4 +- src/controllers/accounts.js | 74 ++--------------- src/socket.io/user.js | 24 ++++-- src/user.js | 1 + src/user/picture.js | 131 ++++++++++++++++++++++++++++++ 5 files changed, 158 insertions(+), 76 deletions(-) create mode 100644 src/user/picture.js diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index b3c8c0af6a..4b2e0ff93d 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -203,7 +203,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], if (!url) { return; } - socket.emit('user.uploadProfileImageFromUrl', url, function(err, imageUrlOnServer) { + socket.emit('user.uploadProfileImageFromUrl', {url: url, uid: ajaxify.variables.get('theirid')}, function(err, imageUrlOnServer) { if (err) { return app.alertError(err.message); } @@ -300,7 +300,7 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], } else { if (!passwordsmatch) { app.alertError('[[user:change_password_error_match]]'); - } + } if (!passwordvalid) { app.alertError('[[user:change_password_error]]'); diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 3f5d23653a..78629b50cc 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -3,8 +3,6 @@ var accountsController = {}; var fs = require('fs'), - path = require('path'), - winston = require('winston'), nconf = require('nconf'), async = require('async'), validator = require('validator'), @@ -20,8 +18,7 @@ var fs = require('fs'), meta = require('../meta'), plugins = require('../plugins'), languages = require('../languages'), - image = require('../image'), - file = require('../file'), + helpers = require('./helpers'); function getUserDataByUserSlug(userslug, callerUID, callback) { @@ -369,32 +366,10 @@ accountsController.accountSettings = function(req, res, next) { accountsController.uploadPicture = function (req, res, next) { var userPhoto = req.files.files[0]; - var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; - var extension = path.extname(userPhoto.name); + var updateUid = req.uid; - var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; - var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; async.waterfall([ - function(next) { - next(userPhoto.size > uploadSize * 1024 ? new Error('[[error:file-too-big, ' + uploadSize + ']]') : null); - }, - function(next) { - next(!extension ? new Error('[[error:invalid-image-extension]]') : null); - }, - function(next) { - file.isFileTypeAllowed(userPhoto.path, ['png', 'jpeg', 'jpg', 'gif'], next); - }, - function(next) { - image.resizeImage(userPhoto.path, extension, imageDimension, imageDimension, next); - }, - function(next) { - if (convertToPNG) { - image.convertImageToPng(userPhoto.path, extension, next); - } else { - next(); - } - }, function(next) { user.getUidByUserslug(req.params.userslug, next); }, @@ -414,50 +389,17 @@ accountsController.uploadPicture = function (req, res, next) { updateUid = uid; next(); }); + }, + function(next) { + user.uploadPicture(updateUid, userPhoto, next); } - ], function(err, result) { - - function done(err, image) { - fs.unlink(userPhoto.path); - if (err) { - return res.json({error: err.message}); - } - - user.setUserFields(updateUid, {uploadedpicture: image.url, picture: image.url}); - - res.json([{name: userPhoto.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url}]); - } - + ], function(err, image) { + fs.unlink(userPhoto.path); if (err) { - fs.unlink(userPhoto.path); return next(err); } - if (plugins.hasListeners('filter:uploadImage')) { - return plugins.fireHook('filter:uploadImage', {image: userPhoto, uid: updateUid}, done); - } - - var filename = updateUid + '-profileimg' + (convertToPNG ? '.png' : extension); - - user.getUserField(updateUid, 'uploadedpicture', function (err, oldpicture) { - if (err) { - return next(err); - } - if (!oldpicture) { - file.saveFileToLocal(filename, 'profile', userPhoto.path, done); - return; - } - - var absolutePath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'profile', path.basename(oldpicture)); - - fs.unlink(absolutePath, function (err) { - if (err) { - winston.error(err); - } - - file.saveFileToLocal(filename, 'profile', userPhoto.path, done); - }); - }); + res.json([{name: userPhoto.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url}]); }); }; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 3cd15c9b92..e395418142 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -263,19 +263,27 @@ SocketUser.changePicture = function(socket, data, callback) { }); }; -SocketUser.uploadProfileImageFromUrl = function(socket, url, callback) { - if (!socket.uid || !url) { +SocketUser.uploadProfileImageFromUrl = function(socket, data, callback) { + function upload() { + user.uploadFromUrl(data.uid, data.url, function(err, uploadedImage) { + callback(err, uploadedImage ? uploadedImage.url : null); + }); + } + + if (!socket.uid || !data.url || !data.uid) { return; } - plugins.fireHook('filter:uploadImage', {image: {url: url}, uid: socket.uid}, function(err, data) { - if (err) { - return callback(err); + if (parseInt(socket.uid, 10) === parseInt(data.uid, 10)) { + return upload(); + } + + user.isAdministrator(socket.uid, function(err, isAdmin) { + if (err || !isAdmin) { + return callback(err || new Error('[[error:not-allowed]]')); } - user.setUserFields(socket.uid, {uploadedpicture: data.url, picture: data.url}, function(err) { - callback(err, data.url); - }); + upload(); }); }; diff --git a/src/user.js b/src/user.js index 281000ccc0..7ad9810554 100644 --- a/src/user.js +++ b/src/user.js @@ -29,6 +29,7 @@ var async = require('async'), require('./user/settings')(User); require('./user/search')(User); require('./user/jobs')(User); + require('./user/picture')(User); User.getUserField = function(uid, field, callback) { User.getUserFields(uid, [field], function(err, user) { diff --git a/src/user/picture.js b/src/user/picture.js new file mode 100644 index 0000000000..d726773a55 --- /dev/null +++ b/src/user/picture.js @@ -0,0 +1,131 @@ +'use strict'; + +var async = require('async'), + path = require('path'), + fs = require('fs'), + nconf = require('nconf'), + winston = require('winston'), + request = require('request'), + mime = require('mime'), + + plugins = require('../plugins'), + file = require('../file'), + image = require('../image'), + meta = require('../meta'); + +module.exports = function(User) { + + User.uploadPicture = function (uid, picture, callback) { + + var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; + var extension = path.extname(picture.name); + var updateUid = uid; + var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; + var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; + + async.waterfall([ + function(next) { + next(picture.size > uploadSize * 1024 ? new Error('[[error:file-too-big, ' + uploadSize + ']]') : null); + }, + function(next) { + next(!extension ? new Error('[[error:invalid-image-extension]]') : null); + }, + function(next) { + file.isFileTypeAllowed(picture.path, ['png', 'jpeg', 'jpg', 'gif'], next); + }, + function(next) { + image.resizeImage(picture.path, extension, imageDimension, imageDimension, next); + }, + function(next) { + if (convertToPNG) { + image.convertImageToPng(picture.path, extension, next); + } else { + next(); + } + } + ], function(err, result) { + + function done(err, image) { + if (err) { + return callback(err); + } + + User.setUserFields(updateUid, {uploadedpicture: image.url, picture: image.url}); + + callback(null, image); + } + + if (err) { + return callback(err); + } + + if (plugins.hasListeners('filter:uploadImage')) { + return plugins.fireHook('filter:uploadImage', {image: picture, uid: updateUid}, done); + } + + var filename = updateUid + '-profileimg' + (convertToPNG ? '.png' : extension); + + User.getUserField(updateUid, 'uploadedpicture', function (err, oldpicture) { + if (err) { + return callback(err); + } + + if (!oldpicture) { + return file.saveFileToLocal(filename, 'profile', picture.path, done); + } + + var absolutePath = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'profile', path.basename(oldpicture)); + + fs.unlink(absolutePath, function (err) { + if (err) { + winston.error(err); + } + + file.saveFileToLocal(filename, 'profile', picture.path, done); + }); + }); + }); + }; + + User.uploadFromUrl = function(uid, url, callback) { + var filename = 'uid:' + uid + ':tmp-image'; + downloadFromUrl(url, filename, function(err, downloadedImage) { + if (err) { + return callback(err); + } + + User.uploadPicture(uid, downloadedImage, function(err, image) { + fs.unlink(filename); + callback(err, image); + }); + }); + }; + + function downloadFromUrl(url, filename, callback) { + request.head(url, function(err, res, body) { + if (err) { + return callback(err); + } + var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; + var size = res.headers['content-length']; + var type = res.headers['content-type']; + var extension = mime.extension(type); + + if (size > uploadSize * 1024) { + return callback(new Error('[[error:file-too-big, ' + uploadSize + ']]')); + } + + request.get(url) + .on('error', function(err) { + winston.error(err); + }) + .pipe(fs.createWriteStream(filename)) + .on('close', function(err) { + if (err) { + return callback(err); + } + callback(null, {path: filename, size: size, type: type, name: filename + '.' + extension}); + }); + }); + } +}; \ No newline at end of file From 80250b6f6cf9a3897ae7ca8c724d7a729c46a7ea Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Apr 2015 16:02:19 -0400 Subject: [PATCH 121/295] adding default of parentCid 0 if parentCid not set --- src/categories.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/categories.js b/src/categories.js index c57013f47f..b3c29a5a15 100644 --- a/src/categories.js +++ b/src/categories.js @@ -252,6 +252,8 @@ var async = require('async'), Categories.getMultipleCategoryFields(cids, ['parentCid'], function(err, data) { if (err) { return callback(err); + } else if (!data.hasOwnProperty('parentCid')) { + data.parentCid = 0; } var parentCids = data.map(function(category) { From 7fa014e5ad41f5c3e6fba88b479670abe6a8ab19 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 16:10:51 -0400 Subject: [PATCH 122/295] closes #3016 --- src/topics/follow.js | 114 ++++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 50 deletions(-) diff --git a/src/topics/follow.js b/src/topics/follow.js index 7bcfab8ea7..c34e15fd96 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -11,6 +11,7 @@ var async = require('async'), posts = require('../posts'), postTools = require('../postTools'), notifications = require('../notifications'), + privileges = require('../privileges'), meta = require('../meta'), emailer = require('../emailer'); @@ -96,60 +97,73 @@ module.exports = function(Topics) { db.getSetMembers('tid:' + tid + ':followers', callback); }; - Topics.notifyFollowers = function(postData, exceptUid) { - Topics.getFollowers(postData.topic.tid, function(err, followers) { - if (err || !Array.isArray(followers) || !followers.length) { - return; - } - - var index = followers.indexOf(exceptUid.toString()); - if (index !== -1) { - followers.splice(index, 1); - } - - if (!followers.length) { - return; - } + Topics.notifyFollowers = function(postData, exceptUid, callback) { + callback = callback || function() {}; + var followers, title; - var title = postData.topic.title; - if (title) { - title = S(title).decodeHTMLEntities().s; - } + async.waterfall([ + function(next) { + Topics.getFollowers(postData.topic.tid, next); + }, + function(followers, next) { + if (!Array.isArray(followers) || !followers.length) { + return callback(); + } + var index = followers.indexOf(exceptUid.toString()); + if (index !== -1) { + followers.splice(index, 1); + } + if (!followers.length) { + return callback(); + } - notifications.create({ - bodyShort: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + title + ']]', - bodyLong: postData.content, - pid: postData.pid, - nid: 'tid:' + postData.topic.tid + ':pid:' + postData.pid + ':uid:' + exceptUid, - tid: postData.topic.tid, - from: exceptUid - }, function(err, notification) { - if (!err && notification) { - notifications.push(notification, followers); + privileges.categories.filterUids('read', postData.topic.cid, followers, next); + }, + function(_followers, next) { + followers = _followers; + if (!followers.length) { + return callback(); + } + title = postData.topic.title; + if (title) { + title = S(title).decodeHTMLEntities().s; } - }); - async.eachLimit(followers, 3, function(toUid, next) { - async.parallel({ - userData: async.apply(user.getUserFields, toUid, ['username']), - userSettings: async.apply(user.getSettings, toUid) - }, function(err, data) { - if (data.userSettings.hasOwnProperty('sendPostNotifications') && data.userSettings.sendPostNotifications) { - emailer.send('notif_post', toUid, { - pid: postData.pid, - subject: '[' + (meta.config.title || 'NodeBB') + '] ' + title, - intro: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + title + ']]', - postBody: postData.content, - site_title: meta.config.title || 'NodeBB', - username: data.userData.username, - url: nconf.get('url') + '/topic/' + postData.topic.tid, - base_url: nconf.get('url') - }, next); - } else { - winston.debug('[topics.notifyFollowers] uid ' + toUid + ' does not have post notifications enabled, skipping.'); - } + notifications.create({ + bodyShort: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + title + ']]', + bodyLong: postData.content, + pid: postData.pid, + nid: 'tid:' + postData.topic.tid + ':pid:' + postData.pid + ':uid:' + exceptUid, + tid: postData.topic.tid, + from: exceptUid + }, next); + }, + function(notification, next) { + notifications.push(notification, followers); + + async.eachLimit(followers, 3, function(toUid, next) { + async.parallel({ + userData: async.apply(user.getUserFields, toUid, ['username']), + userSettings: async.apply(user.getSettings, toUid) + }, function(err, data) { + if (data.userSettings.hasOwnProperty('sendPostNotifications') && data.userSettings.sendPostNotifications) { + emailer.send('notif_post', toUid, { + pid: postData.pid, + subject: '[' + (meta.config.title || 'NodeBB') + '] ' + title, + intro: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + title + ']]', + postBody: postData.content, + site_title: meta.config.title || 'NodeBB', + username: data.userData.username, + url: nconf.get('url') + '/topic/' + postData.topic.tid, + base_url: nconf.get('url') + }, next); + } else { + winston.debug('[topics.notifyFollowers] uid ' + toUid + ' does not have post notifications enabled, skipping.'); + } + }); }); - }); - }); + next(); + } + ], callback); }; }; \ No newline at end of file From ceba856006a549d39d4c5d7c9b3363fb03cac2ae Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Apr 2015 16:12:13 -0400 Subject: [PATCH 123/295] fixing categories with null parentCids, again --- src/categories.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/categories.js b/src/categories.js index b3c29a5a15..9bcb78f025 100644 --- a/src/categories.js +++ b/src/categories.js @@ -252,12 +252,14 @@ var async = require('async'), Categories.getMultipleCategoryFields(cids, ['parentCid'], function(err, data) { if (err) { return callback(err); - } else if (!data.hasOwnProperty('parentCid')) { - data.parentCid = 0; } var parentCids = data.map(function(category) { - return category && category.parentCid; + if (category && category.hasOwnProperty('parentCid') && category.parentCid) { + return category.parentCid; + } else { + return 0; + } }); Categories.getCategoriesData(parentCids, callback); From fa9fde43fb1e3d9a67000b7f69261d8eb150f3d5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 13 Apr 2015 17:29:43 -0400 Subject: [PATCH 124/295] closes #2971 --- public/language/en_GB/error.json | 1 + public/src/client/account/edit.js | 2 + src/database/redis/main.js | 16 +++-- src/socket.io/admin/user.js | 6 +- src/socket.io/user.js | 3 +- src/user/create.js | 2 +- src/user/email.js | 99 +++++++++++++++++-------------- src/user/profile.js | 2 +- 8 files changed, 74 insertions(+), 57 deletions(-) diff --git a/public/language/en_GB/error.json b/public/language/en_GB/error.json index a8d4c042b5..11f507b168 100644 --- a/public/language/en_GB/error.json +++ b/public/language/en_GB/error.json @@ -26,6 +26,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 4b2e0ff93d..e44d9f3f81 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -220,7 +220,9 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], function handleEmailConfirm() { $('#confirm-email').on('click', function() { + var btn = $(this).attr('disabled', true); socket.emit('user.emailConfirm', {}, function(err) { + btn.removeAttr('disabled'); if (err) { return app.alertError(err.message); } diff --git a/src/database/redis/main.js b/src/database/redis/main.js index b09574e10f..59ae28827f 100644 --- a/src/database/redis/main.js +++ b/src/database/redis/main.js @@ -105,18 +105,26 @@ module.exports = function(redisClient, module) { }; module.expire = function(key, seconds, callback) { - redisClient.expire(key, seconds, callback); + redisClient.expire(key, seconds, function(err) { + callback(err); + }); }; module.expireAt = function(key, timestamp, callback) { - redisClient.expireat(key, timestamp, callback); + redisClient.expireat(key, timestamp, function(err) { + callback(err); + }); }; module.pexpire = function(key, ms, callback) { - redisClient.pexpire(key, ms, callback); + redisClient.pexpire(key, ms, function(err) { + callback(err); + }); }; module.pexpireAt = function(key, timestamp, callback) { - redisClient.pexpireat(key, timestamp, callback); + redisClient.pexpireat(key, timestamp, function(err) { + callback(err); + }); }; }; diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index 0fa583d742..454a51741a 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -1,7 +1,7 @@ "use strict"; -var async = require('async'), +var async = require('async'), db = require('../../database'), groups = require('../../groups'), user = require('../../user'), @@ -132,7 +132,7 @@ 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]]')); } @@ -144,7 +144,7 @@ User.sendValidationEmail = function(socket, uids, callback) { async.eachLimit(usersData, 50, function(userData, next) { if (userData.email && userData.uid) { - user.email.verify(userData.uid, userData.email, next); + user.email.sendValidationEmail(userData.uid, userData.email, next); } else { next(); } diff --git a/src/socket.io/user.js b/src/socket.io/user.js index e395418142..02a7aee65e 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -53,8 +53,7 @@ SocketUser.emailConfirm = function(socket, data, callback) { return; } - user.email.verify(socket.uid, email); - callback(); + user.email.sendValidationEmail(socket.uid, email, callback); }); } }; diff --git a/src/user/create.js b/src/user/create.js index d11669099f..db85c81508 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -116,7 +116,7 @@ module.exports = function(User) { if (userData.email) { db.setObjectField('email:uid', userData.email.toLowerCase(), userData.uid, next); if (parseInt(userData.uid, 10) !== 1 && parseInt(meta.config.requireEmailConfirmation, 10) === 1) { - User.email.verify(userData.uid, userData.email); + User.email.sendValidationEmail(userData.uid, userData.email); } } else { next(); diff --git a/src/user/email.js b/src/user/email.js index 973a7e844e..b4c6460683 100644 --- a/src/user/email.js +++ b/src/user/email.js @@ -27,61 +27,68 @@ var async = require('async'), }); }; - UserEmail.verify = function(uid, email, callback) { + UserEmail.sendValidationEmail = 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); - } + var emailInterval = 10; - async.series([ - function(next) { - db.setObject('confirm:' + confirm_code, { - email: email.toLowerCase(), - uid: uid - }, next); - }, - function(next) { - db.expireAt('confirm:' + confirm_code, Math.floor(Date.now() / 1000 + 60 * 60 * 2), next); + async.waterfall([ + function(next) { + db.get('uid:' + uid + ':confirm:email:sent', next); + }, + function(sent, next) { + if (sent) { + return next(new Error('[[error:confirm-email-already-sent, ' + emailInterval + ']]')); } - ], function(err) { - if (err) { - return callback(err); - } - user.getUserField(uid, 'username', function(err, username) { - if (err) { - return winston.error(err.stack); - } + db.set('uid:' + uid + ':confirm:email:sent', 1, next); + }, + function(next) { + db.pexpireAt('uid:' + uid + ':confirm:email:sent', Date.now() + (emailInterval * 60 * 1000), next); + }, + function(next) { + plugins.fireHook('filter:user.verify.code', confirm_code, next); + }, + function(_confirm_code, next) { + confirm_code = _confirm_code; + db.setObject('confirm:' + confirm_code, { + email: email.toLowerCase(), + uid: uid + }, next); + }, + function(next) { + db.expireAt('confirm:' + confirm_code, Math.floor(Date.now() / 1000 + 60 * 60 * 2), next); + }, + function(next) { + user.getUserField(uid, 'username', next); + }, + function(username, next) { + var title = meta.config.title || meta.config.browserTitle || 'NodeBB'; + translator.translate('[[email:welcome-to, ' + title + ']]', meta.config.defaultLang, function(subject) { + var data = { + site_title: title, + username: username, + confirm_link: confirm_link, + confirm_code: confirm_code, - var title = meta.config.title || meta.config.browserTitle || 'NodeBB'; - translator.translate('[[email:welcome-to, ' + title + ']]', meta.config.defaultLang, function(subject) { - var data = { - site_title: title, - username: username, - confirm_link: confirm_link, - confirm_code: confirm_code, - - subject: subject, - template: 'welcome', - uid: uid - }; + subject: subject, + template: 'welcome', + uid: uid + }; - 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, callback); - } else { - winston.warn('No emailer to send verification email!'); - callback(); - } - }); + if (plugins.hasListeners('action:user.verify')) { + plugins.fireHook('action:user.verify', {uid: uid, data: data}); + next(); + } else if (plugins.hasListeners('action:email.send')) { + emailer.send('welcome', uid, data, next); + } else { + winston.warn('No emailer to send verification email!'); + next(); + } }); - }); - }); + } + ], callback); }; UserEmail.confirm = function(code, callback) { diff --git a/src/user/profile.js b/src/user/profile.js index a284165061..1eb66893ca 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -162,7 +162,7 @@ module.exports = function(User) { }, function(next) { if (parseInt(meta.config.requireEmailConfirmation, 10) === 1 && newEmail) { - User.email.verify(uid, newEmail); + User.email.sendValidationEmail(uid, newEmail); } User.setUserField(uid, 'email:confirmed', 0, next); }, From 32d3be0cbdda4e5f8046295333cb9d589db8a0d4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Apr 2015 20:02:56 -0400 Subject: [PATCH 125/295] closes #3014, closes #3009 --- public/language/ar/category.json | 5 ++++- public/language/ar/error.json | 1 + public/language/ar/groups.json | 2 ++ public/language/ar/search.json | 2 +- public/language/ar/user.json | 3 ++- public/language/bn/category.json | 5 ++++- public/language/bn/error.json | 1 + public/language/bn/groups.json | 2 ++ public/language/bn/search.json | 2 +- public/language/bn/user.json | 3 ++- public/language/cs/category.json | 5 ++++- public/language/cs/error.json | 1 + public/language/cs/groups.json | 2 ++ public/language/cs/search.json | 2 +- public/language/cs/user.json | 3 ++- public/language/de/category.json | 5 ++++- public/language/de/error.json | 1 + public/language/de/groups.json | 2 ++ public/language/de/modules.json | 10 +++++----- public/language/de/search.json | 2 +- public/language/de/topic.json | 8 ++++---- public/language/de/user.json | 3 ++- public/language/el/category.json | 5 ++++- public/language/el/error.json | 1 + public/language/el/groups.json | 2 ++ public/language/el/search.json | 2 +- public/language/el/user.json | 3 ++- public/language/en@pirate/category.json | 5 ++++- public/language/en@pirate/error.json | 1 + public/language/en@pirate/groups.json | 2 ++ public/language/en@pirate/search.json | 2 +- public/language/en@pirate/user.json | 3 ++- public/language/en_US/category.json | 5 ++++- public/language/en_US/error.json | 1 + public/language/en_US/groups.json | 2 ++ public/language/en_US/search.json | 2 +- public/language/en_US/user.json | 3 ++- public/language/es/category.json | 5 ++++- public/language/es/error.json | 1 + public/language/es/groups.json | 2 ++ public/language/es/search.json | 2 +- public/language/es/user.json | 3 ++- public/language/et/category.json | 5 ++++- public/language/et/error.json | 1 + public/language/et/groups.json | 2 ++ public/language/et/search.json | 2 +- public/language/et/user.json | 3 ++- public/language/fa_IR/category.json | 5 ++++- public/language/fa_IR/error.json | 1 + public/language/fa_IR/groups.json | 2 ++ public/language/fa_IR/search.json | 2 +- public/language/fa_IR/user.json | 3 ++- public/language/fi/category.json | 5 ++++- public/language/fi/error.json | 1 + public/language/fi/groups.json | 2 ++ public/language/fi/search.json | 2 +- public/language/fi/user.json | 3 ++- public/language/fr/category.json | 5 ++++- public/language/fr/error.json | 1 + public/language/fr/groups.json | 2 ++ public/language/fr/modules.json | 8 ++++---- public/language/fr/search.json | 2 +- public/language/fr/user.json | 3 ++- public/language/he/category.json | 5 ++++- public/language/he/error.json | 1 + public/language/he/groups.json | 2 ++ public/language/he/search.json | 2 +- public/language/he/user.json | 3 ++- public/language/hu/category.json | 5 ++++- public/language/hu/error.json | 1 + public/language/hu/groups.json | 2 ++ public/language/hu/search.json | 2 +- public/language/hu/user.json | 3 ++- public/language/id/category.json | 5 ++++- public/language/id/error.json | 1 + public/language/id/groups.json | 2 ++ public/language/id/search.json | 2 +- public/language/id/user.json | 3 ++- public/language/it/category.json | 5 ++++- public/language/it/error.json | 1 + public/language/it/groups.json | 2 ++ public/language/it/modules.json | 6 +++--- public/language/it/pages.json | 2 +- public/language/it/reset_password.json | 2 +- public/language/it/search.json | 2 +- public/language/it/user.json | 5 +++-- public/language/ja/category.json | 5 ++++- public/language/ja/error.json | 1 + public/language/ja/groups.json | 2 ++ public/language/ja/search.json | 2 +- public/language/ja/user.json | 3 ++- public/language/ko/category.json | 5 ++++- public/language/ko/error.json | 1 + public/language/ko/groups.json | 2 ++ public/language/ko/search.json | 2 +- public/language/ko/user.json | 3 ++- public/language/lt/category.json | 5 ++++- public/language/lt/error.json | 1 + public/language/lt/groups.json | 2 ++ public/language/lt/search.json | 2 +- public/language/lt/user.json | 3 ++- public/language/ms/category.json | 5 ++++- public/language/ms/error.json | 1 + public/language/ms/groups.json | 2 ++ public/language/ms/search.json | 2 +- public/language/ms/user.json | 3 ++- public/language/nb/category.json | 5 ++++- public/language/nb/error.json | 1 + public/language/nb/groups.json | 2 ++ public/language/nb/search.json | 2 +- public/language/nb/user.json | 3 ++- public/language/nl/category.json | 5 ++++- public/language/nl/error.json | 1 + public/language/nl/groups.json | 2 ++ public/language/nl/search.json | 2 +- public/language/nl/user.json | 3 ++- public/language/pl/category.json | 5 ++++- public/language/pl/error.json | 1 + public/language/pl/groups.json | 2 ++ public/language/pl/search.json | 2 +- public/language/pl/user.json | 3 ++- public/language/pt_BR/category.json | 5 ++++- public/language/pt_BR/error.json | 1 + public/language/pt_BR/groups.json | 2 ++ public/language/pt_BR/modules.json | 8 ++++---- public/language/pt_BR/pages.json | 2 +- public/language/pt_BR/reset_password.json | 2 +- public/language/pt_BR/search.json | 2 +- public/language/pt_BR/user.json | 5 +++-- public/language/ro/category.json | 5 ++++- public/language/ro/error.json | 1 + public/language/ro/groups.json | 2 ++ public/language/ro/search.json | 2 +- public/language/ro/user.json | 3 ++- public/language/ru/category.json | 5 ++++- public/language/ru/error.json | 1 + public/language/ru/groups.json | 2 ++ public/language/ru/modules.json | 6 +++--- public/language/ru/search.json | 2 +- public/language/ru/user.json | 3 ++- public/language/sc/category.json | 5 ++++- public/language/sc/error.json | 1 + public/language/sc/groups.json | 2 ++ public/language/sc/search.json | 2 +- public/language/sc/user.json | 3 ++- public/language/sk/category.json | 5 ++++- public/language/sk/error.json | 1 + public/language/sk/groups.json | 2 ++ public/language/sk/search.json | 2 +- public/language/sk/user.json | 3 ++- public/language/sv/category.json | 5 ++++- public/language/sv/error.json | 1 + public/language/sv/groups.json | 2 ++ public/language/sv/search.json | 2 +- public/language/sv/user.json | 3 ++- public/language/th/category.json | 5 ++++- public/language/th/error.json | 1 + public/language/th/groups.json | 2 ++ public/language/th/search.json | 2 +- public/language/th/user.json | 3 ++- public/language/tr/category.json | 5 ++++- public/language/tr/error.json | 5 +++-- public/language/tr/groups.json | 4 +++- public/language/tr/modules.json | 10 +++++----- public/language/tr/pages.json | 6 +++--- public/language/tr/reset_password.json | 2 +- public/language/tr/search.json | 2 +- public/language/tr/tags.json | 2 +- public/language/tr/user.json | 7 ++++--- public/language/vi/category.json | 5 ++++- public/language/vi/error.json | 1 + public/language/vi/groups.json | 2 ++ public/language/vi/search.json | 2 +- public/language/vi/user.json | 3 ++- public/language/zh_CN/category.json | 5 ++++- public/language/zh_CN/error.json | 1 + public/language/zh_CN/groups.json | 2 ++ public/language/zh_CN/modules.json | 8 ++++---- public/language/zh_CN/search.json | 2 +- public/language/zh_CN/user.json | 3 ++- public/language/zh_TW/category.json | 5 ++++- public/language/zh_TW/error.json | 1 + public/language/zh_TW/groups.json | 2 ++ public/language/zh_TW/search.json | 2 +- public/language/zh_TW/user.json | 3 ++- 185 files changed, 388 insertions(+), 150 deletions(-) diff --git a/public/language/ar/category.json b/public/language/ar/category.json index 456ba908c2..6a975425c0 100644 --- a/public/language/ar/category.json +++ b/public/language/ar/category.json @@ -5,5 +5,8 @@ "browsing": "تصفح", "no_replies": "لم يرد أحد", "share_this_category": "انشر هذه الفئة", - "ignore": "تجاهل" + "watch": "Watch", + "ignore": "تجاهل", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 01c1aa7109..3fcc3eb60c 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.", "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "اسم المستخدم قصير.", "username-too-long": "اسم المستخدم طويل", "user-banned": "المستخدم محظور", diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index 1c6a8f90e5..9e5c9fa799 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -20,6 +20,8 @@ "details.kick": "طرد", "details.owner_options": "تدبير المجموعة", "details.group_name": "اسم المجموعة", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "الوصف", "details.badge_preview": "معاينة الوسام", "details.change_icon": "تغيير الأيقونة", diff --git a/public/language/ar/search.json b/public/language/ar/search.json index 9128baf408..ba8bb5da76 100644 --- a/public/language/ar/search.json +++ b/public/language/ar/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 نتيجة (نتائج) موافقة ل \"%2\", (%3 ثواني)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/ar/user.json b/public/language/ar/user.json index a58b91915a..3087ca0ed1 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -79,5 +79,6 @@ "topic_search_help": "في حالة تفعيلها، ستعوض خاصيةُ البحث داخل المواضيع خاصيةَ البحث الخاصة بالمتصفح، فتمكنك بالتالي بالبحث في الموضوع بأكمله دون الاقتصار على مايظهر في الشاشة فحسب.", "follow_topics_you_reply_to": "متابعة المشاركات التي ترد عليها", "follow_topics_you_create": "متابعة المشاركات التي تكتبها", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/bn/category.json b/public/language/bn/category.json index b706e85080..52a6c76853 100644 --- a/public/language/bn/category.json +++ b/public/language/bn/category.json @@ -5,5 +5,8 @@ "browsing": "ব্রাউজিং", "no_replies": "কোন রিপ্লাই নেই", "share_this_category": "এই বিভাগটি অন্যের সাথে ভাগাভাগি করুন", - "ignore": "উপেক্ষা করুন" + "watch": "Watch", + "ignore": "উপেক্ষা করুন", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 71ff379ba6..532c67214a 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "খুব ছোট ইউজারনেম", "username-too-long": "ইউজারনেম বড় হয়ে গিয়েছে", "user-banned": "ব্যবহারকারী নিষিদ্ধ", diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json index 50e0a886dc..d87b5bc5d0 100644 --- a/public/language/bn/groups.json +++ b/public/language/bn/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/bn/search.json b/public/language/bn/search.json index 8fef1aef5a..66f4c69a7e 100644 --- a/public/language/bn/search.json +++ b/public/language/bn/search.json @@ -1,8 +1,8 @@ { "results_matching": "\"%2\" এর সাথে মিলিয়ে %1 ফলাফল পাওয়া গেছে, ( %3 seconds সময় লেগেছে )", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/bn/user.json b/public/language/bn/user.json index 01f9dfcef4..a20d86ad70 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -79,5 +79,6 @@ "topic_search_help": "যদি এনাবল করা হয়ে থাকে, In-topic সার্চিং ব্রাউজারের ডিফল্ট সার্চের বদলে পুরো টপিকজুড়ে সার্চ করার সুবিধা দিবে, যা কেবলমাত্র বর্তমান স্কৃণে দেখানো অংশের মধ্যে সীমাবদ্ধ থাকবে না। ", "follow_topics_you_reply_to": "আপনার উত্তর দেয়া টপিকগুলো ফলো করুন", "follow_topics_you_create": "আপনার তৈরীকরা টপিকসমূহ ফলো করুন", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/cs/category.json b/public/language/cs/category.json index 0d598e974a..6f156ea04b 100644 --- a/public/language/cs/category.json +++ b/public/language/cs/category.json @@ -5,5 +5,8 @@ "browsing": "prohlíží", "no_replies": "Nikdo ještě neodpověděl", "share_this_category": "Share this category", - "ignore": "Ignorovat" + "watch": "Watch", + "ignore": "Ignorovat", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/cs/error.json b/public/language/cs/error.json index fdfdb5f6d3..e4b6c3bb64 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Uživatelské jméno je příliš krátké", "username-too-long": "Uživatelské jméno je příliš dlouhé", "user-banned": "Uživatel byl zakázán", diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 06b86790ae..9a52faf4f7 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/cs/search.json b/public/language/cs/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/cs/search.json +++ b/public/language/cs/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 32199ae6f6..d7b56418be 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/de/category.json b/public/language/de/category.json index f6a13932c2..72b3855c20 100644 --- a/public/language/de/category.json +++ b/public/language/de/category.json @@ -5,5 +5,8 @@ "browsing": "Aktiv", "no_replies": "Niemand hat geantwortet", "share_this_category": "Teile diese Kategorie", - "ignore": "Ignorieren" + "watch": "Watch", + "ignore": "Ignorieren", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/de/error.json b/public/language/de/error.json index 5819a2ee17..1de7dd2b94 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "Deine E-Mail wurde noch nicht bestätigt. Bitte klicke hier, um deine E-Mail zu bestätigen.", "no-email-to-confirm": "Dieses Forum setzt E-Mail-Bestätigung voraus, bitte klick hier um eine E-Mail-Adresse einzugeben", "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Benutzername ist zu kurz", "username-too-long": "Der Benutzername ist zu lang", "user-banned": "Der Benutzer ist gesperrt", diff --git a/public/language/de/groups.json b/public/language/de/groups.json index 52fa359f53..e52eb2cf8e 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Gruppenadministration", "details.group_name": "Gruppenname", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Beschreibung", "details.badge_preview": "Abzeichenvorschau", "details.change_icon": "Symbol ändern", diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 46aa412d54..d0287d790c 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7 Tage", "chat.thirty_days": "30 Tage", "chat.three_months": "3 Monate", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Verfassen", + "composer.show_preview": "Vorschau anzeigen", + "composer.hide_preview": "Vorschau ausblenden", "composer.user_said_in": "%1 sagte in %2:", "composer.user_said": "%1 sagte:", - "composer.discard": "Bist du sicher, dass du diesen Post verwerfen möchtest?", + "composer.discard": "Bist du sicher, dass du diesen Beitrag verwerfen möchtest?", "composer.submit_and_lock": "Einreichen und Sperren", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.toggle_dropdown": "Menu aus-/einblenden" } \ No newline at end of file diff --git a/public/language/de/search.json b/public/language/de/search.json index b803315a9d..5606127487 100644 --- a/public/language/de/search.json +++ b/public/language/de/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 Ergebnis(se) stimmen mit \"%2\" überein, (%3 Sekunden)", "no-matches": "Keine Ergebnisse gefunden", + "advanced-search": "Advanced Search", "in": "In", - "by": "Bei", "titles": "Titel", "titles-posts": "Titel und Beiträge", "posted-by": "Geschrieben von", diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 7036cb823a..c4fe7732d8 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -15,7 +15,7 @@ "guest-login-reply": "Anmelden zum Antworten", "edit": "bearbeiten", "delete": "löschen", - "purge": "bereinigen", + "purge": "säubern", "restore": "Wiederherstellen", "move": "verschieben", "fork": "Aufspalten", @@ -51,12 +51,12 @@ "thread_tools.delete_confirm": "Bist du sicher, dass du dieses Thema löschen möchtest?", "thread_tools.restore": "Thema wiederherstellen", "thread_tools.restore_confirm": "Bist du sicher, dass du dieses Thema wiederherstellen möchtest?", - "thread_tools.purge": "Thema bereinigen", - "thread_tools.purge_confirm": "Bist du sicher, dass du dieses Thema bereinigen möchtest?", + "thread_tools.purge": "Thema säubern", + "thread_tools.purge_confirm": "Bist du sicher, dass du dieses Thema säubern möchtest?", "topic_move_success": "Thema wurde erfolgreich zu %1 verschoben.", "post_delete_confirm": "Sind Sie sicher, dass Sie diesen Beitrag löschen möchten?", "post_restore_confirm": "Sind Sie sicher, dass Sie diesen Beitrag wiederherstellen möchten?", - "post_purge_confirm": "Sind Sie sicher, das Sie diesen Beitrag bereinigen möchten?", + "post_purge_confirm": "Sind Sie sicher, das Sie diesen Beitrag säubern möchten?", "load_categories": "Kategorien laden", "disabled_categories_note": "Deaktivierte Kategorien sind ausgegraut.", "confirm_move": "Verschieben", diff --git a/public/language/de/user.json b/public/language/de/user.json index dcd3570fdd..ebb971beeb 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Falls aktiviert, wird die Suche im Thema das Standardsuchverhalten des Browsers überschreiben und es Ihnen erlauben, das ganze Thema statt dessen, was sich auf dem Bildschirm befindet, zu durchsuchen.", "follow_topics_you_reply_to": "Folge Themen, auf die du antwortest.", "follow_topics_you_create": "Folge Themen, die du erstellst.", - "grouptitle": "Wähle den anzuzeigenden Gruppen Titel aus" + "grouptitle": "Wähle den anzuzeigenden Gruppen Titel aus", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/el/category.json b/public/language/el/category.json index 73f3b51724..b49b18c0e2 100644 --- a/public/language/el/category.json +++ b/public/language/el/category.json @@ -5,5 +5,8 @@ "browsing": "περιηγούνται", "no_replies": "Κανείς δεν έχει απαντήσει", "share_this_category": "Μοιράσου αυτή την κατηγορία", - "ignore": "Αγνόηση" + "watch": "Watch", + "ignore": "Αγνόηση", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/el/error.json b/public/language/el/error.json index 2d00c366d4..34fdbab7a8 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Το όνομα χρήστη είναι πολύ μικρό", "username-too-long": "Το όνομα χρήστη είναι πολύ μεγάλο", "user-banned": "Ο Χρήστης είναι αποκλεισμένος/η", diff --git a/public/language/el/groups.json b/public/language/el/groups.json index 305920e189..28c9fbe159 100644 --- a/public/language/el/groups.json +++ b/public/language/el/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/el/search.json b/public/language/el/search.json index 11b0b90621..e650dbe2e5 100644 --- a/public/language/el/search.json +++ b/public/language/el/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 αποτελεσμα(τα) για \"%2\", (%3 δευτερόλεπτα)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/el/user.json b/public/language/el/user.json index c6eabf9362..d35d996bd2 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -79,5 +79,6 @@ "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_you_create": "Ακολούθα τα θέματα που δημιουργείς.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/en@pirate/category.json b/public/language/en@pirate/category.json index c2c0b64832..7e84700d2f 100644 --- a/public/language/en@pirate/category.json +++ b/public/language/en@pirate/category.json @@ -5,5 +5,8 @@ "browsing": "browsin'", "no_replies": "No one has replied to ye message", "share_this_category": "Share this category", - "ignore": "Ignore" + "watch": "Watch", + "ignore": "Ignore", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index 17465a20a3..44b70fd7d3 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "User banned", diff --git a/public/language/en@pirate/groups.json b/public/language/en@pirate/groups.json index d2314fdc29..5e301aa46a 100644 --- a/public/language/en@pirate/groups.json +++ b/public/language/en@pirate/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/en@pirate/search.json b/public/language/en@pirate/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/en@pirate/search.json +++ b/public/language/en@pirate/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/en@pirate/user.json b/public/language/en@pirate/user.json index 7dfbd79589..28971f9bf3 100644 --- a/public/language/en@pirate/user.json +++ b/public/language/en@pirate/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/en_US/category.json b/public/language/en_US/category.json index 8245a2c365..be0b8e42f5 100644 --- a/public/language/en_US/category.json +++ b/public/language/en_US/category.json @@ -5,5 +5,8 @@ "browsing": "browsing", "no_replies": "No one has replied", "share_this_category": "Share this category", - "ignore": "Ignore" + "watch": "Watch", + "ignore": "Ignore", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index 17465a20a3..44b70fd7d3 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "User banned", diff --git a/public/language/en_US/groups.json b/public/language/en_US/groups.json index d2314fdc29..5e301aa46a 100644 --- a/public/language/en_US/groups.json +++ b/public/language/en_US/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/en_US/search.json b/public/language/en_US/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/en_US/search.json +++ b/public/language/en_US/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/en_US/user.json b/public/language/en_US/user.json index 5551959ce5..e9a96ed0f9 100644 --- a/public/language/en_US/user.json +++ b/public/language/en_US/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/es/category.json b/public/language/es/category.json index 8c6b0fd5ca..c76a662ebf 100644 --- a/public/language/es/category.json +++ b/public/language/es/category.json @@ -5,5 +5,8 @@ "browsing": "viendo ahora", "no_replies": "Nadie ha respondido aún", "share_this_category": "Compartir esta categoría", - "ignore": "Ignorar" + "watch": "Watch", + "ignore": "Ignorar", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/es/error.json b/public/language/es/error.json index e7e9723169..33d629cf6a 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Este foro requiere confirmación de su email, por favor pulse aquí para introducir un email", "email-confirm-failed": "No se ha podido confirmar su email, por favor inténtelo de nuevo más tarde.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Nombre de usuario es demasiado corto", "username-too-long": "Nombre de usuario demasiado largo", "user-banned": "Usuario baneado", diff --git a/public/language/es/groups.json b/public/language/es/groups.json index 22a80ba19a..e12df34a70 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -20,6 +20,8 @@ "details.kick": "Expulsar", "details.owner_options": "Administración De Grupo", "details.group_name": "Nombre de Grupo", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Descripción", "details.badge_preview": "Previsualización de Insignia", "details.change_icon": "Cambiar Icono", diff --git a/public/language/es/search.json b/public/language/es/search.json index 135144c2b3..d9c1192723 100644 --- a/public/language/es/search.json +++ b/public/language/es/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 resuldado(s) coinciden con \"%2\". (%3 segundos)", "no-matches": "No se encontraron coincidencias", + "advanced-search": "Advanced Search", "in": "En", - "by": "Por", "titles": "Títulos", "titles-posts": "Títulos y publicaciones", "posted-by": "Publicado por", diff --git a/public/language/es/user.json b/public/language/es/user.json index b6f415a725..dcec6a1bcb 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Si está activada, la búsqueda 'in-topic' invalidará el comportamiento por defecto del navegador de buscar sólo en la página mostrada y le permitirá entonces buscar en el tema al completo, en vez de hacer una búsqueda únicamente sobre el contenido de la pantalla.", "follow_topics_you_reply_to": "Seguir los temas en las que respondes.", "follow_topics_you_create": "Seguir publicaciones que creas.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/et/category.json b/public/language/et/category.json index 0e02820329..118fd930ce 100644 --- a/public/language/et/category.json +++ b/public/language/et/category.json @@ -5,5 +5,8 @@ "browsing": "vaatab", "no_replies": "Keegi pole vastanud", "share_this_category": "Jaga seda kategooriat", - "ignore": "Ignoreeri" + "watch": "Watch", + "ignore": "Ignoreeri", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/et/error.json b/public/language/et/error.json index c58f87f6b8..cf4a9ad518 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "Sõnumeid ei ole võimalik enne saata kui sinu email on kinnitatud. Kinnitamiseks vajuta siia.", "no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email", "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Kasutajanimi on liiga lühike", "username-too-long": "Kasutajanimi on liiga pikk", "user-banned": "Kasutaja bannitud", diff --git a/public/language/et/groups.json b/public/language/et/groups.json index b89b3f5c4a..e60d080f1f 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -20,6 +20,8 @@ "details.kick": "Viska välja", "details.owner_options": "Grupi haldamine", "details.group_name": "Grupi nimi", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Kirjeldus", "details.badge_preview": "Embleemi eelvaade", "details.change_icon": "Vaheta ikooni", diff --git a/public/language/et/search.json b/public/language/et/search.json index b11f2d84bc..a9f4e17dce 100644 --- a/public/language/et/search.json +++ b/public/language/et/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 tulemus(t) mis vastavad otsingule \"%2\", (%3 sekundit)", "no-matches": "Vasteid ei leitud", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/et/user.json b/public/language/et/user.json index 74ffd88cf6..f4a59443fb 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Kui sisse lülitatud, siis teemasisisene otsing võtab üle brauseri tavapärase lehe otsingu käitumise ning võimaldab otsida terve teema ulatuses ainult ekraanile mahtuva teema asemel.", "follow_topics_you_reply_to": "Järgi teemasid millele vastuse kirjutad.", "follow_topics_you_create": "Järgi teemasid, mis on sinu loodud.", - "grouptitle": "Vali grupile tiitel mida kuvada soovid" + "grouptitle": "Vali grupile tiitel mida kuvada soovid", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/fa_IR/category.json b/public/language/fa_IR/category.json index c11280e51b..6674d4f031 100644 --- a/public/language/fa_IR/category.json +++ b/public/language/fa_IR/category.json @@ -5,5 +5,8 @@ "browsing": "بیننده‌ها", "no_replies": "هیچ کسی پاسخ نداده است.", "share_this_category": "به اشتراک‌گذاری این دسته", - "ignore": "نادیده گرفتن" + "watch": "Watch", + "ignore": "نادیده گرفتن", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index 0a1f675ef7..cdb0510e12 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "شما تا قبل از تایید رایانامه قادر به گفتگو نیستید، لطفا برای تایید رایانامه خود اینجا کلیک کنید", "no-email-to-confirm": "این انجمن نیاز به تایید رایانامه دارد، لطفا برای وارد کردن رایانامه اینجا کلیک کنید", "email-confirm-failed": "ما نتوانستیم رایانامه شما را تایید کنیم، لطفا بعدا دوباره سعی کنید", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", "user-banned": "کاربر محروم شد.", diff --git a/public/language/fa_IR/groups.json b/public/language/fa_IR/groups.json index 25be273bbe..0acc2e28c6 100644 --- a/public/language/fa_IR/groups.json +++ b/public/language/fa_IR/groups.json @@ -20,6 +20,8 @@ "details.kick": "لگد", "details.owner_options": "مدیر گروه", "details.group_name": "نام گروه", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "توضیحات", "details.badge_preview": "پیش نمایشِ نشان", "details.change_icon": "تغییر آیکن", diff --git a/public/language/fa_IR/search.json b/public/language/fa_IR/search.json index 6ed7f642e2..513d9dc3bc 100644 --- a/public/language/fa_IR/search.json +++ b/public/language/fa_IR/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 نتیجه (ها) مطابق با \"%2\" ,(%3 ثانیه)", "no-matches": "هیچ موردی یافت نشد", + "advanced-search": "Advanced Search", "in": "در", - "by": "با", "titles": "عناوین", "titles-posts": "عناوین و دیدگاه ها", "posted-by": "ارسال شده توسط", diff --git a/public/language/fa_IR/user.json b/public/language/fa_IR/user.json index 29bb70f4e9..ab3e57db9c 100644 --- a/public/language/fa_IR/user.json +++ b/public/language/fa_IR/user.json @@ -79,5 +79,6 @@ "topic_search_help": "اگر فعال باشد، جستجوی داخل-جستار قابلیت جستجوی مرورگر را تغییر داده و به شما اجازه میدهد تا در کل جستار، به جای انچه در حال نمایش است جستجو کنید", "follow_topics_you_reply_to": "دنبال کردن جستارهایی که پاسخ داده اید", "follow_topics_you_create": "دنبال کردن جستارهایی که ساخته اید.", - "grouptitle": "عنوان گروهی که میخواهید نشان داده شود را انتخاب کنید." + "grouptitle": "عنوان گروهی که میخواهید نشان داده شود را انتخاب کنید.", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/fi/category.json b/public/language/fi/category.json index 6e36ca410c..0c0233c3b1 100644 --- a/public/language/fi/category.json +++ b/public/language/fi/category.json @@ -5,5 +5,8 @@ "browsing": "selaamassa", "no_replies": "Kukaan ei ole vastannut", "share_this_category": "Jaa tämä kategoria", - "ignore": "Sivuuta" + "watch": "Watch", + "ignore": "Sivuuta", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/fi/error.json b/public/language/fi/error.json index c343ca1345..18583bb756 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Käyttäjänimi on liian lyhyt", "username-too-long": "Käyttäjänimi on liian pitkä", "user-banned": "Käyttäjä on estetty", diff --git a/public/language/fi/groups.json b/public/language/fi/groups.json index c8538e2c28..b320947545 100644 --- a/public/language/fi/groups.json +++ b/public/language/fi/groups.json @@ -20,6 +20,8 @@ "details.kick": "Potkaise", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/fi/search.json b/public/language/fi/search.json index df7f7a2352..d920c18409 100644 --- a/public/language/fi/search.json +++ b/public/language/fi/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Otsikot", "titles-posts": "Otsikot ja Viestit", "posted-by": "Kirjoittanut", diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 83f2888f29..043cc5737e 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -79,5 +79,6 @@ "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": "Seuraa aiheita, joihin olen vastannut.", "follow_topics_you_create": "Seuraa aloittamiani aiheita.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/fr/category.json b/public/language/fr/category.json index 98a8ae2b90..a2840375a7 100644 --- a/public/language/fr/category.json +++ b/public/language/fr/category.json @@ -5,5 +5,8 @@ "browsing": "parcouru par", "no_replies": "Personne n'a répondu", "share_this_category": "Partager cette catégorie", - "ignore": "Ignorer" + "watch": "Watch", + "ignore": "Ignorer", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 05a4510e95..36f603c4f8 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "Il ne vous est pas possible d'utiliser le chat tant que votre adresse email n'a pas été vérifiée. Veuillez cliquer ici pour confirmer votre adresse email.", "no-email-to-confirm": "Ce forum requiert une vérification de votre adresse email. Veuillez cliquer ici pour entrer une adresse.", "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Nom d'utilisateur trop court", "username-too-long": "Nom d'utilisateur trop long", "user-banned": "Utilisateur banni", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index ce980d472e..450117c08f 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -20,6 +20,8 @@ "details.kick": "Exclure", "details.owner_options": "Administration du groupe", "details.group_name": "Nom du groupe", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Aperçu du badge", "details.change_icon": "Modifier l'icône", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index b3cc1f54a3..5c5e9b3fdf 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7 Jours", "chat.thirty_days": "30 Jours", "chat.three_months": "3 Mois", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Écrire", + "composer.show_preview": "Afficher l'aperçu", + "composer.hide_preview": "Masquer l'aperçu", "composer.user_said_in": "%1 a dit dans %2 :", "composer.user_said": "%1 a dit :", "composer.discard": "Êtes-vous sûr de bien vouloir supprimer ce message ?", "composer.submit_and_lock": "Soumettre et Verrouiller", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.toggle_dropdown": "Afficher/masquer le menu" } \ No newline at end of file diff --git a/public/language/fr/search.json b/public/language/fr/search.json index f05eec953d..1de42e7924 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 résultat(s) correspondant(s) à \"%2\", (%3 secondes)", "no-matches": "Aucune réponse trouvée", + "advanced-search": "Advanced Search", "in": "Dans", - "by": "Par", "titles": "Titres", "titles-posts": "Titres et Messages", "posted-by": "Posté par", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 1159ffb60f..9d3719cdc3 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts chargés.", "follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez.", "follow_topics_you_create": "Suivre les sujets que vous créez.", - "grouptitle": "Sélectionnez le titre de groupe que vous souhaitez afficher" + "grouptitle": "Sélectionnez le titre de groupe que vous souhaitez afficher", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/he/category.json b/public/language/he/category.json index 66e87dd4e3..03fb624861 100644 --- a/public/language/he/category.json +++ b/public/language/he/category.json @@ -5,5 +5,8 @@ "browsing": "צופים בנושא זה כעת", "no_replies": "אין תגובות", "share_this_category": "שתף קטגוריה זו", - "ignore": "התעלם" + "watch": "Watch", + "ignore": "התעלם", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/he/error.json b/public/language/he/error.json index e210d21334..da01fda171 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "שם משתמש קצר מדי", "username-too-long": "שם משתמש ארוך מדי", "user-banned": "המשתמש חסום", diff --git a/public/language/he/groups.json b/public/language/he/groups.json index a6bcffab82..bb4e535bb8 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "ניהול הקבוצה", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/he/search.json b/public/language/he/search.json index b9ca111d91..5de6fe4b86 100644 --- a/public/language/he/search.json +++ b/public/language/he/search.json @@ -1,8 +1,8 @@ { "results_matching": "נמצאו %1 תוצאות עבור החיפוש \"%2\", (%3 שניות)", "no-matches": "לא נמצאו תוצאות", + "advanced-search": "Advanced Search", "in": "ב", - "by": "על ידי", "titles": "כותרות", "titles-posts": "כותרות ופוסטים", "posted-by": "פורסם על-ידי", diff --git a/public/language/he/user.json b/public/language/he/user.json index b57074521f..459c7c5d57 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -79,5 +79,6 @@ "topic_search_help": "אם מופעל, חיפוש בתוך נושא יעקוף את מנגנון החיפוש הרגיל של הדפדפן שלך על מנת לאפשר לך לחפש בתוך כל הנושא ולא רק מה שמוצג כרגע בעמוד.", "follow_topics_you_reply_to": "עקוב אחר נושאים שהגבת עליהם.", "follow_topics_you_create": "עקוב אחר נושאים שיצרת.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/hu/category.json b/public/language/hu/category.json index 2815eaab43..e77bbe78a5 100644 --- a/public/language/hu/category.json +++ b/public/language/hu/category.json @@ -5,5 +5,8 @@ "browsing": "böngészés", "no_replies": "Nem érkezett válasz", "share_this_category": "Kategória megosztása", - "ignore": "Ignorálás" + "watch": "Watch", + "ignore": "Ignorálás", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 39ec76c011..cde443a011 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Ez a fórum e-mail megerősítést kíván, kérlek kattints ide egy cím beírásához", "email-confirm-failed": "Nem tudtuk ellenőrizni az e-mail címedet, kérlek próbálkozz később.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Túl rövid felhasználónév", "username-too-long": "Túl hosszú felhasználónév", "user-banned": "Kitiltott felhasználó", diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json index 75a7b053d5..4fff97f77a 100644 --- a/public/language/hu/groups.json +++ b/public/language/hu/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/hu/search.json b/public/language/hu/search.json index 5c09b69e77..d3df716f81 100644 --- a/public/language/hu/search.json +++ b/public/language/hu/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 eredmény(ek) erre \"%2\" (%3 másodperc alatt)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 544cda9db5..a337d44677 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Amennyiben be van kapcsolva, a témán belüli keresés felül fogja írni a böngésző alapértelmezett oldalon belüli keresőjét és engedélyezni fogja neked, hogy a teljes témában kereshess, ne csak abban, ami jelenleg is megjelenik a képernyőn.", "follow_topics_you_reply_to": "Minden olyan téma követése, amihez hozzászóltál.", "follow_topics_you_create": "Minden általad létrehozott téma követése.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/id/category.json b/public/language/id/category.json index 7b0ff0f6eb..46613ff1ad 100644 --- a/public/language/id/category.json +++ b/public/language/id/category.json @@ -5,5 +5,8 @@ "browsing": "penjelajahan", "no_replies": "Belum ada orang yang menjawab", "share_this_category": "Bagikan kategori ini", - "ignore": "Abaikan" + "watch": "Watch", + "ignore": "Abaikan", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/id/error.json b/public/language/id/error.json index 6f1e7b289f..8a245422e2 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username terlalu pendek", "username-too-long": "Username terlalu panjang", "user-banned": "Pengguna dibanned", diff --git a/public/language/id/groups.json b/public/language/id/groups.json index f70bea0bf5..8cf87045b7 100644 --- a/public/language/id/groups.json +++ b/public/language/id/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/id/search.json b/public/language/id/search.json index 544579a3ff..351a44e4e5 100644 --- a/public/language/id/search.json +++ b/public/language/id/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 hasil yang sesuai dengan \"%2\", (%3 detik)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/id/user.json b/public/language/id/user.json index 7b9fc2346c..15cf853e23 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Jika digunakan, pencarian di dalam topik akan mengambil alih tindakan pencarian default browser dan mengijinkan kamu untuk mencari keseluruhan topik sebagai pengganti pencarian hanya yang tampil pada layar saja.", "follow_topics_you_reply_to": "Ikuti topik yang kamu balas.", "follow_topics_you_create": "Ikuti topik yang kamu buat.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/it/category.json b/public/language/it/category.json index 5721f6eb3f..d59b1c696f 100644 --- a/public/language/it/category.json +++ b/public/language/it/category.json @@ -5,5 +5,8 @@ "browsing": "visualizzando", "no_replies": "Nessuno ha risposto", "share_this_category": "Condividi questa Categoria", - "ignore": "Ignora" + "watch": "Watch", + "ignore": "Ignora", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/it/error.json b/public/language/it/error.json index f67e6d6cbb..b6e761860a 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "Non potrai chattare finchè non avrai confermato la tua email, per favore clicca qui per farlo ora.", "no-email-to-confirm": "Questo forum richiede la conferma dell'indirizzo email, per favore clicca qui per inserirne uno", "email-confirm-failed": "Non possiamo confermare la tua email, per favore prova ancora più tardi.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Nome utente troppo corto", "username-too-long": "Nome utente troppo lungo", "user-banned": "Utente bannato", diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 2e9abbf24a..728ed4ea21 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -20,6 +20,8 @@ "details.kick": "Espelli", "details.owner_options": "Amministratore del Grupo", "details.group_name": "Nome Gruppo", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Descrizione", "details.badge_preview": "Anteprima del Badge", "details.change_icon": "Cambia Icona", diff --git a/public/language/it/modules.json b/public/language/it/modules.json index f1245894d9..300257f616 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -15,9 +15,9 @@ "chat.seven_days": "7 Giorni", "chat.thirty_days": "30 Giorni", "chat.three_months": "3 Mesi", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Componi", + "composer.show_preview": "Visualizza Anteprima", + "composer.hide_preview": "Nascondi Anteprima", "composer.user_said_in": "%1 ha detto in %2:", "composer.user_said": "%1 ha detto:", "composer.discard": "Sei sicuro di voler scartare questo post?", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index f76f3dec66..31c72ce45b 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -6,7 +6,7 @@ "users": "Utenti Registrati", "notifications": "Notifiche", "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tag": "Discussioni taggate \"%1\"", "user.edit": "Modificando \"%1\"", "user.following": "Persone seguite da %1", "user.followers": "Persone che seguono %1", diff --git a/public/language/it/reset_password.json b/public/language/it/reset_password.json index 75c0cef364..f324a0854d 100644 --- a/public/language/it/reset_password.json +++ b/public/language/it/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "Email invalida / L'email non esiste!", "password_too_short": "La password inserita è troppo corta, inserisci una password differente.", "passwords_do_not_match": "Le due password che hai inserito non corrispondono.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "La tua password è scaduta, per favore scegline una nuova" } \ No newline at end of file diff --git a/public/language/it/search.json b/public/language/it/search.json index ec851b8966..db4854da62 100644 --- a/public/language/it/search.json +++ b/public/language/it/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 risultato(i) corrispondente(i) \"%2\", (%3 secondi)", "no-matches": "Nessuna corrispondenza trovata", + "advanced-search": "Advanced Search", "in": "In", - "by": "Da", "titles": "Titoli", "titles-posts": "Titoli e Messaggi", "posted-by": "Pubblicato da", diff --git a/public/language/it/user.json b/public/language/it/user.json index 9618dc572b..455026d183 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -27,7 +27,7 @@ "chat": "Chat", "follow": "Segui", "unfollow": "Smetti di seguire", - "more": "More", + "more": "Altro", "profile_update_success": "Profilo aggiornato correttamente!", "change_picture": "Cambia Foto", "edit": "Modifica", @@ -79,5 +79,6 @@ "topic_search_help": "Se abilitata, la ricerca negli argomenti sovrascriverà la pagina di ricerca preimpostata del browser per consentirti di cercare all'interno delle discussioni, anziché soltanto nel contenuto visibile a schermo.", "follow_topics_you_reply_to": "Segui le discussioni in cui rispondi.", "follow_topics_you_create": "Segui le discussioni che crei.", - "grouptitle": "Seleziona il titolo del gruppo che vorresti vedere" + "grouptitle": "Seleziona il titolo del gruppo che vorresti vedere", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/ja/category.json b/public/language/ja/category.json index 6fbd386dac..8d792897c4 100644 --- a/public/language/ja/category.json +++ b/public/language/ja/category.json @@ -5,5 +5,8 @@ "browsing": "閲覧中", "no_replies": "返事はまだありません", "share_this_category": "この板を共有", - "ignore": "Ignore" + "watch": "Watch", + "ignore": "Ignore", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/ja/error.json b/public/language/ja/error.json index d53e73b76e..fad34c3bcc 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "ユーザーが停止された", diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index d2314fdc29..5e301aa46a 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/ja/search.json b/public/language/ja/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/ja/search.json +++ b/public/language/ja/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 586125e599..3c9aad62f3 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/ko/category.json b/public/language/ko/category.json index 3518e3a3d1..f7ccdba720 100644 --- a/public/language/ko/category.json +++ b/public/language/ko/category.json @@ -5,5 +5,8 @@ "browsing": "이 주제를 읽고 있는 사용자", "no_replies": "답글이 없습니다.", "share_this_category": "이 카테고리를 공유", - "ignore": "관심 해제" + "watch": "Watch", + "ignore": "관심 해제", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 2c9de646c5..a25c65768c 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "사용자 이름이 너무 짧습니다.", "username-too-long": "사용자 이름이 너무 깁니다.", "user-banned": "차단된 사용자입니다.", diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index a3383c2ce2..6bc42b54fa 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/ko/search.json b/public/language/ko/search.json index 3ec01cd868..44e5d45337 100644 --- a/public/language/ko/search.json +++ b/public/language/ko/search.json @@ -1,8 +1,8 @@ { "results_matching": "\"%2\"와 일치하는 %1개의 결과를 찾았습니다 (검색시간: %3초)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index c5186b7ce5..67f69342f7 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -79,5 +79,6 @@ "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_you_create": "직접 작성한 주제를 팔로우합니다.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/lt/category.json b/public/language/lt/category.json index 3694a767a7..3fc832a8e4 100644 --- a/public/language/lt/category.json +++ b/public/language/lt/category.json @@ -5,5 +5,8 @@ "browsing": "naršo", "no_replies": "Niekas dar neatsakė", "share_this_category": "Pasidalinti šią kategoriją", - "ignore": "Nepaisyti" + "watch": "Watch", + "ignore": "Nepaisyti", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/lt/error.json b/public/language/lt/error.json index a1a25c65bc..b674f2dc9c 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Šis forumas reikalauja patvirtinimo el. paštu prašome spausti čia el. adreso įrašymui", "email-confirm-failed": "Negalime patvirtinti jūsų el. adreso, prašom bandyti vėliau.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Slapyvardis per trumpas", "username-too-long": "Vartotojo vardas per ilgas", "user-banned": "Vartotojas užblokuotas", diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index 076154cf92..cc1b781426 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Grupės pavadinimas", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Aprašymas", "details.badge_preview": "Badge Preview", "details.change_icon": "Pakeisti paveikslėlį", diff --git a/public/language/lt/search.json b/public/language/lt/search.json index b31715a6b4..34d00a95a7 100644 --- a/public/language/lt/search.json +++ b/public/language/lt/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "Atitikmenų nerasta", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Antraštės", "titles-posts": "Antraštės ir įrašai", "posted-by": "Parašė", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index dfac8074b6..aaa9d071ff 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -79,5 +79,6 @@ "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": "Sekite temas, į kurias jūs atsakėte.", "follow_topics_you_create": "Sekite jūsų sukurtas temas.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/ms/category.json b/public/language/ms/category.json index cc483ad763..cda1131d37 100644 --- a/public/language/ms/category.json +++ b/public/language/ms/category.json @@ -5,5 +5,8 @@ "browsing": "melihat", "no_replies": "Tiada jawapan", "share_this_category": "Kongsi kategori ini", - "ignore": "Ignore" + "watch": "Watch", + "ignore": "Ignore", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 23958cf5de..110b310f24 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Nama pengunna terlalu pendek", "username-too-long": "Username too long", "user-banned": "User banned", diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index d2314fdc29..5e301aa46a 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/ms/search.json b/public/language/ms/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/ms/search.json +++ b/public/language/ms/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/ms/user.json b/public/language/ms/user.json index c92a2e4d4a..b8939a16ed 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/nb/category.json b/public/language/nb/category.json index f8afafe14a..7600207edf 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -5,5 +5,8 @@ "browsing": "leser", "no_replies": "Ingen har svart", "share_this_category": "Del denne kategorien", - "ignore": "Ignorer" + "watch": "Watch", + "ignore": "Ignorer", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 8706a9d569..a0c82e91b0 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Dette forumet krever at e-postbekreftelse, vennligst klikk her for å skrive inn en e-post", "email-confirm-failed": "Vi kunne ikke godkjenne e-posten din, vennligst prøv igjen senere.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Brukernavnet er for kort", "username-too-long": "Brukernavnet er for langt", "user-banned": "Bruker utestengt", diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json index 6ff3a9b71f..0668648206 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kast ut", "details.owner_options": "Gruppeadministrasjon", "details.group_name": "Gruppenavn", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Beskrivelse", "details.badge_preview": "Forhåndsvisning av skilt", "details.change_icon": "Endre ikon", diff --git a/public/language/nb/search.json b/public/language/nb/search.json index 2f06a88eb5..51c3d113da 100644 --- a/public/language/nb/search.json +++ b/public/language/nb/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 resultat(er) samsvarer med \"%2\", (%3 sekunder)", "no-matches": "Ingen matcher funnet", + "advanced-search": "Advanced Search", "in": "I", - "by": "Av", "titles": "Titler", "titles-posts": "Titler og innlegg", "posted-by": "Skapt av", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index dd380635b0..30dd97a4c2 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Hvis aktivert, vil i-emne-søk overstyre nettleseren sin standard sidesøk-oppførsel og tillate deg å søke gjennom hele emnet, i stedet for bare det som vises på skjermen.", "follow_topics_you_reply_to": "Følg emner du svarer i.", "follow_topics_you_create": "Følg emner du oppretter.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/nl/category.json b/public/language/nl/category.json index fe05622fbb..006419994c 100644 --- a/public/language/nl/category.json +++ b/public/language/nl/category.json @@ -5,5 +5,8 @@ "browsing": "verkennen", "no_replies": "Niemand heeft gereageerd", "share_this_category": "Deel deze categorie", - "ignore": "Negeren" + "watch": "Watch", + "ignore": "Negeren", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/nl/error.json b/public/language/nl/error.json index e6be514a63..8d2036b6cb 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "U kunt helaas geen gebruik maken van chats tot uw email adres bevestigd is.", "no-email-to-confirm": "Dit forum vereist email bevestiging, klikt u alstublieft hier om uw email te vermelden", "email-confirm-failed": "Uw email kon helaas niet bevestigd worden, probeert u het alstublieft later nog eens.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Gebruikersnaam is te kort", "username-too-long": "Gebruikersnaam is te lang", "user-banned": "Gebruiker verbannen", diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 67f21acd2b..55329f7460 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -20,6 +20,8 @@ "details.kick": "Verwijder", "details.owner_options": "Groeps Administratie", "details.group_name": "Groepsnaam", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Beschrijving", "details.badge_preview": "Badge Voorvertoning", "details.change_icon": "Icoon veranderen", diff --git a/public/language/nl/search.json b/public/language/nl/search.json index c104ef95d3..5a4a2c8210 100644 --- a/public/language/nl/search.json +++ b/public/language/nl/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 resulta(a)ten was een match \"%2\", (%3 seconds)", "no-matches": "Geen matches gevonden", + "advanced-search": "Advanced Search", "in": "in", - "by": "door", "titles": "Titels", "titles-posts": "Titels en Berichten", "posted-by": "Geplaatst door", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 95c9b61e6a..850d03798a 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Als het is ingeschakeld, dan zal het standaard zoeken overschrijven en zal je vanaf nu het gehele onderwerp kunnen doorzoeken ipv wat je standaard ziet.", "follow_topics_you_reply_to": "Volg de onderwerpen waarop u gereageerd heeft.", "follow_topics_you_create": "Volg de onderwerpen die u gecreëerd heeft.", - "grouptitle": "Selecteer de groepstitel die u wilt weergeven " + "grouptitle": "Selecteer de groepstitel die u wilt weergeven ", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/pl/category.json b/public/language/pl/category.json index a6e6ec1b0f..5efaa0f71c 100644 --- a/public/language/pl/category.json +++ b/public/language/pl/category.json @@ -5,5 +5,8 @@ "browsing": "przegląda", "no_replies": "Nikt jeszcze nie odpowiedział", "share_this_category": "Udostępnij tę kategorię", - "ignore": "Ignoruj" + "watch": "Watch", + "ignore": "Ignoruj", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/pl/error.json b/public/language/pl/error.json index e8f8f3dcdf..fb99d2e70a 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "To forum wymaga weryfikacji przez email. Proszę kliknąć tutaj, aby wprowadzić adres.", "email-confirm-failed": "Nie byliśmy w stanie potwierdzić twojego email-a. Proszę spróbować później.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Nazwa użytkownika za krótka.", "username-too-long": "Zbyt długa nazwa użytkownika", "user-banned": "Użytkownik zbanowany", diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index b9c32948b9..89838d1bc4 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -20,6 +20,8 @@ "details.kick": "Wykop", "details.owner_options": "Administracja grupy", "details.group_name": "Nazwa grupy", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Opis", "details.badge_preview": "Podgląd plakietki", "details.change_icon": "Zmień ikonę", diff --git a/public/language/pl/search.json b/public/language/pl/search.json index 52b4e5a137..44f5ca5023 100644 --- a/public/language/pl/search.json +++ b/public/language/pl/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 wyników pasujących do \"%2\", (%3 sekund)", "no-matches": "Nie znaleziono pasujących wyników", + "advanced-search": "Advanced Search", "in": "W", - "by": "Przez", "titles": "Tytuły", "titles-posts": "Tytuły i posty", "posted-by": "Napisane przez", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index c02fcd355d..0c21e92521 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Jeśli odblokowane, szukanie w wątku zastąpi domyślną funkcję szukania przeglądarki, pozwalając na wyszukiwanie fraz tylko w wątku, a nie na całej stronie.", "follow_topics_you_reply_to": "Śledź tematy, w których piszesz.", "follow_topics_you_create": "Śledź swoje tematy.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/pt_BR/category.json b/public/language/pt_BR/category.json index 7dc608219f..3aff6b8960 100644 --- a/public/language/pt_BR/category.json +++ b/public/language/pt_BR/category.json @@ -5,5 +5,8 @@ "browsing": "navegando", "no_replies": "Ninguém respondeu", "share_this_category": "Compartilhar esta categoria", - "ignore": "Ignorar" + "watch": "Watch", + "ignore": "Ignorar", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index ec4c9c1ba5..7b25af9115 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "Você não está habilitado a conversar até que seu email seja confirmado, por favor clique aqui para confirmar seu email.", "no-email-to-confirm": "Este fórum exige confirmação de email, por gentileza clique aqui para digitar um email", "email-confirm-failed": "Nós não pudemos confirmar seu email, por gentileza tente novamente mais tarde.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Nome de usuário muito curto", "username-too-long": "Nome de usuário muito longo", "user-banned": "Usuário banido", diff --git a/public/language/pt_BR/groups.json b/public/language/pt_BR/groups.json index 2246818345..022d3e244b 100644 --- a/public/language/pt_BR/groups.json +++ b/public/language/pt_BR/groups.json @@ -20,6 +20,8 @@ "details.kick": "Chutar", "details.owner_options": "Administração do Grupo", "details.group_name": "Nome do Grupo", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Descrição", "details.badge_preview": "Visualização do Distintivo", "details.change_icon": "Mudar Ícone", diff --git a/public/language/pt_BR/modules.json b/public/language/pt_BR/modules.json index 346005d4c7..734a60af2a 100644 --- a/public/language/pt_BR/modules.json +++ b/public/language/pt_BR/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7 Dias", "chat.thirty_days": "30 Dias", "chat.three_months": "3 Meses", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Compor", + "composer.show_preview": "Exibir Pré-visualização", + "composer.hide_preview": "Esconder Pré-visualização", "composer.user_said_in": "%1 disse em %2:", "composer.user_said": "%1 disse:", "composer.discard": "Tem certeza que deseja descartar essa postagem?", "composer.submit_and_lock": "Envie e Tranque", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.toggle_dropdown": "Alternar Dropdown" } \ No newline at end of file diff --git a/public/language/pt_BR/pages.json b/public/language/pt_BR/pages.json index d474437f75..5edce3eaac 100644 --- a/public/language/pt_BR/pages.json +++ b/public/language/pt_BR/pages.json @@ -6,7 +6,7 @@ "users": "Usuários Registrados", "notifications": "Notificações", "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tag": "Tópicos com a tag \"%1\"", "user.edit": "Editando \"%1\"", "user.following": "Pessoas que %1 Segue", "user.followers": "Pessoas que Seguem %1", diff --git a/public/language/pt_BR/reset_password.json b/public/language/pt_BR/reset_password.json index accc9ca98a..6bdca20d39 100644 --- a/public/language/pt_BR/reset_password.json +++ b/public/language/pt_BR/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "Email Inválido / Email não existe!", "password_too_short": "A senha entrada é muito curta, por favor escolha uma senha diferente.", "passwords_do_not_match": "As duas senhas que você digitou não combinam.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "A sua senha expirou, por favor escolha uma nova senha" } \ No newline at end of file diff --git a/public/language/pt_BR/search.json b/public/language/pt_BR/search.json index 467fb274f4..4d10dabb0c 100644 --- a/public/language/pt_BR/search.json +++ b/public/language/pt_BR/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 resultado(s) contendo \"%2\", (%3 segundos)", "no-matches": "Nenhum resultado encontrado", + "advanced-search": "Advanced Search", "in": "Em", - "by": "Por", "titles": "Títulos", "titles-posts": "Títulos e Posts", "posted-by": "Postado por", diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index 5769ca8b25..2737b08e7f 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -27,7 +27,7 @@ "chat": "Chat", "follow": "Seguir", "unfollow": "Deixar de Seguir", - "more": "More", + "more": "Mais", "profile_update_success": "O Perfil foi atualizado com sucesso!", "change_picture": "Alterar Foto", "edit": "Editar", @@ -79,5 +79,6 @@ "topic_search_help": "Se habilitado, a pesquisa dentro de tópico irá substituir o funcionamento padrão de pesquisa de página do navegador e permitir que você pesquise pelo tópico todo, ao invés de apenas o que é mostrado na tela.", "follow_topics_you_reply_to": "Seguir tópicos que você responde.", "follow_topics_you_create": "Seguir tópicos que você cria.", - "grouptitle": "Escolha o título do grupo que você deseja exibir" + "grouptitle": "Escolha o título do grupo que você deseja exibir", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/ro/category.json b/public/language/ro/category.json index 733f5de0d7..6bc07f8f8c 100644 --- a/public/language/ro/category.json +++ b/public/language/ro/category.json @@ -5,5 +5,8 @@ "browsing": "navighează", "no_replies": "Nu a răspuns nimeni", "share_this_category": "Distribuie această categorie", - "ignore": "Ignoră" + "watch": "Watch", + "ignore": "Ignoră", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 1c60c0cf83..1a42857df1 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Numele de utilizator este prea scurt", "username-too-long": "Numele de utilizator este prea lung", "user-banned": "Utilizator banat", diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index c41b17a0c5..2e45c9368c 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/ro/search.json b/public/language/ro/search.json index 54328cf585..6af7a31683 100644 --- a/public/language/ro/search.json +++ b/public/language/ro/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 rezultat(e) pentru \"%2\", (%3 secunde)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/ro/user.json b/public/language/ro/user.json index 2826e2a3e0..f58ee67f69 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -79,5 +79,6 @@ "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": "Urmărește subiectele în care ai răspuns.", "follow_topics_you_create": "Urmărește subiectele care le creezi.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/ru/category.json b/public/language/ru/category.json index 4d70a82236..ee4362964c 100644 --- a/public/language/ru/category.json +++ b/public/language/ru/category.json @@ -5,5 +5,8 @@ "browsing": "просматривают", "no_replies": "Нет ответов", "share_this_category": "Поделиться этой категорией", - "ignore": "Игнорировать" + "watch": "Watch", + "ignore": "Игнорировать", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index e3fb637e64..ca6fc46b15 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "Вы не можете оставлять сообщения, пока Ваш email не подтверждён. Нажмите на это сообщение чтобы получить письмо повторно.", "no-email-to-confirm": "Этот форум требует подтверждения по E-mail. Нажмите здесь для ввода E-mail.", "email-confirm-failed": "Мы не можем подтвердить Ваш E-mail, попробуйте позже.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", "user-banned": "Пользователь заблокирован", diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index a6c616b8eb..4d32f69896 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -20,6 +20,8 @@ "details.kick": "Исключить", "details.owner_options": "Настройки группы", "details.group_name": "Имя группы", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Описание", "details.badge_preview": "Предпросмотр бейджа", "details.change_icon": "Сменить иконку", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 1ad5769258..770b9446f5 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -15,9 +15,9 @@ "chat.seven_days": "7 дней", "chat.thirty_days": "30 дней", "chat.three_months": "3 месяца", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Редактор", + "composer.show_preview": "Показать предпросмотр", + "composer.hide_preview": "Скрыть предпросмотр", "composer.user_said_in": "%1 сказал %2:", "composer.user_said": "%1 сказал:", "composer.discard": "Вы уверены, что хотите отказаться от этого поста?", diff --git a/public/language/ru/search.json b/public/language/ru/search.json index 54886ccf15..70bd072c72 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 результатов по фразе \"%2\", (%3 секунды) ", "no-matches": "Совпадений не найдено", + "advanced-search": "Advanced Search", "in": "В", - "by": "От", "titles": "Названия", "titles-posts": "Названия и сообщения", "posted-by": "Написано ", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index ec22a1bd41..02d7287e3f 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Если включено, то стандартный \"Поиск на странице\" Вашего браузера будет осуществлять поиск по всей теме вместо одной её страницы.", "follow_topics_you_reply_to": "Следить за темами, в которых Вы отвечали.", "follow_topics_you_create": "Следить за темами, которые Вы создали.", - "grouptitle": "Выберите бейдж группы для отображения" + "grouptitle": "Выберите бейдж группы для отображения", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/sc/category.json b/public/language/sc/category.json index 306f0e2d04..25d11361e2 100644 --- a/public/language/sc/category.json +++ b/public/language/sc/category.json @@ -5,5 +5,8 @@ "browsing": "navighende", "no_replies": "Perunu at rispostu", "share_this_category": "Share this category", - "ignore": "Ignore" + "watch": "Watch", + "ignore": "Ignore", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 17465a20a3..44b70fd7d3 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "User banned", diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json index d2314fdc29..5e301aa46a 100644 --- a/public/language/sc/groups.json +++ b/public/language/sc/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/sc/search.json b/public/language/sc/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/sc/search.json +++ b/public/language/sc/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 42ebc279b0..54b7023dbe 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/sk/category.json b/public/language/sk/category.json index 62ef9414d6..08035d7fdc 100644 --- a/public/language/sk/category.json +++ b/public/language/sk/category.json @@ -5,5 +5,8 @@ "browsing": "prehliada", "no_replies": "Nikdo ešte neodpovedal", "share_this_category": "zdielaj túto kategóriu", - "ignore": "Ignoruj" + "watch": "Watch", + "ignore": "Ignoruj", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 93c15ed553..1b2e3ff991 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "Užívateľ je zakázaný", diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index d2314fdc29..5e301aa46a 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/sk/search.json b/public/language/sk/search.json index 9dad8b6eab..277c0a32bc 100644 --- a/public/language/sk/search.json +++ b/public/language/sk/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index d5b3ca46b0..7c4f3adb6a 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -79,5 +79,6 @@ "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen.", "follow_topics_you_reply_to": "Follow topics that you reply to.", "follow_topics_you_create": "Follow topics you create.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/sv/category.json b/public/language/sv/category.json index 41b49a95db..722a8d0c45 100644 --- a/public/language/sv/category.json +++ b/public/language/sv/category.json @@ -5,5 +5,8 @@ "browsing": "läser", "no_replies": "Ingen har svarat", "share_this_category": "Dela den här kategorin", - "ignore": "Ignorera" + "watch": "Watch", + "ignore": "Ignorera", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 99879a3388..3c2a527ba4 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Användarnamnet är för kort", "username-too-long": "Användarnamnet är för långt", "user-banned": "Användare bannlyst", diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index 8474322fa4..bf3aaa470d 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/sv/search.json b/public/language/sv/search.json index 4418f62e13..7822eeae96 100644 --- a/public/language/sv/search.json +++ b/public/language/sv/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 resultat matchar \"%2\", (%3 sekunder)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/sv/user.json b/public/language/sv/user.json index cee28e812f..84e7223c95 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Om aktiverat kommer sökning inom ämne överskrida webbläsarens vanliga sid-sökfunktion och tillåta dig att söka genom hela ämnet istället för det som endast visas på skärmen.", "follow_topics_you_reply_to": "Följ ämnen so du svarat på.", "follow_topics_you_create": "Följ ämnen du skapat.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/th/category.json b/public/language/th/category.json index e5d6b1e0fc..bf35101ba9 100644 --- a/public/language/th/category.json +++ b/public/language/th/category.json @@ -5,5 +5,8 @@ "browsing": "เรียกดู", "no_replies": "ยังไม่มีใครตอบ", "share_this_category": "แชร์ Category นี้", - "ignore": "ไม่ต้องสนใจอีก" + "watch": "Watch", + "ignore": "ไม่ต้องสนใจอีก", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/th/error.json b/public/language/th/error.json index 7a46ebaa65..4c60a62295 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Forum นี้ต้องการการยืนยันอีเมล กรุณากดที่นี่เพื่อระบุอีเมล", "email-confirm-failed": "เราไม่สามารถยืนยันอีเมลของคุณ ณ ขณะนี้ กรุณาลองใหม่อีกครั้งภายหลัง", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "ชื่อบัญชีผู้ใช้ สั้นเกินไป", "username-too-long": "ชื่อบัญชีผู้ใช้ ยาวเกินไป", "user-banned": "User banned", diff --git a/public/language/th/groups.json b/public/language/th/groups.json index be94efdf0b..089ba7fa93 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -20,6 +20,8 @@ "details.kick": "เตะออก", "details.owner_options": "การจัดการ Group", "details.group_name": "ชื่อ Group", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "คำอธิบาย", "details.badge_preview": "Badge Preview", "details.change_icon": "เปลี่ยนไอคอน", diff --git a/public/language/th/search.json b/public/language/th/search.json index b9297a6a5a..4590d8d648 100644 --- a/public/language/th/search.json +++ b/public/language/th/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 ผลลัพธ์ ตรงตามที่ระบุ \"%2\", (%3 วินาที)", "no-matches": "ไม่พบผลลัพธ์ที่สอดคล้อง", + "advanced-search": "Advanced Search", "in": "In", - "by": "โดย", "titles": "หัวข้อ", "titles-posts": "หัวข้อ และ ข้อความ", "posted-by": "บันทึกโดย", diff --git a/public/language/th/user.json b/public/language/th/user.json index f4d61b4567..2ff97ba5ab 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -79,5 +79,6 @@ "topic_search_help": "เมื่อการค้นหาแบบ In-Topic ถูกเปิดใช้งาน การค้นหาแบบ In-Topic จะทำงานแทนการค้นหาในรูปแบบเดิม ซึ่งช่วยให้คุณสามารถทำการค้นหาจาก Topic ทั้งหมด เพิ่มเติมจากที่คุณกำลังเห็นอยู่บนหน้าจอ", "follow_topics_you_reply_to": "ติดตามกระทู้ที่คุณตอบ", "follow_topics_you_create": "ติดตามกระทู้ที่คุณตั้ง", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/tr/category.json b/public/language/tr/category.json index 518bd9dcb0..aec3d60779 100644 --- a/public/language/tr/category.json +++ b/public/language/tr/category.json @@ -5,5 +5,8 @@ "browsing": "gözden geçiriliyor", "no_replies": "Kimse yanıtlamadı", "share_this_category": "Bu kategoriyi paylaş", - "ignore": "Yoksay" + "watch": "Watch", + "ignore": "Yoksay", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 475b93ac94..9f039e44ac 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -18,9 +18,10 @@ "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, please click here to confirm your email.", + "email-not-confirmed-chat": "E-postanız onaylanana kadar sohbet edemezsiniz, onaylamak için lütfen buraya tıklayın.", "no-email-to-confirm": "Bu forum e-posta doğrulaması gerektirir, lütfen buraya bir e-posta adresi girin", "email-confirm-failed": "E-posta adresinizi doğrulayamıyoruz. Lütfen daha sonra tekrar deneyin.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Kullanıcı ismi çok kısa", "username-too-long": "Kullanıcı ismi çok uzun.", "user-banned": "Kullanıcı Yasaklı", @@ -35,7 +36,7 @@ "no-emailers-configured": "E-posta eklentisi kurulu değil bu yüzden test e-postası gönderilemedi", "category-disabled": "Kategori aktif değil", "topic-locked": "Başlık Kilitli", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "Gönderilen iletiler %1 saniyeden sonra değiştirilemez", "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.", diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 536921e7e5..8c7326c2cf 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -16,10 +16,12 @@ "details.has_no_posts": "Bu grubun üyeleri henüz bir ileti göndermedi.", "details.latest_posts": "En son iletiler", "details.private": "Özel", - "details.grant": "Grant/Rescind Ownership", + "details.grant": "Gurup sahibi yap/yapma", "details.kick": "Dışarı at", "details.owner_options": "Grup Yöneticisi", "details.group_name": "Grup ismi", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Tanımlama", "details.badge_preview": "Rozet Önizlemesi", "details.change_icon": "İkonu Değiştir", diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index ed7b534740..47929205ca 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7 Gün", "chat.thirty_days": "30 Gün", "chat.three_months": "3 Ay", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Yaz", + "composer.show_preview": "Önizleme Göster", + "composer.hide_preview": "Önizleme Sakla", "composer.user_said_in": "%1 %2 içinde söyledi:", "composer.user_said": "%1 söyledi:", "composer.discard": "Bu iletiyi iptal etmek istediğinizden eminmisiniz?", - "composer.submit_and_lock": "Submit and Lock", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.submit_and_lock": "Gönder ve Kitle", + "composer.toggle_dropdown": "Menü aç" } \ No newline at end of file diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 75f109da8f..922562f348 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -5,8 +5,8 @@ "recent": "Güncel Konular", "users": "Kayıtlı Kullanıcılar", "notifications": "Bildirimler", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "Etiketler", + "tag": "“%1“ ile etiketlenmiş konular", "user.edit": "\"% 1\" düzenleniyor", "user.following": "İnsanlar %1 Takip Ediyor", "user.followers": "%1 takip edenler", @@ -15,7 +15,7 @@ "user.groups": "%1 Kişisine Ait Gruplar", "user.favourites": "%1'in Favori İletileri", "user.settings": "Kullanıcı Ayarları", - "user.watched": "Topics watched by %1", + "user.watched": "%1 tarafından izlenen konular", "maintenance.text": "%1 şu anda bakımda. Lütfen bir süre sonra tekrar deneyin.", "maintenance.messageIntro": "Ayrıca, yönetici şu mesaji bıraktı:" } \ No newline at end of file diff --git a/public/language/tr/reset_password.json b/public/language/tr/reset_password.json index 8cec7cce71..eb1eabab39 100644 --- a/public/language/tr/reset_password.json +++ b/public/language/tr/reset_password.json @@ -13,5 +13,5 @@ "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.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "Parolanız sona erdi, lütfen yeni bir parola seçin" } \ No newline at end of file diff --git a/public/language/tr/search.json b/public/language/tr/search.json index 2ffbbfe36e..9126ee189f 100644 --- a/public/language/tr/search.json +++ b/public/language/tr/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 tane “%2“ bulundu (%3 saniye)", "no-matches": "Hiç eşleşme bulunamadı", + "advanced-search": "Advanced Search", "in": "Konum:", - "by": "Kim Tarafından :", "titles": "Başlıklar", "titles-posts": "Başlıklar ve Yayınlar", "posted-by": "Gönderen", diff --git a/public/language/tr/tags.json b/public/language/tr/tags.json index 9f614ce38c..344a4bfff6 100644 --- a/public/language/tr/tags.json +++ b/public/language/tr/tags.json @@ -1,7 +1,7 @@ { "no_tag_topics": "Bu etiketli başlık yok.", "tags": "Etiketler", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", + "enter_tags_here": "Etiketleri buraya girin. %1-%2 karakter. Her etiketten sonra enter tuşuna basın.", "enter_tags_here_short": "Etiketleri gir...", "no_tags": "Henüz etiket yok." } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 6a916492c2..abf58f769b 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -27,7 +27,7 @@ "chat": "Sohbet", "follow": "Takip Et", "unfollow": "Takip etme", - "more": "More", + "more": "Daha Fazla", "profile_update_success": "Profiliniz başarıyla güncellendi!", "change_picture": "Resmi Değiştir", "edit": "Düzenle", @@ -61,7 +61,7 @@ "digest_monthly": "Aylık", "send_chat_notifications": "Çevrimiçi değilken gelen iletileri e-posta olarak gönder", "send_post_notifications": "Abone olduğum konulara cevap gelince bana eposta yolla", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "settings-require-reload": "Bazı ayar değişiklikleri sayfayı tekrar yüklemenizi gerektirir. Buraya tıklayarak sayfayı tekrar yükleyebilirsiniz.", "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.", @@ -79,5 +79,6 @@ "topic_search_help": "Aktive edilirse, konu içi arama tarayıcının normal arama davranışını değiştirerek tüm konuyu aramanızı sağlar.", "follow_topics_you_reply_to": "İleti gönderdiğim konuları takip et.", "follow_topics_you_create": "Kendi yarattığım konuları takip et.", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Göstermek istediğiniz gurup başlığını seçin", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/vi/category.json b/public/language/vi/category.json index be80ee1583..e209512922 100644 --- a/public/language/vi/category.json +++ b/public/language/vi/category.json @@ -5,5 +5,8 @@ "browsing": "đang xem", "no_replies": "Chưa có bình luận nào", "share_this_category": "Chia sẻ thư mục này", - "ignore": "Bỏ qua" + "watch": "Watch", + "ignore": "Bỏ qua", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 5a9d22c3ee..107c5f58fc 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "Tên đăng nhập quá ngắn", "username-too-long": "Tên đăng nhập quá dài", "user-banned": "Tài khoản bị ban", diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index 214fbefec9..8122f449cd 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Tên nhóm", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/vi/search.json b/public/language/vi/search.json index c9c176ba74..312c315c73 100644 --- a/public/language/vi/search.json +++ b/public/language/vi/search.json @@ -1,8 +1,8 @@ { "results_matching": "%1 kết quả(s) trùng với \"%2\", (%3 giây)", "no-matches": "No matches found", + "advanced-search": "Advanced Search", "in": "In", - "by": "By", "titles": "Titles", "titles-posts": "Titles and Posts", "posted-by": "Posted by", diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 76ce150b05..fbb6819c0d 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -79,5 +79,6 @@ "topic_search_help": "Nếu được bật, in-topic searching sẽ thay thế tính năng tìm kiếu mặc định của trình duyệt và giúp bạn tìm trong toàn bộ nội dung bài viết, thay vì chỉ tìm trong những gì đang có trên màn hình.", "follow_topics_you_reply_to": "Theo dõi chủ đề mà bạn trả lời", "follow_topics_you_create": "Theo dõi chủ đề bạn tạo", - "grouptitle": "Chọn tên nhóm mà bạn muốn hiển thị" + "grouptitle": "Chọn tên nhóm mà bạn muốn hiển thị", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/zh_CN/category.json b/public/language/zh_CN/category.json index 1d5d4fb2a5..6f6b33dc22 100644 --- a/public/language/zh_CN/category.json +++ b/public/language/zh_CN/category.json @@ -5,5 +5,8 @@ "browsing": "正在浏览", "no_replies": "尚无回复", "share_this_category": "分享此版块", - "ignore": "忽略" + "watch": "Watch", + "ignore": "忽略", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index ab5ead86b5..ed22374145 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "您的电子邮箱尚未确认,无法聊天,请点击这里确认您的电子邮箱。", "no-email-to-confirm": "本论坛需要电子邮箱确认,请点击这里输入一个电子邮箱地址", "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "用户名太短", "username-too-long": "用户名太长", "user-banned": "用户已禁止", diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index b7a60f7813..f741bd2923 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -20,6 +20,8 @@ "details.kick": "踢", "details.owner_options": "用户组管理", "details.group_name": "用户组名", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "描述", "details.badge_preview": "标志预览", "details.change_icon": "更改图标", diff --git a/public/language/zh_CN/modules.json b/public/language/zh_CN/modules.json index 7d8bba08f2..e6a2678ea4 100644 --- a/public/language/zh_CN/modules.json +++ b/public/language/zh_CN/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7天", "chat.thirty_days": "30天", "chat.three_months": "3个月", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "编写", + "composer.show_preview": "显示预览", + "composer.hide_preview": "隐藏预览", "composer.user_said_in": "%1 在 %2 中说:", "composer.user_said": "%1 说:", "composer.discard": "确定想要取消此帖?", "composer.submit_and_lock": "提交并锁定", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.toggle_dropdown": "标为 Dropdown" } \ No newline at end of file diff --git a/public/language/zh_CN/search.json b/public/language/zh_CN/search.json index 9df978a688..36df17748c 100644 --- a/public/language/zh_CN/search.json +++ b/public/language/zh_CN/search.json @@ -1,8 +1,8 @@ { "results_matching": "共 %1 条结果匹配 \"%2\",(耗时 %3 秒)", "no-matches": "无匹配结果", + "advanced-search": "Advanced Search", "in": "在", - "by": "-", "titles": "标题", "titles-posts": "标题和回帖", "posted-by": "发表", diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index c72367e4a5..fa0bc81a2f 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -79,5 +79,6 @@ "topic_search_help": "启用后,主题内搜索会替代浏览器默认的页面搜索,你可以在整个主题的全部内容进行搜索,而不是仅限于屏幕显示的内容。", "follow_topics_you_reply_to": "关注您回复的主题。", "follow_topics_you_create": "关注您创建的主题。", - "grouptitle": "选择展现的组内称号" + "grouptitle": "选择展现的组内称号", + "no-group-title": "No group title" } \ No newline at end of file diff --git a/public/language/zh_TW/category.json b/public/language/zh_TW/category.json index 055d4a70d3..b018f21e89 100644 --- a/public/language/zh_TW/category.json +++ b/public/language/zh_TW/category.json @@ -5,5 +5,8 @@ "browsing": "正在瀏覽", "no_replies": "還沒有回覆", "share_this_category": "分享這類別", - "ignore": "忽略" + "watch": "Watch", + "ignore": "忽略", + "watch.message": "You are now watching updates from this category", + "ignore.message": "You are now ignoring updates from this category" } \ No newline at end of file diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 3aae7dd5bc..633323e282 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -21,6 +21,7 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", "username-too-short": "用戶名太短", "username-too-long": "用戶名太長", "user-banned": "該使用者已被停用", diff --git a/public/language/zh_TW/groups.json b/public/language/zh_TW/groups.json index 97401e5d7d..caaab4b118 100644 --- a/public/language/zh_TW/groups.json +++ b/public/language/zh_TW/groups.json @@ -20,6 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Group Administration", "details.group_name": "Group Name", + "details.member_count": "Member Count", + "details.creation_date": "Creation Date", "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", diff --git a/public/language/zh_TW/search.json b/public/language/zh_TW/search.json index eef48e983e..9eadd12f6d 100644 --- a/public/language/zh_TW/search.json +++ b/public/language/zh_TW/search.json @@ -1,8 +1,8 @@ { "results_matching": "有%1個跟\"%2\"相符的結果(%3秒)", "no-matches": "沒有找到相符的主題", + "advanced-search": "Advanced Search", "in": "在", - "by": "由", "titles": "標題", "titles-posts": "標題與發布", "posted-by": "Posted by", diff --git a/public/language/zh_TW/user.json b/public/language/zh_TW/user.json index 5555900498..305141fcfe 100644 --- a/public/language/zh_TW/user.json +++ b/public/language/zh_TW/user.json @@ -79,5 +79,6 @@ "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_you_create": "關注您創建的主題。", - "grouptitle": "Select the group title you would like to display" + "grouptitle": "Select the group title you would like to display", + "no-group-title": "No group title" } \ No newline at end of file From a055ff3547e0a9c8863b3d7a6f7ae2390f1b5649 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 14 Apr 2015 10:21:15 -0400 Subject: [PATCH 126/295] latest translations --- public/language/de/category.json | 6 +++--- public/language/de/error.json | 2 +- public/language/de/groups.json | 4 ++-- public/language/de/search.json | 2 +- public/language/de/user.json | 2 +- public/language/fr/category.json | 6 +++--- public/language/fr/error.json | 2 +- public/language/fr/groups.json | 4 ++-- public/language/fr/search.json | 2 +- public/language/fr/user.json | 2 +- public/language/ru/category.json | 6 +++--- public/language/ru/error.json | 6 +++--- public/language/ru/groups.json | 4 ++-- public/language/ru/search.json | 2 +- public/language/ru/user.json | 2 +- public/language/zh_CN/category.json | 6 +++--- public/language/zh_CN/error.json | 2 +- public/language/zh_CN/groups.json | 4 ++-- public/language/zh_CN/search.json | 2 +- public/language/zh_CN/user.json | 2 +- 20 files changed, 34 insertions(+), 34 deletions(-) diff --git a/public/language/de/category.json b/public/language/de/category.json index 72b3855c20..f073846d6d 100644 --- a/public/language/de/category.json +++ b/public/language/de/category.json @@ -5,8 +5,8 @@ "browsing": "Aktiv", "no_replies": "Niemand hat geantwortet", "share_this_category": "Teile diese Kategorie", - "watch": "Watch", + "watch": "Beobachten", "ignore": "Ignorieren", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch.message": "Du beobachtest jetzt Änderungen in dieser Kategorie", + "ignore.message": "Du ignorierst jetzt Änderungen in dieser Kategorie" } \ No newline at end of file diff --git a/public/language/de/error.json b/public/language/de/error.json index 1de7dd2b94..a31a951019 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -21,7 +21,7 @@ "email-not-confirmed-chat": "Deine E-Mail wurde noch nicht bestätigt. Bitte klicke hier, um deine E-Mail zu bestätigen.", "no-email-to-confirm": "Dieses Forum setzt E-Mail-Bestätigung voraus, bitte klick hier um eine E-Mail-Adresse einzugeben", "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Bestätigungsemail ist bereits versandt. Um eine weitere senden zu können, warte bitte %1 Minuten.", "username-too-short": "Benutzername ist zu kurz", "username-too-long": "Der Benutzername ist zu lang", "user-banned": "Der Benutzer ist gesperrt", diff --git a/public/language/de/groups.json b/public/language/de/groups.json index e52eb2cf8e..c2328959aa 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -20,8 +20,8 @@ "details.kick": "Kick", "details.owner_options": "Gruppenadministration", "details.group_name": "Gruppenname", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", + "details.member_count": "Mitgliederanzahl", + "details.creation_date": "Erstelldatum", "details.description": "Beschreibung", "details.badge_preview": "Abzeichenvorschau", "details.change_icon": "Symbol ändern", diff --git a/public/language/de/search.json b/public/language/de/search.json index 5606127487..a8ac1251f0 100644 --- a/public/language/de/search.json +++ b/public/language/de/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 Ergebnis(se) stimmen mit \"%2\" überein, (%3 Sekunden)", "no-matches": "Keine Ergebnisse gefunden", - "advanced-search": "Advanced Search", + "advanced-search": "Erweiterte Suche", "in": "In", "titles": "Titel", "titles-posts": "Titel und Beiträge", diff --git a/public/language/de/user.json b/public/language/de/user.json index ebb971beeb..1245f5168d 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -80,5 +80,5 @@ "follow_topics_you_reply_to": "Folge Themen, auf die du antwortest.", "follow_topics_you_create": "Folge Themen, die du erstellst.", "grouptitle": "Wähle den anzuzeigenden Gruppen Titel aus", - "no-group-title": "No group title" + "no-group-title": "Kein Gruppentitel" } \ No newline at end of file diff --git a/public/language/fr/category.json b/public/language/fr/category.json index a2840375a7..0e0a238c35 100644 --- a/public/language/fr/category.json +++ b/public/language/fr/category.json @@ -5,8 +5,8 @@ "browsing": "parcouru par", "no_replies": "Personne n'a répondu", "share_this_category": "Partager cette catégorie", - "watch": "Watch", + "watch": "Suivre", "ignore": "Ignorer", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch.message": "Vous suivez désormais les mises à jour de cette catégorie.", + "ignore.message": "Vous ne suivez plus les mises jour de cette catégorie." } \ No newline at end of file diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 36f603c4f8..ab4e1b11ef 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -21,7 +21,7 @@ "email-not-confirmed-chat": "Il ne vous est pas possible d'utiliser le chat tant que votre adresse email n'a pas été vérifiée. Veuillez cliquer ici pour confirmer votre adresse email.", "no-email-to-confirm": "Ce forum requiert une vérification de votre adresse email. Veuillez cliquer ici pour entrer une adresse.", "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "L'email de confirmation a déjà été envoyé. Veuillez attendre %1 minutes avant de redemander un nouvel envoi.", "username-too-short": "Nom d'utilisateur trop court", "username-too-long": "Nom d'utilisateur trop long", "user-banned": "Utilisateur banni", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 450117c08f..6ad4028954 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -20,8 +20,8 @@ "details.kick": "Exclure", "details.owner_options": "Administration du groupe", "details.group_name": "Nom du groupe", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", + "details.member_count": "Nombre de membres", + "details.creation_date": "Date de création", "details.description": "Description", "details.badge_preview": "Aperçu du badge", "details.change_icon": "Modifier l'icône", diff --git a/public/language/fr/search.json b/public/language/fr/search.json index 1de42e7924..cfbabc6dd0 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 résultat(s) correspondant(s) à \"%2\", (%3 secondes)", "no-matches": "Aucune réponse trouvée", - "advanced-search": "Advanced Search", + "advanced-search": "Recherche avancée", "in": "Dans", "titles": "Titres", "titles-posts": "Titres et Messages", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 9d3719cdc3..2b7f73bf46 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -80,5 +80,5 @@ "follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez.", "follow_topics_you_create": "Suivre les sujets que vous créez.", "grouptitle": "Sélectionnez le titre de groupe que vous souhaitez afficher", - "no-group-title": "No group title" + "no-group-title": "Aucun titre de groupe" } \ No newline at end of file diff --git a/public/language/ru/category.json b/public/language/ru/category.json index ee4362964c..c584f9f4c6 100644 --- a/public/language/ru/category.json +++ b/public/language/ru/category.json @@ -5,8 +5,8 @@ "browsing": "просматривают", "no_replies": "Нет ответов", "share_this_category": "Поделиться этой категорией", - "watch": "Watch", + "watch": "Следить", "ignore": "Игнорировать", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch.message": "Вы теперь следите за обновлениями из этой категории", + "ignore.message": "Вы теперь игнорируете обновления из этой категории" } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index ca6fc46b15..07d0c16752 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -21,7 +21,7 @@ "email-not-confirmed-chat": "Вы не можете оставлять сообщения, пока Ваш email не подтверждён. Нажмите на это сообщение чтобы получить письмо повторно.", "no-email-to-confirm": "Этот форум требует подтверждения по E-mail. Нажмите здесь для ввода E-mail.", "email-confirm-failed": "Мы не можем подтвердить Ваш E-mail, попробуйте позже.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Email для подтверждения уже был отправлен, подождите %1 минут, если хотите выслать повторный.", "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", "user-banned": "Пользователь заблокирован", @@ -44,8 +44,8 @@ "title-too-long": "Заголовок не может быть длиннее %1 символов.", "too-many-posts": "Вы можете делать пост один раз в %1 сек.", "too-many-posts-newbie": "Вы новый пользователь, поэтому можете делать пост раз в %1 сек., пока не заработаете %2 п. репутации.", - "tag-too-short": "Введите более длинный тэг. Тэги должны содержать как минимум %1 символа(ов).", - "tag-too-long": "Введите тэг покороче. Тэги должны быть короче %1 символов.", + "tag-too-short": "Тэги должны содержать как минимум %1 символа(ов).", + "tag-too-long": "Тэги должны быть короче %1 символов.", "file-too-big": "Максимальный разрешенный размер файла - %1 Кбайт. Пожалуйста, загрузите файл меньшего размера.", "cant-vote-self-post": "Вы не можете проголосовать за Ваш пост", "already-favourited": "Вы уже добавили этот пост в избранное", diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index 4d32f69896..b50974212e 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -20,8 +20,8 @@ "details.kick": "Исключить", "details.owner_options": "Настройки группы", "details.group_name": "Имя группы", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", + "details.member_count": "Количество участников", + "details.creation_date": "Дата создания", "details.description": "Описание", "details.badge_preview": "Предпросмотр бейджа", "details.change_icon": "Сменить иконку", diff --git a/public/language/ru/search.json b/public/language/ru/search.json index 70bd072c72..8ca07bdccf 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 результатов по фразе \"%2\", (%3 секунды) ", "no-matches": "Совпадений не найдено", - "advanced-search": "Advanced Search", + "advanced-search": "Расширенный поиск", "in": "В", "titles": "Названия", "titles-posts": "Названия и сообщения", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 02d7287e3f..3f5745bd32 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -80,5 +80,5 @@ "follow_topics_you_reply_to": "Следить за темами, в которых Вы отвечали.", "follow_topics_you_create": "Следить за темами, которые Вы создали.", "grouptitle": "Выберите бейдж группы для отображения", - "no-group-title": "No group title" + "no-group-title": "Не показывать бейдж" } \ No newline at end of file diff --git a/public/language/zh_CN/category.json b/public/language/zh_CN/category.json index 6f6b33dc22..14f4a36667 100644 --- a/public/language/zh_CN/category.json +++ b/public/language/zh_CN/category.json @@ -5,8 +5,8 @@ "browsing": "正在浏览", "no_replies": "尚无回复", "share_this_category": "分享此版块", - "watch": "Watch", + "watch": "订阅", "ignore": "忽略", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch.message": "您现在已经订阅了此版块", + "ignore.message": "您现在已经取消订阅了此版块" } \ No newline at end of file diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index ed22374145..50b7e3d23b 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -21,7 +21,7 @@ "email-not-confirmed-chat": "您的电子邮箱尚未确认,无法聊天,请点击这里确认您的电子邮箱。", "no-email-to-confirm": "本论坛需要电子邮箱确认,请点击这里输入一个电子邮箱地址", "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "确认邮件已发出,如需重新发送请等待 %1 分钟后再试。", "username-too-short": "用户名太短", "username-too-long": "用户名太长", "user-banned": "用户已禁止", diff --git a/public/language/zh_CN/groups.json b/public/language/zh_CN/groups.json index f741bd2923..821707c77f 100644 --- a/public/language/zh_CN/groups.json +++ b/public/language/zh_CN/groups.json @@ -20,8 +20,8 @@ "details.kick": "踢", "details.owner_options": "用户组管理", "details.group_name": "用户组名", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", + "details.member_count": "会员总数", + "details.creation_date": "创建时间", "details.description": "描述", "details.badge_preview": "标志预览", "details.change_icon": "更改图标", diff --git a/public/language/zh_CN/search.json b/public/language/zh_CN/search.json index 36df17748c..f24707dbc8 100644 --- a/public/language/zh_CN/search.json +++ b/public/language/zh_CN/search.json @@ -1,7 +1,7 @@ { "results_matching": "共 %1 条结果匹配 \"%2\",(耗时 %3 秒)", "no-matches": "无匹配结果", - "advanced-search": "Advanced Search", + "advanced-search": "高级搜索", "in": "在", "titles": "标题", "titles-posts": "标题和回帖", diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index fa0bc81a2f..013d4c7e6c 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -80,5 +80,5 @@ "follow_topics_you_reply_to": "关注您回复的主题。", "follow_topics_you_create": "关注您创建的主题。", "grouptitle": "选择展现的组内称号", - "no-group-title": "No group title" + "no-group-title": "无组内头衔" } \ No newline at end of file From 1cc80cbc842a2f6bf48fc987c27ad121136bcdd5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Apr 2015 11:01:11 -0400 Subject: [PATCH 127/295] closes #3014 --- src/pubsub.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pubsub.js b/src/pubsub.js index 42c0f54cfb..82414a5c31 100644 --- a/src/pubsub.js +++ b/src/pubsub.js @@ -6,6 +6,8 @@ var nconf = require('nconf'), winston = require('winston'), EventEmitter = require('events').EventEmitter; +var channelName; + var PubSub = function() { var self = this; if (nconf.get('redis')) { @@ -13,10 +15,11 @@ var PubSub = function() { var subClient = redis.connect(); this.pubClient = redis.connect(); - subClient.subscribe('pubsub_channel'); + channelName = 'db:' + nconf.get('redis:database') + 'pubsub_channel'; + subClient.subscribe(channelName); subClient.on('message', function(channel, message) { - if (channel !== 'pubsub_channel') { + if (channel !== channelName) { return; } @@ -34,7 +37,7 @@ util.inherits(PubSub, EventEmitter); PubSub.prototype.publish = function(event, data) { if (this.pubClient) { - this.pubClient.publish('pubsub_channel', JSON.stringify({event: event, data: data})); + this.pubClient.publish(channelName, JSON.stringify({event: event, data: data})); } else { this.emit(event, data); } From 6a509a51db7dbe90887541f54b5928ebfaf62023 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 14 Apr 2015 12:23:23 -0400 Subject: [PATCH 128/295] fixes #2992 --- public/src/client/register.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/client/register.js b/public/src/client/register.js index cab41bb72f..6955fcb989 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -24,8 +24,9 @@ define('forum/register', ['csrf', 'translator'], function(csrf, translator) { } }); + // Update the "others can mention you via" text username.on('keyup', function() { - $('#yourUsername').text(this.value.length > 0 ? this.value : 'username'); + $('#yourUsername').text(this.value.length > 0 ? utils.slugify(this.value) : 'username'); }); username.on('blur', function() { From e147328d537c21d697e4e894f11b755bf776313a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 14 Apr 2015 12:52:49 -0400 Subject: [PATCH 129/295] updated backgroundDraggable jquery plugin with fork that allows for percentages: https://github.com/bcole808/jquery-draggable-background/commit/ad2c5a87d16c6f6c55ab1a7b55b94d50a2434354 --- public/src/client/groups/details.js | 4 +-- .../backgroundDraggable.js | 27 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index bc1534f051..b066bd0339 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -198,7 +198,8 @@ define('forum/groups/details', ['iconSelect', 'vendor/colorpicker/colorpicker', coverEl.find('.change').on('click', function() { coverEl.toggleClass('active', 1); coverEl.backgroundDraggable({ - axis: 'y' + axis: 'y', + units: 'percent' }); coverEl.on('dragover', Details.cover.onDragOver); coverEl.on('drop', Details.cover.onDrop); @@ -246,7 +247,6 @@ define('forum/groups/details', ['iconSelect', 'vendor/colorpicker/colorpicker', if (files.length && files[0].type.match('image.*')) { reader.onload = function(e) { coverEl.css('background-image', 'url(' + e.target.result + ')'); - coverEl.backgroundDraggable(); Details.cover.newCover = e.target.result; }; diff --git a/public/vendor/jquery/draggable-background/backgroundDraggable.js b/public/vendor/jquery/draggable-background/backgroundDraggable.js index baae4d0f95..8453e5aeb0 100644 --- a/public/vendor/jquery/draggable-background/backgroundDraggable.js +++ b/public/vendor/jquery/draggable-background/backgroundDraggable.js @@ -75,7 +75,7 @@ // Get the image's width and height if bound var imageDimensions = { width: 0, height: 0 }; - if (options.bound) { + if (options.bound || options.units == 'percent') { imageDimensions = getBackgroundImageDimensions($el); } @@ -97,6 +97,12 @@ xPos = parseInt(pos[1]) || 0, yPos = parseInt(pos[2]) || 0; + // We must convert percentage back to pixels + if (options.units == 'percent') { + xPos = Math.round(xPos / -200 * imageDimensions.width); + yPos = Math.round(yPos / -200 * imageDimensions.height); + } + $window.on('mousemove.dbg touchmove.dbg', function(e) { e.preventDefault(); @@ -107,12 +113,22 @@ var x = e.clientX, y = e.clientY; - xPos = options.axis === 'y' ? xPos : limit($el.innerWidth()-imageDimensions.width, 0, xPos+x-x0, options.bound); - yPos = options.axis === 'x' ? yPos : limit($el.innerHeight()-imageDimensions.height, 0, yPos+y-y0, options.bound); + if (options.units == 'percent') { + xPos = options.axis === 'y' ? xPos : limit(-imageDimensions.width/2, 0, xPos+x-x0, options.bound); + yPos = options.axis === 'x' ? yPos : limit(-imageDimensions.height/2, 0, yPos+y-y0, options.bound); + + // Convert pixels to percentage + $el.css('background-position', xPos / imageDimensions.width * -200 + '% ' + yPos / imageDimensions.height * -200 + '%'); + } else { + xPos = options.axis === 'y' ? xPos : limit($el.innerWidth()-imageDimensions.width, 0, xPos+x-x0, options.bound); + yPos = options.axis === 'x' ? yPos : limit($el.innerHeight()-imageDimensions.height, 0, yPos+y-y0, options.bound); + + $el.css('background-position', xPos + 'px ' + yPos + 'px'); + } + x0 = x; y0 = y; - $el.css('background-position', xPos + 'px ' + yPos + 'px'); }); $window.on('mouseup.dbg touchend.dbg mouseleave.dbg', function() { @@ -152,6 +168,7 @@ $.fn.backgroundDraggable.defaults = { bound: true, - axis: undefined + axis: undefined, + units: 'pixels' }; }(jQuery)); \ No newline at end of file From eaa442db8c17bb5a97a3e2d28cd2cf5bd3a12579 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Apr 2015 13:05:58 -0400 Subject: [PATCH 130/295] update deleted propery before calling hook --- src/threadTools.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/threadTools.js b/src/threadTools.js index aa83f99eb7..1a8016a2e2 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -35,7 +35,7 @@ var async = require('async'), if (err) { return callback(err); } - + topicData.deleted = isDelete ? 1 : 0; ThreadTools[isDelete ? 'lock' : 'unlock'](tid, uid); if (isDelete) { plugins.fireHook('action:topic.delete', tid); From f7a3aef322ac6fc77bfc9401c7697d3ebd0b8515 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Apr 2015 14:16:06 -0400 Subject: [PATCH 131/295] escape on the way out, fixes birthday/age calculation --- src/controllers/accounts.js | 9 ++++++++- src/user/profile.js | 5 ++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 78629b50cc..f21aff3f85 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -89,10 +89,17 @@ function getUserDataByUserSlug(userslug, callerUID, callback) { userData.profile_links = results.profile_links; userData.status = require('../socket.io').isUserOnline(userData.uid) ? (userData.status || 'online') : 'offline'; userData.banned = parseInt(userData.banned, 10) === 1; - userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), ''); + userData.websiteName = userData.website.replace('http://', '').replace('https://', ''); userData.followingCount = parseInt(userData.followingCount, 10) || 0; userData.followerCount = parseInt(userData.followerCount, 10) || 0; + userData.username = validator.escape(userData.username); + userData.email = validator.escape(userData.email); + userData.fullname = validator.escape(userData.fullname); + userData.websiteName = validator.escape(userData.websiteName); + userData.location = validator.escape(userData.location); + userData.signature = validator.escape(userData.signature); + callback(null, userData); }); }); diff --git a/src/user/profile.js b/src/user/profile.js index 1eb66893ca..4961c1d13d 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -111,7 +111,6 @@ module.exports = function(User) { } data[field] = data[field].trim(); - data[field] = validator.escape(data[field]); if (field === 'email') { return updateEmail(uid, data.email, next); @@ -122,8 +121,8 @@ module.exports = function(User) { } else if (field === 'signature') { data[field] = S(data[field]).stripTags().s; } else if (field === 'website') { - if (!data[field].startsWith(validator.escape('http://')) && !data[field].startsWith(validator.escape('https://'))) { - data[field] = validator.escape('http://') + data[field]; + if (!data[field].startsWith('http://') && !data[field].startsWith('https://')) { + data[field] = 'http://' + data[field]; } } From d5dd48ecc835d4ae3ce40d78e0241e359be5d040 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 14 Apr 2015 14:27:42 -0400 Subject: [PATCH 132/295] closes #3013 --- install/data/defaults.json | 4 ++++ src/controllers/api.js | 1 + src/user/picture.js | 4 +++- src/views/admin/settings/user.tpl | 6 ++++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 778dee3838..980e673325 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -94,5 +94,9 @@ { "field": "requireEmailConfirmation", "value": 0 + }, + { + "field": "profile:allowProfileImageUploads", + "value": 1 } ] diff --git a/src/controllers/api.js b/src/controllers/api.js index e565963816..367c6eb278 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -44,6 +44,7 @@ apiController.getConfig = function(req, res, next) { config.allowGuestSearching = parseInt(meta.config.allowGuestSearching, 10) === 1; config.allowGuestHandles = parseInt(meta.config.allowGuestHandles, 10) === 1; config.allowFileUploads = parseInt(meta.config.allowFileUploads, 10) === 1; + config.allowProfileImageUploads = parseInt(meta.config.allowProfileImageUploads) === 1; config.allowTopicsThumbnail = parseInt(meta.config.allowTopicsThumbnail, 10) === 1; config.allowAccountDelete = parseInt(meta.config.allowAccountDelete, 10) === 1; config.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; diff --git a/src/user/picture.js b/src/user/picture.js index d726773a55..8f030091a9 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -24,6 +24,9 @@ module.exports = function(User) { var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; async.waterfall([ + function(next) { + next(parseInt(meta.config.allowProfileImageUploads) !== 1 ? new Error('[[error:profile-image-uploads-disabled]]') : null); + }, function(next) { next(picture.size > uploadSize * 1024 ? new Error('[[error:file-too-big, ' + uploadSize + ']]') : null); }, @@ -44,7 +47,6 @@ module.exports = function(User) { } } ], function(err, result) { - function done(err, image) { if (err) { return callback(err); diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index ab09e237c8..2db779fe27 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -46,6 +46,12 @@
    Avatars
    +
    + +
    +
    From 625a0dcbfa09a285094cd08326786a72039d2a8f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 20 Apr 2015 23:26:02 -0400 Subject: [PATCH 194/295] closes #3074 --- src/database/mongo/sorted.js | 8 ++++++-- src/routes/debug.js | 4 +++- tests/database/sorted.js | 12 ++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index a056de991f..1d8f992ab9 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -377,8 +377,12 @@ module.exports = function(db, module) { }; module.isSortedSetMember = function(key, value, callback) { - module.sortedSetScore(key, value, function(err, score) { - callback(err, !!score); + if (!key) { + return callback(); + } + value = helpers.valueToString(value); + db.collection('objects').findOne({_key: key, value: value}, {_id: 0, value: 1}, function(err, result) { + callback(err, !!result); }); }; diff --git a/src/routes/debug.js b/src/routes/debug.js index 695e806b23..b81938ccc9 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -9,7 +9,7 @@ var express = require('express'), module.exports = function(app, middleware, controllers) { var router = express.Router(); - app.use(nconf.get('relative_path') + '/debug', router); + router.get('/uid/:uid', function (req, res) { if (!req.params.uid) { return res.redirect('/404'); @@ -59,4 +59,6 @@ module.exports = function(app, middleware, controllers) { router.get('/test', function(req, res) { res.redirect(404); }); + + app.use(nconf.get('relative_path') + '/debug', router); }; diff --git a/tests/database/sorted.js b/tests/database/sorted.js index 6680ee8716..5c34c380b8 100644 --- a/tests/database/sorted.js +++ b/tests/database/sorted.js @@ -347,6 +347,10 @@ describe('Sorted Set methods', function() { }); describe('isSortedSetMember()', function() { + before(function(done) { + db.sortedSetAdd('zeroscore', 0, 'itemwithzeroscore', done); + }); + it('should return false if sorted set does not exist', function(done) { db.isSortedSetMember('doesnotexist', 'value1', function(err, isMember) { assert.equal(err, null); @@ -373,6 +377,14 @@ describe('Sorted Set methods', function() { done(); }); }); + + it('should return true if element is in sorted set with score 0', function(done) { + db.isSortedSetMember('zeroscore', 'itemwithzeroscore', function(err, isMember) { + assert.ifError(err); + assert.deepEqual(isMember, true); + done(); + }); + }); }); describe('isSortedSetMembers()', function() { From cc4e626f5fee4286272e65a5381a9b8751b7fa4a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Apr 2015 12:08:23 -0400 Subject: [PATCH 195/295] updated middleware.renderHeader so that navbar config is retrieved in parallel like everything else, instead of retrieved first. (ping @psychobunny) --- src/meta.js | 1 + src/middleware/middleware.js | 247 +++++++++++++++++------------------ 2 files changed, 122 insertions(+), 126 deletions(-) diff --git a/src/meta.js b/src/meta.js index 8624f63ed4..7226de3c60 100644 --- a/src/meta.js +++ b/src/meta.js @@ -23,6 +23,7 @@ var async = require('async'), require('./meta/sounds')(Meta); require('./meta/settings')(Meta); require('./meta/logs')(Meta); + require('./meta/tags')(Meta); Meta.templates = require('./meta/templates'); /* Assorted */ diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index ed430a934d..0601bb18a9 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -191,142 +191,137 @@ middleware.buildHeader = function(req, res, next) { }; middleware.renderHeader = function(req, res, callback) { - navigation.get(function(err, menuItems) { - if (err) { - return callback(err); + var defaultMetaTags = [{ + name: 'viewport', + content: 'width=device-width, initial-scale=1.0, user-scalable=no' + }, { + name: 'content-type', + content: 'text/html; charset=UTF-8' + }, { + name: 'apple-mobile-web-app-capable', + content: 'yes' + }, { + property: 'og:site_name', + content: meta.config.title || 'NodeBB' + }, { + name: 'keywords', + content: meta.config.keywords || '' + }, { + name: 'msapplication-badge', + content: 'frequency=30; polling-uri=' + nconf.get('url') + '/sitemap.xml' + }, { + name: 'msapplication-square150x150logo', + content: meta.config['brand:logo'] || '' + }], + defaultLinkTags = [{ + rel: 'apple-touch-icon', + href: nconf.get('relative_path') + '/apple-touch-icon' + }], + templateValues = { + bootswatchCSS: meta.config['theme:src'], + title: meta.config.title || '', + description: meta.config.description || '', + 'cache-buster': meta.config['cache-buster'] ? 'v=' + meta.config['cache-buster'] : '', + 'brand:logo': meta.config['brand:logo'] || '', + 'brand:logo:display': meta.config['brand:logo']?'':'hide', + allowRegistration: meta.config.allowRegistration === undefined || parseInt(meta.config.allowRegistration, 10) === 1, + searchEnabled: plugins.hasListeners('filter:search.query') + }; + + for (var key in res.locals.config) { + if (res.locals.config.hasOwnProperty(key)) { + templateValues[key] = res.locals.config[key]; } + } - var defaultMetaTags = [{ - name: 'viewport', - content: 'width=device-width, initial-scale=1.0, user-scalable=no' - }, { - name: 'content-type', - content: 'text/html; charset=UTF-8' - }, { - name: 'apple-mobile-web-app-capable', - content: 'yes' - }, { - property: 'og:site_name', - content: meta.config.title || 'NodeBB' - }, { - name: 'keywords', - content: meta.config.keywords || '' - }, { - name: 'msapplication-badge', - content: 'frequency=30; polling-uri=' + nconf.get('url') + '/sitemap.xml' - }, { - name: 'msapplication-square150x150logo', - content: meta.config['brand:logo'] || '' - }], - defaultLinkTags = [{ - rel: 'apple-touch-icon', - href: nconf.get('relative_path') + '/apple-touch-icon' - }], - templateValues = { - bootswatchCSS: meta.config['theme:src'], - title: meta.config.title || '', - description: meta.config.description || '', - 'cache-buster': meta.config['cache-buster'] ? 'v=' + meta.config['cache-buster'] : '', - 'brand:logo': meta.config['brand:logo'] || '', - 'brand:logo:display': meta.config['brand:logo']?'':'hide', - navigation: menuItems, - allowRegistration: meta.config.allowRegistration === undefined || parseInt(meta.config.allowRegistration, 10) === 1, - searchEnabled: plugins.hasListeners('filter:search.query') - }; + templateValues.configJSON = JSON.stringify(res.locals.config); - for (var key in res.locals.config) { - if (res.locals.config.hasOwnProperty(key)) { - templateValues[key] = res.locals.config[key]; - } + templateValues.metaTags = defaultMetaTags.concat(res.locals.metaTags || []).map(function(tag) { + if(!tag || typeof tag.content !== 'string') { + winston.warn('Invalid meta tag. ', tag); + return tag; } - templateValues.configJSON = JSON.stringify(res.locals.config); - - templateValues.metaTags = defaultMetaTags.concat(res.locals.metaTags || []).map(function(tag) { - if(!tag || typeof tag.content !== 'string') { - winston.warn('Invalid meta tag. ', tag); - return tag; - } - - tag.content = validator.escape(tag.content); - return tag; - }); + tag.content = validator.escape(tag.content); + return tag; + }); - templateValues.linkTags = defaultLinkTags.concat(res.locals.linkTags || []); - templateValues.linkTags.unshift({ - rel: "icon", - type: "image/x-icon", - href: nconf.get('relative_path') + '/favicon.ico' - }); + templateValues.linkTags = defaultLinkTags.concat(res.locals.linkTags || []); + templateValues.linkTags.unshift({ + rel: "icon", + type: "image/x-icon", + href: nconf.get('relative_path') + '/favicon.ico' + }); - async.parallel({ - customCSS: function(next) { - templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1; - if (!templateValues.useCustomCSS || !meta.config.customCSS || !meta.config.renderedCustomCSS) { - return next(null, ''); - } - next(null, meta.config.renderedCustomCSS); - }, - customJS: function(next) { - templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; - next(null, templateValues.useCustomJS ? meta.config.customJS : ''); - }, - title: function(next) { - if (req.uid) { - user.getSettings(req.uid, function(err, settings) { - if (err) { - return next(err); - } - meta.title.build(req.url.slice(1), settings.userLang, res.locals, next); - }); - } else { - meta.title.build(req.url.slice(1), meta.config.defaultLang, res.locals, next); - } - }, - isAdmin: function(next) { - user.isAdministrator(req.uid, next); - }, - user: function(next) { - if (req.uid) { - user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next); - } else { - next(null, { - username: '[[global:guest]]', - userslug: '', - picture: user.createGravatarURLFromEmail(''), - status: 'offline', - banned: false, - uid: 0 - }); - } + async.parallel({ + customCSS: function(next) { + templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1; + if (!templateValues.useCustomCSS || !meta.config.customCSS || !meta.config.renderedCustomCSS) { + return next(null, ''); } - }, function(err, results) { - if (err) { - return callback(err); + next(null, meta.config.renderedCustomCSS); + }, + customJS: function(next) { + templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; + next(null, templateValues.useCustomJS ? meta.config.customJS : ''); + }, + title: function(next) { + if (req.uid) { + user.getSettings(req.uid, function(err, settings) { + if (err) { + return next(err); + } + meta.title.build(req.url.slice(1), settings.userLang, res.locals, next); + }); + } else { + meta.title.build(req.url.slice(1), meta.config.defaultLang, res.locals, next); } - - if (results.user && parseInt(results.user.banned, 10) === 1) { - req.logout(); - res.redirect('/'); - return; + }, + isAdmin: function(next) { + user.isAdministrator(req.uid, next); + }, + user: function(next) { + if (req.uid) { + user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'status', 'email:confirmed', 'banned'], next); + } else { + next(null, { + username: '[[global:guest]]', + userslug: '', + picture: user.createGravatarURLFromEmail(''), + status: 'offline', + banned: false, + uid: 0 + }); } - 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; - templateValues.isAdmin = results.user.isAdmin; - templateValues.user = results.user; - templateValues.userJSON = JSON.stringify(results.user); - templateValues.customCSS = results.customCSS; - templateValues.customJS = results.customJS; - templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; - - templateValues.template = {name: res.locals.template}; - templateValues.template[res.locals.template] = true; - - app.render('header', templateValues, callback); - }); + }, + navigation: async.apply(navigation.get) + }, function(err, results) { + if (err) { + return callback(err); + } + + if (results.user && parseInt(results.user.banned, 10) === 1) { + req.logout(); + res.redirect('/'); + 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; + templateValues.navigation = results.navigation + templateValues.isAdmin = results.user.isAdmin; + templateValues.user = results.user; + templateValues.userJSON = JSON.stringify(results.user); + templateValues.customCSS = results.customCSS; + templateValues.customJS = results.customJS; + templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; + + templateValues.template = {name: res.locals.template}; + templateValues.template[res.locals.template] = true; + + app.render('header', templateValues, callback); }); }; From c26f2743924777aeff47c91c178e9a3b451626d0 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Apr 2015 12:24:37 -0400 Subject: [PATCH 196/295] moved meta and link tag parsing out to a new module, meta/tags --- src/meta/tags.js | 58 ++++++++++++++++++++++++++++++++++++ src/middleware/middleware.js | 50 ++++--------------------------- 2 files changed, 63 insertions(+), 45 deletions(-) create mode 100644 src/meta/tags.js diff --git a/src/meta/tags.js b/src/meta/tags.js new file mode 100644 index 0000000000..222f77727b --- /dev/null +++ b/src/meta/tags.js @@ -0,0 +1,58 @@ +var nconf = require('nconf'), + validator = require('validator'), + plugins = require('../plugins'); + +module.exports = function(Meta) { + Meta.tags = {}; + + Meta.tags.parse = function(meta, link, callback) { + var defaultMetaTags = [{ + name: 'viewport', + content: 'width=device-width, initial-scale=1.0, user-scalable=no' + }, { + name: 'content-type', + content: 'text/html; charset=UTF-8' + }, { + name: 'apple-mobile-web-app-capable', + content: 'yes' + }, { + property: 'og:site_name', + content: Meta.config.title || 'NodeBB' + }, { + name: 'keywords', + content: Meta.config.keywords || '' + }, { + name: 'msapplication-badge', + content: 'frequency=30; polling-uri=' + nconf.get('url') + '/sitemap.xml' + }, { + name: 'msapplication-square150x150logo', + content: Meta.config['brand:logo'] || '' + }], + defaultLinkTags = [{ + rel: 'apple-touch-icon', + href: nconf.get('relative_path') + '/apple-touch-icon' + }]; + + meta = defaultMetaTags.concat(meta || []).map(function(tag) { + if(!tag || typeof tag.content !== 'string') { + winston.warn('Invalid meta tag. ', tag); + return tag; + } + + tag.content = validator.escape(tag.content); + return tag; + }); + + link = defaultLinkTags.concat(link || []); + link.unshift({ + rel: "icon", + type: "image/x-icon", + href: nconf.get('relative_path') + '/favicon.ico' + }); + + callback(null, { + meta: meta, + link: link + }); + }; +}; \ No newline at end of file diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 0601bb18a9..7ef23b28b0 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -191,33 +191,7 @@ middleware.buildHeader = function(req, res, next) { }; middleware.renderHeader = function(req, res, callback) { - var defaultMetaTags = [{ - name: 'viewport', - content: 'width=device-width, initial-scale=1.0, user-scalable=no' - }, { - name: 'content-type', - content: 'text/html; charset=UTF-8' - }, { - name: 'apple-mobile-web-app-capable', - content: 'yes' - }, { - property: 'og:site_name', - content: meta.config.title || 'NodeBB' - }, { - name: 'keywords', - content: meta.config.keywords || '' - }, { - name: 'msapplication-badge', - content: 'frequency=30; polling-uri=' + nconf.get('url') + '/sitemap.xml' - }, { - name: 'msapplication-square150x150logo', - content: meta.config['brand:logo'] || '' - }], - defaultLinkTags = [{ - rel: 'apple-touch-icon', - href: nconf.get('relative_path') + '/apple-touch-icon' - }], - templateValues = { + var templateValues = { bootswatchCSS: meta.config['theme:src'], title: meta.config.title || '', description: meta.config.description || '', @@ -236,23 +210,6 @@ middleware.renderHeader = function(req, res, callback) { templateValues.configJSON = JSON.stringify(res.locals.config); - templateValues.metaTags = defaultMetaTags.concat(res.locals.metaTags || []).map(function(tag) { - if(!tag || typeof tag.content !== 'string') { - winston.warn('Invalid meta tag. ', tag); - return tag; - } - - tag.content = validator.escape(tag.content); - return tag; - }); - - templateValues.linkTags = defaultLinkTags.concat(res.locals.linkTags || []); - templateValues.linkTags.unshift({ - rel: "icon", - type: "image/x-icon", - href: nconf.get('relative_path') + '/favicon.ico' - }); - async.parallel({ customCSS: function(next) { templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1; @@ -294,7 +251,8 @@ middleware.renderHeader = function(req, res, callback) { }); } }, - navigation: async.apply(navigation.get) + navigation: async.apply(navigation.get), + tags: async.apply(meta.tags.parse, res.locals.metaTags, res.locals.linkTags) }, function(err, results) { if (err) { return callback(err); @@ -311,6 +269,8 @@ middleware.renderHeader = function(req, res, callback) { templateValues.browserTitle = results.title; templateValues.navigation = results.navigation + templateValues.metaTags = results.tags.meta; + templateValues.metalinkTags = results.tags.link; templateValues.isAdmin = results.user.isAdmin; templateValues.user = results.user; templateValues.userJSON = JSON.stringify(results.user); From a72501f3b4173e31b436c1b8e75bd6d8bcb49bc1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Apr 2015 12:29:58 -0400 Subject: [PATCH 197/295] closed #3076 --- src/meta/tags.js | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/meta/tags.js b/src/meta/tags.js index 222f77727b..165851820b 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -1,12 +1,14 @@ var nconf = require('nconf'), validator = require('validator'), + async = require('async'), plugins = require('../plugins'); module.exports = function(Meta) { Meta.tags = {}; Meta.tags.parse = function(meta, link, callback) { - var defaultMetaTags = [{ + async.parallel([ + async.apply(plugins.fireHook, 'filter:meta.getMetaTags', [{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, user-scalable=no' }, { @@ -27,32 +29,33 @@ module.exports = function(Meta) { }, { name: 'msapplication-square150x150logo', content: Meta.config['brand:logo'] || '' - }], - defaultLinkTags = [{ + }]), + async.apply(plugins.fireHook, 'filter:meta.getLinkTags', [{ rel: 'apple-touch-icon', href: nconf.get('relative_path') + '/apple-touch-icon' - }]; + }]) + ], function(err, tags) { + meta = tags[0].concat(meta || []).map(function(tag) { + if(!tag || typeof tag.content !== 'string') { + winston.warn('Invalid meta tag. ', tag); + return tag; + } - meta = defaultMetaTags.concat(meta || []).map(function(tag) { - if(!tag || typeof tag.content !== 'string') { - winston.warn('Invalid meta tag. ', tag); + tag.content = validator.escape(tag.content); return tag; - } + }); - tag.content = validator.escape(tag.content); - return tag; - }); - - link = defaultLinkTags.concat(link || []); - link.unshift({ - rel: "icon", - type: "image/x-icon", - href: nconf.get('relative_path') + '/favicon.ico' - }); + link = tags[1].concat(link || []); + link.unshift({ + rel: "icon", + type: "image/x-icon", + href: nconf.get('relative_path') + '/favicon.ico' + }); - callback(null, { - meta: meta, - link: link + callback(null, { + meta: meta, + link: link + }); }); }; }; \ No newline at end of file From 2dc20e690f0d097cc4e5685b1eda2b985157661f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 14:32:21 -0400 Subject: [PATCH 198/295] web install init --- app.js | 10 ++++------ install/web.js | 11 +++++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 install/web.js diff --git a/app.js b/app.js index 66f16da88c..3e947becbd 100644 --- a/app.js +++ b/app.js @@ -65,8 +65,10 @@ configExists = fs.existsSync(configFile); if (!nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nconf.get('reset') && configExists) { start(); -} else if (nconf.get('setup') || nconf.get('install') || !configExists) { +} else if (nconf.get('setup') || nconf.get('install')) { setup(); +} else if (!configExists) { + require('./install/web').install(); } else if (nconf.get('upgrade')) { upgrade(); } else if (nconf.get('reset')) { @@ -219,11 +221,7 @@ function start() { function setup() { loadConfig(); - if (nconf.get('setup')) { - winston.info('NodeBB Setup Triggered via Command Line'); - } else { - winston.warn('Configuration not found, starting NodeBB setup'); - } + winston.info('NodeBB Setup Triggered via Command Line'); var install = require('./src/install'); diff --git a/install/web.js b/install/web.js new file mode 100644 index 0000000000..773754af83 --- /dev/null +++ b/install/web.js @@ -0,0 +1,11 @@ +"use strict"; + +var web = {}; + +web.install = function() { + +}; + + + +module.exports = web; \ No newline at end of file From 610d687a96fef5a3c59bad069bea7bd09aa395b6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Apr 2015 14:32:36 -0400 Subject: [PATCH 199/295] moved favicon into default link tags, and fixed bug that caused link tags to not show up --- src/meta/tags.js | 9 ++++----- src/middleware/middleware.js | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/meta/tags.js b/src/meta/tags.js index 165851820b..022a3ef778 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -31,6 +31,10 @@ module.exports = function(Meta) { content: Meta.config['brand:logo'] || '' }]), async.apply(plugins.fireHook, 'filter:meta.getLinkTags', [{ + rel: "icon", + type: "image/x-icon", + href: nconf.get('relative_path') + '/favicon.ico' + }, { rel: 'apple-touch-icon', href: nconf.get('relative_path') + '/apple-touch-icon' }]) @@ -46,11 +50,6 @@ module.exports = function(Meta) { }); link = tags[1].concat(link || []); - link.unshift({ - rel: "icon", - type: "image/x-icon", - href: nconf.get('relative_path') + '/favicon.ico' - }); callback(null, { meta: meta, diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 7ef23b28b0..9e400de9b7 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -270,7 +270,7 @@ middleware.renderHeader = function(req, res, callback) { templateValues.browserTitle = results.title; templateValues.navigation = results.navigation templateValues.metaTags = results.tags.meta; - templateValues.metalinkTags = results.tags.link; + templateValues.linkTags = results.tags.link; templateValues.isAdmin = results.user.isAdmin; templateValues.user = results.user; templateValues.userJSON = JSON.stringify(results.user); From 60d655e32b23ed78c66f555a49e953d9d45d97a4 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 14:52:57 -0400 Subject: [PATCH 200/295] installer - got the basics in --- Gruntfile.js | 2 +- app.js | 2 +- install/web.js | 33 ++++++++++++++++++++++++++++++++- src/views/install/index.tpl | 1 + 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/views/install/index.tpl diff --git a/Gruntfile.js b/Gruntfile.js index 551d8d7ed3..5820b1565f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -60,7 +60,7 @@ module.exports = function(grunt) { files: ['public/src/**/*.js', 'node_modules/nodebb-*/*.js', 'node_modules/nodebb-*/*/*.js', 'node_modules/nodebb-*/*/*/*.js', 'node_modules/nodebb-*/*/*/*/*.js'] }, serverUpdated: { - files: ['*.js', 'src/**/*.js'] + files: ['*.js', 'install/*.js', 'src/**/*.js'] }, templatesUpdated: { files: ['src/views/**/*.tpl', 'node_modules/nodebb-*/*.tpl', 'node_modules/nodebb-*/*/*.tpl', 'node_modules/nodebb-*/*/*/*.tpl', 'node_modules/nodebb-*/*/*/*/*.tpl', 'node_modules/nodebb-*/*/*/*/*/*.tpl'] diff --git a/app.js b/app.js index 3e947becbd..68ffe6faea 100644 --- a/app.js +++ b/app.js @@ -68,7 +68,7 @@ if (!nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nc } else if (nconf.get('setup') || nconf.get('install')) { setup(); } else if (!configExists) { - require('./install/web').install(); + require('./install/web').install(nconf.get('port')); } else if (nconf.get('upgrade')) { upgrade(); } else if (nconf.get('reset')) { diff --git a/install/web.js b/install/web.js index 773754af83..4b9b19ce03 100644 --- a/install/web.js +++ b/install/web.js @@ -1,11 +1,42 @@ "use strict"; +var winston = require('winston'), + express = require('express'), + nconf = require('nconf'), + path = require('path'), + app = express(); + var web = {}; -web.install = function() { +web.install = function(port) { + port = port || 8080; + winston.info('Launching web installer on port ', port); + setupRoutes(); + launchExpress(port); }; +function launchExpress(port) { + app.use(express.static('public', {})); + app.engine('tpl', require('templates.js').__express); + app.set('view engine', 'tpl'); + app.set('views', path.join(__dirname, '../src/views')); + + var server = app.listen(port, function() { + var host = server.address().address; + winston.info('Web installer listening on http://%s:%s', host, port); + }); +} + +function setupRoutes() { + app.get('/', install); +} + +function install(req, res, next) { + console.log('test'); + res.render('install/index', {}); +} + module.exports = web; \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl new file mode 100644 index 0000000000..69ffdfe478 --- /dev/null +++ b/src/views/install/index.tpl @@ -0,0 +1 @@ +Welcome to the installer! \ No newline at end of file From ee94d72c597bd70bb0304d4cbad353700f4c061b Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 15:24:50 -0400 Subject: [PATCH 201/295] themed installer, started form --- src/views/install/index.tpl | 67 ++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 69ffdfe478..c422c302f5 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -1 +1,66 @@ -Welcome to the installer! \ No newline at end of file + + + + + + + NodeBB Web Installer + + + + + + + + + + + + + +
    +

    +

    Welcome to the NodeBB Installer!
    You are just a few steps away from launching your own NodeBB forum

    +

    +
    +

    + Administrator +

    +

    + + +

    +
    + + + + \ No newline at end of file From 2f2e2d60a0ca8412c84a5eaaf04fa5d934a5411d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Apr 2015 15:37:36 -0400 Subject: [PATCH 202/295] updated translations --- public/language/nl/category.json | 6 +++--- public/language/nl/error.json | 6 +++--- public/language/nl/groups.json | 4 ++-- public/language/nl/modules.json | 8 ++++---- public/language/nl/pages.json | 2 +- public/language/nl/reset_password.json | 2 +- public/language/nl/search.json | 2 +- public/language/nl/user.json | 16 ++++++++-------- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/public/language/nl/category.json b/public/language/nl/category.json index 006419994c..afb8eb21c8 100644 --- a/public/language/nl/category.json +++ b/public/language/nl/category.json @@ -5,8 +5,8 @@ "browsing": "verkennen", "no_replies": "Niemand heeft gereageerd", "share_this_category": "Deel deze categorie", - "watch": "Watch", + "watch": "Volgen", "ignore": "Negeren", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch.message": "Je krijgt nu updates binnen van deze categorie", + "ignore.message": "Je krijgt geen updates meer binnen van deze categorie" } \ No newline at end of file diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 04ffc07151..bfc1d5c320 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -21,7 +21,7 @@ "email-not-confirmed-chat": "U kunt helaas geen gebruik maken van chats tot uw email adres bevestigd is.", "no-email-to-confirm": "Dit forum vereist email bevestiging, klikt u alstublieft hier om uw email te vermelden", "email-confirm-failed": "Uw email kon helaas niet bevestigd worden, probeert u het alstublieft later nog eens.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Bevestigingsmailtje is al verzonden, wacht %1 minuut/minuten om nog 1 te verzenden", "username-too-short": "Gebruikersnaam is te kort", "username-too-long": "Gebruikersnaam is te lang", "user-banned": "Gebruiker verbannen", @@ -46,7 +46,7 @@ "too-many-posts-newbie": "Als een nieuwe gebruiker kan je maar om de %1 seconden een bericht plaatsen vanwege je reputatie. Uw moet deze level van reputatie verdienen %2. Wacht alstublieft met het plaatsen van uw bericht.", "tag-too-short": "Maakt u alstublieft de tag iets langer. Tags dienen minimaal %1 karakters te bevatten", "tag-too-long": "Maakt u alstublieft de tag iets korter. Tags mogen maximaal %1 karakters bevatten", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "file-too-big": "De maximale bestandsgrootte is %1 kbs", "cant-vote-self-post": "Je kan niet op je eigen berichten stemmen", "already-favourited": "U heeft al dit bericht in uw favorieten staan", "already-unfavourited": "U heeft al dit bericht uit uw favorieten gehaald", @@ -63,7 +63,7 @@ "post-already-restored": "Dit bericht is al hersteld", "topic-already-deleted": "Deze topic is al verwijderd", "topic-already-restored": "Deze topic is al hersteld", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", + "cant-purge-main-post": "Je kan het beginbericht niet verwijderen. Verwijder het onderwerp hiervoor.", "topic-thumbnails-are-disabled": "Onderwerp thumbnails zijn uitgeschakeld", "invalid-file": "Ongeldig bestand", "uploads-are-disabled": "Uploads zijn uitgeschakeld", diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index 55329f7460..8fbbbee137 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -20,8 +20,8 @@ "details.kick": "Verwijder", "details.owner_options": "Groeps Administratie", "details.group_name": "Groepsnaam", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", + "details.member_count": "Leden telling", + "details.creation_date": "Datum van het creëeren", "details.description": "Beschrijving", "details.badge_preview": "Badge Voorvertoning", "details.change_icon": "Icoon veranderen", diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index b4ff78710f..76dd6413a9 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7 Dagen", "chat.thirty_days": "30 Dagen", "chat.three_months": "3 Maanden", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "samenstellen", + "composer.show_preview": "Laat voorbeeld zien", + "composer.hide_preview": "Verberg voorbeeld", "composer.user_said_in": "%1 zegt in %2:", "composer.user_said": "%1 zegt:", "composer.discard": "Weet u het zeker dat u dit bericht niet wilt plaatsen?", "composer.submit_and_lock": "Plaatsen en vergrendelen", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.toggle_dropdown": "pin menu" } \ No newline at end of file diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 955675f48d..f9db18bd4c 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -6,7 +6,7 @@ "users": "Geregistreerde Gebruikers", "notifications": "Notificaties", "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tag": "Onderwerpen getagd onder \"%1\"", "user.edit": "\"%1\" aanpassen", "user.following": "Mensen %1 Volgt", "user.followers": "Mensen die %1 Volgen", diff --git a/public/language/nl/reset_password.json b/public/language/nl/reset_password.json index 3844bbb12f..87a167b975 100644 --- a/public/language/nl/reset_password.json +++ b/public/language/nl/reset_password.json @@ -13,5 +13,5 @@ "invalid_email": "Fout Email Adres / Email Adres bestaat niet!", "password_too_short": "Het ingegeven wachtwoord is te kort. Kiest u alstublieft een ander wachtwoord.", "passwords_do_not_match": "De twee wachtwoorden die u heeft ingegeven komen niet overeen.", - "password_expired": "Your password has expired, please choose a new password" + "password_expired": "U wachtwoord is verlopen, kies een nieuw wachtwoord" } \ No newline at end of file diff --git a/public/language/nl/search.json b/public/language/nl/search.json index 5a4a2c8210..91d52f12a2 100644 --- a/public/language/nl/search.json +++ b/public/language/nl/search.json @@ -1,7 +1,7 @@ { "results_matching": "%1 resulta(a)ten was een match \"%2\", (%3 seconds)", "no-matches": "Geen matches gevonden", - "advanced-search": "Advanced Search", + "advanced-search": "Geavanceerd Zoeken", "in": "in", "titles": "Titels", "titles-posts": "Titels en Berichten", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 9537ef0f2c..d30ff024a9 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -27,7 +27,7 @@ "chat": "Chat", "follow": "Volgen", "unfollow": "Ontvolgen", - "more": "More", + "more": "Meer", "profile_update_success": "Uw profiel is succesvol geüpdatet", "change_picture": "Afbeelding Aanpassen", "edit": "Aanpassen", @@ -68,16 +68,16 @@ "has_no_watched_topics": "Deze gebruiker heeft nog geen berichten bekeken", "email_hidden": "Email Verborgen", "hidden": "verborgen", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "Blader door onderwerpen en berichten in plaats van oneindig scrollen.", "topics_per_page": "Onderwerpen per Pagina", "posts_per_page": "Berichten per Pagina", - "notification_sounds": "Play a sound when you receive a notification", + "notification_sounds": "Speel een geluid af wanneer ik een notificatie ontvang.", "browsing": "Zoek Instellingen", - "open_links_in_new_tab": "Open outgoing links in new tab", + "open_links_in_new_tab": "Open de uitgaande links in een nieuw tabblad", "enable_topic_searching": "Zet zoeken in het onderwerp aan", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", + "topic_search_help": "Als het is ingeschakeld, dan zal het standaard zoeken overschrijven en zal je vanaf nu het gehele onderwerp kunnen doorzoeken ipv wat je standaard ziet.", + "follow_topics_you_reply_to": "Volg de onderwerpen waarop u gereageerd heeft.", + "follow_topics_you_create": "Volg de onderwerpen die u gecreëerd heeft.", "grouptitle": "Selecteer de groepstitel die u wilt weergeven ", - "no-group-title": "No group title" + "no-group-title": "Geen groepstitel" } \ No newline at end of file From 2ffdec53869f5bfec63842272f60af73468b57ae Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 15:43:55 -0400 Subject: [PATCH 203/295] styled active clas --- public/src/installer/install.js | 14 ++++++++++ src/views/install/index.tpl | 46 ++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 public/src/installer/install.js diff --git a/public/src/installer/install.js b/public/src/installer/install.js new file mode 100644 index 0000000000..48464808ff --- /dev/null +++ b/public/src/installer/install.js @@ -0,0 +1,14 @@ +"use strict"; + +$('document').ready(function() { + setupInputs(); + + + + function setupInputs() { + $('.form-control').on('focus', function() { + $('.input-row.active').removeClass('active'); + $(this).parents('.input-row').addClass('active'); + }); + } +}); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index c422c302f5..b5d932efa2 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -21,6 +21,23 @@ .btn, .form-control, .navbar { border-radius: 0; } .container { font-size: 18px; } body, small, p, div { font-family: "Roboto", sans-serif; } + .input-row { + margin-bottom: 20px; + } + .input-row.active .input-field { + border-right: 5px solid #BF3E11; + padding-right: 20px; + } + .input-row.active .help-text { + display: block; + } + + .help-text { + line-height: 20px; + color: #888; + font-size: 85%; + display: none; + } @@ -52,15 +69,30 @@

    Welcome to the NodeBB Installer!
    You are just a few steps away from launching your own NodeBB forum


    -

    - Administrator -

    -

    - - -

    + +
    +
    + + +
    +
    + Here is some sample help text. Username should be between 6 and 12 characters long. +
    +
    +
    +
    + + +
    +
    + Here is some sample help text. Username should be between 6 and 12 characters long. +
    +
    +
    + + \ No newline at end of file From 005c95277b6ef37f8e9e6e0b17c79d26f51db103 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 16:21:04 -0400 Subject: [PATCH 204/295] using less for web installer --- install/web.js | 23 +++++++++++++++++++---- public/less/install.less | 20 ++++++++++++++++++++ src/views/install/index.tpl | 24 +----------------------- 3 files changed, 40 insertions(+), 27 deletions(-) create mode 100644 public/less/install.less diff --git a/install/web.js b/install/web.js index 4b9b19ce03..39fd3420ce 100644 --- a/install/web.js +++ b/install/web.js @@ -2,8 +2,9 @@ var winston = require('winston'), express = require('express'), - nconf = require('nconf'), + fs = require('fs'), path = require('path'), + less = require('less'), app = express(); var web = {}; @@ -12,8 +13,10 @@ web.install = function(port) { port = port || 8080; winston.info('Launching web installer on port ', port); - setupRoutes(); - launchExpress(port); + compileLess(function() { + setupRoutes(); + launchExpress(port); + }); }; @@ -34,9 +37,21 @@ function setupRoutes() { } function install(req, res, next) { - console.log('test'); res.render('install/index', {}); } +function compileLess(callback) { + fs.readFile(path.join(__dirname, '../public/less/install.less'), function(err, style) { + less.render(style.toString(), function(err, css) { + if(err) { + return winston.error('Unable to compile LESS: ', err); + } + + console.log(css); + + fs.writeFile(path.join(__dirname, '../public/stylesheet.css'), css.css, callback); + }); + }); +} module.exports = web; \ No newline at end of file diff --git a/public/less/install.less b/public/less/install.less new file mode 100644 index 0000000000..9385de3e86 --- /dev/null +++ b/public/less/install.less @@ -0,0 +1,20 @@ +.btn, .form-control, .navbar { border-radius: 0; } +.container { font-size: 18px; } +body, small, p, div { font-family: "Roboto", sans-serif; } +.input-row { + margin-bottom: 20px; +} +.input-row.active .input-field { + border-right: 5px solid #BF3E11; + padding-right: 20px; +} +.input-row.active .help-text { + display: block; +} + +.help-text { + line-height: 20px; + color: #888; + font-size: 85%; + display: none; +} \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index b5d932efa2..29b45dd0de 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -8,6 +8,7 @@ + - - From 14b16cb527f1eb71598a2b57e77a860dc1140396 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 16:21:51 -0400 Subject: [PATCH 205/295] log --- install/web.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/web.js b/install/web.js index 39fd3420ce..351f512868 100644 --- a/install/web.js +++ b/install/web.js @@ -47,8 +47,6 @@ function compileLess(callback) { return winston.error('Unable to compile LESS: ', err); } - console.log(css); - fs.writeFile(path.join(__dirname, '../public/stylesheet.css'), css.css, callback); }); }); From 3ffd3a5d3c6df879f7a3f0088bd179544cbf43ac Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 21 Apr 2015 16:26:24 -0400 Subject: [PATCH 206/295] closes #2970, closes #3078 --- public/src/client/topic/events.js | 11 +++-------- src/privileges/posts.js | 2 +- src/threadTools.js | 3 +-- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 80df64dc6d..d40fc776a1 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -1,7 +1,7 @@ 'use strict'; -/* globals config, app, ajaxify, define, socket, templates */ +/* globals config, app, ajaxify, define, socket, templates, translator, utils */ define('forum/topic/events', [ 'forum/topic/browsing', @@ -20,8 +20,8 @@ define('forum/topic/events', [ 'event:voted': updatePostVotesAndUserReputation, 'event:favourited': updateFavouriteCount, - 'event:topic_deleted': toggleTopicDeleteState, - 'event:topic_restored': toggleTopicDeleteState, + 'event:topic_deleted': threadTools.setDeleteState, + 'event:topic_restored': threadTools.setDeleteState, 'event:topic_purged': onTopicPurged, 'event:topic_locked': threadTools.setLockedState, @@ -81,11 +81,6 @@ define('forum/topic/events', [ $('[data-pid="' + data.post.pid + '"] .favouriteCount').html(data.post.reputation).attr('data-favourites', data.post.reputation); } - function toggleTopicDeleteState(data) { - threadTools.setLockedState(data); - threadTools.setDeleteState(data); - } - function onTopicPurged(data) { ajaxify.go('category/' + ajaxify.variables.get('category_id')); } diff --git a/src/privileges/posts.js b/src/privileges/posts.js index 8dfd89bff2..f39de4e08e 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -109,7 +109,7 @@ module.exports = function(privileges) { return callback(null, true); } if (results.isEditable.isLocked) { - return callback(new Error('[[error:topic-locked]]]')); + return callback(new Error('[[error:topic-locked]]')); } if (results.isEditable.isEditExpired) { return callback(new Error('[[error:post-edit-duration-expired, ' + meta.config.postEditDuration + ']]')); diff --git a/src/threadTools.js b/src/threadTools.js index 1a8016a2e2..ea66ac9239 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -36,7 +36,7 @@ var async = require('async'), return callback(err); } topicData.deleted = isDelete ? 1 : 0; - ThreadTools[isDelete ? 'lock' : 'unlock'](tid, uid); + if (isDelete) { plugins.fireHook('action:topic.delete', tid); } else { @@ -47,7 +47,6 @@ var async = require('async'), tid: tid, cid: topicData.cid, isDelete: isDelete, - isLocked: isDelete, uid: uid }; From 828980f3e61e159a488ad6527bd1669361e236d5 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Tue, 21 Apr 2015 16:48:41 -0400 Subject: [PATCH 207/295] closes #3008 --- src/threadTools.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/threadTools.js b/src/threadTools.js index ea66ac9239..c98e62dbcc 100644 --- a/src/threadTools.js +++ b/src/threadTools.js @@ -26,9 +26,10 @@ var async = require('async'), return callback(err); } - var alreadyDeletedOrRestored = (parseInt(topicData.deleted, 10) && isDelete) || (!parseInt(topicData.deleted, 10) && !isDelete); - if (alreadyDeletedOrRestored) { - return callback(null, {tid: tid}); + if (parseInt(topicData.deleted, 10) === 1 && isDelete) { + return callback(new Error('[[error:topic-already-deleted]]')); + } else if(parseInt(topicData.deleted, 10) !== 1 && !isDelete) { + return callback(new Error('[[error:topic-already-restored]]')); } topics[isDelete ? 'delete' : 'restore'](tid, function(err) { From 1f2bd9390d6d2da7057e18ea3aa3b46d3db3008e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 17:02:36 -0400 Subject: [PATCH 208/295] compiling JS as well now --- install/web.js | 25 +++++++++++++++++++++++-- public/src/installer/install.js | 16 ++++++++++++++++ src/views/install/index.tpl | 8 ++++---- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/install/web.js b/install/web.js index 351f512868..c462c24e6a 100644 --- a/install/web.js +++ b/install/web.js @@ -5,15 +5,26 @@ var winston = require('winston'), fs = require('fs'), path = require('path'), less = require('less'), + async = require('async'), + uglify = require('uglify-js'), app = express(); -var web = {}; +var web = {}, + scripts = [ + 'public/vendor/jquery/js/jquery.js', + 'public/vendor/bootstrap/js/bootstrap.min.js', + 'public/vendor/bootbox/bootbox.min.js', + 'public/vendor/xregexp/xregexp.js', + 'public/vendor/xregexp/unicode/unicode-base.js', + 'public/src/utils.js', + 'public/src/installer/install.js' + ]; web.install = function(port) { port = port || 8080; winston.info('Launching web installer on port ', port); - compileLess(function() { + async.parallel([compileLess, compileJS], function() { setupRoutes(); launchExpress(port); }); @@ -52,4 +63,14 @@ function compileLess(callback) { }); } +function compileJS(callback) { + var scriptPath = path.join(__dirname, '..'), + result = uglify.minify(scripts.map(function(script) { + return path.join(scriptPath, script); + })); + + + fs.writeFile(path.join(__dirname, '../public/nodebb.min.js'), result.code, callback); +} + module.exports = web; \ No newline at end of file diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 48464808ff..fe86a5642e 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -1,4 +1,5 @@ "use strict"; +/*global utils*/ $('document').ready(function() { setupInputs(); @@ -10,5 +11,20 @@ $('document').ready(function() { $('.input-row.active').removeClass('active'); $(this).parents('.input-row').addClass('active'); }); + + $('[name="username"]').on('blur', validateUsername); + } + + + function validateUsername() { + var $this = $(this), + username = $this.val(), + help = $this.parents('.input-row').children('.help-text'); + + if (!utils.isUserNameValid(username) || !utils.slugify(username)) { + help.html('Invalid Username.'); + } else { + help.html(''); + } } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 29b45dd0de..8d10af37d7 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -54,13 +54,13 @@
    - Here is some sample help text. Username should be between 6 and 12 characters long. +
    - - + +
    Here is some sample help text. Username should be between 6 and 12 characters long. @@ -71,6 +71,6 @@ - + \ No newline at end of file From 25e2e72366d7286f2205480f14cd1ae6028ca857 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 17:14:27 -0400 Subject: [PATCH 209/295] got username validation working --- public/less/install.less | 30 +++++++++++++++++++++++------- public/src/installer/install.js | 13 ++++++++++--- src/views/install/index.tpl | 8 ++------ 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/public/less/install.less b/public/less/install.less index 9385de3e86..a57d0e26c8 100644 --- a/public/less/install.less +++ b/public/less/install.less @@ -1,15 +1,31 @@ .btn, .form-control, .navbar { border-radius: 0; } .container { font-size: 18px; } body, small, p, div { font-family: "Roboto", sans-serif; } + .input-row { margin-bottom: 20px; -} -.input-row.active .input-field { - border-right: 5px solid #BF3E11; - padding-right: 20px; -} -.input-row.active .help-text { - display: block; + + &.active { + .input-field { + border-right: 5px solid #38B44A; + padding-right: 20px; + } + + .help-text { + display: block; + } + } + + &.error { + .input-field { + border-right: 5px solid #BF3E11; + padding-right: 20px; + } + + .help-text { + display: block; + } + } } .help-text { diff --git a/public/src/installer/install.js b/public/src/installer/install.js index fe86a5642e..f157f1d120 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -8,8 +8,13 @@ $('document').ready(function() { function setupInputs() { $('.form-control').on('focus', function() { + var parent = $(this).parents('.input-row'); + $('.input-row.active').removeClass('active'); - $(this).parents('.input-row').addClass('active'); + parent.addClass('active').removeClass('error'); + + var help = parent.find('.help-text'); + help.html(help.attr('data-help')); }); $('[name="username"]').on('blur', validateUsername); @@ -19,12 +24,14 @@ $('document').ready(function() { function validateUsername() { var $this = $(this), username = $this.val(), - help = $this.parents('.input-row').children('.help-text'); + parent = $this.parents('.input-row'), + help = parent.children('.help-text'); if (!utils.isUserNameValid(username) || !utils.slugify(username)) { + parent.addClass('error'); help.html('Invalid Username.'); } else { - help.html(''); + parent.removeClass('error'); } } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 8d10af37d7..3687bd400f 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -53,18 +53,14 @@
    -
    - -
    +
    -
    - Here is some sample help text. Username should be between 6 and 12 characters long. -
    +
    From 50b9a7096ef32557cca4e2e65c23e5214ed95f4c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 17:50:42 -0400 Subject: [PATCH 210/295] minor ux --- public/src/installer/install.js | 1 + src/views/install/index.tpl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index f157f1d120..2d19a36dad 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -3,6 +3,7 @@ $('document').ready(function() { setupInputs(); + $('[name="username"]').focus(); diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 3687bd400f..dc0eca5fb1 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -53,7 +53,7 @@ -
    +
    From 22d2ba5d6b9749d423060bfe9d9bee8715c2a276 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 18:00:01 -0400 Subject: [PATCH 211/295] mobile optimization for installer --- public/less/install.less | 16 ++++++++++++++-- src/views/install/index.tpl | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/public/less/install.less b/public/less/install.less index a57d0e26c8..3e296a15d2 100644 --- a/public/less/install.less +++ b/public/less/install.less @@ -5,9 +5,21 @@ body, small, p, div { font-family: "Roboto", sans-serif; } .input-row { margin-bottom: 20px; + .form-control { + margin-bottom: 5px; + } + + .help-text { + pointer-events: none; + } + + .input-field { + border-right: 5px solid #FFF; + } + &.active { .input-field { - border-right: 5px solid #38B44A; + border-right-color: #38B44A; padding-right: 20px; } @@ -18,7 +30,7 @@ body, small, p, div { font-family: "Roboto", sans-serif; } &.error { .input-field { - border-right: 5px solid #BF3E11; + border-right-color: #BF3E11; padding-right: 20px; } diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index dc0eca5fb1..f55f548888 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -58,9 +58,9 @@
    - +
    -
    +
    From 9fba76dc43108ee14d0fbef4ecef7d5bd5da632c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 18:01:07 -0400 Subject: [PATCH 212/295] fixed header links for installer --- src/views/install/index.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index f55f548888..c2e0a3ec09 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -35,8 +35,8 @@
    From fe40d0f9e8d246f0676f5a0c65be90f1b1855aeb Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 18:21:50 -0400 Subject: [PATCH 213/295] installer: password validation --- public/src/installer/install.js | 43 ++++++++++++++++++++++++--------- src/views/install/index.tpl | 8 +++--- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 2d19a36dad..ff3b92e542 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -18,21 +18,42 @@ $('document').ready(function() { help.html(help.attr('data-help')); }); - $('[name="username"]').on('blur', validateUsername); + $('[name="username"]').on('blur', function() { + validate('username', $(this)); + }); + $('[name="password"]').on('blur', function() { + validate('password', $(this)); + }); } - - function validateUsername() { - var $this = $(this), - username = $this.val(), - parent = $this.parents('.input-row'), + function validate(type, el) { + var field = el.val(), + parent = el.parents('.input-row'), help = parent.children('.help-text'); - if (!utils.isUserNameValid(username) || !utils.slugify(username)) { - parent.addClass('error'); - help.html('Invalid Username.'); - } else { - parent.removeClass('error'); + function validateUsername(field) { + if (!utils.isUserNameValid(field) || !utils.slugify(field)) { + parent.addClass('error'); + help.html('Invalid Username.'); + } else { + parent.removeClass('error'); + } + } + + function validatePassword(field) { + if (!utils.isPasswordValid(field)) { + parent.addClass('error'); + help.html('Invalid Password.'); + } else { + parent.removeClass('error'); + } + } + + switch (type) { + case 'username': + return validateUsername(field); + case 'password': + return validatePassword(field); } } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index c2e0a3ec09..f611a7cf4c 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -49,18 +49,18 @@
    -
    +
    -
    +
    -
    +
    -
    +
    From ab2272b6b5127e511642b86269aed97742895d33 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 18:32:24 -0400 Subject: [PATCH 214/295] installer: confirm password --- public/src/installer/install.js | 18 +++++++++++++----- src/views/install/index.tpl | 7 +++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index ff3b92e542..0ec469ff5b 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -18,11 +18,8 @@ $('document').ready(function() { help.html(help.attr('data-help')); }); - $('[name="username"]').on('blur', function() { - validate('username', $(this)); - }); - $('[name="password"]').on('blur', function() { - validate('password', $(this)); + $('[name]').on('blur', function() { + validate($(this).attr('name'), $(this)); }); } @@ -49,11 +46,22 @@ $('document').ready(function() { } } + function validateConfirmPassword(field) { + if ($('[name="password"]').val() !== $('[name="confirm"]').val()) { + parent.addClass('error'); + help.html('Passwords do not match.'); + } else { + parent.removeClass('error'); + } + } + switch (type) { case 'username': return validateUsername(field); case 'password': return validatePassword(field); + case 'confirm': + return validateConfirmPassword(field); } } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index f611a7cf4c..5dbd31de84 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -62,6 +62,13 @@
    +
    +
    + + +
    +
    +
    From 8a7aaf8f7609bf52d0b3c9c77f7352725d315226 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 18:38:54 -0400 Subject: [PATCH 215/295] installer: validate email --- public/src/installer/install.js | 11 +++++++++++ src/views/install/index.tpl | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 0ec469ff5b..63698ce7ad 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -55,6 +55,15 @@ $('document').ready(function() { } } + function validateEmail(field) { + if (!utils.isEmailValid(field)) { + parent.addClass('error'); + help.html('Invalid Email Address.'); + } else { + parent.removeClass('error'); + } + } + switch (type) { case 'username': return validateUsername(field); @@ -62,6 +71,8 @@ $('document').ready(function() { return validatePassword(field); case 'confirm': return validateConfirmPassword(field); + case 'email': + return validateEmail(field); } } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 5dbd31de84..222d08abf5 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -55,6 +55,13 @@
    +
    +
    + + +
    +
    +
    @@ -67,7 +74,7 @@
    -
    +
    From a11652ead146b63a547034e903ed828ab7e8e2d8 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 18:48:58 -0400 Subject: [PATCH 216/295] cleanup installer.less --- public/less/install.less | 26 ++++++++++++++++---------- src/views/install/index.tpl | 13 +++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/public/less/install.less b/public/less/install.less index 3e296a15d2..1289c62941 100644 --- a/public/less/install.less +++ b/public/less/install.less @@ -1,6 +1,15 @@ -.btn, .form-control, .navbar { border-radius: 0; } -.container { font-size: 18px; } -body, small, p, div { font-family: "Roboto", sans-serif; } +.btn, .form-control, .navbar { + border-radius: 0; +} + +.container { + font-size: 18px; + margin-bottom: 100px; +} + +body, small, p, div { + font-family: "Roboto", sans-serif; +} .input-row { margin-bottom: 20px; @@ -11,6 +20,10 @@ body, small, p, div { font-family: "Roboto", sans-serif; } .help-text { pointer-events: none; + line-height: 20px; + color: #888; + font-size: 85%; + display: none; } .input-field { @@ -38,11 +51,4 @@ body, small, p, div { font-family: "Roboto", sans-serif; } display: block; } } -} - -.help-text { - line-height: 20px; - color: #888; - font-size: 85%; - display: none; } \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 222d08abf5..bb3850fafe 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -76,6 +76,19 @@
    + +

    +

    Configure your database

    +
    +

    + +
    +
    + + +
    +
    +
    From bf13b6160f064941ca7d6a075935b66a0a25197e Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 19:10:47 -0400 Subject: [PATCH 217/295] load database questions --- install/web.js | 14 ++++++++++++- src/views/install/index.tpl | 39 ++++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/install/web.js b/install/web.js index c462c24e6a..515a4fe7b6 100644 --- a/install/web.js +++ b/install/web.js @@ -48,7 +48,19 @@ function setupRoutes() { } function install(req, res, next) { - res.render('install/index', {}); + var dbs = ['redis', 'mongo'], + databases = []; + + dbs.forEach(function(el) { + databases.push({ + name: el, + questions: require('../src/database/' + el).questions + }); + }); + + res.render('install/index', { + databases: databases + }); } function compileLess(callback) { diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index bb3850fafe..9c86dc073f 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -44,35 +44,39 @@

    -

    Welcome to the NodeBB Installer!
    You are just a few steps away from launching your own NodeBB forum

    +

    Welcome to the NodeBB Installer

    + You are just a few steps away from launching your own NodeBB forum!

    -
    +

    +

    Create an Administrator account

    +
    +

    - +
    - +
    - +
    - +
    @@ -84,14 +88,31 @@
    - - + +
    -
    +
    + +
    + +
    +
    + + +
    +
    + +
    + +
    + From a38697458587080c44a1181a8e619ce43c28e2c9 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 19:31:25 -0400 Subject: [PATCH 218/295] installer: database switcher --- public/src/installer/install.js | 16 ++++++++++++---- src/views/install/index.tpl | 8 +++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 63698ce7ad..2407c95a02 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -8,7 +8,7 @@ $('document').ready(function() { function setupInputs() { - $('.form-control').on('focus', function() { + $('form').on('focus', '.form-control', function() { var parent = $(this).parents('.input-row'); $('.input-row.active').removeClass('active'); @@ -18,12 +18,14 @@ $('document').ready(function() { help.html(help.attr('data-help')); }); - $('[name]').on('blur', function() { - validate($(this).attr('name'), $(this)); + $('form').on('blur change', '[name]', function() { + activate($(this).attr('name'), $(this)); }); + + activate($('[name="database"]').val(), $('[name="database"]')); } - function validate(type, el) { + function activate(type, el) { var field = el.val(), parent = el.parents('.input-row'), help = parent.children('.help-text'); @@ -64,6 +66,10 @@ $('document').ready(function() { } } + function switchDatabase(field) { + $('#database-config').html($('[data-database="' + field + '"]').html()); + } + switch (type) { case 'username': return validateUsername(field); @@ -73,6 +79,8 @@ $('document').ready(function() { return validateConfirmPassword(field); case 'email': return validateEmail(field); + case 'database': + return switchDatabase(field); } } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 9c86dc073f..0901f5fdab 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -88,17 +88,19 @@
    - +
    + +
    -
    +
    From 20a1ab185c933fed4f5804fff30a4850b4f3a987 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 19:50:58 -0400 Subject: [PATCH 219/295] small refactor to install/web.js --- install/web.js | 23 ++++++++++++++++------- src/views/install/index.tpl | 4 +++- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/install/web.js b/install/web.js index 515a4fe7b6..f87c4d024d 100644 --- a/install/web.js +++ b/install/web.js @@ -2,6 +2,7 @@ var winston = require('winston'), express = require('express'), + bodyParser = require('body-parser'), fs = require('fs'), path = require('path'), less = require('less'), @@ -24,6 +25,14 @@ web.install = function(port) { port = port || 8080; winston.info('Launching web installer on port ', port); + app.use(express.static('public', {})); + app.engine('tpl', require('templates.js').__express); + app.set('view engine', 'tpl'); + app.set('views', path.join(__dirname, '../src/views')); + app.use(bodyParser.urlencoded({ + extended: true + })); + async.parallel([compileLess, compileJS], function() { setupRoutes(); launchExpress(port); @@ -32,11 +41,6 @@ web.install = function(port) { function launchExpress(port) { - app.use(express.static('public', {})); - app.engine('tpl', require('templates.js').__express); - app.set('view engine', 'tpl'); - app.set('views', path.join(__dirname, '../src/views')); - var server = app.listen(port, function() { var host = server.address().address; winston.info('Web installer listening on http://%s:%s', host, port); @@ -44,10 +48,11 @@ function launchExpress(port) { } function setupRoutes() { - app.get('/', install); + app.get('/', welcome); + app.post('/', install); } -function install(req, res, next) { +function welcome(req, res) { var dbs = ['redis', 'mongo'], databases = []; @@ -63,6 +68,10 @@ function install(req, res, next) { }); } +function install(req, res) { + console.log(req.body); +} + function compileLess(callback) { fs.readFile(path.join(__dirname, '../public/less/install.less'), function(err, style) { less.render(style.toString(), function(err, css) { diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 0901f5fdab..26286a6a8f 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -47,7 +47,7 @@

    Welcome to the NodeBB Installer

    You are just a few steps away from launching your own NodeBB forum!

    -
    +

    Create an Administrator account


    @@ -97,6 +97,8 @@
    + +
    From a93e52aadec040a0d172f861d1b9b642c6531569 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 19:54:33 -0400 Subject: [PATCH 220/295] fixed cold load database switcher for installer --- public/src/installer/install.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 2407c95a02..8d9f8c5c90 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -22,7 +22,7 @@ $('document').ready(function() { activate($(this).attr('name'), $(this)); }); - activate($('[name="database"]').val(), $('[name="database"]')); + activate('database', $('[name="database"]')); } function activate(type, el) { @@ -67,6 +67,7 @@ $('document').ready(function() { } function switchDatabase(field) { + console.log(field); $('#database-config').html($('[data-database="' + field + '"]').html()); } From 2646b38dd281e143c657c657bf5bbb258b6202de Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 20:02:38 -0400 Subject: [PATCH 221/295] woops, added too many namespaces --- src/views/install/index.tpl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 26286a6a8f..633fb870cb 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -54,29 +54,29 @@

    - - + +
    - - + +
    - - + +
    - - + +
    From 213ee2d063af32d908dbcf8b5831643e93e0f50d Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 20:04:38 -0400 Subject: [PATCH 222/295] installer: fixed validation --- public/src/installer/install.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 8d9f8c5c90..2b334fa54e 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -31,10 +31,13 @@ $('document').ready(function() { help = parent.children('.help-text'); function validateUsername(field) { + console.log('derp'); if (!utils.isUserNameValid(field) || !utils.slugify(field)) { + console.log('derp1'); parent.addClass('error'); help.html('Invalid Username.'); } else { + console.log('derp2'); parent.removeClass('error'); } } @@ -72,13 +75,13 @@ $('document').ready(function() { } switch (type) { - case 'username': + case 'admin:username': return validateUsername(field); - case 'password': + case 'admin:password': return validatePassword(field); - case 'confirm': + case 'admin:confirm': return validateConfirmPassword(field); - case 'email': + case 'admin:email': return validateEmail(field); case 'database': return switchDatabase(field); From 89c863caa7df5ccf708aa0a3086bd98273196276 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 20:05:35 -0400 Subject: [PATCH 223/295] embarassing console.log's are allowed at 8pm on monday --- public/src/installer/install.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 2b334fa54e..1fa56e32d6 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -31,13 +31,10 @@ $('document').ready(function() { help = parent.children('.help-text'); function validateUsername(field) { - console.log('derp'); if (!utils.isUserNameValid(field) || !utils.slugify(field)) { - console.log('derp1'); parent.addClass('error'); help.html('Invalid Username.'); } else { - console.log('derp2'); parent.removeClass('error'); } } @@ -70,7 +67,6 @@ $('document').ready(function() { } function switchDatabase(field) { - console.log(field); $('#database-config').html($('[data-database="' + field + '"]').html()); } From e2215b99126bb1d7e5b989309563c600886f3702 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 20:27:40 -0400 Subject: [PATCH 224/295] don't blindly ignore error in install.js --- src/install.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/install.js b/src/install.js index c3fa0cb94f..a19d1ee8f2 100644 --- a/src/install.js +++ b/src/install.js @@ -55,7 +55,8 @@ function checkSetupFlag(next) { var setupVal; try { setupVal = JSON.parse(nconf.get('setup')); - } catch (e) { + } catch (err) { + winston.error('Was unable to parse JSON, continuing with regular setup.', err); setupVal = undefined; } From 3d9519bdec6f6f3c88c14c6693443803f3a9041d Mon Sep 17 00:00:00 2001 From: psychobunny Date: Tue, 21 Apr 2015 20:42:06 -0400 Subject: [PATCH 225/295] installer: actually installing nodebb --- src/install.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/install.js b/src/install.js index a19d1ee8f2..262ec0c749 100644 --- a/src/install.js +++ b/src/install.js @@ -60,6 +60,7 @@ function checkSetupFlag(next) { setupVal = undefined; } + console.log(setupVal); if (setupVal && setupVal instanceof Object) { if (setupVal['admin:username'] && setupVal['admin:password'] && setupVal['admin:password:confirm'] && setupVal['admin:email']) { install.values = setupVal; From b604c9d5e1a8208efe8ac7bf1daf0bd99a0fdab5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Apr 2015 10:27:54 -0400 Subject: [PATCH 226/295] updated install script to accept environment variables updated upgrade script to execute callback when present updated install script to not fire upgrades unless necessary updated install script to write directly to console, and not through winston if a password is not provided, one is auto-generated --- app.js | 30 ++++++++++++++++++---- src/install.js | 68 ++++++++++++++++++++++++++++++++++++-------------- src/upgrade.js | 10 +++++--- 3 files changed, 80 insertions(+), 28 deletions(-) diff --git a/app.js b/app.js index 66f16da88c..70f6e7f0a8 100644 --- a/app.js +++ b/app.js @@ -227,15 +227,35 @@ function setup() { var install = require('./src/install'); - winston.info('Welcome to NodeBB!'); - winston.info('This looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.'); - winston.info('Press enter to accept the default setting (shown in brackets).'); + process.stdout.write('\nWelcome to NodeBB!\n'); + process.stdout.write('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.\n'); + process.stdout.write('Press enter to accept the default setting (shown in brackets).\n'); + + install.setup(function (err, data) { + var separator = ' '; + if (process.stdout.columns > 10) { + for(var x=0,cols=process.stdout.columns-10;x 0) { - winston.info('Administrator found, skipping Admin setup'); + process.stdout.write('Administrator found, skipping Admin setup\n'); next(); } else { createAdmin(next); @@ -279,9 +289,10 @@ function createAdministrator(next) { function createAdmin(callback) { var User = require('./user'), - Groups = require('./groups'); + Groups = require('./groups'), + password; - winston.warn('No administrators have been detected, running initial user setup'); + winston.warn('No administrators have been detected, running initial user setup\n'); var questions = [{ name: 'username', @@ -323,7 +334,9 @@ function createAdmin(callback) { return callback(new Error('invalid-values')); } - Groups.join('administrators', uid, callback); + Groups.join('administrators', uid, function(err) { + callback(err, results); + }); }); }, retryPassword = function (originalResults) { @@ -348,11 +361,17 @@ function createAdmin(callback) { if (!install.values) { prompt.get(questions, success); } else { + // If automated setup did not provide a user password, generate one, it will be shown to the user upon setup completion + if (!install.values.hasOwnProperty('admin:password')) { + process.stdout.write('Password was not provided during automated setup, generating one...\n') + password = utils.generateUUID().slice(0, 8); + } + var results = { - username: install.values['admin:username'], - email: install.values['admin:email'], - password: install.values['admin:password'], - 'password:confirm': install.values['admin:password:confirm'] + username: install.values['admin:username'] || 'admin', + email: install.values['admin:email'] || '', + password: install.values['admin:password'] || password, + 'password:confirm': install.values['admin:password:confirm'] || password }; success(null, results); @@ -368,11 +387,11 @@ function createCategories(next) { } if (Array.isArray(categoryData) && categoryData.length) { - winston.info('Categories OK. Found ' + categoryData.length + ' categories.'); + process.stdout.write('Categories OK. Found ' + categoryData.length + ' categories.\n'); return next(); } - winston.warn('No categories found, populating instance with default categories'); + process.stdout.write('No categories found, populating instance with default categories\n'); fs.readFile(path.join(__dirname, '../', 'install/data/categories.json'), function (err, default_categories) { if (err) { @@ -423,7 +442,7 @@ function createWelcomePost(next) { function enableDefaultPlugins(next) { var Plugins = require('./plugins'); - winston.info('Enabling default plugins'); + process.stdout.write('Enabling default plugins\n'); var defaultEnabled = [ 'nodebb-plugin-markdown', @@ -462,6 +481,8 @@ function setCopyrightWidget(next) { } install.setup = function (callback) { + var upgrade = require('./upgrade'); + async.series([ checkSetupFlag, checkCIFlag, @@ -475,14 +496,23 @@ install.setup = function (callback) { enableDefaultPlugins, setCopyrightWidget, function (next) { - require('./upgrade').upgrade(next); + upgrade.check(function(uptodate) { + if (!uptodate) { upgrade.upgrade(next); } + else { next(); } + }); } - ], function (err) { + ], function (err, results) { if (err) { winston.warn('NodeBB Setup Aborted.\n ' + err.stack); process.exit(); } else { - callback(); + var data = {}; + if (results[6]) { + data.username = results[6].username + data.password = results[6].password; + } + + callback(null, data); } }); }; @@ -500,7 +530,7 @@ install.save = function (server_conf, callback) { return callback(err); } - winston.info('Configuration Saved OK'); + process.stdout.write('Configuration Saved OK\n'); nconf.file({ file: path.join(__dirname, '..', 'config.json') diff --git a/src/upgrade.js b/src/upgrade.js index 3a52020ca5..a11e890a52 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -971,23 +971,25 @@ Upgrade.upgrade = function(callback) { } else { winston.info('[upgrade] Schema already up to date!'); } - - process.exit(); } else { switch(err.message) { case 'upgrade-not-possible': winston.error('[upgrade] NodeBB upgrade could not complete, as your database schema is too far out of date.'); winston.error('[upgrade] Please ensure that you did not skip any minor version upgrades.'); winston.error('[upgrade] (e.g. v0.1.x directly to v0.3.x)'); - process.exit(); break; default: winston.error('[upgrade] Errors were encountered while updating the NodeBB schema: ' + err.message); - process.exit(); break; } } + + if (typeof callback === 'function') { + callback(err); + } else { + process.exit(); + } }); }; From d7444e5edf6eb2d5b4cad5a36847afac35a53535 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Apr 2015 10:30:42 -0400 Subject: [PATCH 227/295] removed from required values for env setup --- src/install.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/install.js b/src/install.js index d2566f0e4f..866fd1d567 100644 --- a/src/install.js +++ b/src/install.js @@ -52,7 +52,7 @@ questions.optional = [ ]; function checkSetupFlag(next) { - var envSetupKeys = ['url', 'database'], + var envSetupKeys = ['database'], setupVal; try { setupVal = JSON.parse(nconf.get('setup')); From 7632997a999ad9d11fda831d8972c566a5cd67e3 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 10:41:44 -0400 Subject: [PATCH 228/295] closes #3045 --- public/src/app.js | 2 ++ public/src/client/account/edit.js | 4 ++-- src/groups.js | 4 ++++ src/messaging.js | 6 ++++++ src/socket.io/user.js | 25 ++++++++++++++++--------- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index 0460e440d7..f054575011 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -66,6 +66,8 @@ app.cacheBuster = null; }, 1000); }); + socket.on('event:logout', app.logout); + socket.on('event:alert', function(data) { app.alert(data); }); diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index e44d9f3f81..42dd151e6f 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -157,8 +157,8 @@ define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], return false; } else { socket.emit('user.deleteAccount', {}, function(err) { - if (!err) { - app.logout(); + if (err) { + app.alertError(err.message); } }); } diff --git a/src/groups.js b/src/groups.js index 90053643d3..a66555104e 100644 --- a/src/groups.js +++ b/src/groups.js @@ -115,6 +115,10 @@ var async = require('async'), return next(err); } + uids = uids.filter(function(uid) { + return uid && parseInt(uid, 10); + }); + if (options.truncateUserList) { var userListCount = parseInt(options.userListCount, 10) || 4; if (uids.length > userListCount) { diff --git a/src/messaging.js b/src/messaging.js index d80cf4a78c..cd3e1f96e2 100644 --- a/src/messaging.js +++ b/src/messaging.js @@ -250,6 +250,12 @@ var db = require('./database'), return callback(err); } + results.users.forEach(function(user, index) { + if (user && !parseInt(user.uid, 10)) { + Messaging.markRead(uid, uids[index]); + } + }); + results.users = results.users.filter(function(user) { return user && parseInt(user.uid, 10); }); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 02a7aee65e..0df36121e8 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -24,20 +24,27 @@ SocketUser.exists = function(socket, data, callback) { }; SocketUser.deleteAccount = function(socket, data, callback) { - if (socket.uid) { - user.isAdministrator(socket.uid, function(err, isAdmin) { - if (err || isAdmin) { - return callback(err || new Error('[[error:cant-delete-admin]]')); - } + if (!socket.uid) { + return; + } + user.isAdministrator(socket.uid, function(err, isAdmin) { + if (err || isAdmin) { + return callback(err || new Error('[[error:cant-delete-admin]]')); + } - socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); - user.deleteAccount(socket.uid, callback); + socket.broadcast.emit('event:user_status_change', {uid: socket.uid, status: 'offline'}); + user.deleteAccount(socket.uid, function(err) { + if (err) { + return callback(err); + } + websockets.in('uid_' + socket.uid).emit('event:logout'); + callback(); }); - } + }); }; SocketUser.emailExists = function(socket, data, callback) { - if(data && data.email) { + if (data && data.email) { user.email.exists(data.email, callback); } }; From 8f5c393b12f61cdfd6e18e9fce2bb58fcb41e261 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Apr 2015 10:58:40 -0400 Subject: [PATCH 229/295] only exposing password at setup end if one is autogenerated --- src/install.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/install.js b/src/install.js index 866fd1d567..e5226cb78e 100644 --- a/src/install.js +++ b/src/install.js @@ -335,7 +335,7 @@ function createAdmin(callback) { } Groups.join('administrators', uid, function(err) { - callback(err, results); + callback(err, password ? results : undefined); }); }); }, @@ -362,7 +362,7 @@ function createAdmin(callback) { prompt.get(questions, success); } else { // If automated setup did not provide a user password, generate one, it will be shown to the user upon setup completion - if (!install.values.hasOwnProperty('admin:password')) { + if (!install.values.hasOwnProperty('admin:password') && !nconf.get('admin:password')) { process.stdout.write('Password was not provided during automated setup, generating one...\n') password = utils.generateUUID().slice(0, 8); } @@ -370,8 +370,8 @@ function createAdmin(callback) { var results = { username: install.values['admin:username'] || 'admin', email: install.values['admin:email'] || '', - password: install.values['admin:password'] || password, - 'password:confirm': install.values['admin:password:confirm'] || password + password: install.values['admin:password'] || nconf.get('admin:password') || password, + 'password:confirm': install.values['admin:password:confirm'] || nconf.get('admin:password') || password }; success(null, results); From a2497b050edd010d2a6fe9dead509fed4de96cec Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 11:10:42 -0400 Subject: [PATCH 230/295] crash fix --- src/socket.io/posts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 314028b14c..14b294da39 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -234,7 +234,7 @@ SocketPosts.sendNotificationToPostOwner = function(pid, fromuid, notification) { async.parallel({ username: async.apply(user.getUserField, fromuid, 'username'), topicTitle: async.apply(topics.getTopicField, postData.tid, 'title'), - postObj: async.apply(postTools.parsePost, postData) + postObj: async.apply(posts.parsePost, postData) }, function(err, results) { if (err) { return; From 859e7593e1bec1280ae4a6647815ad8dd8bc0021 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 11:22:55 -0400 Subject: [PATCH 231/295] basic installer function --- install/web.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/install/web.js b/install/web.js index f87c4d024d..40993d6d90 100644 --- a/install/web.js +++ b/install/web.js @@ -69,7 +69,18 @@ function welcome(req, res) { } function install(req, res) { - console.log(req.body); + req.body.url = "http://127.0.0.1"; + req.body.port = "4567"; + var parameters = JSON.stringify(req.body).replace(/"/g, '\\"'); + + + var sys = require('sys'), + exec = require('child_process').exec, + command = 'node app.js --setup=\'' + parameters + '\''; + + exec(command, function(error, stdout, stderr) { + res.json(error, stdout, stderr); + }); } function compileLess(callback) { From 176bf28d2f6b663fef53884981bef312832bf5ba Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 11:36:19 -0400 Subject: [PATCH 232/295] web installer works, woohoo! --- install/web.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/install/web.js b/install/web.js index 40993d6d90..3eaf0c253f 100644 --- a/install/web.js +++ b/install/web.js @@ -69,18 +69,21 @@ function welcome(req, res) { } function install(req, res) { - req.body.url = "http://127.0.0.1"; - req.body.port = "4567"; - var parameters = JSON.stringify(req.body).replace(/"/g, '\\"'); + var env = {}; + req.body.port = "4567"; - var sys = require('sys'), - exec = require('child_process').exec, - command = 'node app.js --setup=\'' + parameters + '\''; + for (var i in req.body) { + if (req.body.hasOwnProperty(i)) { + env[i.replace(':', '__')] = req.body[i]; + } + } - exec(command, function(error, stdout, stderr) { - res.json(error, stdout, stderr); + require('child_process').fork('app', ['--setup'], { + env: env }); + + res.json({}); } function compileLess(callback) { From 6dfb229c66e6845ad9fa49d241cdffb03ae8e22d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 12:13:14 -0400 Subject: [PATCH 233/295] closes #2842 --- src/controllers/index.js | 2 +- src/middleware/middleware.js | 21 +++++++++++---------- src/routes/authentication.js | 24 ++++++++++++++++-------- src/routes/index.js | 4 +++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 9500fca12c..7a2f225290 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -81,7 +81,7 @@ Controllers.login = function(req, res, next) { data.alternate_logins = loginStrategies.length > 0; data.authentication = loginStrategies; data.showResetLink = emailersPresent; - data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1; + data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1 || parseInt(req.query.local, 10) === 1; data.allowRegistration = parseInt(meta.config.allowRegistration, 10) === 1; data.allowLoginWith = '[[login:' + (meta.config.allowLoginWith || 'username-email') + ']]'; data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:login]]'}]); diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 9e400de9b7..8adc6aabe7 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -10,18 +10,19 @@ var app, winston = require('winston'), validator = require('validator'), nconf = require('nconf'), + ensureLoggedIn = require('connect-ensure-login'), - plugins = require('./../plugins'), - navigation = require('./../navigation'), - meta = require('./../meta'), - translator = require('./../../public/src/modules/translator'), - user = require('./../user'), - groups = require('./../groups'), - db = require('./../database'), - categories = require('./../categories'), - topics = require('./../topics'), + plugins = require('../plugins'), + navigation = require('../navigation'), + meta = require('../meta'), + translator = require('../../public/src/modules/translator'), + user = require('../user'), + groups = require('../groups'), + db = require('../database'), + categories = require('../categories'), + topics = require('../topics'), messaging = require('../messaging'), - ensureLoggedIn = require('connect-ensure-login'), + analytics = require('../analytics'), controllers = { diff --git a/src/routes/authentication.js b/src/routes/authentication.js index a0f420458d..4f9611e56a 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -101,11 +101,23 @@ user.auth.logAttempt(uid, req.ip, next); }, function(next) { - db.getObjectFields('user:' + uid, ['password', 'banned', 'passwordExpiry'], next); + async.parallel({ + userData: function(next) { + db.getObjectFields('user:' + uid, ['password', 'banned', 'passwordExpiry'], next); + }, + isAdmin: function(next) { + user.isAdministrator(uid, next); + } + }, next); }, - function(_userData, next) { - userData = _userData; + function(result, next) { + userData = result.userData; userData.uid = uid; + userData.isAdmin = result.isAdmin; + + if (!result.isAdmin && parseInt(meta.config.allowLocalLogin, 10) === 0) { + return next(new Error('[[error:local-login-disabled]]')); + } if (!userData || !userData.password) { return next(new Error('[[error:invalid-user-data]]')); @@ -136,10 +148,6 @@ }); function login(req, res, next) { - if (parseInt(meta.config.allowLocalLogin, 10) === 0) { - return res.status(404).send(''); - } - // Handle returnTo data if (req.body.hasOwnProperty('returnTo') && !req.session.returnTo) { req.session.returnTo = req.body.returnTo; @@ -147,7 +155,7 @@ if (plugins.hasListeners('action:auth.overrideLogin')) { return Auth.continueLogin(req, res, next); - }; + } var loginWith = meta.config.allowLoginWith || 'username-email'; diff --git a/src/routes/index.js b/src/routes/index.js index e9a2ed5ace..2ebf77d53e 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -118,7 +118,9 @@ module.exports = function(app, middleware) { app.all(relativePath + '/api/?*', middleware.prepareAPI); app.all(relativePath + '/api/admin/?*', middleware.isAdmin); - app.all(relativePath + '/admin/?*', middleware.ensureLoggedIn, middleware.applyCSRF, middleware.isAdmin); + + var ensureLoggedIn = require('connect-ensure-login'); + app.all(relativePath + '/admin/?*', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.isAdmin); adminRoutes(router, middleware, controllers); metaRoutes(router, middleware, controllers); From ee78281f3535ee634e9a03137907ac0e5de2bf37 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 13:22:07 -0400 Subject: [PATCH 234/295] console.log --- src/install.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/install.js b/src/install.js index 972f59c7be..24125121b8 100644 --- a/src/install.js +++ b/src/install.js @@ -61,7 +61,6 @@ function checkSetupFlag(next) { setupVal = undefined; } - console.log(setupVal); if (setupVal && setupVal instanceof Object) { if (setupVal['admin:username'] && setupVal['admin:password'] && setupVal['admin:password:confirm'] && setupVal['admin:email']) { install.values = setupVal; From dd61bdb9c6b5f99611ee01f73c24cbade3687a2c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 13:47:41 -0400 Subject: [PATCH 235/295] closes #3038 --- public/src/client/account/favourites.js | 6 +++-- public/src/client/account/posts.js | 6 +++-- public/src/client/account/topics.js | 6 +++-- public/src/client/account/watched.js | 6 +++-- public/src/client/category.js | 3 +-- public/src/client/recent.js | 2 +- public/src/client/tag.js | 2 +- src/controllers/accounts.js | 36 +++++++++++++++++++++---- src/pagination.js | 2 +- 9 files changed, 51 insertions(+), 18 deletions(-) diff --git a/public/src/client/account/favourites.js b/public/src/client/account/favourites.js index 1e6e77e20b..30a6d29a7e 100644 --- a/public/src/client/account/favourites.js +++ b/public/src/client/account/favourites.js @@ -10,7 +10,9 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol $('.user-favourite-posts img').addClass('img-responsive'); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -24,10 +26,10 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol }, function(data, done) { if (data.posts && data.posts.length) { onPostsLoaded(data.posts, done); - $('.user-favourite-posts').attr('data-nextstart', data.nextStart); } else { done(); } + $('.user-favourite-posts').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/posts.js b/public/src/client/account/posts.js index c4759b9016..9b04cdc67a 100644 --- a/public/src/client/account/posts.js +++ b/public/src/client/account/posts.js @@ -10,7 +10,9 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'], $('.user-favourite-posts img').addClass('img-responsive'); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -24,10 +26,10 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'], }, function(data, done) { if (data.posts && data.posts.length) { onPostsLoaded(data.posts, done); - $('.user-favourite-posts').attr('data-nextstart', data.nextStart); } else { done(); } + $('.user-favourite-posts').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/topics.js b/public/src/client/account/topics.js index c6c93f4262..3242f0395e 100644 --- a/public/src/client/account/topics.js +++ b/public/src/client/account/topics.js @@ -8,7 +8,9 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'], AccountTopics.init = function() { header.init(); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -23,10 +25,10 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'], if (data.topics && data.topics.length) { onTopicsLoaded(data.topics, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/watched.js b/public/src/client/account/watched.js index 08feb89344..b9f7fcc5f7 100644 --- a/public/src/client/account/watched.js +++ b/public/src/client/account/watched.js @@ -7,7 +7,9 @@ define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll'] AccountWatched.init = function() { header.init(); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -21,10 +23,10 @@ define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll'] }, function(data, done) { if (data.topics && data.topics.length) { onTopicsLoaded(data.topics, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/category.js b/public/src/client/category.js index 5e64f4fc56..777d3f808a 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -342,17 +342,16 @@ define('forum/category', [ after: after, author: utils.params().author }, function (data, done) { - if (data.topics && data.topics.length) { Category.onTopicsLoaded(data, function() { done(); callback(); }); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); $(window).trigger('action:categories.loaded'); }); } diff --git a/public/src/client/recent.js b/public/src/client/recent.js index dc4a949c4d..fc55ee9b08 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -93,10 +93,10 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite }, function(data, done) { if (data.topics && data.topics.length) { Recent.onTopicsLoaded('recent', data.topics, false, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); }; diff --git a/public/src/client/tag.js b/public/src/client/tag.js index 7328934e2d..d2e6dd30b7 100644 --- a/public/src/client/tag.js +++ b/public/src/client/tag.js @@ -29,11 +29,11 @@ define('forum/tag', ['forum/recent', 'forum/infinitescroll'], function(recent, i }, function(data, done) { if (data.topics && data.topics.length) { recent.onTopicsLoaded('tag', data.topics, false, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); $('#load-more-btn').hide(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } }; diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 536241dba1..71a208ba06 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -255,22 +255,48 @@ accountsController.getGroups = function(req, res, next) { }; function getFromUserSet(tpl, set, method, type, req, res, next) { - accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) { + async.parallel({ + settings: function(next) { + user.getSettings(req.uid, next); + }, + userData: function(next) { + accountsController.getBaseUser(req.params.userslug, req.uid, next); + } + }, function(err, results) { if (err) { return next(err); } - + var userData = results.userData; if (!userData) { return helpers.notFound(req, res); } - method('uid:' + userData.uid + ':' + set, req.uid, 0, 19, function(err, data) { + var setName = 'uid:' + userData.uid + ':' + set; + + var page = Math.max(1, parseInt(req.query.page, 10) || 1); + var itemsPerPage = (tpl === 'account/topics' || tpl === 'account/watched') ? results.settings.topicsPerPage : results.settings.postsPerPage; + itemsPerPage = parseInt(itemsPerPage, 10); + + async.parallel({ + count: function(next) { + db.sortedSetCard(setName, next); + }, + data: function(next) { + var start = (page - 1) * itemsPerPage; + var stop = start + itemsPerPage; + method(setName, req.uid, start, stop, next); + } + }, function(err, results) { if (err) { return next(err); } - userData[type] = data[type]; - userData.nextStart = data.nextStart; + userData[type] = results.data[type]; + userData.nextStart = results.data.nextStart; + var pageCount = Math.ceil(results.count / itemsPerPage); + + var pagination = require('../pagination'); + userData.pagination = pagination.create(page, pageCount); res.render(tpl, userData); }); diff --git a/src/pagination.js b/src/pagination.js index 58aac68f8f..58813c391b 100644 --- a/src/pagination.js +++ b/src/pagination.js @@ -13,7 +13,7 @@ pagination.create = function(currentPage, pageCount, queryObj) { pages: [] }; } - + pageCount = parseInt(pageCount, 10); var pagesToShow = [1, 2, pageCount - 1, pageCount]; currentPage = parseInt(currentPage, 10) || 1; From 220dec5711b1a1be9ea99fb61cf089d37d2627e3 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 13:54:51 -0400 Subject: [PATCH 236/295] installer: validate before sending form --- public/src/installer/install.js | 15 ++++++ src/views/install/index.tpl | 85 +++++++++++++++++---------------- 2 files changed, 60 insertions(+), 40 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 1fa56e32d6..80d46bf337 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -22,9 +22,24 @@ $('document').ready(function() { activate($(this).attr('name'), $(this)); }); + $('form').submit(validateAll); + activate('database', $('[name="database"]')); } + function validateAll(ev) { + $('form .admin [name]').each(function() { + activate($(this).attr('name'), $(this)); + }); + + if ($('.error').length) { + ev.preventDefault(); + $('html, body').animate({'scrollTop': '0px'}, 400); + + return false; + } + } + function activate(type, el) { var field = el.val(), parent = el.parents('.input-row'), diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 633fb870cb..5bf430e290 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -48,55 +48,60 @@ You are just a few steps away from launching your own NodeBB forum!

    -

    -

    Create an Administrator account

    -
    -

    -
    -
    - - +
    +

    +

    Create an Administrator account

    +
    +

    + +
    +
    + + +
    +
    -
    -
    -
    -
    - - +
    +
    + + +
    +
    -
    -
    -
    -
    - - +
    +
    + + +
    +
    -
    -
    -
    -
    - - +
    +
    + + +
    +
    -
    -

    -

    Configure your database

    -
    -

    +
    +

    +

    Configure your database

    +
    +

    -
    -
    - - +
    +
    + + +
    -
    -
    +
    +
    From d99e028a1e4d34c8b975d35d145869b89f820e68 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 13:57:14 -0400 Subject: [PATCH 237/295] only call sortedSetCard if using pagination --- src/controllers/accounts.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 71a208ba06..8dd8860a45 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -275,11 +275,14 @@ function getFromUserSet(tpl, set, method, type, req, res, next) { var page = Math.max(1, parseInt(req.query.page, 10) || 1); var itemsPerPage = (tpl === 'account/topics' || tpl === 'account/watched') ? results.settings.topicsPerPage : results.settings.postsPerPage; - itemsPerPage = parseInt(itemsPerPage, 10); async.parallel({ - count: function(next) { - db.sortedSetCard(setName, next); + itemCount: function(next) { + if (results.settings.usePagination) { + db.sortedSetCard(setName, next); + } else { + next(null, 0); + } }, data: function(next) { var start = (page - 1) * itemsPerPage; @@ -293,7 +296,7 @@ function getFromUserSet(tpl, set, method, type, req, res, next) { userData[type] = results.data[type]; userData.nextStart = results.data.nextStart; - var pageCount = Math.ceil(results.count / itemsPerPage); + var pageCount = Math.ceil(results.itemCount / itemsPerPage); var pagination = require('../pagination'); userData.pagination = pagination.create(page, pageCount); From f981e6d466f4c008b98a0cef1dacd7a2314acc31 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 13:57:18 -0400 Subject: [PATCH 238/295] fixed confirm password validation --- public/src/installer/install.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 80d46bf337..c21d62a459 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -64,7 +64,7 @@ $('document').ready(function() { } function validateConfirmPassword(field) { - if ($('[name="password"]').val() !== $('[name="confirm"]').val()) { + if ($('[name="admin:password"]').val() !== $('[name="admin:password:confirm"]').val()) { parent.addClass('error'); help.html('Passwords do not match.'); } else { @@ -90,7 +90,7 @@ $('document').ready(function() { return validateUsername(field); case 'admin:password': return validatePassword(field); - case 'admin:confirm': + case 'admin:password:confirm': return validateConfirmPassword(field); case 'admin:email': return validateEmail(field); From c8000d36db881e12c6e525b1e41126ffead3f532 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 13:58:43 -0400 Subject: [PATCH 239/295] hint --- src/install.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/install.js b/src/install.js index 24125121b8..f6e6c0c6f7 100644 --- a/src/install.js +++ b/src/install.js @@ -364,7 +364,7 @@ function createAdmin(callback) { } else { // If automated setup did not provide a user password, generate one, it will be shown to the user upon setup completion if (!install.values.hasOwnProperty('admin:password') && !nconf.get('admin:password')) { - process.stdout.write('Password was not provided during automated setup, generating one...\n') + process.stdout.write('Password was not provided during automated setup, generating one...\n'); password = utils.generateUUID().slice(0, 8); } @@ -509,7 +509,7 @@ install.setup = function (callback) { } else { var data = {}; if (results[6]) { - data.username = results[6].username + data.username = results[6].username; data.password = results[6].password; } From b617c1faa94d91661fb14010380d46aa7a09d784 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:06:59 -0400 Subject: [PATCH 240/295] use from-file to optimize grunt dev with web installer --- install/web.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/install/web.js b/install/web.js index 3eaf0c253f..3a2b3f0373 100644 --- a/install/web.js +++ b/install/web.js @@ -8,6 +8,7 @@ var winston = require('winston'), less = require('less'), async = require('async'), uglify = require('uglify-js'), + nconf = require('nconf'), app = express(); var web = {}, @@ -23,7 +24,7 @@ var web = {}, web.install = function(port) { port = port || 8080; - winston.info('Launching web installer on port ', port); + winston.info('Launching web installer on port', port); app.use(express.static('public', {})); app.engine('tpl', require('templates.js').__express); @@ -87,6 +88,11 @@ function install(req, res) { } function compileLess(callback) { + if ((nconf.get('from-file') || '').indexOf('less') !== -1) { + winston.info('LESS compilation skipped'); + return callback(false); + } + fs.readFile(path.join(__dirname, '../public/less/install.less'), function(err, style) { less.render(style.toString(), function(err, css) { if(err) { @@ -99,6 +105,11 @@ function compileLess(callback) { } function compileJS(callback) { + if ((nconf.get('from-file') || '').indexOf('js') !== -1) { + winston.info('Client-side JS compilation skipped'); + return callback(false); + } + var scriptPath = path.join(__dirname, '..'), result = uglify.minify(scripts.map(function(script) { return path.join(scriptPath, script); From 653394120732a99a8a20bd3ee785dcd8dcbb00cf Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:07:24 -0400 Subject: [PATCH 241/295] remove hardcoded port variable --- install/web.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/install/web.js b/install/web.js index 3a2b3f0373..c61ae743a0 100644 --- a/install/web.js +++ b/install/web.js @@ -71,9 +71,7 @@ function welcome(req, res) { function install(req, res) { var env = {}; - - req.body.port = "4567"; - + for (var i in req.body) { if (req.body.hasOwnProperty(i)) { env[i.replace(':', '__')] = req.body[i]; From e9a92bd1bf32932cd47611d6efd9df6e18744427 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:08:15 -0400 Subject: [PATCH 242/295] removed some compile scripts that we don't need --- install/web.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/install/web.js b/install/web.js index c61ae743a0..d1bfa2a1c5 100644 --- a/install/web.js +++ b/install/web.js @@ -13,9 +13,6 @@ var winston = require('winston'), var web = {}, scripts = [ - 'public/vendor/jquery/js/jquery.js', - 'public/vendor/bootstrap/js/bootstrap.min.js', - 'public/vendor/bootbox/bootbox.min.js', 'public/vendor/xregexp/xregexp.js', 'public/vendor/xregexp/unicode/unicode-base.js', 'public/src/utils.js', @@ -71,7 +68,7 @@ function welcome(req, res) { function install(req, res) { var env = {}; - + for (var i in req.body) { if (req.body.hasOwnProperty(i)) { env[i.replace(':', '__')] = req.body[i]; From 8556ddd9a08a45add1b65caa4b568a2e97db27e7 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:39:37 -0400 Subject: [PATCH 243/295] installation spinner; started launch page --- install/web.js | 16 +++++++++++++--- public/src/installer/install.js | 2 ++ src/views/install/index.tpl | 8 ++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/install/web.js b/install/web.js index d1bfa2a1c5..4ccce7efdb 100644 --- a/install/web.js +++ b/install/web.js @@ -62,7 +62,9 @@ function welcome(req, res) { }); res.render('install/index', { - databases: databases + databases: databases, + error: res.locals.error ? true : false, + success: res.locals.success ? true : false }); } @@ -75,11 +77,19 @@ function install(req, res) { } } - require('child_process').fork('app', ['--setup'], { + var child = require('child_process').fork('app', ['--setup'], { env: env }); - res.json({}); + child.on('close', function(data) { + if (data === 0) { + res.locals.success = true; + } else { + res.locals.error = true; + } + + welcome(req, res); + }); } function compileLess(callback) { diff --git a/public/src/installer/install.js b/public/src/installer/install.js index c21d62a459..7739f228ed 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -37,6 +37,8 @@ $('document').ready(function() { $('html, body').animate({'scrollTop': '0px'}, 400); return false; + } else { + $('#submit .fa-spin').removeClass('hide'); } } diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 5bf430e290..3fbff54144 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -42,18 +42,18 @@
    -
    +

    Welcome to the NodeBB Installer

    You are just a few steps away from launching your own NodeBB forum!

    -
    +

    Create an Administrator account


    - +
    @@ -103,7 +103,7 @@
    - +
    From 45e216edef6190f3d1f4a54648bff3e7891a81e2 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:49:31 -0400 Subject: [PATCH 244/295] installer: database error messages --- install/web.js | 10 ++++++++-- public/src/installer/install.js | 7 +++++++ src/views/install/index.tpl | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/install/web.js b/install/web.js index 4ccce7efdb..8beadbf673 100644 --- a/install/web.js +++ b/install/web.js @@ -9,7 +9,8 @@ var winston = require('winston'), async = require('async'), uglify = require('uglify-js'), nconf = require('nconf'), - app = express(); + app = express(), + server; var web = {}, scripts = [ @@ -39,7 +40,7 @@ web.install = function(port) { function launchExpress(port) { - var server = app.listen(port, function() { + server = app.listen(port, function() { var host = server.address().address; winston.info('Web installer listening on http://%s:%s', host, port); }); @@ -48,6 +49,7 @@ function launchExpress(port) { function setupRoutes() { app.get('/', welcome); app.post('/', install); + app.post('/launch', launch); } function welcome(req, res) { @@ -92,6 +94,10 @@ function install(req, res) { }); } +function launch(req, res) { + +} + function compileLess(callback) { if ((nconf.get('from-file') || '').indexOf('less') !== -1) { winston.info('LESS compilation skipped'); diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 7739f228ed..876d6bb4d3 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -25,6 +25,13 @@ $('document').ready(function() { $('form').submit(validateAll); activate('database', $('[name="database"]')); + + if ($('#database-error').length) { + $('[name="database"]').parents('.input-row').addClass('error'); + $('html, body').animate({ + scrollTop: ($('#database-error').offset().top + 100) + 'px' + }, 400); + } } function validateAll(ev) { diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 3fbff54144..4866745126 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -84,6 +84,10 @@
    + + + +

    Configure your database

    @@ -98,6 +102,7 @@
    +
    There was an error connecting to your database. Please try again.
    @@ -107,6 +112,15 @@
    + +
    +

    +

    Congratulations! Your NodeBB has been set-up.

    + + +

    +
    +
    From d72d1a1641d9b128527184e91a8b19126d3ea6dd Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:54:35 -0400 Subject: [PATCH 245/295] save values from form --- install/web.js | 7 +++++-- src/views/install/index.tpl | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/install/web.js b/install/web.js index 8beadbf673..af5b168692 100644 --- a/install/web.js +++ b/install/web.js @@ -63,10 +63,13 @@ function welcome(req, res) { }); }); + console.log(req.body); + res.render('install/index', { databases: databases, error: res.locals.error ? true : false, - success: res.locals.success ? true : false + success: res.locals.success ? true : false, + values: req.body }); } @@ -95,7 +98,7 @@ function install(req, res) { } function launch(req, res) { - + } function compileLess(callback) { diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 4866745126..beb32f9419 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -57,28 +57,28 @@
    - +
    - +
    - +
    - +
    From 5db316613642507fb59ac1aa18b789fb891ee0ae Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 14:54:55 -0400 Subject: [PATCH 246/295] log --- install/web.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/install/web.js b/install/web.js index af5b168692..745e1d2063 100644 --- a/install/web.js +++ b/install/web.js @@ -63,8 +63,6 @@ function welcome(req, res) { }); }); - console.log(req.body); - res.render('install/index', { databases: databases, error: res.locals.error ? true : false, From 7488fa0416ec7c5de8d68f71fd8412923de278a4 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 15:13:59 -0400 Subject: [PATCH 247/295] cleanup; fixes --- public/src/installer/install.js | 26 ++++++++++++++++---------- src/views/install/index.tpl | 9 +++++---- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 876d6bb4d3..4fc8677266 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -5,6 +5,17 @@ $('document').ready(function() { setupInputs(); $('[name="username"]').focus(); + activate('database', $('[name="database"]')); + + if ($('#database-error').length) { + $('[name="database"]').parents('.input-row').addClass('error'); + $('html, body').animate({ + scrollTop: ($('#database-error').offset().top + 100) + 'px' + }, 400); + } + + $('#launch').on('click', launchForum); + function setupInputs() { @@ -23,15 +34,6 @@ $('document').ready(function() { }); $('form').submit(validateAll); - - activate('database', $('[name="database"]')); - - if ($('#database-error').length) { - $('[name="database"]').parents('.input-row').addClass('error'); - $('html, body').animate({ - scrollTop: ($('#database-error').offset().top + 100) + 'px' - }, 400); - } } function validateAll(ev) { @@ -39,7 +41,7 @@ $('document').ready(function() { activate($(this).attr('name'), $(this)); }); - if ($('.error').length) { + if ($('form .admin .error').length) { ev.preventDefault(); $('html, body').animate({'scrollTop': '0px'}, 400); @@ -107,4 +109,8 @@ $('document').ready(function() { return switchDatabase(field); } } + + function launchForum() { + $('#launch .fa-spin').removeClass('hide'); + } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index beb32f9419..98781e3821 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -8,6 +8,7 @@ + @@ -57,28 +58,28 @@
    - +
    - +
    - +
    - +
    From 9b53cdfcc06084936be41b983ec9a4b30f3abde3 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 15:17:08 -0400 Subject: [PATCH 248/295] skip to the launch screen if config is set but installer is still active --- install/web.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/install/web.js b/install/web.js index 745e1d2063..9739701de4 100644 --- a/install/web.js +++ b/install/web.js @@ -63,11 +63,17 @@ function welcome(req, res) { }); }); - res.render('install/index', { - databases: databases, - error: res.locals.error ? true : false, - success: res.locals.success ? true : false, - values: req.body + fs.readFile(path.join(__dirname, '../config.json'), function(err, file) { + if (file) { + res.locals.success = true; + } + + res.render('install/index', { + databases: databases, + error: res.locals.error ? true : false, + success: res.locals.success ? true : false, + values: req.body + }); }); } From ddd5c494618ce8e95f07690129f7f504a0e2861a Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 15:29:29 -0400 Subject: [PATCH 249/295] installer ux fixes --- install/web.js | 18 ++++++------------ public/src/installer/install.js | 4 ++++ src/views/install/index.tpl | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/install/web.js b/install/web.js index 9739701de4..f406d3ba35 100644 --- a/install/web.js +++ b/install/web.js @@ -63,17 +63,11 @@ function welcome(req, res) { }); }); - fs.readFile(path.join(__dirname, '../config.json'), function(err, file) { - if (file) { - res.locals.success = true; - } - - res.render('install/index', { - databases: databases, - error: res.locals.error ? true : false, - success: res.locals.success ? true : false, - values: req.body - }); + res.render('install/index', { + databases: databases, + error: res.locals.error ? true : false, + success: res.locals.success ? true : false, + values: req.body }); } @@ -102,7 +96,7 @@ function install(req, res) { } function launch(req, res) { - + res.json({}); } function compileLess(callback) { diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 4fc8677266..26c757ea1f 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -112,5 +112,9 @@ $('document').ready(function() { function launchForum() { $('#launch .fa-spin').removeClass('hide'); + + $.post('/launch', function() { + console.log('launched'); + }); } }); \ No newline at end of file diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 98781e3821..6935a9f3d9 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -103,7 +103,7 @@
    -
    There was an error connecting to your database. Please try again.
    +
    There was an error connecting to your database. Please try again.
    From e8ea1e12a12f930c990905150f00662fbb6e9f1b Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 15:51:14 -0400 Subject: [PATCH 250/295] launch nodebb after install --- install/web.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install/web.js b/install/web.js index f406d3ba35..af9db0a9da 100644 --- a/install/web.js +++ b/install/web.js @@ -97,6 +97,8 @@ function install(req, res) { function launch(req, res) { res.json({}); + + server.close(); } function compileLess(callback) { From 255e3bdd20232377d487e0b13f95395915fefb6c Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 15:52:12 -0400 Subject: [PATCH 251/295] default is 4567 instead of 8080 --- install/web.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/web.js b/install/web.js index af9db0a9da..f86feddaad 100644 --- a/install/web.js +++ b/install/web.js @@ -21,7 +21,7 @@ var web = {}, ]; web.install = function(port) { - port = port || 8080; + port = port || 4567; winston.info('Launching web installer on port', port); app.use(express.static('public', {})); @@ -99,6 +99,7 @@ function launch(req, res) { res.json({}); server.close(); + require('child_process').fork('app', [], {}); } function compileLess(callback) { From 24a11314dcbfec8f9bb38f762e07c33860f61cc2 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 17:51:35 -0400 Subject: [PATCH 252/295] installer - finally got it all working ;) --- install/web.js | 13 +++++++++++-- public/src/installer/install.js | 6 +++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/install/web.js b/install/web.js index f86feddaad..cbfd87c8ac 100644 --- a/install/web.js +++ b/install/web.js @@ -96,10 +96,19 @@ function install(req, res) { } function launch(req, res) { + var pidFilePath = __dirname + '../pidfile'; res.json({}); - server.close(); - require('child_process').fork('app', [], {}); + + var child = require('child_process').spawn('node', ['app.js'], { + detached: true, + stdio: ['ignore', 'ignore', 'ignore'] + }); + + fs.writeFile(__dirname + '../pidfile', child.pid, function() { + child.unref(); + process.exit(0); + }); } function compileLess(callback) { diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 26c757ea1f..15b3514f03 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -114,7 +114,11 @@ $('document').ready(function() { $('#launch .fa-spin').removeClass('hide'); $.post('/launch', function() { - console.log('launched'); + setInterval(function() { + $.get('/admin', function(data) { + window.location = 'admin'; + }); + }, 750); }); } }); \ No newline at end of file From fac747cab7f9ef96eef4e6e6d3ed526e26ba9ce7 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Wed, 22 Apr 2015 17:59:08 -0400 Subject: [PATCH 253/295] call loader.js instead --- install/web.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/install/web.js b/install/web.js index cbfd87c8ac..35343d91af 100644 --- a/install/web.js +++ b/install/web.js @@ -100,15 +100,15 @@ function launch(req, res) { res.json({}); server.close(); - var child = require('child_process').spawn('node', ['app.js'], { + var child = require('child_process').spawn('node', ['loader.js'], { detached: true, stdio: ['ignore', 'ignore', 'ignore'] }); - fs.writeFile(__dirname + '../pidfile', child.pid, function() { - child.unref(); - process.exit(0); - }); + + child.unref(); + process.exit(0); + } function compileLess(callback) { From c004efee3f7832fa902ca7d5ac87c267f577eb01 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 23 Apr 2015 11:15:37 -0400 Subject: [PATCH 254/295] closed #3084 --- src/posts/edit.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/posts/edit.js b/src/posts/edit.js index e96714af96..efec4c7918 100644 --- a/src/posts/edit.js +++ b/src/posts/edit.js @@ -116,7 +116,8 @@ module.exports = function(Posts) { data.tags = data.tags || []; async.waterfall([ - function(next) { + async.apply(plugins.fireHook,'filter:topic.edit', topicData), + function(topicData, next) { db.setObject('topic:' + tid, topicData, next); }, function(next) { From a54dccdf3b1668844e58b1dd99efe5286443330a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 23 Apr 2015 11:27:34 -0400 Subject: [PATCH 255/295] closed #3068 --- src/categories/update.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/categories/update.js b/src/categories/update.js index f68a7aed20..6fcf7d4b57 100644 --- a/src/categories/update.js +++ b/src/categories/update.js @@ -3,8 +3,8 @@ var async = require('async'), db = require('../database'), - utils = require('../../public/src/utils'); - + utils = require('../../public/src/utils'), + plugins = require('../plugins'); module.exports = function(Categories) { @@ -16,12 +16,12 @@ module.exports = function(Categories) { return next(err); } - var category = modified[cid]; - var fields = Object.keys(category); - - async.each(fields, function(key, next) { - updateCategoryField(cid, key, category[key], next); - }, next); + plugins.fireHook('filter:category.update', modified[cid], function(err, category) { + var fields = Object.keys(category); + async.each(fields, function(key, next) { + updateCategoryField(cid, key, category[key], next); + }, next); + }); }); } From 5d5346c4f994b10efa97cf30a5eb695614e075c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Apr 2015 13:43:27 -0400 Subject: [PATCH 256/295] allow overriding template name --- src/middleware/middleware.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 8adc6aabe7..b2a7653fd0 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -309,9 +309,9 @@ middleware.processRender = function(req, res, next) { } options.loggedIn = req.user ? parseInt(req.user.uid, 10) !== 0 : false; - options.template = {name: template}; - options.template[template] = true; - res.locals.template = template; + options.template = options.template || {name: template}; + options.template[options.template.name] = true; + res.locals.template = options.template.name; if ('function' !== typeof fn) { fn = defaultFn; From f44e850fa0eb3653f1ec02c40098ef075a1be3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Apr 2015 13:50:48 -0400 Subject: [PATCH 257/295] revert last change, breaks ajaxify --- src/middleware/middleware.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index b2a7653fd0..8adc6aabe7 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -309,9 +309,9 @@ middleware.processRender = function(req, res, next) { } options.loggedIn = req.user ? parseInt(req.user.uid, 10) !== 0 : false; - options.template = options.template || {name: template}; - options.template[options.template.name] = true; - res.locals.template = options.template.name; + options.template = {name: template}; + options.template[template] = true; + res.locals.template = template; if ('function' !== typeof fn) { fn = defaultFn; From 21b634e03fb70c989c394945f0291df722e15740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Apr 2015 14:37:27 -0400 Subject: [PATCH 258/295] closes #3081 --- public/src/modules/navigator.js | 3 ++- src/controllers/topics.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index e8d57352cb..443f404cea 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -161,7 +161,8 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com var elTop = el.offset().top; var elBottom = elTop + Math.floor(el.height()); - return (elTop >= scrollTop && elBottom <= scrollBottom) || (elTop <= scrollTop && elBottom >= scrollTop); + + return (elTop >= scrollTop && elBottom < scrollBottom) || (elTop < scrollTop && elBottom > scrollTop); } navigator.scrollToPost = function(postIndex, highlight, duration, offset) { diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 4e2ade5868..9db26b8f4f 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -89,9 +89,9 @@ topicsController.get = function(req, res, next) { } if (!settings.usePagination) { if (reverse) { - postIndex = Math.max(0, postCount - (req.params.post_index || postCount) - (settings.postsPerPage - 1)); + postIndex = Math.max(0, postCount - (req.params.post_index || postCount) - (settings.postsPerPage / 2)); } else { - postIndex = Math.max(0, (req.params.post_index || 1) - (settings.postsPerPage + 1)); + postIndex = Math.max(0, (req.params.post_index || 1) - (settings.postsPerPage / 2)); } } else if (!req.query.page) { var index = 0; From 8544531a79a1a61ea8fcf922395d86f3ae0afc7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Apr 2015 15:05:27 -0400 Subject: [PATCH 259/295] removed event --- 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 2fe5caab95..7e3dc9f07f 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -36,13 +36,11 @@ define('forum/groups/list', function() { $('#search-sort').on('change', Groups.search); }; - Groups.search = function(event) { + Groups.search = function() { var groupsEl = $('#groups-list'), queryEl = $('#search-text'), sortEl = $('#search-sort'); - event.preventDefault(); - socket.emit('groups.search', { query: queryEl.val(), options: { From e88d88e56c68fca95053a9e74529a1a9b3e920c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Apr 2015 15:43:50 -0400 Subject: [PATCH 260/295] added return false --- public/src/client/groups/list.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index 7e3dc9f07f..42bdbf88ae 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -55,6 +55,7 @@ define('forum/groups/list', function() { groupsEl.empty().append(html); }); }); + return false; }; return Groups; From a5c52958e76078cad215ccb2812712188629156c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Apr 2015 16:06:27 -0400 Subject: [PATCH 261/295] made handleSearch public --- public/src/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index f054575011..d13a6004ab 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -394,7 +394,7 @@ app.cacheBuster = null; }); } - function handleSearch() { + app.handleSearch = function () { var searchButton = $("#search-button"), searchFields = $("#search-fields"), searchInput = $('#search-fields input'); @@ -516,7 +516,7 @@ app.cacheBuster = null; handleStatusChange(); if (config.searchEnabled) { - handleSearch(); + app.handleSearch(); } handleNewTopic(); From d6949815add0facfad971e0764bdc144c6c63390 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 23 Apr 2015 17:03:31 -0400 Subject: [PATCH 262/295] #3085 --- src/install.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/install.js b/src/install.js index f6e6c0c6f7..4a48d7197c 100644 --- a/src/install.js +++ b/src/install.js @@ -55,7 +55,9 @@ function checkSetupFlag(next) { var envSetupKeys = ['database'], setupVal; try { - setupVal = JSON.parse(nconf.get('setup')); + if (nconf.get('setup')) { + setupVal = JSON.parse(nconf.get('setup')); + } } catch (err) { winston.error('Was unable to parse JSON, continuing with regular setup.', err); setupVal = undefined; @@ -472,17 +474,17 @@ function setCopyrightWidget(next) { if (err) { return next(err); } - + if (!results.footer && results.footerJSON) { - db.setObjectField('widgets:global', 'footer', results.footerJSON.toString(), next); + db.setObjectField('widgets:global', 'footer', results.footerJSON.toString(), next); } else { next(); } - }); + }); } install.setup = function (callback) { - var upgrade = require('./upgrade'); + async.series([ checkSetupFlag, @@ -497,6 +499,7 @@ install.setup = function (callback) { enableDefaultPlugins, setCopyrightWidget, function (next) { + var upgrade = require('./upgrade'); upgrade.check(function(uptodate) { if (!uptodate) { upgrade.upgrade(next); } else { next(); } From e5928f330e7dc0d2bda2057c32f5c45d9dd8f48b Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 23 Apr 2015 17:18:11 -0400 Subject: [PATCH 263/295] closes #3085 --- src/install.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/install.js b/src/install.js index 4a48d7197c..250aa4c799 100644 --- a/src/install.js +++ b/src/install.js @@ -59,7 +59,6 @@ function checkSetupFlag(next) { setupVal = JSON.parse(nconf.get('setup')); } } catch (err) { - winston.error('Was unable to parse JSON, continuing with regular setup.', err); setupVal = undefined; } From 03b0d282f1d6b0364a736c1f0a8be929569298f3 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Thu, 23 Apr 2015 17:58:28 -0400 Subject: [PATCH 264/295] search fix prevent crash if search term is invalid regex --- public/src/app.js | 14 ++++---------- public/src/client/search.js | 18 +++++++++++------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/public/src/app.js b/public/src/app.js index d13a6004ab..c2c1f179f0 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -187,21 +187,15 @@ app.cacheBuster = null; }; function highlightNavigationLink() { - var path = window.location.pathname, - parts = path.split('/'), - active = parts[parts.length - 1]; - + var path = window.location.pathname; $('#main-nav li').removeClass('active'); - if (active) { + if (path) { $('#main-nav li a').each(function () { var href = $(this).attr('href'); - if (active === "sort-posts" || active === "sort-reputation" || active === "search" || active === "latest" || active === "online") { - active = 'users'; - } - if (href && href.match(active)) { + if (href && path.startsWith(href)) { $(this.parentNode).addClass('active'); - return false; + return false; } }); } diff --git a/public/src/client/search.js b/public/src/client/search.js index e46a709e74..027f76ca18 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -117,14 +117,18 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco return; } - var regexStr = searchQuery.trim().split(' ').join('|'); - var regex = new RegExp('(' + regexStr + ')', 'gi'); + try { + var regexStr = searchQuery.trim().split(' ').join('|'); + var regex = new RegExp('(' + regexStr + ')', 'gi'); - $('.search-result-text').each(function() { - var result = $(this); - var text = result.html().replace(regex, '$1'); - result.html(text).find('img').addClass('img-responsive'); - }); + $('.search-result-text').each(function() { + var result = $(this); + var text = result.html().replace(regex, '$1'); + result.html(text).find('img').addClass('img-responsive'); + }); + } catch(e) { + return; + } } function handleSavePreferences() { From 47a23772298370f920075e020d63d0f5fff671f9 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 24 Apr 2015 10:39:24 -0400 Subject: [PATCH 265/295] closes #3089 --- src/controllers/categories.js | 2 +- src/controllers/topics.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index e86bbce574..8c45cdc86e 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -159,7 +159,7 @@ categoriesController.list = function(req, res, next) { categoriesController.get = function(req, res, next) { var cid = req.params.category_id, - page = req.query.page || 1, + page = parseInt(req.query.page, 10) || 1, userPrivileges; if (req.params.topic_index && !utils.isNumber(req.params.topic_index)) { diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 9db26b8f4f..1548e29861 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -18,7 +18,6 @@ var topicsController = {}, topicsController.get = function(req, res, next) { var tid = req.params.topic_id, - page = 1, sort = req.query.sort, userPrivileges; @@ -82,7 +81,7 @@ topicsController.get = function(req, res, next) { } var postIndex = 0; - page = parseInt(req.query.page, 10) || 1; + var 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; From dc16a665aec3be17b7b6b01501782ba0a00b0005 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 24 Apr 2015 10:59:00 -0400 Subject: [PATCH 266/295] page checks #3089 --- src/controllers/categories.js | 9 +++++++-- src/controllers/topics.js | 5 +++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 8c45cdc86e..80bf87907a 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -184,6 +184,8 @@ categoriesController.get = function(req, res, next) { }, next); }, function(results, next) { + userPrivileges = results.privileges; + if (!results.exists || (results.categoryData && parseInt(results.categoryData.disabled, 10) === 1)) { return helpers.notFound(req, res); } @@ -196,15 +198,18 @@ categoriesController.get = function(req, res, next) { return helpers.redirect(res, '/category/' + encodeURI(results.categoryData.slug)); } + var settings = results.userSettings; var topicIndex = utils.isNumber(req.params.topic_index) ? parseInt(req.params.topic_index, 10) - 1 : 0; var topicCount = parseInt(results.categoryData.topic_count, 10); + var pageCount = Math.max(1, Math.ceil(topicCount / settings.topicsPerPage)); if (topicIndex < 0 || topicIndex > Math.max(topicCount - 1, 0)) { return helpers.redirect(res, '/category/' + cid + '/' + req.params.slug + (topicIndex > topicCount ? '/' + topicCount : '')); } - userPrivileges = results.privileges; - var settings = results.userSettings; + if (settings.usePagination && (page < 1 || page > pageCount)) { + return helpers.notFound(req, res); + } if (!settings.usePagination) { topicIndex = Math.max(topicIndex - (settings.topicsPerPage - 1), 0); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 1548e29861..3f96682c31 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -53,12 +53,13 @@ topicsController.get = function(req, res, next) { var settings = results.settings; var postCount = parseInt(results.topic.postcount, 10); var pageCount = Math.max(1, Math.ceil((postCount - 1) / settings.postsPerPage)); + var page = parseInt(req.query.page, 10) || 1; if (utils.isNumber(req.params.post_index) && (req.params.post_index < 1 || req.params.post_index > postCount)) { return helpers.redirect(res, '/topic/' + req.params.topic_id + '/' + req.params.slug + (req.params.post_index > postCount ? '/' + postCount : '')); } - if (settings.usePagination && (req.query.page < 1 || req.query.page > pageCount)) { + if (settings.usePagination && (page < 1 || page > pageCount)) { return helpers.notFound(req, res); } @@ -81,7 +82,7 @@ topicsController.get = function(req, res, next) { } var postIndex = 0; - var 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; From 67eef3653be595225306a7255d338f6bba11d001 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 24 Apr 2015 14:40:10 -0400 Subject: [PATCH 267/295] updated the web install form to populate the database fields if a value is passed in --- src/views/install/index.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 6935a9f3d9..06bf4cbd52 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -129,7 +129,7 @@
    - +
    From 5487da9030cd8d4ae50d59087b5f1237c4abcf8e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 24 Apr 2015 14:50:31 -0400 Subject: [PATCH 268/295] updated web installer to auto-select the database if passed in via env var --- install/web.js | 4 ++++ src/views/install/index.tpl | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/install/web.js b/install/web.js index 35343d91af..af56943b52 100644 --- a/install/web.js +++ b/install/web.js @@ -65,6 +65,10 @@ function welcome(req, res) { res.render('install/index', { databases: databases, + dbBool: { + redis: nconf.get('database') === 'redis', + mongo: nconf.get('database') === 'mongo' + }, error: res.locals.error ? true : false, success: res.locals.success ? true : false, values: req.body diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 06bf4cbd52..d3f6df8b3c 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -99,8 +99,8 @@
    There was an error connecting to your database. Please try again.
    From 275a9ef476a07829e294c80c714dd7821af8f4fb Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 24 Apr 2015 15:11:22 -0400 Subject: [PATCH 269/295] Reverted the last update to web installer, and updated it so environment variables always take precedence over form input, and form is hidden if database value is passed in --- install/web.js | 13 ++++--------- src/views/install/index.tpl | 6 ++++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/install/web.js b/install/web.js index af56943b52..0587238244 100644 --- a/install/web.js +++ b/install/web.js @@ -65,10 +65,7 @@ function welcome(req, res) { res.render('install/index', { databases: databases, - dbBool: { - redis: nconf.get('database') === 'redis', - mongo: nconf.get('database') === 'mongo' - }, + skipDatabaseSetup: !!nconf.get('database'), error: res.locals.error ? true : false, success: res.locals.success ? true : false, values: req.body @@ -76,16 +73,14 @@ function welcome(req, res) { } function install(req, res) { - var env = {}; - for (var i in req.body) { - if (req.body.hasOwnProperty(i)) { - env[i.replace(':', '__')] = req.body[i]; + if (req.body.hasOwnProperty(i) && !process.env.hasOwnProperty(i)) { + process.env[i.replace(':', '__')] = req.body[i]; } } var child = require('child_process').fork('app', ['--setup'], { - env: env + env: process.env }); child.on('close', function(data) { diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index d3f6df8b3c..296c1d4d44 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -89,6 +89,7 @@ +

    Configure your database

    @@ -99,8 +100,8 @@
    There was an error connecting to your database. Please try again.
    @@ -108,6 +109,7 @@
    + From 17dfb4df9445042244070a108f716ac2d16a906f Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 24 Apr 2015 22:51:47 -0400 Subject: [PATCH 270/295] posts_list.tpl changes --- public/src/client/account/favourites.js | 37 ++----------------------- public/src/client/account/posts.js | 23 +++++++++------ public/src/client/account/profile.js | 22 +++++++-------- 3 files changed, 29 insertions(+), 53 deletions(-) diff --git a/public/src/client/account/favourites.js b/public/src/client/account/favourites.js index 30a6d29a7e..fd5931cc49 100644 --- a/public/src/client/account/favourites.js +++ b/public/src/client/account/favourites.js @@ -2,47 +2,16 @@ /* globals define, app, utils */ -define('forum/account/favourites', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) { +define('forum/account/favourites', ['forum/account/header', 'forum/account/posts'], function(header, posts) { var Favourites = {}; Favourites.init = function() { header.init(); - $('.user-favourite-posts img').addClass('img-responsive'); + $('[component="post/content"] img').addClass('img-responsive'); - if (!config.usePagination) { - infinitescroll.init(loadMore); - } + posts.handleInfiniteScroll('posts.loadMoreFavourites', 'account/favourites'); }; - function loadMore(direction) { - if (direction < 0) { - return; - } - - infinitescroll.loadMore('posts.loadMoreFavourites', { - uid: ajaxify.variables.get('theirid'), - after: $('.user-favourite-posts').attr('data-nextstart') - }, function(data, done) { - if (data.posts && data.posts.length) { - onPostsLoaded(data.posts, done); - } else { - done(); - } - $('.user-favourite-posts').attr('data-nextstart', data.nextStart); - }); - } - - function onPostsLoaded(posts, callback) { - infinitescroll.parseAndTranslate('account/favourites', 'posts', {posts: posts}, function(html) { - $('.user-favourite-posts').append(html); - html.find('img').addClass('img-responsive'); - html.find('.timeago').timeago(); - app.createUserTooltips(); - utils.makeNumbersHumanReadable(html.find('.human-readable-number')); - callback(); - }); - } - return Favourites; }); diff --git a/public/src/client/account/posts.js b/public/src/client/account/posts.js index 9b04cdc67a..e6ce44c9d4 100644 --- a/public/src/client/account/posts.js +++ b/public/src/client/account/posts.js @@ -1,15 +1,22 @@ 'use strict'; -/* globals define, app, socket, utils */ +/* globals define, app, socket, utils, config, ajaxify */ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) { var AccountPosts = {}; + var method, template; AccountPosts.init = function() { header.init(); - $('.user-favourite-posts img').addClass('img-responsive'); + $('[component="post/content"] img').addClass('img-responsive'); + AccountPosts.handleInfiniteScroll('posts.loadMoreUserPosts', 'account/posts'); + }; + + AccountPosts.handleInfiniteScroll = function(_method, _template) { + method = _method; + template = _template; if (!config.usePagination) { infinitescroll.init(loadMore); } @@ -20,22 +27,22 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'], return; } - infinitescroll.loadMore('posts.loadMoreUserPosts', { - uid: $('.account-username-box').attr('data-uid'), - after: $('.user-favourite-posts').attr('data-nextstart') + infinitescroll.loadMore(method, { + uid: ajaxify.variables.get('theirid'), + after: $('[component="posts"]').attr('data-nextstart') }, function(data, done) { if (data.posts && data.posts.length) { onPostsLoaded(data.posts, done); } else { done(); } - $('.user-favourite-posts').attr('data-nextstart', data.nextStart); + $('[component="posts"]').attr('data-nextstart', data.nextStart); }); } function onPostsLoaded(posts, callback) { - infinitescroll.parseAndTranslate('account/posts', 'posts', {posts: posts}, function(html) { - $('.user-favourite-posts').append(html); + infinitescroll.parseAndTranslate(template, 'posts', {posts: posts}, function(html) { + $('[component="posts"]').append(html); html.find('img').addClass('img-responsive'); html.find('.timeago').timeago(); app.createUserTooltips(); diff --git a/public/src/client/account/profile.js b/public/src/client/account/profile.js index 263b1ae873..3c92559250 100644 --- a/public/src/client/account/profile.js +++ b/public/src/client/account/profile.js @@ -40,10 +40,10 @@ define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll', }; function processPage() { - $('.user-recent-posts img, .post-signature img').addClass('img-responsive'); + $('[component="posts"] img').addClass('img-responsive'); - $('.user-recent-posts blockquote').prev('p').remove(); - $('.user-recent-posts blockquote').remove(); + $('[component="post/content"] blockquote').prev('p').remove(); + $('[component="post/content"] blockquote').remove(); } function updateButtons() { @@ -57,7 +57,7 @@ define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll', socket.emit('user.' + type, { uid: theirid }, function(err) { - if(err) { + if (err) { return app.alertError(err.message); } @@ -77,29 +77,29 @@ define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll', } function loadMorePosts(direction) { - if(direction < 0 || !$('.user-recent-posts').length) { + if (direction < 0 || !$('[component="posts"]').length) { return; } - $('.loading-indicator').removeClass('hidden'); + $('[component="posts/loading"]').removeClass('hidden'); infinitescroll.loadMore('posts.loadMoreUserPosts', { - after: $('.user-recent-posts').attr('data-nextstart'), + after: $('[component="posts"]').attr('data-nextstart'), uid: theirid }, function(data, done) { if (data.posts && data.posts.length) { onPostsLoaded(data.posts, done); - $('.user-recent-posts').attr('data-nextstart', data.nextStart); } else { done(); } - $('.loading-indicator').addClass('hidden'); + $('[component="posts"]').attr('data-nextstart', data.nextStart); + $('[component="posts/loading"]').addClass('hidden'); }); } function onPostsLoaded(posts, callback) { posts = posts.filter(function(post) { - return !$('.user-recent-posts div[data-pid=' + post.pid + ']').length; + return !$('[component="posts"] [data-pid=' + post.pid + ']').length; }); if (!posts.length) { @@ -108,7 +108,7 @@ define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll', infinitescroll.parseAndTranslate('account/profile', 'posts', {posts: posts}, function(html) { - $('.user-recent-posts .loading-indicator').before(html); + $('[component="posts"]').append(html); html.find('.timeago').timeago(); callback(); From ec6c6187512286aecb27b269b28148a11222371e Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Sat, 25 Apr 2015 08:05:33 -0700 Subject: [PATCH 271/295] use replicaset if configured Signed-off-by: Ryan Wilson --- src/database/mongo.js | 11 ++++++++++- tests/mocks/databasemock.js | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index be473e616c..1632d41334 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -73,7 +73,16 @@ nconf.set('mongo:database', '0'); } - var connString = 'mongodb://' + usernamePassword + nconf.get('mongo:host') + ':' + nconf.get('mongo:port') + '/' + nconf.get('mongo:database'); + var hosts = nconf.get('mongo:host').split(','); + var ports = nconf.get('mongo:port').split(','); + var servers = []; + + for (var i = 0; i < hosts.length; i++) { + servers.push(hosts[i] + ':' + ports[i]); + } + + var connString = 'mongodb://' + usernamePassword + servers.join() + '/' + nconf.get('mongo:database'); + var connOptions = { server: { poolSize: parseInt(nconf.get('mongo:poolSize'), 10) || 10 diff --git a/tests/mocks/databasemock.js b/tests/mocks/databasemock.js index d3dea94a8c..a895d25c8a 100644 --- a/tests/mocks/databasemock.js +++ b/tests/mocks/databasemock.js @@ -45,6 +45,14 @@ ' "password": "",' + '\n' + ' "database": "1"' + '\n' + '}\n'+ + ' or (mongo) in a replicaset' + '\n' + + '"test_database": {' + '\n' + + ' "host": "127.0.0.1,127.0.0.1,127.0.0.1",' + '\n' + + ' "port": "27017,27018,27019",' + '\n' + + ' "username": "",' + '\n' + + ' "password": "",' + '\n' + + ' "database": "nodebb_test"' + '\n' + + '}\n'+ '===========================================================' ); winston.error(errorText); From c354929569c21b5656ad88a803dd69f0dbe362af Mon Sep 17 00:00:00 2001 From: Ryan Wilson Date: Sat, 25 Apr 2015 08:16:27 -0700 Subject: [PATCH 272/295] handled port as int with toString() Signed-off-by: Ryan Wilson --- src/database/mongo.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/database/mongo.js b/src/database/mongo.js index 1632d41334..adcb0a44e0 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -74,7 +74,7 @@ } var hosts = nconf.get('mongo:host').split(','); - var ports = nconf.get('mongo:port').split(','); + var ports = nconf.get('mongo:port').toString().split(','); var servers = []; for (var i = 0; i < hosts.length; i++) { @@ -161,4 +161,3 @@ }; }(exports)); - From 0d7e72be51f5c6d30598c402a5ab0216289e0f77 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 25 Apr 2015 12:59:56 -0400 Subject: [PATCH 273/295] removed dupe code --- public/src/client/account/topics.js | 14 ++++++++--- public/src/client/account/watched.js | 35 ++-------------------------- 2 files changed, 13 insertions(+), 36 deletions(-) diff --git a/public/src/client/account/topics.js b/public/src/client/account/topics.js index 3242f0395e..ed0f50bc88 100644 --- a/public/src/client/account/topics.js +++ b/public/src/client/account/topics.js @@ -1,13 +1,21 @@ 'use strict'; -/* globals define, app, socket, utils */ +/* globals define, app, socket, utils, config, ajaxify */ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) { var AccountTopics = {}; + var template, set; AccountTopics.init = function() { header.init(); + AccountTopics.handleInfiniteScroll('account/topics', 'uid:' + ajaxify.variables.get('theirid') + ':topics'); + }; + + AccountTopics.handleInfiniteScroll = function(_template, _set) { + template = _template; + set = _set; + if (!config.usePagination) { infinitescroll.init(loadMore); } @@ -19,15 +27,15 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'], } infinitescroll.loadMore('topics.loadMoreFromSet', { - set: 'uid:' + $('.account-username-box').attr('data-uid') + ':topics', + set: set, after: $('[component="category"]').attr('data-nextstart') }, function(data, done) { - if (data.topics && data.topics.length) { onTopicsLoaded(data.topics, done); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/watched.js b/public/src/client/account/watched.js index b9f7fcc5f7..56fd52d0d4 100644 --- a/public/src/client/account/watched.js +++ b/public/src/client/account/watched.js @@ -1,45 +1,14 @@ 'use strict'; /* globals define, app, socket, utils */ -define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) { +define('forum/account/watched', ['forum/account/header', 'forum/account/topics'], function(header, topics) { var AccountWatched = {}; AccountWatched.init = function() { header.init(); - if (!config.usePagination) { - infinitescroll.init(loadMore); - } + topics.handleInfiniteScroll('account/watched', 'uid:' + ajaxify.variables.get('theirid') + ':followed_tids'); }; - function loadMore(direction) { - if (direction < 0) { - return; - } - - infinitescroll.loadMore('topics.loadMoreFromSet', { - set: 'uid:' + $('.account-username-box').attr('data-uid') + ':followed_tids', - after: $('[component="category"]').attr('data-nextstart') - }, function(data, done) { - if (data.topics && data.topics.length) { - onTopicsLoaded(data.topics, done); - } else { - done(); - } - $('[component="category"]').attr('data-nextstart', data.nextStart); - }); - } - - function onTopicsLoaded(topics, callback) { - infinitescroll.parseAndTranslate('account/watched', 'topics', {topics: topics}, function(html) { - $('[component="category"]').append(html); - html.find('.timeago').timeago(); - app.createUserTooltips(); - utils.makeNumbersHumanReadable(html.find('.human-readable-number')); - $(window).trigger('action:topics.loaded'); - callback(); - }); - } - return AccountWatched; }); From 5a6c46a0a066143e934a217592f321d9a7509cf6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 25 Apr 2015 14:59:13 -0400 Subject: [PATCH 274/295] updating group creation method to send back group data in the return callback, and to include the ownerUid if one was passed in --- src/groups.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/groups.js b/src/groups.js index a66555104e..dd5ded7dab 100644 --- a/src/groups.js +++ b/src/groups.js @@ -534,6 +534,8 @@ var async = require('async'), if (data.hasOwnProperty('ownerUid')) { tasks.push(async.apply(db.setAdd, 'group:' + data.name + ':owners', data.ownerUid)); tasks.push(async.apply(db.sortedSetAdd, 'group:' + data.name + ':members', now, data.ownerUid)); + + groupData.ownerUid = data.ownerUid; } if (!data.hidden) { @@ -545,7 +547,7 @@ var async = require('async'), plugins.fireHook('action:group.create', groupData); } - callback(err); + callback(err, groupData); }); }); }; From 84cbdc1358434ea0b979b082ea85b0dbe33985e7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Sat, 25 Apr 2015 22:34:54 -0400 Subject: [PATCH 275/295] changed the password confirmation form field in the web installer so that it doesn't clobber some env vars, and allowed admin username and email to be set via env var --- src/install.js | 4 ++-- src/views/install/index.tpl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/install.js b/src/install.js index 250aa4c799..e7bb669402 100644 --- a/src/install.js +++ b/src/install.js @@ -370,8 +370,8 @@ function createAdmin(callback) { } var results = { - username: install.values['admin:username'] || 'admin', - email: install.values['admin:email'] || '', + username: install.values['admin:username'] || nconf.get('admin:username') || 'admin', + email: install.values['admin:email'] || nconf.get('admin:email') || '', password: install.values['admin:password'] || nconf.get('admin:password') || password, 'password:confirm': install.values['admin:password:confirm'] || nconf.get('admin:password') || password }; diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 296c1d4d44..75d6c1e16a 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -78,8 +78,8 @@
    - - + +
    From b9172358ddd03705437676930480f88b4cca2722 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sun, 26 Apr 2015 12:56:13 -0400 Subject: [PATCH 276/295] #3093 --- src/routes/feeds.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 202d84f42c..be018c33c3 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -241,6 +241,9 @@ function generateTopicsFeed(feedOptions, feedTopics, callback) { if (err) { return next(err); } + if (!mainPost) { + return next(null, feedItem); + } feedItem.description = mainPost.content; feedItem.author = mainPost.user.username; next(null, feedItem); @@ -250,7 +253,9 @@ function generateTopicsFeed(feedOptions, feedTopics, callback) { return callback(err); } feedItems.forEach(function(feedItem) { - feed.item(feedItem); + if (feedItem) { + feed.item(feedItem); + } }); callback(null, feed); }); From c13e14d2c86220a1c6ff356f4dfeb89599014f65 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 27 Apr 2015 12:25:05 -0400 Subject: [PATCH 277/295] pass in element to filter:taskbar.push; taskbar.push cleanup --- public/src/modules/taskbar.js | 61 ++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/public/src/modules/taskbar.js b/public/src/modules/taskbar.js index ba3ccd04c2..9cedb24bd3 100644 --- a/public/src/modules/taskbar.js +++ b/public/src/modules/taskbar.js @@ -44,43 +44,20 @@ define('taskbar', function() { }; taskbar.push = function(module, uuid, options) { + var element = taskbar.tasklist.find('li[data-uuid="' + uuid + '"]'); + var data = { module: module, uuid: uuid, - options: options + options: options, + element: element }; $(window).trigger('filter:taskbar.push', data); - var element = taskbar.tasklist.find('li[data-uuid="' + data.uuid + '"]'); - - if (element.length) { - return; - } - - var title = $('
    ').text(data.options.title || 'NodeBB Task').html(); - - var btnEl = $('
  • ') - .addClass(data.options.className) - .html('' + - (data.options.icon ? ' ' : '') + - (data.options.image ? ' ': '') + - '' + title + '' + - '') - .attr({ - 'data-module': data.module, - 'data-uuid': data.uuid - }) - .addClass(data.options.state !== undefined ? data.options.state : 'active'); - - if (!data.options.state || data.options.state === 'active') { - minimizeAll(); + if (!element.length) { + createTaskbar(data); } - - taskbar.tasklist.append(btnEl); - update(); - - $(window).trigger('action:taskbar.pushed'); }; taskbar.minimize = function(module, uuid) { @@ -118,5 +95,31 @@ define('taskbar', function() { taskbar.tasklist.find('.active').removeClass('active'); } + function createTaskbar(data) { + var title = $('
    ').text(data.options.title || 'NodeBB Task').html(); + + var btnEl = $('
  • ') + .addClass(data.options.className) + .html('' + + (data.options.icon ? ' ' : '') + + (data.options.image ? ' ': '') + + '' + title + '' + + '') + .attr({ + 'data-module': data.module, + 'data-uuid': data.uuid + }) + .addClass(data.options.state !== undefined ? data.options.state : 'active'); + + if (!data.options.state || data.options.state === 'active') { + minimizeAll(); + } + + taskbar.tasklist.append(btnEl); + update(); + + $(window).trigger('action:taskbar.pushed'); + } + return taskbar; }); From 15563657129556a52dcefe22a5c41bccd8797e14 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 27 Apr 2015 12:41:16 -0400 Subject: [PATCH 278/295] call taskbar.push regardless of whether it's a new chat or not there's logic in taskbar.push to not create the element anyways --- public/src/modules/chat.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 593d576e3e..9c1183d6a1 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -85,6 +85,11 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra if (!isSelf && (!modal.is(":visible") || !app.isFocused)) { app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]'); sounds.play('chat-incoming'); + + taskbar.push('chat', modal.attr('UUID'), { + title: username, + touid: data.message.fromUser.uid + }); } } else { module.createModal(username, data.withUid, function(modal) { From 533193fa7954e7a352a582734db90f344301f53f Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 27 Apr 2015 12:44:35 -0400 Subject: [PATCH 279/295] send in data to action:taskbar.pushed as well --- public/src/modules/taskbar.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/public/src/modules/taskbar.js b/public/src/modules/taskbar.js index 9cedb24bd3..f1757fe553 100644 --- a/public/src/modules/taskbar.js +++ b/public/src/modules/taskbar.js @@ -98,7 +98,7 @@ define('taskbar', function() { function createTaskbar(data) { var title = $('
    ').text(data.options.title || 'NodeBB Task').html(); - var btnEl = $('
  • ') + var taskbarEl = $('
  • ') .addClass(data.options.className) .html('' + (data.options.icon ? ' ' : '') + @@ -115,10 +115,11 @@ define('taskbar', function() { minimizeAll(); } - taskbar.tasklist.append(btnEl); + taskbar.tasklist.append(taskbarEl); update(); - $(window).trigger('action:taskbar.pushed'); + data.element = taskbarEl; + $(window).trigger('action:taskbar.pushed', data); } return taskbar; From 8bb73192cfda41ef615b7368a2d8b1d559c3e435 Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 27 Apr 2015 13:50:02 -0400 Subject: [PATCH 280/295] closes #3073 --- src/views/admin/header.tpl | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl index 4fbeea9566..26136d550e 100644 --- a/src/views/admin/header.tpl +++ b/src/views/admin/header.tpl @@ -74,7 +74,32 @@
  • +
    + + +
    From 7f80a4a4399ad1caf8d1d8c294381c95789f61ea Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 1 May 2015 20:08:24 -0400 Subject: [PATCH 294/295] latest translations --- public/language/ar/error.json | 26 ++-- public/language/bg/error.json | 24 ++-- public/language/bn/error.json | 26 ++-- public/language/cs/error.json | 26 ++-- public/language/de/error.json | 26 ++-- public/language/el/error.json | 26 ++-- public/language/en@pirate/error.json | 26 ++-- public/language/en_US/error.json | 26 ++-- public/language/es/error.json | 26 ++-- public/language/et/error.json | 26 ++-- public/language/fa_IR/category.json | 8 +- public/language/fa_IR/error.json | 26 ++-- public/language/fi/error.json | 26 ++-- public/language/fr/error.json | 24 ++-- public/language/he/error.json | 26 ++-- public/language/hu/error.json | 26 ++-- public/language/id/error.json | 26 ++-- public/language/it/error.json | 26 ++-- public/language/ja/error.json | 26 ++-- public/language/ko/error.json | 26 ++-- public/language/lt/error.json | 26 ++-- public/language/ms/category.json | 14 +-- public/language/ms/email.json | 50 ++++---- public/language/ms/error.json | 160 ++++++++++++------------- public/language/ms/global.json | 84 ++++++------- public/language/ms/groups.json | 68 +++++------ public/language/ms/login.json | 16 +-- public/language/ms/modules.json | 40 +++---- public/language/ms/notifications.json | 40 +++---- public/language/ms/pages.json | 18 +-- public/language/ms/recent.json | 24 ++-- public/language/ms/reset_password.json | 22 ++-- public/language/ms/search.json | 76 ++++++------ public/language/ms/success.json | 8 +- public/language/ms/tags.json | 10 +- public/language/ms/topic.json | 82 ++++++------- public/language/ms/user.json | 80 ++++++------- public/language/ms/users.json | 8 +- public/language/nb/category.json | 6 +- public/language/nb/error.json | 34 +++--- public/language/nb/modules.json | 10 +- public/language/nb/pages.json | 8 +- public/language/nl/error.json | 26 ++-- public/language/pl/error.json | 26 ++-- public/language/pt_BR/error.json | 26 ++-- public/language/pt_BR/user.json | 12 +- public/language/ro/error.json | 26 ++-- public/language/ru/error.json | 28 ++--- public/language/ru/pages.json | 2 +- public/language/ru/user.json | 12 +- public/language/sc/error.json | 26 ++-- public/language/sk/error.json | 26 ++-- public/language/sv/error.json | 26 ++-- public/language/th/error.json | 26 ++-- public/language/tr/error.json | 24 ++-- public/language/vi/error.json | 26 ++-- public/language/zh_CN/error.json | 28 ++--- public/language/zh_CN/user.json | 12 +- public/language/zh_TW/error.json | 26 ++-- 59 files changed, 880 insertions(+), 880 deletions(-) diff --git a/public/language/ar/error.json b/public/language/ar/error.json index d7b5c53677..4273f07874 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "هذا المنتدى يستلزم تفعيل بريدك الإلكتروني، انقر هنا من فضلك لإدخاله.", "email-confirm-failed": "لم نستطع تفعيل بريدك الإلكتروني، المرجو المحاولة لاحقًا.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "اسم المستخدم قصير.", "username-too-long": "اسم المستخدم طويل", "user-banned": "المستخدم محظور", - "user-too-new": "عذرًا، يجب الانتظار %1 ثواني قبل إضافة ردك الأول.", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "قائمة غير موجودة", "no-topic": "موضوع غير موجود", "no-post": "رد غير موجود", @@ -36,17 +36,17 @@ "no-emailers-configured": "لا يمكن إرسال رسالة إلكترونية تجريبية لعدم وجود قوالب خاصة بالرسائل الإلكترونية،", "category-disabled": "قائمة معطلة", "topic-locked": "الموضوع مقفول", - "post-edit-duration-expired": "لايمكنك تعديل مشاركتك بعد مرور أكثر من %1 ثانية على كتابتها.", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "الرجاء انتظار الرفع", - "content-too-short": "المرجو إدخال موضوع أطول من هذا. يجب أن تتوفر المواضيع على %1 حروف على الأقل.", - "content-too-long": "لا يمكن للمشاركات أن تتجاوز %1 حرفًا/أحرف.", - "title-too-short": "المرجو إدخال عنوان أطول من هذا. يجب أن تتوفر العناوين على %1 حروف على الأقل.", - "title-too-long": "المرجو إدخال عنوان أقصر من هذا. يجب ألا تتجاوز العناوين %1 حرفًا.", - "too-many-posts": "يمكنك إنشاء المواضيع بمعدل موضوع واحد كل %1 ثانية - المرجو الانتظار قليلا.", - "too-many-posts-newbie": "بصفتك مستخدمًا جديدًا، يمكنك إنشاء المواضيع بمعدل موضوع واحد كل %1 ثانية حتى تحصل على سمعة %2 - المرجو الانتظار قليلا.", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "لايمكنك التصويت لردك", "already-favourited": "لقد سبق وأضفت هذا الرد إلى المفضلة", "already-unfavourited": "لقد سبق وحذفت هذا الرد من المفضلة", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "الصور المصغرة غير مفعلة.", "invalid-file": "ملف غير مقبول", "uploads-are-disabled": "رفع الملفات غير مفعل", - "signature-too-long": "عذرا، توقيعك يجب ألا يتجاوز %1 حرفًا", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "لايمكنك فتح محادثة مع نفسك", "chat-restricted": "هذا المستخدم عطل المحادثات الواردة عليه. يجب أن يتبعك حتى تتمكن من فتح محادثة معه.", "too-many-messages": "You have sent too many messages, please wait awhile.", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 63595becca..17907c8815 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Няма да можете да пишете в чата, докато е-пощата Ви не бъде потвърдена. Моля, натиснете тук, за да потвърдите е-пощата си.", "no-email-to-confirm": "Този форум изисква потвърдена е-поща. Моля, натиснете тук, за да въведете е-поща", "email-confirm-failed": "Не успяхме да потвърдим е-пощата Ви. Моля, опитайте отново по-късно.", - "confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минути, преди да изпратите ново.", + "confirm-email-already-sent": "Е-писмото за потвърждение вече е изпратено. Моля, почакайте още %1 минута/и, преди да изпратите ново.", "username-too-short": "Потребителското име е твърде кратко", "username-too-long": "Потребителското име е твърде дълго", "user-banned": "Потребителят е блокиран", - "user-too-new": "Съжаляваме, но трябва да изчакате поне %1 секунди, преди да направите първата си публикация", + "user-too-new": "Съжаляваме, но трябва да изчакате поне %1 секунда/и, преди да направите първата си публикация", "no-category": "Категорията не съществува", "no-topic": "Темата не съществува", "no-post": "Публикацията не съществува", @@ -36,16 +36,16 @@ "no-emailers-configured": "Добавките за е-поща не са заредени, така че не може да бъде изпратено пробно е-писмо", "category-disabled": "Категорията е изключена", "topic-locked": "Темата е заключена", - "post-edit-duration-expired": "Можете да редактирате публикациите си до %1 секунди, след като ги пуснете", + "post-edit-duration-expired": "Можете да редактирате публикациите си до %1 секунда/и, след като ги пуснете", "still-uploading": "Моля, изчакайте качването да приключи.", - "content-too-short": "Моля, въведете по-дълъг текст на публикацията. Публикациите трябва да съдържат поне %1 символа.", - "content-too-long": "Моля, въведете по-кратък текст на публикацията. Публикациите трябва да съдържат не повече от %1 символа.", - "title-too-short": "Моля, въведете по-дълго заглавие. Заглавията трябва да съдържат поне %1 символа.", - "title-too-long": "Моля, въведете по-кратко заглавие. Заглавията трябва да съдържат не повече от %1 символа.", - "too-many-posts": "Можете да публикувате веднъж на %1 секунди – моля, изчакайте малко, преди да опитате да публикувате отново", - "too-many-posts-newbie": "Като нов потребител, Вие можете да публикувате веднъж на %1 секунди, докато не натрупате %2 репутация – моля, изчакайте малко, преди да опитате да публикувате отново", - "tag-too-short": "Моля, въведете по-дълъг етикет. Етикетите трябва да съдържат поне %1 символа", - "tag-too-long": "Моля, въведете по-кратък етикет. Етикетите трябва да съдържат не повече от %1 символа", + "content-too-short": "Моля, въведете по-дълъг текст на публикацията. Публикациите трябва да съдържат поне %1 символ(а).", + "content-too-long": "Моля, въведете по-кратък текст на публикацията. Публикациите трябва да съдържат не повече от %1 символ(а).", + "title-too-short": "Моля, въведете по-дълго заглавие. Заглавията трябва да съдържат поне %1 символ(а).", + "title-too-long": "Моля, въведете по-кратко заглавие. Заглавията трябва да съдържат не повече от %1 символ(а).", + "too-many-posts": "Можете да публикувате веднъж на %1 секунда/и – моля, изчакайте малко, преди да опитате да публикувате отново", + "too-many-posts-newbie": "Като нов потребител, Вие можете да публикувате веднъж на %1 секунда/и, докато не натрупате %2 репутация – моля, изчакайте малко, преди да опитате да публикувате отново", + "tag-too-short": "Моля, въведете по-дълъг етикет. Етикетите трябва да съдържат поне %1 символ(а)", + "tag-too-long": "Моля, въведете по-кратък етикет. Етикетите трябва да съдържат не повече от %1 символ(а)", "file-too-big": "Максималният разрешен размер на файл е %1 КБ – моля, качете по-малък файл", "cant-vote-self-post": "Не можете да гласувате за собствената си публикация", "already-favourited": "Вече сте отбелязали тази публикация като любима", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Иконките на темите са изключени.", "invalid-file": "Грешен файл", "uploads-are-disabled": "Качването не е разрешено", - "signature-too-long": "Съжаляваме, но подписът Ви трябва да съдържа не повече от %1 символа.", + "signature-too-long": "Съжаляваме, но подписът Ви трябва да съдържа не повече от %1 символ(а).", "cant-chat-with-yourself": "Не можете да пишете чат съобщение на себе си!", "chat-restricted": "Този потребител е ограничил чат съобщенията до себе си. Той трябва първо да Ви последва, преди да можете да си пишете с него.", "too-many-messages": "Изпратили сте твърде много съобщения. Моля, изчакайте малко.", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index e19eb7f0e2..40b8dc44d7 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "খুব ছোট ইউজারনেম", "username-too-long": "ইউজারনেম বড় হয়ে গিয়েছে", "user-banned": "ব্যবহারকারী নিষিদ্ধ", - "user-too-new": "দুঃখিত! প্রথম পোষ্ট করার জন্য আপনাকে %1 সেকেন্ড অপেক্ষা করতে হবে।", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "বিভাগটি খুজে পাওয়া যায় নি", "no-topic": "এই টপিক নেই", "no-post": "এই পোষ্ট নেই", @@ -36,17 +36,17 @@ "no-emailers-configured": "কোন ইমেল প্লাগইন লোড করা নেই, কাজেই টেস্ট মেইল পাঠানো সম্ভব হচ্ছে না", "category-disabled": "বিভাগটি নিষ্ক্রিয়", "topic-locked": "টপিক বন্ধ", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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 সেকেন্ডে একবার পোষ্ট করতে পারবেন। পরবর্তী পোষ্ট করার জন্য অপেক্ষা করুন। ", - "too-many-posts-newbie": "নতুন সদস্য হিসাবে %2 সন্মানণা পাওয়া পর্যন্ত আপনি প্রতি %1 সেকেন্ডে একবার পোষ্ট করতে পারবেন। পরবর্তী পোষ্ট করার জন্য অপেক্ষা করুন। ", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "আপনি নিজের পোস্টে ভোট দিতে পারবেন না।", "already-favourited": "আপনি ইতিমধ্যে এই পোষ্টটি পছন্দের তালিকায় যোগ করেছেন", "already-unfavourited": "আপনি ইতিমধ্যে এই পোষ্টটি আপনার পছন্দের তালিকা থেকে সরিয়ে ফেলেছেন", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "টপিক থাম্বনেল নিষ্ক্রিয় করা। ", "invalid-file": "ভুল ফাইল", "uploads-are-disabled": "আপলোড নিষ্ক্রিয় করা", - "signature-too-long": "দুঃখিত, আপনার সাক্ষর %1 অক্ষরের বেশী হতে পারবে না। ", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "আপনি নিজের সাথে চ্যাট করতে পারবেন না!", "chat-restricted": "এই সদস্য তার বার্তালাপ সংরক্ষিত রেখেছেন। এই সদস্য আপনাকে ফলো করার পরই কেবলমাত্র আপনি তার সাথে চ্যাট করতে পারবেন", "too-many-messages": "You have sent too many messages, please wait awhile.", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index a6e6f32bb1..1a82707bd9 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Uživatelské jméno je příliš krátké", "username-too-long": "Uživatelské jméno je příliš dlouhé", "user-banned": "Uživatel byl zakázán", - "user-too-new": "Pardon, ale je potřeba vyčkat %1 sekund, než-li budete moci vytvořit svůj první příspěvek.", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategorie neexistuje", "no-topic": "Téma neexistuje", "no-post": "Příspěvek neexistuje", @@ -36,17 +36,17 @@ "no-emailers-configured": "Protože není zaveden žádný emailový plugin, není možné odeslat testovací email.", "category-disabled": "Kategorie zakázána", "topic-locked": "Téma uzamčeno", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "too-many-posts-newbie": "Jako nový uživatel můžete své příspěvky odesílat po %1 sekundách, dokud nedosáhnete %2 reputace - vyčkejte, prosím, před dalším odesláním", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Nemůžete hlasovat pro svůj vlastní příspěvek", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", "invalid-file": "Neplatný soubor", "uploads-are-disabled": "Nahrávání je zakázáno", - "signature-too-long": "Pardon, ale váš podpis nemůže být delší, než-li %1 znaků.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Nemůžete chatovat sami se sebou!", "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.", diff --git a/public/language/de/error.json b/public/language/de/error.json index dc07a892d4..3c1248097a 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Deine E-Mail wurde noch nicht bestätigt. Bitte klicke hier, um deine E-Mail zu bestätigen.", "no-email-to-confirm": "Dieses Forum setzt E-Mail-Bestätigung voraus, bitte klick hier um eine E-Mail-Adresse einzugeben", "email-confirm-failed": "Wir konnten deine E-Mail-Adresse nicht bestätigen, bitte versuch es später noch einmal", - "confirm-email-already-sent": "Bestätigungsemail ist bereits versandt. Um eine weitere senden zu können, warte bitte %1 Minuten.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Benutzername ist zu kurz", "username-too-long": "Der Benutzername ist zu lang", "user-banned": "Der Benutzer ist gesperrt", - "user-too-new": "Tut uns leid, du musst %1 Sekunden warten, bevor du deinen ersten Beitrag verfassen kannst!", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Die Kategorie existiert nicht", "no-topic": "Das Thema existiert nicht", "no-post": "Der Beitrag existiert nicht", @@ -36,17 +36,17 @@ "no-emailers-configured": "Es wurde keine E-Mail-Plugins geladen, weshalb eine Test-E-Mail nicht gesendet werden konnte.", "category-disabled": "Kategorie ist deaktiviert", "topic-locked": "Thema ist gesperrt", - "post-edit-duration-expired": "Du darfst Beiträge lediglich innerhalb von %1 Sekunden nach dem erstellen editieren", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "too-many-posts-newbie": "Als neuer Benutzer kannst du nur alle %1 Sekunden einen Beitrag verfassen, bis du %2 Reputationspunkte hast - Bitte warte etwas, bevor du erneut einen Beitrag verfasst", - "tag-too-short": "Bitte gib ein längeres Stichwort an. Stichwörter sollten aus mindestens %1 Zeichen bestehen.", - "tag-too-long": "Bitte gib ein kürzeres Stichwort ein. Stichwörter können nicht länger als %1 Zeichen sein.", - "file-too-big": "Maximal erlaubte Dateigröße ist %1 kb - lade bitte eine kleinere Datei hoch", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Du kannst deinen eigenen Beitrag nicht bewerten", "already-favourited": "Dieser Beitrag ist bereits in deinen Favoriten enthalten", "already-unfavourited": "Du hast diesen Beitrag bereits aus deinen Favoriten entfernt", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Vorschaubilder für Themen sind deaktiviert", "invalid-file": "Datei ungültig", "uploads-are-disabled": "Uploads sind deaktiviert", - "signature-too-long": "Entschuldigung, deine Signatur darf maximal %1 Zeichen enthalten.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Du kannst nicht mit dir selber chatten!", "chat-restricted": "Dieser Benutzer hat seine Chatfunktion eingeschränkt. Du kannst nur mit diesem Benutzer chatten, wenn er dir folgt.", "too-many-messages": "Du hast zu viele Nachrichten versandt, bitte warte eine Weile.", diff --git a/public/language/el/error.json b/public/language/el/error.json index 20622fbf45..5749bd7156 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Το όνομα χρήστη είναι πολύ μικρό", "username-too-long": "Το όνομα χρήστη είναι πολύ μεγάλο", "user-banned": "Ο Χρήστης είναι αποκλεισμένος/η", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "Δεν έχουν φορτωθεί email plugins, οποτε το δοκιμαστικό email δεν μπορεί να σταλθεί", "category-disabled": "Η κατηγορία έχει απενεργοποιηθεί", "topic-locked": "Το θέμα έχει κλειδωθεί", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Δεν μπορείς να ψηφίσεις την δημοσίευσή σου", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Οι εικόνες θεμάτων είναι απενεργοποιημένες", "invalid-file": "Άκυρο Αρχείο", "uploads-are-disabled": "Το ανέβασμα αρχείων έχει απενεργοποιηθεί", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/en@pirate/error.json b/public/language/en@pirate/error.json index 2d27b23f7c..867f331c3c 100644 --- a/public/language/en@pirate/error.json +++ b/public/language/en@pirate/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "User banned", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Category disabled", "topic-locked": "Topic Locked", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "You cannot vote for your own post", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", "invalid-file": "Invalid File", "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/en_US/error.json b/public/language/en_US/error.json index 2d27b23f7c..867f331c3c 100644 --- a/public/language/en_US/error.json +++ b/public/language/en_US/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "User banned", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Category disabled", "topic-locked": "Topic Locked", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "You cannot vote for your own post", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", "invalid-file": "Invalid File", "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/es/error.json b/public/language/es/error.json index 5cc00a70f7..12132c317d 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "No puedes usar el chat hasta que confirmes tu dirección de correo electrónico, por favor haz click aquí para confirmar tu correo.", "no-email-to-confirm": "Este foro requiere confirmación de su email, por favor pulse aquí para introducir un email", "email-confirm-failed": "No se ha podido confirmar su email, por favor inténtelo de nuevo más tarde.", - "confirm-email-already-sent": "El email de confirmación ya ha sido enviado, por favor espera %1 minuto para enviar otro.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Nombre de usuario es demasiado corto", "username-too-long": "Nombre de usuario demasiado largo", "user-banned": "Usuario baneado", - "user-too-new": "Lo sentimos, es necesario que esperes %1 segudos antes poder hacer tu primera publicación", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "La categoría no existe", "no-topic": "El tema no existe", "no-post": "La publicación no existe", @@ -36,17 +36,17 @@ "no-emailers-configured": "No se ha cargado ningún plugin de email, así que no se pudo enviar el email de prueba.", "category-disabled": "Categoría deshabilitada", "topic-locked": "Tema bloqueado", - "post-edit-duration-expired": "Sólo puedes editar mensajes durante %1 segundos después de haberlo escrito", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "too-many-posts-newbie": "Como nuevo usuario, solo puedes publicar una vez cada %1 segundos hasta hayas ganado una reputación de %2 - por favor espere antes de volver a publicar", - "tag-too-short": "Por favor introduce una etiqueta más larga. Las etiquetas deben contener por lo menos %1 caracteres", - "tag-too-long": "Por favor introduce una etiqueta más pequeña. Las etiquetas no pueden exceder los %1 caracteres", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "No puedes votar tus propios posts", "already-favourited": "Ya ha marcado esta publicación como favorita", "already-unfavourited": "Ya ha desmarcado esta publicación como favorita", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Las miniaturas de los temas están deshabilitadas.", "invalid-file": "Archivo no válido", "uploads-are-disabled": "Las subidas están deshabilitadas.", - "signature-too-long": "Lo sentimos, pero tu firma no puede ser más larga de %1 caracteres.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "¡No puedes conversar contigo mismo!", "chat-restricted": "Este usuario tiene restringidos los mensajes de chat. Los usuarios deben seguirte antes de que pueda charlar con ellos", "too-many-messages": "Has enviado demasiados mensajes, por favor espera un poco.", diff --git a/public/language/et/error.json b/public/language/et/error.json index bda6283abb..776586b76c 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Sõnumeid ei ole võimalik enne saata kui sinu email on kinnitatud. Kinnitamiseks vajuta siia.", "no-email-to-confirm": "See foorum nõuab emaili kinnitust, palun vajuta siia, et sisestada email", "email-confirm-failed": "Meil ei õnnestunud sinu emaili kinnitada, proovi hiljem uuesti.", - "confirm-email-already-sent": "Kinnitus e-mail on juba saadetud, palun oota %1 minutit uue saatmiseks.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Kasutajanimi on liiga lühike", "username-too-long": "Kasutajanimi on liiga pikk", "user-banned": "Kasutaja bannitud", - "user-too-new": "Vabandame, enne esimese postituse loomist pead ootama %1 sekundit", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategooriat ei eksisteeri", "no-topic": "Teemat ei eksisteeri", "no-post": "Postitust ei eksisteeri", @@ -36,17 +36,17 @@ "no-emailers-configured": "Emaili rakendust ei ole laetud, seega test emaili ei ole võimalik saata", "category-disabled": "Kategooria keelatud", "topic-locked": "Teema lukustatud", - "post-edit-duration-expired": "Postituse muutmine on lubatud vaid %1 sekundit peale postitamist", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "Palun oota, kuni üleslaadimised on laetud.", - "content-too-short": "Palun sisesta pikem vastus. Vähemalt %1 tähemärki.", - "content-too-long": "Palun lühenda oma vastust. Postitus ei saa olla pikem kui %1 tähemärki.", - "title-too-short": "Palun sisesta pikem pealkiri. Pealkiri peaks koosnema vähemalt %1 tähemärgist.", - "title-too-long": "Palun sisesta lühem pealkiri. Pealkirjad ei saa olla pikemad kui %1 tähemärki.", - "too-many-posts": "Sa saad postitada iga %1 sekundi tagant - palun oota enne uue postituse tegemist", - "too-many-posts-newbie": "Uue kasutajana saad postitada vaid iga %1 sekundi tagant, seniks kuni oled teeninud vähemalt %2 reputatsiooni - palun oota enne uue postituse tegemist", - "tag-too-short": "Palun sisesta pikem märksõna. Märksõna peaks koosnema vähemalt %1 tähemärgist", - "tag-too-long": "Palun sisesta lühem märksõna. Märksõnad ei saa olla pikemad kui %1 tähemärki", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Sa ei saa hääletada enda postituse poolt", "already-favourited": "Sa juba märkisid selle postituse lemmikuks", "already-unfavourited": "Sa juba eemaldasid selle postituse lemmikute hulgast", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Teema thumbnailid on keelatud.", "invalid-file": "Vigane fail", "uploads-are-disabled": "Üleslaadimised on keelatud", - "signature-too-long": "Allkiri ei saa olla pikem kui %1 tähemärki.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Sa ei saa endaga vestelda!", "chat-restricted": "Kasutaja on piiranud sõnumite saatmist. Privaatsõnumi saatmiseks peab kasutaja sind jälgima", "too-many-messages": "Oled saatnud liiga palju sõnumeid, oota natukene.", diff --git a/public/language/fa_IR/category.json b/public/language/fa_IR/category.json index 3f5b15a3cc..d67bba2cd7 100644 --- a/public/language/fa_IR/category.json +++ b/public/language/fa_IR/category.json @@ -1,12 +1,12 @@ { "new_topic_button": "جستار تازه", - "guest-login-post": "برای فرستادن دیدگاه وارد شوید", - "no_topics": "هیچ جستاری در این دسته نیست.
    چرا شما یکی نفرستید؟", + "guest-login-post": "برای ثبت نظر وارد شوید", + "no_topics": "هیچ پستی در این دسته نیست.
    چرا شما یکی نفرستید؟", "browsing": "بیننده‌ها", "no_replies": "هیچ کسی پاسخ نداده است.", "share_this_category": "به اشتراک‌گذاری این دسته", - "watch": "نظاره کردن", + "watch": "نظارت کردن", "ignore": "نادیده گرفتن", - "watch.message": "در حال حاظر شما به روز رسانی های این دسته را می پایید", + "watch.message": "در حال حاظر شما به روز رسانی های این دسته را دنبال می کنید", "ignore.message": "در حال حاظر شما به روز رسانی های این دسته را نادیده میگیرد" } \ No newline at end of file diff --git a/public/language/fa_IR/error.json b/public/language/fa_IR/error.json index ffd1a4e58a..b7e7237c4a 100644 --- a/public/language/fa_IR/error.json +++ b/public/language/fa_IR/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "شما تا قبل از تایید رایانامه قادر به گفتگو نیستید، لطفا برای تایید رایانامه خود اینجا کلیک کنید", "no-email-to-confirm": "این انجمن نیاز به تایید رایانامه دارد، لطفا برای وارد کردن رایانامه اینجا کلیک کنید", "email-confirm-failed": "ما نتوانستیم رایانامه شما را تایید کنیم، لطفا بعدا دوباره سعی کنید", - "confirm-email-already-sent": "رایانامه تاییدیه ارسال شد، لطفا %1 دقیقه صبر کنید تا رایانامه دیگری ارسال کنید", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", "user-banned": "کاربر محروم شد.", - "user-too-new": "با عرض پوزش، شما باید ٪ 1 ثانیه قبل از ساخت اولین دیدگاه خود صبر کنید", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "دسته بندی وجود ندارد", "no-topic": "جستار وجود ندارد.", "no-post": "دیدگاه وجود ندارد", @@ -36,17 +36,17 @@ "no-emailers-configured": "افزونه ایمیلی بارگیری نشده است، پس رایانامه امتحانی نمیتواند فرستاده شود", "category-disabled": "دسته غیر‌فعال شد.", "topic-locked": "جستار بسته شد.", - "post-edit-duration-expired": "شما تنها می توانید پس از 1٪ ثانیه از ارسال دیدگاه انرا ویرایش نمایید", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "خواهشمندیم تا پایان بارگذاری‌ها شکیبا باشید.", - "content-too-short": "لطفا دیدگاه طولانی تری وارد کنید. دیدگاه ها حداقل باید شامل 1% نویسه باشند.", - "content-too-long": "لطفا دیدگاه کوتاه تری وارد کنید. دیدگاه ها نمیتوانند بیش از 1% نویسه داشته باشند", - "title-too-short": "لطفا عنوان طولانی تری وارد کنید. عنوان ها حداقل باید شامل 1% نویسه باشند", - "title-too-long": "خواهشمندیم عنوان کوتاه‌تری بنویسید. عنوان‌ها نمی‌توانند بیش‌تر از %1 نویسه داشته باشند.", - "too-many-posts": "شما تنها می توانید هر 1٪ ثانیه دیدگاه ارسال کنید - لطفا قبل از ارسالِ دوباره صبر کنید", - "too-many-posts-newbie": "به عنوان یک کاربر جدید، شما تنها قادرید هر 1٪ ثانیه دیدگاه ارسال کنید تا زمانی که شما ٪ 2 اعتبار بدست آورید - لطفا قبل از ارسالِ دوباره صبر کنید", - "tag-too-short": "لطفا برچسب بلندتری را وارد کنید. برچسب هاباید حداقل شامل 1% نویسه باشند.", - "tag-too-long": "لطفا برچسب کوتاه تری را وارد کنید. برچسب ها نمیتوانند بیشتر از 1% نویسه باشند.", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "شما نمی‌توانید به دیدگاه خود رای بدهید.", "already-favourited": "شما قبلا این دیدگاه را محبوب کرده اید", "already-unfavourited": "شما قبلا این دیدگاه را نامحبوب کرده اید", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "چهرک‌های جستار غیرفعال شده است.", "invalid-file": "فایل نامعتبر است.", "uploads-are-disabled": "امکان بارگذاری غیرفعال شده است.", - "signature-too-long": "شرمنده، امضا نمی‌تواند بیش‌تر از %1 نویسه داشته باشد.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "شما نمی‌توانید با خودتان گفتگو کنید!", "chat-restricted": "این کاربر پیام های گفتگوی خود را محدود کرده است . آنها بایدشما را دنبال کنند تا اینکه شما بتوانید به آنها پیامی بفرستید", "too-many-messages": "شما پیامهای خیلی زیادی فرستاده اید، لطفا مدتی صبر نمایید", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index c5d4a28c5e..6001a3f211 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Käyttäjänimi on liian lyhyt", "username-too-long": "Käyttäjänimi on liian pitkä", "user-banned": "Käyttäjä on estetty", - "user-too-new": "Pahottelut, joudut odottamaan %1 sekuntia ennen ensimmäisen viestin kirjoittamista", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategoriaa ei ole olemassa", "no-topic": "Aihetta ei ole olemassa", "no-post": "Viestiä ei ole olemassa", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Kategoria ei ole käytössä", "topic-locked": "Aihe lukittu", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Et voi antaa ääntä omalle viestillesi", "already-favourited": "Tämä viesti on jo suosikeissasi", "already-unfavourited": "Olet jo poistanut tämän viestin suosikeistasi", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Aiheiden kuvakkeet eivät ole käytössä", "invalid-file": "Virheellinen tiedosto", "uploads-are-disabled": "Et voi lähettää tiedostoa", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Et voi keskustella itsesi kanssa!", "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.", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 958f8aa228..880c9ce132 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Il ne vous est pas possible d'utiliser le chat tant que votre adresse email n'a pas été vérifiée. Veuillez cliquer ici pour confirmer votre adresse email.", "no-email-to-confirm": "Ce forum requiert une vérification de votre adresse email. Veuillez cliquer ici pour entrer une adresse.", "email-confirm-failed": "Votre adresse email n'a pas pu être vérifiée. Veuillez ré-essayer plus tard.", - "confirm-email-already-sent": "L'email de confirmation a déjà été envoyé. Veuillez attendre %1 minutes avant de redemander un nouvel envoi.", + "confirm-email-already-sent": "L'email de confirmation a déjà été envoyé. Veuillez attendre %1 minute(s) avant de redemander un nouvel envoi.", "username-too-short": "Nom d'utilisateur trop court", "username-too-long": "Nom d'utilisateur trop long", "user-banned": "Utilisateur banni", - "user-too-new": "Désolé, vous devez attendre encore %1 secondes avant d'envoyer votre premier message", + "user-too-new": "Désolé, vous devez attendre encore %1 seconde(s) avant d'envoyer votre premier message", "no-category": "Cette catégorie n'existe pas", "no-topic": "Ce sujet n'existe pas", "no-post": "Ce message n'existe pas", @@ -36,16 +36,16 @@ "no-emailers-configured": "Un email de test n'a pas pu être envoyé car aucun plugin de gestion des emails n'était chargé", "category-disabled": "Catégorie désactivée", "topic-locked": "Sujet verrouillé", - "post-edit-duration-expired": "Vous ne pouvez modifier un post que %1 secondes après l'avoir posté.", + "post-edit-duration-expired": "Vous ne pouvez modifier un message que %1 seconde(s) après l'avoir posté.", "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.", - "too-many-posts-newbie": "En tant que nouvel utilisateur, vous ne pouvez poster que toutes les %1 secondes jusqu'à ce que vous obteniez une réputation de %2 - patientez avant de publier de nouveau. ", - "tag-too-short": "Veuillez entrer un mot-clé plus long. Les mots-clés devraient contenir au moins %1 caractères.", - "tag-too-long": "Veuillez entrer un mot-clé plus court. Les mot-clés ne peuvent faire plus de %1 caractères.", + "content-too-short": "Veuillez entrer un message plus long. %1 caractère(s) minimum.", + "content-too-long": "Veuillez poster un message plus cours. Les messages ne peuvent être plus long que %1 caractère(s).", + "title-too-short": "Veuillez entrer un titre plus long. %1 caractère(s) minimum.", + "title-too-long": "Veuillez entrer un titre plus court. Les titres ne peuvent excéder %1 caractère(s).", + "too-many-posts": "Vous ne pouvez poster que toutes les %1 seconde(s).", + "too-many-posts-newbie": "En tant que nouvel utilisateur, vous ne pouvez poster que toutes les %1 seconde(s) jusqu'à ce que vous obteniez une réputation de %2 - patientez avant de publier de nouveau.", + "tag-too-short": "Veuillez entrer un mot-clé plus long. Les mots-clés doivent contenir au moins %1 caractère(s).", + "tag-too-long": "Veuillez entrer un mot-clé plus court. Les mot-clés ne peuvent faire plus de %1 caractère(s).", "file-too-big": "La taille maximale autorisée pour un fichier est de %1 kb. Veuillez envoyer un fichier plus petit.", "cant-vote-self-post": "Vous ne pouvez pas voter pour vos propres messages", "already-favourited": "Vous avez déjà mis ce message en favoris", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Les miniatures de sujet sont désactivés", "invalid-file": "Fichier invalide", "uploads-are-disabled": "Les envois sont désactivés", - "signature-too-long": "La signature ne peut dépasser %1 caractères !", + "signature-too-long": "La signature ne peut dépasser %1 caractère(s).", "cant-chat-with-yourself": "Vous ne pouvez chatter avec vous même !", "chat-restricted": "Cet utilisateur a restreint les ses messages de chat. Il doit d'abord vous suivre avant de pouvoir discuter avec lui.", "too-many-messages": "Vous avez envoyé trop de messages, veuillez patienter un instant.", diff --git a/public/language/he/error.json b/public/language/he/error.json index a40cd66ef3..d3171986cc 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "שם משתמש קצר מדי", "username-too-long": "שם משתמש ארוך מדי", "user-banned": "המשתמש חסום", - "user-too-new": "מצטערים, אתה צריך לחכות %1 שניות לפני שתוכל לפרסם את הפוסט הראשון שלך", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "קטגוריה אינה קיימת", "no-topic": "נושא אינו קיים", "no-post": "פוסט אינו קיים", @@ -36,17 +36,17 @@ "no-emailers-configured": "לא נמצאו פלאגינים למייל, לכן אין אפשרות לשלוח מייל ניסיון.", "category-disabled": "קטגוריה לא פעילה", "topic-locked": "נושא נעול", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "אנא המתן לסיום ההעלאות", - "content-too-short": "יש להכניס פוסט ארוך יותר. פוסטים חייבים להכיל לפחות %1 תווים.", - "content-too-long": "יש לקצר את הפוסט. פוסטים אינם יכולים להיות ארוכים מ %1 תווים.", - "title-too-short": "יש להכניס כותרת ארוכה יותר. כותרות חייבות להכיל לפחות %1 תווים.", - "title-too-long": "יש לקצר את הכותרת. כותרות אינן יכולות להיות ארוכות מ %1 תווים.", - "too-many-posts": "אתה יכול להעלות פוסט כל %1 שניות בלבד - אנא המתן.", - "too-many-posts-newbie": "כמשתמש חדש, אתה יכול להעלות פוסט כל %1 שניות עד שצברת %2 מוניטין - אנא המתן.", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "לא ניתן להצביע לפוסט שלך", "already-favourited": "כבר הוספת פוסט זה למועדפים", "already-unfavourited": "כבר הסרת פוסט זה מהמועדפים", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "תמונות ממוזערות לנושא אינן מאופשרות.", "invalid-file": "קובץ לא תקין", "uploads-are-disabled": "העלאת קבצים אינה מאופשרת", - "signature-too-long": "מצטערים, אורך החתימה המקסימלי הוא %1 תווים.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "לא ניתן לעשות צ'אט עם עצמך!", "chat-restricted": "משתמש זה חסם את הודעות הצ'אט שלו ממשתמשים זרים. המשתמש חייב לעקוב אחריך לפני שתוכל לשוחח איתו בצ'אט", "too-many-messages": "שלחת יותר מדי הודעות, אנא המתן לזמן מה.", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index ef8c8f24a1..e84486eb06 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Ez a fórum e-mail megerősítést kíván, kérlek kattints ide egy cím beírásához", "email-confirm-failed": "Nem tudtuk ellenőrizni az e-mail címedet, kérlek próbálkozz később.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Túl rövid felhasználónév", "username-too-long": "Túl hosszú felhasználónév", "user-banned": "Kitiltott felhasználó", - "user-too-new": "Sajnáljuk, várnod kell %1 másodpercet, mielőtt beküldenéd az első hozzászólásodat", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Nem létező kategória", "no-topic": "Nem létező téma", "no-post": "Nem létező hozzászólás", @@ -36,17 +36,17 @@ "no-emailers-configured": "Nincs levelező beállítva, ezért a teszt e-mail nem került kiküldésre.", "category-disabled": "Kategória kikapcsolva", "topic-locked": "Téma lezárva", - "post-edit-duration-expired": "A hozzászólásaidat %1 másodpercig szerkesztheted, miután beküldted azt", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "Kérlek várj, amíg a feltöltés befejeződik.", - "content-too-short": "Kérlek hosszabb hozzászólást írj be. Legalább %1 karakternek kell lennie.", - "content-too-long": "Kérlek rövidebb hozzászólást írj be. Legfeljebb %1 karakter lehet.", - "title-too-short": "Kérlek hosszabb címet válassz. Legalább %1 karakternek kell lennie.", - "title-too-long": "Kérlek rövidebb címet válassz. Legfeljebb %1 karakter lehet.", - "too-many-posts": "%1 másodpercenként csak egy hozzászólást írhatsz - kérlek várj mielőtt újból hozzászólnál", - "too-many-posts-newbie": "Mint friss tag, csak egy hozzászólást küldhetsz be %1 másodpercenként, míg nem kapsz %2 jó hírnevet - kérlek várj mielőtt újból hozzászólnál", - "tag-too-short": "Kérlek hosszabb címkét válassz. Legalább %1 karakter hosszúnak kell lennie", - "tag-too-long": "Kérlek rövidebb címkét válassz. Legfeljebb %1 karakter lehet", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Nem szavazhatsz a saját hozzászólásodra", "already-favourited": "Már bejelölted Kedvencnek ezt a hozzászólást", "already-unfavourited": "Már kivetted a Kedvenceid közül ezt a hozzászólást", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Témakör bélyegképek tíltásra kerültek.", "invalid-file": "Érvénytelen fájl", "uploads-are-disabled": "A feltöltés nem engedélyezett", - "signature-too-long": "Sajnáljuk, az aláírás nem lehet hosszabb %1 karakternél.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Nem cseveghetsz magaddal!", "chat-restricted": "Ez a felhasználó korlátozta a chat beállításait. Csak akkor cseveghetsz vele, miután felvett a követettek közé téged", "too-many-messages": "Túl sok üzenetet küldtél, kérlek várj egy picit.", diff --git a/public/language/id/error.json b/public/language/id/error.json index 8a9d67d1f3..508ebfcc6b 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Username terlalu pendek", "username-too-long": "Username terlalu panjang", "user-banned": "Pengguna dibanned", - "user-too-new": "Maaf kamu harus menunggu %1 detik sebelum membuat post pertama", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategori tidak ditemukan", "no-topic": "Topik tidak ditemukan", "no-post": "Post tidak ditemukan", @@ -36,17 +36,17 @@ "no-emailers-configured": "Tidak ada plugin email, jadi test email tidak dapat dikirim", "category-disabled": "Kategori ditiadakan", "topic-locked": "Topik dikunci", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "too-many-posts-newbie": "Sebagai pengguna baru, kamu hanya diijinkan membuat posting satu kali setiap %1 detik sampai kamu mendapatkan %2 reputasi - mohon tunggu beberapa saat sebelum melakukan posting kembali", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Kamu tidak dapat vote postingan sendiri", "already-favourited": "Post ini sudah kamu favorit", "already-unfavourited": "Postingan ini sudah kamu unfavorit", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Thumbnail di topik ditiadakan", "invalid-file": "File Salah", "uploads-are-disabled": "Upload ditiadakan", - "signature-too-long": "Maaf, tanda pengenalmu tidak dapat melebihi %1 karakter.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Kamu tidak dapat chat dengan akun sendiri", "chat-restricted": "Pengguna ini telah membatasi percakapa mereka. Mereka harus mengikutimu sebelum kamu dapat melakukan percakapan dengan mereka ", "too-many-messages": "You have sent too many messages, please wait awhile.", diff --git a/public/language/it/error.json b/public/language/it/error.json index 4dafdfe2e7..fc59c81e2c 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Non potrai chattare finchè non avrai confermato la tua email, per favore clicca qui per farlo ora.", "no-email-to-confirm": "Questo forum richiede la conferma dell'indirizzo email, per favore clicca qui per inserirne uno", "email-confirm-failed": "Non possiamo confermare la tua email, per favore prova ancora più tardi.", - "confirm-email-already-sent": "Email di conferma già inviata, per favore attendere %1 minuti per richiederne un'altra.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Nome utente troppo corto", "username-too-long": "Nome utente troppo lungo", "user-banned": "Utente bannato", - "user-too-new": "Spiacenti, devi aspettare %1 secondi prima di creare il tuo primo Post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "La Categoria non esiste", "no-topic": "Il Topic non esiste", "no-post": "Il Post non esiste", @@ -36,17 +36,17 @@ "no-emailers-configured": "Nessun plugin per le email è caricato, quindi la mail di test non può essere inviata", "category-disabled": "Categoria disabilitata", "topic-locked": "Discussione Bloccata", - "post-edit-duration-expired": "Ti è consentito modificare un post per %1 secondi dopo averlo inviato", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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": "Per favore inserisci un post più breve. I post non possono essere più lunghi di %1 caratteri.", - "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", - "too-many-posts-newbie": "Come nuovo utente puoi postare solamente una volta ogni %1 secondi finché non hai raggiunto un livello di reputazione %2 - per favore attendi prima di inviare ancora", - "tag-too-short": "Per favore inserisci un tag più lungo. I tag dovrebbero avere almeno %1 caratteri", - "tag-too-long": "Per favore inserisci un tag più corto. I tags non dovrebbero essere più lunghi di %1 caratteri", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Non puoi votare il tuo stesso post", "already-favourited": "Hai già inserito tra i preferiti questo post", "already-unfavourited": "Hai già inserito tra i Non Preferiti questo post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Le anteprime della Discussione sono disabilitate.", "invalid-file": "File non valido", "uploads-are-disabled": "Uploads disabilitati", - "signature-too-long": "Spiacenti, la tua firma non può essere lunga %1 caratteri.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Non puoi chattare con te stesso!", "chat-restricted": "Questo utente ha ristretto i suoi messaggi in chat alle persone che segue. Per poter chattare con te ti deve prima seguire.", "too-many-messages": "Hai inviato troppi messaggi, aspetta un attimo.", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index e65e892ead..f4edefb38f 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "ユーザーが停止された", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "この板は無効された", "topic-locked": "スレッドがロックされた", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "自分のポストに評価することはできません。", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "スレッドのサムネイルが無効された", "invalid-file": "無効なファイル", "uploads-are-disabled": "アップロードが無効された", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 224fb2c4ad..c9f81d74db 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "사용자 이름이 너무 짧습니다.", "username-too-long": "사용자 이름이 너무 깁니다.", "user-banned": "차단된 사용자입니다.", - "user-too-new": "죄송합니다. 첫 번째 게시물은 %1 초 후에 작성할 수 있습니다", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "존재하지 않는 카테고리입니다.", "no-topic": "존재하지 않는 주제입니다.", "no-post": "존재하지 않는 게시물입니다.", @@ -36,17 +36,17 @@ "no-emailers-configured": "이메일 추가기능이 로드되지 않았으므로 테스트 메일을 발송할 수 없습니다.", "category-disabled": "비활성화된 카테고리입니다.", "topic-locked": "잠긴 주제입니다.", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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초 간격으로 제한됩니다 - 잠시 기다렸다가 작성해주세요.", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "자신의 게시물에는 투표할 수 없습니다.", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "주제 섬네일이 이미 해제되었습니다.", "invalid-file": "올바르지 않은 파일입니다.", "uploads-are-disabled": "업로드는 비활성화되어 있습니다.", - "signature-too-long": "죄송합니다. 서명은 최대 %1자로 제한됩니다.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 2a09e177c5..b87aac771c 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Šis forumas reikalauja patvirtinimo el. paštu prašome spausti čia el. adreso įrašymui", "email-confirm-failed": "Negalime patvirtinti jūsų el. adreso, prašom bandyti vėliau.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Slapyvardis per trumpas", "username-too-long": "Vartotojo vardas per ilgas", "user-banned": "Vartotojas užblokuotas", - "user-too-new": "Atsiprašome, bet jums reikia laukti 1% sekundes prieš patalpinant savo pirmąjį įrašą", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Tokios kategorijos nėra", "no-topic": "Tokios temos nėra", "no-post": "Tokio įrašo nėra", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Kategorija išjungta", "topic-locked": "Tema užrakinta", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Jūs negalite balsuoti už savo pranešimą", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Temos paveikslėliai neleidžiami.", "invalid-file": "Klaidingas failas", "uploads-are-disabled": "Įkėlimai neleidžiami", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Jūs negalite susirašinėti su savimi!", "chat-restricted": "This user has restricted their chat messages. They must follow you before you can chat with them", "too-many-messages": "Išsiuntėte per daug pranešimų, kurį laiką prašome palaukti.", diff --git a/public/language/ms/category.json b/public/language/ms/category.json index cda1131d37..fa77df77b5 100644 --- a/public/language/ms/category.json +++ b/public/language/ms/category.json @@ -1,12 +1,12 @@ { - "new_topic_button": "\nTopik Baru", - "guest-login-post": "Log in to post", - "no_topics": "Tiada topik dalam kategori ini.
    Cuba menghantar topik yang baru?", + "new_topic_button": "Topik Baru", + "guest-login-post": "Log masuk untuk kirim", + "no_topics": "Tiada topik dalam kategori ini.
    Cuba hantar topik yang baru?", "browsing": "melihat", "no_replies": "Tiada jawapan", "share_this_category": "Kongsi kategori ini", - "watch": "Watch", - "ignore": "Ignore", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch": "Melihat", + "ignore": "Abai", + "watch.message": "Anda sedang melihat kemaskini dari kategori ini", + "ignore.message": "Anda sedang mengabaikan kemaskini dari kategori ini" } \ No newline at end of file diff --git a/public/language/ms/email.json b/public/language/ms/email.json index 4c5ca1adde..385b7b84a2 100644 --- a/public/language/ms/email.json +++ b/public/language/ms/email.json @@ -1,28 +1,28 @@ { - "password-reset-requested": "Password Reset Requested - %1!", - "welcome-to": "Selemat datang ke %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", - "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", - "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", + "password-reset-requested": "Permintaan set semula kata lalaun - %1!", + "welcome-to": "Selamat datang ke %1", + "greeting_no_name": "Salam", + "greeting_with_name": "Salam %1", + "welcome.text1": "Terima kasih kerana mendaftar dengan %1!", + "welcome.text2": "Untuk mengaktifkan akaun anda sepenuhnya, kami perlu mengesahkan bahawa anda memiliki alamat emel yang didaftarkan.", + "welcome.cta": "Klik sini untuk sahkan emel anda", + "reset.text1": "Kami menerima permintaan set semula kata laluan anda, kemungkinan kerana anda terlupa. Sekiranya tidak, sila abaikan emel ini.", + "reset.text2": "Untuk meneruskan dengan set semula kata laluan, sila klik pautan berikut:", + "reset.cta": "Klik sini untuk set semula kata laluan anda", + "reset.notify.subject": "Kata laluan berjaya ditukar", + "reset.notify.text1": "Pada %1, kata laluan anda berjaya ditukar.", + "reset.notify.text2": "Sekiranya anda tidak pernah melakukannya, sila hubungi pendtadbir / admin dengan segera.", + "digest.notifications": "Anda ada pemberitahuan yang belum dibaca, pemberitahuan dari %1:", + "digest.latest_topics": "Topik terkini dari %1", + "digest.cta": "Klik sini untuk melawat %1", + "digest.unsub.info": "Ringkasan ini dihantar berdasarkan tetapan langganan anda.", + "digest.no_topics": "Tiada topik yang aktif selama %1", + "notif.chat.subject": "Pesanan baru diterima dari %1", + "notif.chat.cta": "Klik sini untuk meneruskan perbualan", + "notif.chat.unsub.info": "Pemberitahuan sembang ini dihantar berdasarkan tetapan langganan anda.", + "notif.post.cta": "Klik sini untuk baca artikel penuh", + "notif.post.unsub.info": "Kiriman pemberitahuan ini dihantar berdasarkan tetapan langganan anda.", + "test.text1": "Ini adalah percubaan email untuk mengesahkan emailer ditetap dengan betul di NodeBB.", + "unsub.cta": "Klik sini untuk mengubah tetapan itu", "closing": "Terima Kasih!" } \ No newline at end of file diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 03f0381720..b0cc688b16 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -1,83 +1,83 @@ { - "invalid-data": "Invalid Data", - "not-logged-in": "You don't seem to be logged in.", - "account-locked": "Your account has been locked temporarily", - "search-requires-login": "Searching requires an account! Please login or register!", - "invalid-cid": "Invalid Category ID", - "invalid-tid": "Invalid Topic ID", - "invalid-pid": "Invalid Post ID", - "invalid-uid": "Invalid User ID", - "invalid-username": "Invalid Username", - "invalid-email": "Invalid Email", - "invalid-title": "Invalid title!", - "invalid-user-data": "Invalid User Data", - "invalid-password": "Password salah!", - "invalid-username-or-password": "Please specify both a username and password", - "invalid-search-term": "Invalid search term", - "invalid-pagination-value": "Invalid pagination value", - "username-taken": "Username taken", - "email-taken": "Email taken", - "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, please click here to confirm your email.", - "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", - "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "invalid-data": "Data Tak Sah", + "not-logged-in": "Anda tidak log masuk.", + "account-locked": "Akaun anda telah dikunci untuk seketika", + "search-requires-login": "Pencarian perlukan akaun! Log masuk atau daftar!", + "invalid-cid": "Kategori ID Tak Sah", + "invalid-tid": "Topik ID Tak Sah", + "invalid-pid": "Kiriman ID Tak Sah", + "invalid-uid": "ID Pengguna Tak Sah", + "invalid-username": "Nama Pengguna Tak Sah", + "invalid-email": "Emel Tak Sah", + "invalid-title": "Tajuk Tak Sah!", + "invalid-user-data": "Data Pengguna Tak Sah", + "invalid-password": "Kata laluan salah!", + "invalid-username-or-password": "Sila tentukan kedua-dua nama pengguna dan kata laluan", + "invalid-search-term": "Terma pencarian tak sah", + "invalid-pagination-value": "Nilai halaman tak sah", + "username-taken": "Nama pengguna telah digunakan", + "email-taken": "Emel telah digunakan", + "email-not-confirmed": "Emel anda belum disahkan lagi, sila klik sini untuk mengesahkan emel anda.", + "email-not-confirmed-chat": "Anda tidak dibenarkan sembang sehingga emel disahkan, sila sahkan emel anda.", + "no-email-to-confirm": "Forum ini memerlukan pengesahan emel, sila klik sini untuk memasukkan emel", + "email-confirm-failed": "Kami tidak dapat memastikan emel anda, sila cuba lagi nanti", + "confirm-email-already-sent": "Pengesahan emel telah dihantar, sila tunggu %1 minit() untuk menghantar yang baru.", "username-too-short": "Nama pengunna terlalu pendek", - "username-too-long": "Username too long", - "user-banned": "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", - "category-disabled": "Category disabled", - "topic-locked": "Topic Locked", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", - "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", - "cant-vote-self-post": "You cannot vote for your own post", - "already-favourited": "You have already favourited this post", - "already-unfavourited": "You have already unfavourited this post", - "cant-ban-other-admins": "You can't ban other admins!", - "invalid-image-type": "Invalid image type. Allowed types are: %1", - "invalid-image-extension": "Invalid image extension", - "invalid-file-type": "Invalid file type. Allowed types are: %1", - "group-name-too-short": "Group name too short", - "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", - "topic-already-deleted": "This topic has already been deleted", - "topic-already-restored": "This topic has already been restored", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", - "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", - "invalid-file": "Invalid File", - "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", - "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", - "not-enough-reputation-to-downvote": "You do not have enough reputation to downvote this post", - "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", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "username-too-long": "Nama pengunna terlalu panjang", + "user-banned": "Pengguna diharamkan", + "user-too-new": "Maaf, anda dikehendaki menunggu %1 saat() sebelum membuat kiriman pertama anda", + "no-category": "Kategori tidak wujud", + "no-topic": "Topik tidak wujud", + "no-post": "Kiriman tidak wujud", + "no-group": "Kumpulan tidak wujud", + "no-user": "Pengguna tidak wujud", + "no-teaser": "Pengusik tidak wujud", + "no-privileges": "Anda tidak mempunyai cukup keistimewaan untuk perbuatan ini.", + "no-emailers-configured": "Tiada plug-in emel dimuatkan, jadi emel percubaan tidak dihantar", + "category-disabled": "Kategori dilumpuhkan", + "topic-locked": "Topik Dikunci", + "post-edit-duration-expired": "Anda hanya dibenarkan menyunting kiriman selepas %1 saat() berlalu", + "still-uploading": "Sila tunggu muatnaik untuk siap.", + "content-too-short": "Sila masukkan kiriman yang lebih panjang. Kiriman mesti mengandungi sekurang-kurangnya %1 aksara().", + "content-too-long": "Sila masukkan kiriman yang lebih ringkas. Kiriman mesti mengandungi tidak lebih %1 aksara().", + "title-too-short": "Sila masukkan tajuk yang lebih panjang. Tajuk mesti mengandungi sekurang-kurangnya %1 aksara().", + "title-too-long": "Sila masukkan tajuk yang lebih ringkas. Tajuk mesti mengandungi tidak lebih %1 aksara().", + "too-many-posts": "Anda hanya boleh mengirim sekali setiap %1 saat() - sila tunggu sebelum kiriman seterusnya", + "too-many-posts-newbie": "Sebagai pengguna baru, anda hanya boleh mengirim sekali setiap %1 saat() sehinnga anda mendapat %2 reputasi - sila tunggu sebelum kiriman seterusnya", + "tag-too-short": "Sila masukkan tag yang lebih panjang. Tag mesti mengandungi sekurang-kurangnya %1 aksara()", + "tag-too-long": "Sila masukkan tag yang lebih pendek. Tag mesti mengandungi tidak lebih %1 aksara()", + "file-too-big": "Maksimum saiz fail yang dibenarkan ialah %1 kB - sila muatnaik fail yang lebih kecil", + "cant-vote-self-post": "Anda tidak boleh mengundi kiriman sendiri", + "already-favourited": "Anda telah pun menggemari kiriman ini", + "already-unfavourited": "Anda telah pun nyah-gemar kiriman ini", + "cant-ban-other-admins": "Anda tidak boleh haramkan admin / pentadbir!", + "invalid-image-type": "Jenis imej tak sah. Jenis yang dibenarkan ialah: %1", + "invalid-image-extension": "Sambungan imej tak sah", + "invalid-file-type": "Jenis fail tak sah. Jenis fail yang dibenarkan ialah: %1", + "group-name-too-short": "Nama kumpulan terlalu pendek", + "group-already-exists": "Kumpulan telah wujud", + "group-name-change-not-allowed": "Pengubahan nama kumpulan tidak dibenarkan", + "group-already-member": "Anda telah pun menjadi ahli kumpulan ini", + "group-needs-owner": "Kumpulan ini memerlukan sekurang-kurangnya seorang pemilik", + "post-already-deleted": "Kiriman ini telah dipadam", + "post-already-restored": "Kiriman ini telah dipulihkan", + "topic-already-deleted": "Topik ini telah dipadam", + "topic-already-restored": "Kiriman ini telah dipulihkan", + "cant-purge-main-post": "Anda tidak boleh memadam, kiriman utama, sebaliknya sila pada topik", + "topic-thumbnails-are-disabled": "Topik kecil dilumpuhkan.", + "invalid-file": "Fail tak sah", + "uploads-are-disabled": "Muatnaik dilumpuhkan", + "signature-too-long": "Maaf, tandatangan tidak boleh lebih daripada %1 aksara().", + "cant-chat-with-yourself": "Anda tidak boleh sembang dengan diri sendiri!", + "chat-restricted": "Pengguna ini menyekat ruangan sembangnya. Dia hendaklah mengikut anda sebelum kalian dapat bersembang", + "too-many-messages": "Anda menghantar terlalu banyak pesanan, sila tunggu seketika.", + "reputation-system-disabled": "Sistem reputasi dilumpuhkan.", + "downvoting-disabled": "Undi turun dilumpuhkan", + "not-enough-reputation-to-downvote": "Anda tidak mempunyai reputasi mencukupi untuk mengundi turun kiriman ini", + "not-enough-reputation-to-flag": "Anda tidak mempunyai reputasi mencukupi untuk menanda kiriman ini", + "reload-failed": "NodeBB menemui masalah ketika muat semula: \"%1\". NodeBB akan terus melayan aset pelanggan sedia ada, tapi anda seharusnya undur perbuatan yang dilakukan sebelum muat semula.", + "registration-error": "Ralat pendaftaran.", + "parse-error": "Sesuatu tidak kena berlaku ketika menghuraikan repson pelayan (server)", + "wrong-login-type-email": "Sila guna emel anda untuk log masuk", + "wrong-login-type-username": "Sila guna nama pengguna anda untuk log masuk" } \ No newline at end of file diff --git a/public/language/ms/global.json b/public/language/ms/global.json index 438206d7ef..5b1c91d6bb 100644 --- a/public/language/ms/global.json +++ b/public/language/ms/global.json @@ -3,64 +3,64 @@ "search": "Cari", "buttons.close": "Tutup", "403.title": "Akses dinafikan", - "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": "Anda tidak mempunyai kebenaran untuk melihat halaman ini", + "403.login": "Mungkin anda boleh cuba log masuk?", "404.title": "tidak dijumpai", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "Halaman yang diminta tidak wujud. Kembali ke halaman utama.", "500.title": "ralat dalaman", - "500.message": "Oops! ada yang tidak kena", + "500.message": "Oops! Macam ada yang tidak kena", "register": "Daftar", "login": "Log Masuk", "please_log_in": "Sila daftar masuk", "logout": "Log Keluar", "posting_restriction_info": "Kiriman terhad kepada pengguna berdaftar sahaja, Sila click disini untuk daftar masuk", - "welcome_back": "Welcome Back", - "you_have_successfully_logged_in": "Anda telah daftar keluar", - "save_changes": "simpan perubahan", + "welcome_back": "Selamat kembali", + "you_have_successfully_logged_in": "Anda telah berjaya log masuk", + "save_changes": "Simpan perubahan", "close": "Tutup", "pagination": "Mukasurat", "pagination.out_of": "%1 out of %2", - "pagination.enter_index": "Enter index", + "pagination.enter_index": "Masukkan indeks", "header.admin": "Pentadbir", - "header.recent": "terkini", + "header.recent": "Terkini", "header.unread": "Belum dibaca", "header.tags": "Tags", - "header.popular": "popular", - "header.users": "pengguna", - "header.groups": "Groups", - "header.chats": "chats", - "header.notifications": "makluman", + "header.popular": "Popular", + "header.users": "Pengguna", + "header.groups": "Kumpulan", + "header.chats": "Sembang", + "header.notifications": "Pemberitahuan", "header.search": "Cari", - "header.profile": "profil", - "notifications.loading": "Makluman sedang dimuatkan", - "chats.loading": "chats sedang dimuatkan", + "header.profile": "Profil", + "notifications.loading": "Pemberitahuan sedang dimuatkan", + "chats.loading": "Sembang sedang dimuatkan", "motd.welcome": "Selamat datang ke NodeBB, platfom perbincangan masa hadapan", "previouspage": "Laman sebelum", "nextpage": "Laman berikut", "alert.success": "berjaya", "alert.error": "ralat", "alert.banned": "Diharamkan", - "alert.banned.message": "You have just been banned, you will now be logged out.", + "alert.banned.message": "Amda baru sahaja diharamkan, anda sekarang akan di log keluar.", "alert.unfollow": "Anda tidak lagi mengikuti %1", "alert.follow": "Anda sekarang mengikuti %1", "online": "dalam talian", - "users": "Users", - "topics": "Topics", + "users": "Pengguna", + "topics": "Topik", "posts": "Kiriman", - "views": "paparan", - "reputation": "Reputation", - "read_more": "read more", - "posted_ago_by_guest": "posted %1 by Guest", - "posted_ago_by": "posted %1 by %2", - "posted_ago": "posted %1", - "posted_in_ago_by_guest": "posted in %1 %2 by Guest", - "posted_in_ago_by": "posted in %1 %2 by %3", - "posted_in_ago": "posted in %1 %2", - "replied_ago": "replied %1", - "user_posted_ago": "%1 posted %2", - "guest_posted_ago": "Guest posted %1", - "last_edited_by_ago": "last edited by %1 %2", - "norecentposts": "Tiada posting terkini", + "views": "Paparan", + "reputation": "Reputasi", + "read_more": "baca lafi", + "posted_ago_by_guest": "dikirim %1 oleh pelawat", + "posted_ago_by": "dikirim %1 oleh %2", + "posted_ago": "dikirim %1", + "posted_in_ago_by_guest": "dikirim pada %1 %2 oleh pelawat", + "posted_in_ago_by": "dikirim pada %1 %2 oleh %3", + "posted_in_ago": "dikirim pada %1 %2", + "replied_ago": "dibalas %1", + "user_posted_ago": "%1 mengirim %2", + "guest_posted_ago": "Pelawat mengirim %1", + "last_edited_by_ago": "terakhir disunting oleh %1 %2", + "norecentposts": "Tiada kiriman terkini", "norecenttopics": "Tiada topik terkini", "recentposts": "Kiriman terkini", "recentips": "IP berdaftar terkini", @@ -70,12 +70,12 @@ "offline": "Tidak ditalian", "email": "Emel", "language": "Bahasa", - "guest": "Guest", - "guests": "Guests", - "updated.title": "Forum Updated", - "updated.message": "This forum has just been updated to the latest version. Click here to refresh the page.", - "privacy": "Privacy", - "follow": "Follow", - "unfollow": "Unfollow", - "delete_all": "Delete All" + "guest": "Pelawat", + "guests": "Pelawat", + "updated.title": "Forum Dikemaskini", + "updated.message": "Forum ini baru dshsjs dikemaskini ke versi terkini. Klik sini untuk segar semula halaman.", + "privacy": "Privasi", + "follow": "Ikut", + "unfollow": "Nyah-ikut", + "delete_all": "Padam Semua" } \ No newline at end of file diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index 5e301aa46a..767f1e778f 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -1,36 +1,36 @@ { - "groups": "Groups", - "view_group": "View Group", - "owner": "Group Owner", - "new_group": "Create New Group", - "no_groups_found": "There are no groups to see", - "pending.accept": "Accept", - "pending.reject": "Reject", - "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", - "details.grant": "Grant/Rescind Ownership", - "details.kick": "Kick", - "details.owner_options": "Group Administration", - "details.group_name": "Group Name", - "details.member_count": "Member Count", - "details.creation_date": "Creation Date", - "details.description": "Description", - "details.badge_preview": "Badge Preview", - "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", - "details.badge_text": "Badge Text", - "details.userTitleEnabled": "Show Badge", - "details.private_help": "If enabled, joining of groups requires approval from a group owner", - "details.hidden": "Hidden", - "details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually", - "event.updated": "Group details have been updated", - "event.deleted": "The group \"%1\" has been deleted" + "groups": "Kumpulan", + "view_group": "Lihat Kumpulan", + "owner": "Pemilik Kumpulan", + "new_group": "Buat Kumpulan Baru", + "no_groups_found": "Tiada kumpulan untuk dilihat", + "pending.accept": "Terima", + "pending.reject": "Tolak", + "cover-instructions": "Seret dan lepas gambar, lepas ke posisi, dan tekan Simpan", + "cover-change": "Ubah", + "cover-save": "Simpan", + "cover-saving": "Menyimpan", + "details.title": "Perincian Kumpulan", + "details.members": "Senarai Ahli", + "details.pending": "Ahli Menunggu", + "details.has_no_posts": "Kumpulan ahli kumpulan ini belum membuat sebarang kiriman.", + "details.latest_posts": "Kiriman Terkini", + "details.private": "Privasi", + "details.grant": "Pemberian/Pembatalan pemilikan", + "details.kick": "Tendang", + "details.owner_options": "Pentadbiran Kumpulan", + "details.group_name": "Nama Kumpulan", + "details.member_count": "Kiraan Ahli", + "details.creation_date": "Tarikh Dicipta", + "details.description": "Penerangan", + "details.badge_preview": "Pra-lihat Lencana", + "details.change_icon": "Tukar Ikon", + "details.change_colour": "Tukar Warna", + "details.badge_text": "Teks Lencana", + "details.userTitleEnabled": "Tunjuk Lencana", + "details.private_help": "Jika dibolehkan, menyertai kumpulan memerlukan kelulusan pemilik kumpulan", + "details.hidden": "Sembunyi", + "details.hidden_help": "Jika dibolehkan, kumpulan ini tidak akan dijumpai di senarai kumpulan, dan pengguna hendaklah di jemput secara manual", + "event.updated": "Perincian kumpulan telah dikemaskini", + "event.deleted": "Kumpulan \"%1\" telah dipadam" } \ No newline at end of file diff --git a/public/language/ms/login.json b/public/language/ms/login.json index 3f0d1e37ea..7536a7c973 100644 --- a/public/language/ms/login.json +++ b/public/language/ms/login.json @@ -1,11 +1,11 @@ { - "username-email": "Username / Email", - "username": "Username", - "email": "Email", - "remember_me": "Ingat Saya?", + "username-email": "Nama pengguna / Emel", + "username": "Nama pengguna", + "email": "Emel", + "remember_me": "Ingatkan Saya", "forgot_password": "Lupa Kata Laluan?", - "alternative_logins": "Login Alternatif", - "failed_login_attempt": "Login gagal, sila cuba lagi.", - "login_successful": "Anda berjaya login!", - "dont_have_account": "Don't have an account?" + "alternative_logins": "Log Masuk Alternatif", + "failed_login_attempt": "Log masuk gagal, sila cuba lagi.", + "login_successful": "Anda berjaya log masuk!", + "dont_have_account": "Tiada akaun?" } \ No newline at end of file diff --git a/public/language/ms/modules.json b/public/language/ms/modules.json index 5e83239dcb..a284cae6fe 100644 --- a/public/language/ms/modules.json +++ b/public/language/ms/modules.json @@ -1,26 +1,26 @@ { "chat.chatting_with": "Bercakap dengan ", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "Taip pesanan di sini, tekan ENTER untuk hantar", "chat.send": "hantar", "chat.no_active": "Anda tiada pesanan yang aktif", "chat.user_typing": "%1 menaip", - "chat.user_has_messaged_you": "%1 has messaged you.", - "chat.see_all": "See all Chats", - "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", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", - "composer.user_said_in": "%1 said in %2:", - "composer.user_said": "%1 said:", - "composer.discard": "Are you sure you wish to discard this post?", - "composer.submit_and_lock": "Submit and Lock", - "composer.toggle_dropdown": "Toggle Dropdown" + "chat.user_has_messaged_you": "%1 mesej anda.", + "chat.see_all": "Lihat semua Sembang", + "chat.no-messages": "Sila pilih penerima untuk lihat sejarah sembang", + "chat.recent-chats": "Sembang Terbaru", + "chat.contacts": "Hubungi", + "chat.message-history": "Sejarah Pesanan", + "chat.pop-out": "Pop keluar sembang", + "chat.maximize": "Memaksimum", + "chat.seven_days": "7 Hari", + "chat.thirty_days": "30 Hari", + "chat.three_months": "3 Bulan", + "composer.compose": "Tulis", + "composer.show_preview": "Pra-lihat", + "composer.hide_preview": "Sorok pra-lihat", + "composer.user_said_in": "%1 disebut di %2:", + "composer.user_said": "%1 berkata:", + "composer.discard": "Anda yakin untuk membuang kiriman ini?", + "composer.submit_and_lock": "Hantar dan Kunci", + "composer.toggle_dropdown": "Togol Kebawah" } \ No newline at end of file diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index e8fffb1cd8..0d8fccbef6 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -1,27 +1,27 @@ { "title": "pemberitahuan", "no_notifs": "Anda tiada pemberitahuan baru", - "see_all": "LIhat semua pemberitahuan", - "mark_all_read": "Mark all notifications read", - "back_to_home": "Back to %1", + "see_all": "Lihat semua pemberitahuan", + "mark_all_read": "Tandakan semua pemberitahuan sudah dibaca", + "back_to_home": "Kembali ke %1", "outgoing_link": "Sambungan luar", - "outgoing_link_message": "You are now leaving %1.", - "continue_to": "Continue to %1", - "return_to": "Return to %1", + "outgoing_link_message": "Anda sedang meninggalkan %1.", + "continue_to": "Sambung ke %1", + "return_to": "Kembali ke %1", "new_notification": "Pemberitahuan baru", - "you_have_unread_notifications": "Anda ada pemberitahuan yang belum dibaca", + "you_have_unread_notifications": "Ada pemberitahuan yang belum dibaca", "new_message_from": "Pesanan baru daripada %1", - "upvoted_your_post_in": "%1 has upvoted your post in %2.", - "moved_your_post": "%1 has moved your post.", - "moved_your_topic": "%1 has moved your topic.", - "favourited_your_post_in": "%1 has favourited your post in %2.", - "user_flagged_post_in": "%1 flagged a post in %2", - "user_posted_to": "%1 telah membalas posting kepada: %2", - "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-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", - "email-confirm-sent": "Confirmation email sent." + "upvoted_your_post_in": "%1 telah mengundi naik kiriman and di %2.", + "moved_your_post": "%1 telah memindahkan kiriman anda.", + "moved_your_topic": "%1 telah memindahkan topik anda.", + "favourited_your_post_in": "%1 menggemari kiriman and di %2.", + "user_flagged_post_in": "%1 menanda kiriman anda di %2", + "user_posted_to": "%1 telah membalas kiriman kepada: %2", + "user_posted_topic": "%1 membuka topik baru : %2", + "user_mentioned_you_in": "%1 sebut anda di %2", + "user_started_following_you": "%1 mula mengikut anda.", + "email-confirmed": "EMel Disahkan", + "email-confirmed-message": "Terima kasih kerana mengesahkan emel anda. Akaun anda telah diaktifkan sepenuhnya.", + "email-confirm-error-message": "Berlaku masalah semasa mengesahkan emel anda. Mungkin kod tidak sah atau tamat tempoh.", + "email-confirm-sent": "Pengesahan emel telah dihantar." } \ No newline at end of file diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index d7b4bb0b72..07d202fb98 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -5,17 +5,17 @@ "recent": "Topik Baru", "users": "Pengguna Berdaftar", "notifications": "Makluman", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "Tag", + "tag": "Topik ditag di bawwah \"%1\"", "user.edit": "Menyunting \"%1\"", - "user.following": "Pengguna yang %1 Ikuti", - "user.followers": "Pengguna yang Mengikuti %1", + "user.following": "Pengguna yang %1 diikuti", + "user.followers": "Pengguna yang Mengikut %1", "user.posts": "Kiriman dibuat oleh %1", "user.topics": "Topik dibuat oleh %1", - "user.groups": "%1's Groups", + "user.groups": "Kumpulan-kumpulan %1", "user.favourites": "Mesej Kegemaran %1", - "user.settings": "Tetapan pengguna", - "user.watched": "Topics watched by %1", - "maintenance.text": "%1 is currently undergoing maintenance. Please come back another time.", - "maintenance.messageIntro": "Additionally, the administrator has left this message:" + "user.settings": "Tetapan Pengguna", + "user.watched": "Topik yand dilihat oleh %1", + "maintenance.text": "%1 sedang berada dalam mod pembaikpulihan. Sila cuba lagi nanti.", + "maintenance.messageIntro": "Tambahan, admin meninggalkan mesej ini :" } \ No newline at end of file diff --git a/public/language/ms/recent.json b/public/language/ms/recent.json index fe18961628..a2fc732a76 100644 --- a/public/language/ms/recent.json +++ b/public/language/ms/recent.json @@ -3,17 +3,17 @@ "day": "Hari", "week": "Minggu", "month": "Bulan", - "year": "Year", - "alltime": "All Time", + "year": "Tahun", + "alltime": "Selamanya", "no_recent_topics": "Tiada topik terkini", - "no_popular_topics": "There are no popular 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." + "no_popular_topics": "Tiada topik popular.", + "there-is-a-new-topic": "Ada topik baru.", + "there-is-a-new-topic-and-a-new-post": "Ada topik baru dan kiriman baru.", + "there-is-a-new-topic-and-new-posts": "Ada topik baru dan %1 kiriman baru.", + "there-are-new-topics": "Ada %1 topik baru.", + "there-are-new-topics-and-a-new-post": "Ada %1 topik-topik dan kiriman-kiriman baru.", + "there-are-new-topics-and-new-posts": "Ada %1 topik baru dan %2 kiriman baru.", + "there-is-a-new-post": "Ada kiriman baru.", + "there-are-new-posts": "Ada %1 kiriman baru.", + "click-here-to-reload": "Klik sini untuk muat semula." } \ No newline at end of file diff --git a/public/language/ms/reset_password.json b/public/language/ms/reset_password.json index 596b035386..cb2fd6f183 100644 --- a/public/language/ms/reset_password.json +++ b/public/language/ms/reset_password.json @@ -1,17 +1,17 @@ { - "reset_password": "Menetapkan semula password", - "update_password": "Mengemaskini password", - "password_changed.title": "Password diubah", - "password_changed.message": "p>Password telah ditetapkan semula, Sila log masuk semula.", + "reset_password": "Menetapkan semula kata laluan", + "update_password": "Mengemaskini kata laluan", + "password_changed.title": "Kata laluan diubah", + "password_changed.message": "p>Kata laluan telah ditetapkan semula, Sila log masuk semula.", "wrong_reset_code.title": "Kod penetapan semula yang salah", - "wrong_reset_code.message": "Kod penetapan semua salah. Sila cuba lagi, atau mohon semula kod penetapan .", - "new_password": "Password baru", - "repeat_password": "Sahkan password", + "wrong_reset_code.message": "Kod penetapan semula salah. Sila cuba lagi, atau mohon semula kod penetapan .", + "new_password": "Kata laluan baru", + "repeat_password": "Sahkan kata laluan", "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", + "password_reset_sent": "Penetapan semula kata laluan telah dihantar", "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.", - "password_expired": "Your password has expired, please choose a new password" + "password_too_short": "Kata lauan terlalu pendek, sila pilih kata laluan yang lain", + "passwords_do_not_match": "Kedua-dua laluan yang dimasukkan tidak sepadan / tidak sama", + "password_expired": "Kata laluan telah tamat tempoh, pilih kata laluan baru" } \ No newline at end of file diff --git a/public/language/ms/search.json b/public/language/ms/search.json index 277c0a32bc..8248f9adec 100644 --- a/public/language/ms/search.json +++ b/public/language/ms/search.json @@ -1,40 +1,40 @@ { - "results_matching": "%1 result(s) matching \"%2\", (%3 seconds)", - "no-matches": "No matches found", - "advanced-search": "Advanced Search", - "in": "In", - "titles": "Titles", - "titles-posts": "Titles and Posts", - "posted-by": "Posted by", - "in-categories": "In Categories", - "search-child-categories": "Search child categories", - "reply-count": "Reply Count", - "at-least": "At least", - "at-most": "At most", - "post-time": "Post time", - "newer-than": "Newer than", - "older-than": "Older than", - "any-date": "Any date", - "yesterday": "Yesterday", - "one-week": "One week", - "two-weeks": "Two weeks", - "one-month": "One month", - "three-months": "Three months", - "six-months": "Six months", - "one-year": "One year", - "sort-by": "Sort by", - "last-reply-time": "Last reply time", - "topic-title": "Topic title", - "number-of-replies": "Number of replies", - "number-of-views": "Number of views", - "topic-start-date": "Topic start date", - "username": "Username", - "category": "Category", - "descending": "In descending order", - "ascending": "In ascending order", - "save-preferences": "Save preferences", - "clear-preferences": "Clear preferences", - "search-preferences-saved": "Search preferences saved", - "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "results_matching": "%1 hasil sepadan \"%2\", (%3 saat)", + "no-matches": "Tiada padanan dijumpai", + "advanced-search": "Pencarian Lebih Mendalam", + "in": "Dalam", + "titles": "Tajuk", + "titles-posts": "Tajuk dan kiriman", + "posted-by": "Dikirim oleh", + "in-categories": "Dalam kategori", + "search-child-categories": "Cari anak kategori", + "reply-count": "Kira Balasan", + "at-least": "Sekurang-kurangnya", + "at-most": "Selebihnya", + "post-time": "Masa kiriman", + "newer-than": "Baru daripada", + "older-than": "Lama daripada", + "any-date": "Mana-mana masa", + "yesterday": "Semalam", + "one-week": "Seminggu", + "two-weeks": "Dua minggu", + "one-month": "Sebulan", + "three-months": "Tiga bulan", + "six-months": "Enam bulan", + "one-year": "Setahun", + "sort-by": "Susun mengikut", + "last-reply-time": "Masa balasan terakhir", + "topic-title": "Tajuk topik", + "number-of-replies": "Jumlah dibalas", + "number-of-views": "Jumlah dilihat", + "topic-start-date": "Tarikh topik mula", + "username": "Nama pengguna", + "category": "Kategori", + "descending": "Tertib menurun", + "ascending": "Tertib menaik", + "save-preferences": "Simpan butiran", + "clear-preferences": "Bersihkan butiran", + "search-preferences-saved": "Cari butiran yang disimpan", + "search-preferences-cleared": "Cari butiran yang diersihkan", + "show-results-as": "Tunjuk hasil sebagai" } \ No newline at end of file diff --git a/public/language/ms/success.json b/public/language/ms/success.json index fde8a77044..ca52454bf7 100644 --- a/public/language/ms/success.json +++ b/public/language/ms/success.json @@ -1,6 +1,6 @@ { - "success": "Success", - "topic-post": "You have successfully posted.", - "authentication-successful": "Authentication Successful", - "settings-saved": "Settings saved!" + "success": "Berjaya", + "topic-post": "Kiriman anda berjaya dihantar.", + "authentication-successful": "Pengesahan Berjaya", + "settings-saved": "Tetapan disimpan!" } \ No newline at end of file diff --git a/public/language/ms/tags.json b/public/language/ms/tags.json index c416d8d4ec..ad9c9350a7 100644 --- a/public/language/ms/tags.json +++ b/public/language/ms/tags.json @@ -1,7 +1,7 @@ { - "no_tag_topics": "There are no topics with this tag.", - "tags": "Tags", - "enter_tags_here": "Enter tags here, between %1 and %2 characters each.", - "enter_tags_here_short": "Enter tags...", - "no_tags": "There are no tags yet." + "no_tag_topics": "Tiada topik untuk tag ini.", + "tags": "Tag", + "enter_tags_here": "Masukkan tag sini, masing-masing antara %1 dan %2 aksara.", + "enter_tags_here_short": "Masukkan tag ...", + "no_tags": "Belum ada tag." } \ No newline at end of file diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index e173c79263..fc1c334a0d 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -4,18 +4,18 @@ "topic_id_placeholder": "Masukkan ID topik", "no_topics_found": "Tiada topik yang ditemui", "no_posts_found": "Tiada kirim yang dijumpai", - "post_is_deleted": "This post is deleted!", + "post_is_deleted": "Kiriman ini di padam!", "profile": "Profil", - "posted_by": "Posted by %1", - "posted_by_guest": "Posted by Guest", + "posted_by": "Dikirim oleh %1", + "posted_by_guest": "Dikirim oleh pelawat", "chat": "Sembang", "notify_me": "Kekal dimaklumkan berkenaan respon dalam topik ini", "quote": "Petikan", "reply": "Balas", - "guest-login-reply": "Log in to reply", - "edit": "Edit", + "guest-login-reply": "Log masuk untuk balas", + "edit": "Sunting", "delete": "Padamkan", - "purge": "Purge", + "purge": "Singkirkan", "restore": "Pulihkan", "move": "Pindahkan", "fork": "Fork", @@ -23,77 +23,77 @@ "share": "Kongsi", "tools": "Perkakas", "flag": "Tanda", - "locked": "Locked", - "bookmark_instructions": "Clik disini untuk kembali ke posisi sebelumnya atau tutup untuk mengabaikan", - "flag_title": "Tanda posting ini untuk moderasi", + "locked": "Kunci", + "bookmark_instructions": "Klik disini untuk kembali ke posisi sebelumnya atau tutup untuk mengabaikan", + "flag_title": "Tanda kiriman ini untuk diselia", "flag_confirm": "Adakah anda pasti untuk menanda kiriman ini", - "flag_success": "Kiriman ini telah ditandakan untuk moderasi", - "deleted_message": "This topic has been deleted. Only users with topic management privileges can see it.", - "following_topic.message": "Anda akan menerima makluman apabila ada kiriman kedalam topik ini", + "flag_success": "Kiriman ini telah ditandakan untuk diselia", + "deleted_message": "Topik ini telah dipadam. Hanya pengguna dengan kuasa pengurusan boleh melihatnya.", + "following_topic.message": "Anda akan menerima makluman apabila ada kiriman ke dalam topik ini", "not_following_topic.message": "Anda tidak lagi akan menerima makluman daripada topik ini", - "login_to_subscribe": "SIla daftar atau log masuk untuk melanggani topik ini", + "login_to_subscribe": "Sila daftar atau log masuk untuk melanggani topik ini", "markAsUnreadForAll.success": "Topik ditanda sebagai belum dibaca untuk semua", - "watch": "Saksikan", - "unwatch": "Unwatch", + "watch": "Lihat", + "unwatch": "Batal lihat", "watch.title": "Akan dimaklumkan sekiranya ada balasan dalam topik ini", - "unwatch.title": "Stop watching this topic", + "unwatch.title": "Berhenti melihat topik ini", "share_this_post": "Kongsi kiriman ini", - "thread_tools.title": "Topic Tools", + "thread_tools.title": "Perkakas Topik", "thread_tools.markAsUnreadForAll": "Tanda sebagai belum dibaca", "thread_tools.pin": "Pinkan topik", - "thread_tools.unpin": "Unpin topik", + "thread_tools.unpin": "Batalkan pin topik", "thread_tools.lock": "Kunci topik", "thread_tools.unlock": "Buka kekunci topik", "thread_tools.move": "Pindahkan topik", - "thread_tools.move_all": "Move All", + "thread_tools.move_all": "Pindahkan Semua", "thread_tools.fork": "Fork topik", "thread_tools.delete": "Padamkan topik", - "thread_tools.delete_confirm": "Are you sure you want to delete this topic?", + "thread_tools.delete_confirm": "Anda yakin untuk padamkan topik ini?", "thread_tools.restore": "Pulihkan topik", - "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?", + "thread_tools.restore_confirm": "Anda yakin untuk pulihkan topik ini?", + "thread_tools.purge": "Singkirkan Topik", + "thread_tools.purge_confirm": "Anda yakin untuk singkirkan topik ini?", "topic_move_success": "Topik telah dipindahkan ke %1", "post_delete_confirm": "Adakah anda pasti untuk memadam kiriman ini?", "post_restore_confirm": "Adakah anda pasti untuk memulihkan kiriman ini?", - "post_purge_confirm": "Are you sure you want to purge this post?", + "post_purge_confirm": "Adakah anda pasti untuk singkirkan kiriman ini?", "load_categories": "Memuatkan kategori", "disabled_categories_note": "Kategori yang disekat diwarnakan kelabu", "confirm_move": "Pindahkan", "confirm_fork": "Salin", "favourite": "Kegemaran", - "favourites": "Kegemaran - kegemaran", + "favourites": "Kegemaran-kegemaran", "favourites.has_no_favourites": "Anda tiada sebarang kegemaran, tandakan kiriman yang digemari untuk dilihat disini", - "loading_more_posts": "Memuatkan lagi kiriman ", + "loading_more_posts": "Memuatkan lagi kiriman", "move_topic": "Pindahkan topik", - "move_topics": "Move Topics", + "move_topics": "Pindahkan topik-topik", "move_post": "Pindahkan kiriman", "post_moved": "Kiriman dipindahkan", "fork_topic": "Salin topik", "topic_will_be_moved_to": "Topik ini akan dipindahkan kepada kategori", - "fork_topic_instruction": "Clik kiriman yang anda hendak salin", + "fork_topic_instruction": "Klik kiriman yang anda hendak salin", "fork_no_pids": "Tiada kiriman yang dipilih", - "fork_success": "Successfully forked topic! Click here to go to the forked topic.", + "fork_success": "Berjaya menyalin topik. Klik sini untuk ke topik yang disalin.", "composer.title_placeholder": "Masukkan tajuk topik disini", - "composer.handle_placeholder": "Name", + "composer.handle_placeholder": "Nama", "composer.discard": "Abaikan", "composer.submit": "Hantar", - "composer.replying_to": "Replying to %1", + "composer.replying_to": "Balas ke %1", "composer.new_topic": "Topik baru", "composer.uploading": "Memuat naik ...", - "composer.thumb_url_label": "Pastekan gambaran URL", + "composer.thumb_url_label": "Tampalkan gambaran URL", "composer.thumb_title": "Letakkan gambaran kepada topik ini", "composer.thumb_url_placeholder": "http://example.com/thumb.png", "composer.thumb_file_label": "Atau muat naik fail", "composer.thumb_remove": "Bersihkan kawasan", "composer.drag_and_drop_images": "Seret dan lepaskan imej disini", - "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" + "more_users_and_guests": "%1 lebih pengguna(-pengguna) dan %2 pelawat(-pelawat)", + "more_users": "%1 lebih pengguna(-pengguna)", + "more_guests": "%1 lebih pelawat(-pelawat)", + "users_and_others": "%1 dan %2 lain-lain", + "sort_by": "Susun ikut", + "oldest_to_newest": "Lama ke Baru", + "newest_to_oldest": "Baru ke Lama", + "most_votes": "Terbanyak Undi", + "most_posts": "Terbanyak Kiriman" } \ No newline at end of file diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 28a02735cb..305f15bdb8 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -2,12 +2,12 @@ "banned": "Diharamkan", "offline": "Tidak ditalian", "username": "Nama pengguna", - "joindate": "Join Date", - "postcount": "Post Count", + "joindate": "Tarikh Mula", + "postcount": "Jumlah Kiriman", "email": "Emel", - "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": "Pastikan Emel", + "delete_account": "Padam Akaun", + "delete_account_confirm": "Anda yakin untuk paddam akaun anda?
    Pebuatan ini tidak boleh diundur dan anda tidak boleh memulihkan sebarang data anda.

    Masukkan nama pengguna anda untuk memastikan anda benar-benar ingin memadam akaun ini.", "fullname": "Nama penuh", "website": "Laman Web", "location": "Lokasi", @@ -18,66 +18,66 @@ "profile_views": "Lihat profil", "reputation": "Reputasi", "favourites": "Kegemaran", - "watched": "Watched", + "watched": "Melihat", "followers": "Pengikut", "following": "Mengikuti", "signature": "Tandatangan", "gravatar": "Gravatar", - "birthday": "Harijadi", + "birthday": "Tarikh lahir", "chat": "Bersembang", "follow": "Ikuti", - "unfollow": "Henti ikuti", - "more": "More", + "unfollow": "Henti mengikuti", + "more": "Lagi", "profile_update_success": "Profil telah dikemaskini", "change_picture": "Tukar gambar", - "edit": "Edit", + "edit": "Sunting", "uploaded_picture": "Muatnaik gambak", "upload_new_picture": "Muatnaik gambar baru", - "upload_new_picture_from_url": "Upload New Picture From URL", - "current_password": "Password sekarang", - "change_password": "TUkar password", - "change_password_error": "Password salah!", - "change_password_error_wrong_current": "Password anda sekarang tidak sah", - "change_password_error_length": "Password terlalu pendek", - "change_password_error_match": "Password mesti padan", - "change_password_error_privileges": "You do not have the rights to change this password.", - "change_password_success": "Password dikemaskini", - "confirm_password": "Sahkan password", - "password": "password", + "upload_new_picture_from_url": "Muatnaik gambar baru dari URL", + "current_password": "Kata laluan sekarang", + "change_password": "Tukar kata laluan", + "change_password_error": "Kata laluan salah!", + "change_password_error_wrong_current": "Kata laluan anda sekarang tidak sah", + "change_password_error_length": "Kata laluan terlalu pendek", + "change_password_error_match": "Kata laluan mesti padan", + "change_password_error_privileges": "Anda tidak mempunyai kebenaran untuk mengubah kata laluan ini", + "change_password_success": "Kata laluan dikemaskini", + "confirm_password": "Sahkan kata laluan", + "password": "kata laluan", "username_taken_workaround": "Nama pengguna yang anda minta telah digunakan oleh orang lain, jadi kami telah mengubahsuaikannya sedikit. Anda kini dikenali sebagai %1", "upload_picture": "Muatnaik gambar", "upload_a_picture": "Muatnaik sekeping gambar", "image_spec": "Anda hanya boleh memuatnaikkan fail PNG, JPG atau GIF", - "settings": "Penetapan", + "settings": "Tetapan", "show_email": "Tunjukkan emel saya", - "show_fullname": "Show My Full Name", - "restrict_chats": "Only allow chat messages from users I follow", - "digest_label": "Langgani berita", - "digest_description": "Langgani berita terkini untuk forum ini melalui emel (Makluman dan topik) menurut jadual yang ditetapkan", + "show_fullname": "Tunjukkan Nama Penuh", + "restrict_chats": "Hanya benarkan sembang mesej dari pengguna yang saya ikut sahaja", + "digest_label": "Langgan berita", + "digest_description": "Langgan berita terkini untuk forum ini melalui emel (Makluman dan topik) menurut jadual yang ditetapkan", "digest_off": "Tutup", "digest_daily": "Harian", "digest_weekly": "Mingguan", "digest_monthly": "Bulanan", - "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", - "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", + "send_chat_notifications": "Hantar emel sekiranya ada mesej sembang baru dan saya di luar talian (offline)", + "send_post_notifications": "Hantarkan emel apabila topik yang saya langgan menerima balasan", + "settings-require-reload": "Sebahagian perubahan tetapan memerlukan segar semula. Klik sini untuk segar semula halaman ini.", "has_no_follower": "Pengguna ini tiada pengikut :(", "follows_no_one": "Pengguna ini tidak mengikuti sesiapa :(", - "has_no_posts": "Pengguna ini masih belum mengirim sebarang pos", - "has_no_topics": "Pengguna ini masih belum menghantar sebarang kiriman", - "has_no_watched_topics": "This user didn't watch any topics yet.", + "has_no_posts": "Pengguna ini masih belum mengirim sebarang kiriman", + "has_no_topics": "Pengguna ini masih belum menghantar sebarang topik", + "has_no_watched_topics": "Pengguna ini masih belum melihat sebarang topik", "email_hidden": "Emel disembunyikan", "hidden": "disembunyikan", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "Gunakan muka surat untuk topik dan kiriman daripada penggunaan skroll infiniti", "topics_per_page": "Topik setiap muka", "posts_per_page": "Kiriman setiap muka", - "notification_sounds": "Play a sound when you receive a notification", - "browsing": "Browsing Settings", - "open_links_in_new_tab": "Open outgoing links in new tab", + "notification_sounds": "Mainkan bunyi apabila anda mendapat pemberitahuan", + "browsing": "Melihat-lihat Tetapan", + "open_links_in_new_tab": "Buka pautan luar di tab yang baru", "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", - "grouptitle": "Select the group title you would like to display", - "no-group-title": "No group title" + "follow_topics_you_reply_to": "Ikut topik yang anda balas", + "follow_topics_you_create": "Ikut topik yang anda buat", + "grouptitle": "Pilih nama kumpulan yang anda ingin tunjukkan", + "no-group-title": "Tiada nama kumpulan" } \ No newline at end of file diff --git a/public/language/ms/users.json b/public/language/ms/users.json index 26475bd746..5f373391d5 100644 --- a/public/language/ms/users.json +++ b/public/language/ms/users.json @@ -5,8 +5,8 @@ "search": "Cari", "enter_username": "Masukkan nama pengguna untuk carian", "load_more": "Muat lagi", - "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", - "filter-by": "Filter By", - "online-only": "Online only", - "picture-only": "Picture only" + "users-found-search-took": "%1 pengguna dijumpai! Pencarian ambil masa %2 saat.", + "filter-by": "Saring dengan", + "online-only": "Atas talian sahaja", + "picture-only": "Gambar sahaja" } \ No newline at end of file diff --git a/public/language/nb/category.json b/public/language/nb/category.json index 7600207edf..673aec04c3 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -5,8 +5,8 @@ "browsing": "leser", "no_replies": "Ingen har svart", "share_this_category": "Del denne kategorien", - "watch": "Watch", + "watch": "Overvåk", "ignore": "Ignorer", - "watch.message": "You are now watching updates from this category", - "ignore.message": "You are now ignoring updates from this category" + "watch.message": "Du overvåker nå oppdateringer fra denne kategorien", + "ignore.message": "Du ignorerer nå oppdateringer fra denne kategorien" } \ No newline at end of file diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 4c89e79255..a03b17a6b4 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -18,14 +18,14 @@ "username-taken": "Brukernavn opptatt", "email-taken": "E-post opptatt", "email-not-confirmed": "E-posten din har ikke blitt bekreftet enda, vennligst klikk for å bekrefte din e-post.", - "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", + "email-not-confirmed-chat": "Du kan ikke chatte før e-posten din er bekreftet, vennligst klikk her for å bekrefte e-postadressen.", "no-email-to-confirm": "Dette forumet krever at e-postbekreftelse, vennligst klikk her for å skrive inn en e-post", "email-confirm-failed": "Vi kunne ikke godkjenne e-posten din, vennligst prøv igjen senere.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Brukernavnet er for kort", "username-too-long": "Brukernavnet er for langt", "user-banned": "Bruker utestengt", - "user-too-new": "Beklager, du må vente %1 sekunder før du kan opprette ditt første innlegg.", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategorien eksisterer ikke.", "no-topic": "Emne eksisterer ikke", "no-post": "Innlegg eksisterer ikke", @@ -36,17 +36,17 @@ "no-emailers-configured": "Ingen e-post-tillegg er lastet, så ingen test e-post kunne bli sendt", "category-disabled": "Kategori deaktivert", "topic-locked": "Emne låst", - "post-edit-duration-expired": "Du har bare lov til å endre innlegg i %1 sekunder etter at det ble skrevet", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "too-many-posts-newbie": "Som en ny bruker, kan du bare poste et innlegg hvert %1 sekund til du har tjent deg opp %2 i rykte - vennligst vent før du poster igjen", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Du kan ikke stemme på ditt eget innlegg", "already-favourited": "Du har allerede favorittmerket dette innlegget", "already-unfavourited": "Du har allerede avfavorisert dette innlegget", @@ -67,10 +67,10 @@ "topic-thumbnails-are-disabled": "Emne-minatyrbilder har blitt deaktivert", "invalid-file": "Ugyldig fil", "uploads-are-disabled": "Opplastninger er deaktivert", - "signature-too-long": "Beklager, signaturen din kan ikke være lengre en %1 tegn.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Du kan ikke chatte med deg selv!", "chat-restricted": "Denne brukeren har begrenset sine chat-meldinger. De må følge deg før du kan chatte med dem", - "too-many-messages": "You have sent too many messages, please wait awhile.", + "too-many-messages": "Du har sendt for mange meldinger, vennligst vent en stund.", "reputation-system-disabled": "Ryktesystem er deaktivert.", "downvoting-disabled": "Nedstemming av deaktivert", "not-enough-reputation-to-downvote": "Du har ikke nok rykte til å nedstemme det innlegget", @@ -78,6 +78,6 @@ "reload-failed": "NodeBB støtte på et problem under lasting på nytt: \"%1\". NodeBB vil fortsette å servere eksisterende klientside ressureser, selv om du burde angre endringene du gjorde før du lastet på nytt.", "registration-error": "Feil under registrering", "parse-error": "Noe gikk feil under analysering av serversvar", - "wrong-login-type-email": "Please use your email to login", - "wrong-login-type-username": "Please use your username to login" + "wrong-login-type-email": "Vennligst bruk e-posten din for å logge inn", + "wrong-login-type-username": "Vennligst bruk brukernavnet ditt for å logge inn" } \ No newline at end of file diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index 1044a6d677..e85add6129 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -15,12 +15,12 @@ "chat.seven_days": "7 dager", "chat.thirty_days": "30 dager", "chat.three_months": "3 måneder", - "composer.compose": "Compose", - "composer.show_preview": "Show Preview", - "composer.hide_preview": "Hide Preview", + "composer.compose": "Komponer", + "composer.show_preview": "Vis forhåndsvisning", + "composer.hide_preview": "Skjul forhåndsvisning", "composer.user_said_in": "%1 sa i %2: ", "composer.user_said": "%1 sa: ", "composer.discard": "Er du sikker på at du vil forkaste dette innlegget?", - "composer.submit_and_lock": "Submit and Lock", - "composer.toggle_dropdown": "Toggle Dropdown" + "composer.submit_and_lock": "Send og lås", + "composer.toggle_dropdown": "Veksle nedtrekksfelt" } \ No newline at end of file diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 2fbcf61d29..6f0ab862c4 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -5,17 +5,17 @@ "recent": "Seneste emner", "users": "Registrerte brukere", "notifications": "Varsler", - "tags": "Tags", - "tag": "Topics tagged under \"%1\"", + "tags": "Tagger", + "tag": "Emner tagget under \"%1\"", "user.edit": "Endrer \"%1\"", "user.following": "Personer %1 følger", "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.groups": "%1 sine grupper", "user.favourites": "%1 sine favoritt-innlegg", "user.settings": "Brukerinnstillinger", - "user.watched": "Topics watched by %1", + "user.watched": "Innlegg overvåket av %|1", "maintenance.text": "%1 er for tiden under vedlikehold. Kom tilbake en annen gang.", "maintenance.messageIntro": "I tillegg har administratoren skrevet denne meldingen:" } \ No newline at end of file diff --git a/public/language/nl/error.json b/public/language/nl/error.json index bfc1d5c320..984ed8e4a1 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "U kunt helaas geen gebruik maken van chats tot uw email adres bevestigd is.", "no-email-to-confirm": "Dit forum vereist email bevestiging, klikt u alstublieft hier om uw email te vermelden", "email-confirm-failed": "Uw email kon helaas niet bevestigd worden, probeert u het alstublieft later nog eens.", - "confirm-email-already-sent": "Bevestigingsmailtje is al verzonden, wacht %1 minuut/minuten om nog 1 te verzenden", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Gebruikersnaam is te kort", "username-too-long": "Gebruikersnaam is te lang", "user-banned": "Gebruiker verbannen", - "user-too-new": "Onze excuses maar je moet nog %1 seconden wachten voordat je een bericht mag plaatsen", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Categorie bestaat niet", "no-topic": "Topic bestaat niet", "no-post": "Bericht bestaat niet", @@ -36,17 +36,17 @@ "no-emailers-configured": "Er zijn geen email plugins geladen, een test email kan dus niet verzonden worden", "category-disabled": "Categorie uitgeschakeld", "topic-locked": "Onderwerp gesloten", - "post-edit-duration-expired": "Het is niet toegestaan om berichten aan te passen tot %1 seconden na het plaatsen", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "Heb even geduld totdat de alle bestanden geüpload zijn", - "content-too-short": "Maak de bericht alstublieft wat langer. Op z'n minst %1 karakters", - "content-too-long": "Maakt u het bericht alstublieft wat korter. Berichten mogen niet langer zijn dan %1 karakters.", - "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.", - "too-many-posts-newbie": "Als een nieuwe gebruiker kan je maar om de %1 seconden een bericht plaatsen vanwege je reputatie. Uw moet deze level van reputatie verdienen %2. Wacht alstublieft met het plaatsen van uw bericht.", - "tag-too-short": "Maakt u alstublieft de tag iets langer. Tags dienen minimaal %1 karakters te bevatten", - "tag-too-long": "Maakt u alstublieft de tag iets korter. Tags mogen maximaal %1 karakters bevatten", - "file-too-big": "De maximale bestandsgrootte is %1 kbs", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Je kan niet op je eigen berichten stemmen", "already-favourited": "U heeft al dit bericht in uw favorieten staan", "already-unfavourited": "U heeft al dit bericht uit uw favorieten gehaald", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Onderwerp thumbnails zijn uitgeschakeld", "invalid-file": "Ongeldig bestand", "uploads-are-disabled": "Uploads zijn uitgeschakeld", - "signature-too-long": "Sorry, maar deze handtekening kan niet groter zijn dan %1 karakters!", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Je kan niet met jezelf chatten!", "chat-restricted": "Deze gebruiker heeft beperkingen gelegd op chatfunctie. Hun moeten jouw volgen voordat je met hun kan chatten", "too-many-messages": "U heeft teveel berichten verstuurd in een korte tijd. Wacht u alstublieft even.", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index b9a5742c4b..ca267996bc 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "To forum wymaga weryfikacji przez email. Proszę kliknąć tutaj, aby wprowadzić adres.", "email-confirm-failed": "Nie byliśmy w stanie potwierdzić twojego email-a. Proszę spróbować później.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Nazwa użytkownika za krótka.", "username-too-long": "Zbyt długa nazwa użytkownika", "user-banned": "Użytkownik zbanowany", - "user-too-new": "Przepraszamy, powinieneś zaczekać %1 sekund przed pierwszym postem", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategoria nie istnieje", "no-topic": "Temat nie istnieje", "no-post": "Post nie istnieje", @@ -36,17 +36,17 @@ "no-emailers-configured": "Nie zainstalowano żadnego dodatku obsługującego e-mail, więc nie można wysłać testowej wiadomości.", "category-disabled": "Kategoria wyłączona.", "topic-locked": "Temat zamknięty", - "post-edit-duration-expired": "Możesz edytować posty przez %1 sekund po napisaniu.", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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": "Proszę wpisać krótszy post. Posty nie mogą zawierać więcej niż %1 znaków.", - "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ć", - "too-many-posts-newbie": "Jako nowy użytkownik, możesz wysyłać posty co %1 sekund, do chwili aż zbierzesz %2 reputacji - proszę poczekać przed ponownym wysłaniem posta", - "tag-too-short": "Proszę podać dłuższy tag. Tagi powinny zawierać co najmniej %1 znaków.", - "tag-too-long": "Proszę podać krótszy tag. Tagi nie mogą być dłuższe niż %1 znaków.", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Nie możesz głosować na własny post", "already-favourited": "Już polubiłeś ten post", "already-unfavourited": "Już przestałeś lubić ten post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Miniatury tematów są wyłączone", "invalid-file": "Błędny plik", "uploads-are-disabled": "Uploadowanie jest wyłączone", - "signature-too-long": "Przepraszamy, ale podpis nie może być dłuższy niż %1 znaków.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Nie możesz rozmawiać ze sobą", "chat-restricted": "Ten użytkownik ograniczył swoje czaty. Musi Cię śledzić, zanim będziesz mógł z nim czatować.", "too-many-messages": "Wysłałeś zbyt wiele wiadomości, proszę poczekaj chwilę.", diff --git a/public/language/pt_BR/error.json b/public/language/pt_BR/error.json index bad5453643..a2518e7d1d 100644 --- a/public/language/pt_BR/error.json +++ b/public/language/pt_BR/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Você não está habilitado a conversar até que seu email seja confirmado, por favor clique aqui para confirmar seu email.", "no-email-to-confirm": "Este fórum exige confirmação de email, por gentileza clique aqui para digitar um email", "email-confirm-failed": "Nós não pudemos confirmar seu email, por gentileza tente novamente mais tarde.", - "confirm-email-already-sent": "Email de confirmação já enviado, por favor aguarde %1 minutos para enviar outro.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Nome de usuário muito curto", "username-too-long": "Nome de usuário muito longo", "user-banned": "Usuário banido", - "user-too-new": "Desculpe, é pedido que você aguarde %1 segundos antes de fazer o seu primeiro post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "A categoria não existe", "no-topic": "O tópico não existe", "no-post": "O post não existe", @@ -36,17 +36,17 @@ "no-emailers-configured": "Nenhum plugin de email foi carregado, por isso um email de teste não pôde ser enviado", "category-disabled": "Categoria desativada", "topic-locked": "Tópico Trancado", - "post-edit-duration-expired": "Você pode editar posts apenas %1 segundos após postar", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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": "Por favor entre com um post mais curto. Posts não podem ser maiores do que %1 caracteres.", - "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", - "too-many-posts-newbie": "Como novo usuário, você pode postar apenas uma vez a cada %1 segundos até que você tenha recebido reputação de %2 - por favor aguarde antes de postar novamente", - "tag-too-short": "Por favor digite uma tag mais longa. Tags devem conter pelo menos %1 caracteres", - "tag-too-long": "Por favor digite uma tag mais curta. Tags não podem ter mais do que %1 caracteres", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Você não pode votar no seu próprio post", "already-favourited": "Você já adicionou este post aos favoritos", "already-unfavourited": "Você já removeu este post dos favoritos", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Thumbnails para tópico estão desativados.", "invalid-file": "Arquivo Inválido", "uploads-are-disabled": "Uploads estão desativados", - "signature-too-long": "Desculpe, sua assinatura não pode ser maior que %1 caracteres.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Você não pode iniciar um chat consigo mesmo!", "chat-restricted": "Este usuário restringiu suas mensagens de chat. Eles devem seguir você antes que você possa conversar com eles", "too-many-messages": "Você enviou muitas mensagens, por favor aguarde um momento.", diff --git a/public/language/pt_BR/user.json b/public/language/pt_BR/user.json index 6e3b1b9e94..677358d58d 100644 --- a/public/language/pt_BR/user.json +++ b/public/language/pt_BR/user.json @@ -68,16 +68,16 @@ "has_no_watched_topics": "Este usuário ainda não acompanhou quaisquer tópicos.", "email_hidden": "Email Escondido", "hidden": "escondido", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "Paginar tópicos ao invés de utilizar em vez de usar rolagem infinita.", "topics_per_page": "Tópicos por Página", "posts_per_page": "Posts por Página", - "notification_sounds": "Play a sound when you receive a notification", + "notification_sounds": "Tocar um som quando você receber uma notificação.", "browsing": "Configurações de Navegação", - "open_links_in_new_tab": "Open outgoing links in new tab", + "open_links_in_new_tab": "Abrir links externos em nova aba", "enable_topic_searching": "Habilitar Pesquisa dentro de Tópico", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", + "topic_search_help": "Se habilitado, a pesquisa dentro do tópico irá substituir a pesquisa padrão do seu navegador. Assim, você poderá pesquisar pelo tópico inteiro, e não apenas pelo o que está sendo exibido na tela.", + "follow_topics_you_reply_to": "Seguir tópicos que você responde", + "follow_topics_you_create": "Seguir tópicos que você cria", "grouptitle": "Escolha o título do grupo que você deseja exibir", "no-group-title": "Sem título de grupo" } \ No newline at end of file diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 3b4fcd84e3..29d8d514b7 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Numele de utilizator este prea scurt", "username-too-long": "Numele de utilizator este prea lung", "user-banned": "Utilizator banat", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "Nici un plugin pentru email nu a fost încărcat, așa că un email de test nu a fost trimis.", "category-disabled": "Categorie dezactivată", "topic-locked": "Subiect Închis", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Nu poți vota propriul tău mesaj", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Pictogramele pentru subiect sunt interzise.", "invalid-file": "Fișier invalid", "uploads-are-disabled": "Uploadurile sunt dezactivate", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Nu poți conversa cu tine!", "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.", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 2c843a9110..99d893e336 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "Вы не можете оставлять сообщения, пока Ваш email не подтверждён. Нажмите на это сообщение чтобы получить письмо повторно.", "no-email-to-confirm": "Этот форум требует подтверждения по E-mail. Нажмите здесь для ввода E-mail.", "email-confirm-failed": "Мы не можем подтвердить Ваш E-mail, попробуйте позже.", - "confirm-email-already-sent": "Email для подтверждения уже был отправлен, подождите %1 минут, если хотите выслать повторный.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", "user-banned": "Пользователь заблокирован", - "user-too-new": "Вы можете написать свой первый пост через %1 сек.", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Категория не существует", "no-topic": "Тема не существует", "no-post": "Сообщение не существует", @@ -36,17 +36,17 @@ "no-emailers-configured": "Не подключен ни один плагин для отправки почты, поэтому тестовый email не может быть отправлен", "category-disabled": "Категория отключена", "topic-locked": "Тема закрыта", - "post-edit-duration-expired": "Вы можете редактировать сообщение в течении %1 секунд(ы) после написания.", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "Пожалуйста, подождите завершения загрузки.", - "content-too-short": "Пост должен содержать минимум %1 симв.", - "content-too-long": "Размер поста не должен превышать %1 символов. Пожалуйста, сделайте его короче.", - "title-too-short": "Заголовок должен содержать минимум %1 симв.", - "title-too-long": "Заголовок не может быть длиннее %1 символов.", - "too-many-posts": "Вы можете делать пост один раз в %1 сек.", - "too-many-posts-newbie": "Вы новый пользователь, поэтому можете делать пост раз в %1 сек., пока не заработаете %2 п. репутации.", - "tag-too-short": "Тэги должны содержать как минимум %1 символа(ов).", - "tag-too-long": "Тэги должны быть короче %1 символов.", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Вы не можете проголосовать за Ваш пост", "already-favourited": "Вы уже добавили этот пост в избранное", "already-unfavourited": "Вы уже удалили этот пост из избранного", @@ -63,11 +63,11 @@ "post-already-restored": "Этот пост уже восстановлен.", "topic-already-deleted": "Тема уже удалена", "topic-already-restored": "Тема уже восстановлена", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", + "cant-purge-main-post": "Вы не можете удалить главное сообщение темы, вместо этого, пожалуйста, удалите топик", "topic-thumbnails-are-disabled": "Иконки для темы запрещены", "invalid-file": "Файл испорчен", "uploads-are-disabled": "Загрузка запрещена", - "signature-too-long": "Ваша подпись не может быть длиннее %1 симв.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Вы не можете общаться с самим собой", "chat-restricted": "Пользователь ограничил прием сообщений. Он должен подписаться на Вас, чтобы Вы могли вести переписку с ним.", "too-many-messages": "Вы отправили слишком много сообщений, подождите немного.", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 7f1fa6684f..7834c7951c 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -15,7 +15,7 @@ "user.groups": "Группы %1", "user.favourites": "Избранные сообщения %1", "user.settings": "Настройки", - "user.watched": "Topics watched by %1", + "user.watched": "Темы смотрели %1", "maintenance.text": "%1 в настоящее время на обслуживании. Пожалуйста, возвращайтесь позже.", "maintenance.messageIntro": "Администратор оставил сообщение:" } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 4c3854626c..800be7cf79 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -68,16 +68,16 @@ "has_no_watched_topics": "Этот пользователь еще не просмотрел ни одной темы", "email_hidden": "Email скрыт", "hidden": "скрыто", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "Разбивать по страницам топики и посты вместо того чтобы выводить бесконечным списком", "topics_per_page": "Тем на Странице", "posts_per_page": "Постов на Странице", - "notification_sounds": "Play a sound when you receive a notification", + "notification_sounds": "Воспроизводить звук во время получения уведомления", "browsing": "Настройки просмотра", - "open_links_in_new_tab": "Open outgoing links in new tab", + "open_links_in_new_tab": "Открывать внешние ссылки в новых вкладках", "enable_topic_searching": "Активировать поиск внутри тем", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", + "topic_search_help": "Если опция включена, поиск в теме будет осуществляться за счёт собственного поиска, который позволит искать во всей теме, а не только в загруженных сообщениях", + "follow_topics_you_reply_to": "Следить за темами в которых вы отвечаете", + "follow_topics_you_create": "Следить за темами которые вы создаёте", "grouptitle": "Выберите бейдж группы для отображения", "no-group-title": "Не показывать бейдж" } \ No newline at end of file diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 2d27b23f7c..867f331c3c 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "User banned", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Category disabled", "topic-locked": "Topic Locked", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "You cannot vote for your own post", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", "invalid-file": "Invalid File", "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 0e0b365fc6..aac7aeee03 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Username too short", "username-too-long": "Username too long", "user-banned": "Užívateľ je zakázaný", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Category does not exist", "no-topic": "Topic does not exist", "no-post": "Post does not exist", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Kategória je znefunkčená.", "topic-locked": "Uzamknutá téma", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Nedá sa hlasovať za vlastný príspevok", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Nahľady tém sú znefunkčnené.", "invalid-file": "Neplatný súbor", "uploads-are-disabled": "Nahrávanie je znefunkčnené", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Nemôžete chatovat so samým sebou.", "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.", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index 872acf6a43..bfd4e763eb 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Användarnamnet är för kort", "username-too-long": "Användarnamnet är för långt", "user-banned": "Användare bannlyst", - "user-too-new": "Tyvärr, du måste vänta %1 sekunder innan du kan skapa ditt första inlägg", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategorin hittades inte", "no-topic": "Ämnet hittades inte", "no-post": "Inlägget hittades inte", @@ -36,17 +36,17 @@ "no-emailers-configured": "Inga tillägg för epostadress har laddats, så något textmeddelande kunde inte skickas", "category-disabled": "Kategorin inaktiverad", "topic-locked": "Ämnet låst", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "too-many-posts-newbie": "Som en ny användare kan du endast skapa nya inlägg var %1:e sekund tills du har %2 förtroende - vänta ett tag innan du försöker skapa ett nytt inlägg", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Du kan inte rösta på ditt eget inlägg.", "already-favourited": "Du har redan favoriserat det här inlägget", "already-unfavourited": "Du har redan avfavoriserat det här inlägget", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Miniatyrbilder för ämnen är inaktiverat", "invalid-file": "Ogiltig fil", "uploads-are-disabled": "Uppladdningar är inaktiverat", - "signature-too-long": "Signaturer kan tyvärr inte vara längre än %1 tecken.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Du kan inte chatta med dig själv.", "chat-restricted": "Denna användaren har begränsat sina chatt-meddelanden. Användaren måste följa dig innan ni kan chatta med varann", "too-many-messages": "You have sent too many messages, please wait awhile.", diff --git a/public/language/th/error.json b/public/language/th/error.json index bad2831e82..1c33a57db0 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "Forum นี้ต้องการการยืนยันอีเมล กรุณากดที่นี่เพื่อระบุอีเมล", "email-confirm-failed": "เราไม่สามารถยืนยันอีเมลของคุณ ณ ขณะนี้ กรุณาลองใหม่อีกครั้งภายหลัง", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "ชื่อบัญชีผู้ใช้ สั้นเกินไป", "username-too-long": "ชื่อบัญชีผู้ใช้ ยาวเกินไป", "user-banned": "User banned", - "user-too-new": "Sorry, you are required to wait %1 seconds before making your first post", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "ยังไม่มี Category นี้", "no-topic": "ยังไม่มี Topic นี้", "no-post": "ยังไม่มี Post นี้", @@ -36,17 +36,17 @@ "no-emailers-configured": "No email plugins were loaded, so a test email could not be sent", "category-disabled": "Category นี้ถูกปิดการใช้งานแล้ว", "topic-locked": "Topic Locked", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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", - "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", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "You cannot vote for your own post", "already-favourited": "You have already favourited this post", "already-unfavourited": "You have already unfavourited this post", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Topic thumbnails are disabled.", "invalid-file": "Invalid File", "uploads-are-disabled": "Uploads are disabled", - "signature-too-long": "Sorry, your signature cannot be longer than %1 characters.", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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.", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 3bd7779bee..49e7247239 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -25,7 +25,7 @@ "username-too-short": "Kullanıcı ismi çok kısa", "username-too-long": "Kullanıcı ismi çok uzun.", "user-banned": "Kullanıcı Yasaklı", - "user-too-new": "Özür dileriz, ilk iletinizi yapmadan önce %1 saniye beklemeniz gerekiyor", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Kategori Yok", "no-topic": "Başlık Yok", "no-post": "İleti Yok", @@ -36,17 +36,17 @@ "no-emailers-configured": "E-posta eklentisi kurulu değil bu yüzden test e-postası gönderilemedi", "category-disabled": "Kategori aktif değil", "topic-locked": "Başlık Kilitli", - "post-edit-duration-expired": "Gönderilen iletiler %1 saniyeden sonra değiştirilemez", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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.", - "too-many-posts-newbie": "Yeni bir kullanıcı olarak, %2 saygınlığınız olana kadar sadece %1 saniyede bir mesaj gönderebilirsiniz. Lütfen tekrar ileti göndermeden önce bekleyin.", - "tag-too-short": "Lütfen daha uzun bir etiket giriniz. Etiketler en az %1 karakter uzunluğunda olmalı", - "tag-too-long": "Lütfen daha kısa bir etiket girin. Etiketler %1 karakterden daha uzun olamaz", - "file-too-big": "İzin verilen en büyük dosya boyutu %1 kb - lütfen daha küçük bir dosya yükleyin", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Kendi iletinize oy veremezsiniz", "already-favourited": "Bu iletiyi zaten favorilerinize eklediniz", "already-unfavourited": "Bu iletiyi zaten favorilerinizden çıkardınız", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Başlık resimleri kapalı.", "invalid-file": "Geçersiz Dosya", "uploads-are-disabled": "Yüklemeler kapalı", - "signature-too-long": "İmza en fazla %1 karakter olabilir!", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "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": "Ardı ardına çok fazla mesaj yolladınız, lütfen biraz bekleyiniz.", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 0c3a4a866a..3aecae1d63 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "Tên đăng nhập quá ngắn", "username-too-long": "Tên đăng nhập quá dài", "user-banned": "Tài khoản bị ban", - "user-too-new": "Xin thứ lỗi, bạn cần đợi %1 giây trước khi tạo bài viết đầu tiên", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "Danh mục không tồn tại", "no-topic": "Chủ đề không tồn tại", "no-post": "Bài viết không tồn tại", @@ -36,17 +36,17 @@ "no-emailers-configured": "Không có trình cắm email nào được tải, vì vậy email kiểm tra không thể gửi được", "category-disabled": "Danh mục bị khóa", "topic-locked": "Chủ đề bị khóa", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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.", - "too-many-posts-newbie": "Tài khoản mới chỉ có thể gởi 1 bài mỗi %1 giây cho đến khi bạn có được %2 điểm tín nhiệm - Xin vui lòng chờ giây lát trước khi thử lại", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "Bạn không thể vote cho chính bài viết của bạn", "already-favourited": "Bạn đã bấm yêu thích cho bài viết này rồi", "already-unfavourited": "Bạn đã bỏ thích bài này rồi", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "Thumbnails cho chủ đề đã bị tắt", "invalid-file": "File không hợp lệ", "uploads-are-disabled": "Đã khóa lựa chọn tải lên", - "signature-too-long": "Chứ ký không được dài quá %1 ký tự", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "Bạn không thể chat với chính bạn!", "chat-restricted": "Người dùng này đã bật chế độ hạn chế tin nhắn chat. Bạn phải được anh/cô ta follow thì mới có thể gởi tin nhắn đến họ được.", "too-many-messages": "You have sent too many messages, please wait awhile.", diff --git a/public/language/zh_CN/error.json b/public/language/zh_CN/error.json index 40f3d5b4ab..934a7e3991 100644 --- a/public/language/zh_CN/error.json +++ b/public/language/zh_CN/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "您的电子邮箱尚未确认,无法聊天,请点击这里确认您的电子邮箱。", "no-email-to-confirm": "本论坛需要电子邮箱确认,请点击这里输入一个电子邮箱地址", "email-confirm-failed": "我们无法确认您的电子邮箱,请重试", - "confirm-email-already-sent": "确认邮件已发出,如需重新发送请等待 %1 分钟后再试。", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "用户名太短", "username-too-long": "用户名太长", "user-banned": "用户已禁止", - "user-too-new": "抱歉,您需要等待 %1 秒后,才可以发帖!", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "版面不存在", "no-topic": "主题不存在", "no-post": "帖子不存在", @@ -36,17 +36,17 @@ "no-emailers-configured": "未加载任何电子邮箱插件,无法发送测试邮件", "category-disabled": "版块已禁用", "topic-locked": "主题已锁定", - "post-edit-duration-expired": "您只能在发表后 %1 秒内修改内容", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "still-uploading": "请等待上传完成", - "content-too-short": "请再输入一些内容,帖子至少要有 %1 个字符。", - "content-too-long": "请输入更短的发帖。发帖字数不能超过 %1 个字符。", - "title-too-short": "请再输入一些内容,标题至少要有 %1 个字符。", - "title-too-long": "请输入更短的标题。不超过 %1 字。", - "too-many-posts": "发帖间隔至少要 %1 秒 - 请稍候再发帖", - "too-many-posts-newbie": "作为新用户,您必须每隔 %1 秒才能发帖一次,直到您有 %2 点威望为止 —— 请稍候再发帖", - "tag-too-short": "标签长度过短,标签长度至少为 %1 个字符", - "tag-too-long": "标签长度过长,标签长度至多为 %1 个字符", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "您不能给自己的帖子投票。", "already-favourited": "您已收藏该帖", "already-unfavourited": "您已取消收藏此帖", @@ -63,11 +63,11 @@ "post-already-restored": "此帖已经恢复", "topic-already-deleted": "此主题已被删除", "topic-already-restored": "此主题已恢复", - "cant-purge-main-post": "You can't purge the main post, please delete the topic instead", + "cant-purge-main-post": "无法清除主贴,请直接删除主题", "topic-thumbnails-are-disabled": "主题缩略图已禁用", "invalid-file": "无效文件", "uploads-are-disabled": "上传已禁用", - "signature-too-long": "抱歉,您的签名不能超过 %1 个字符。", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "您不能和自己聊天!", "chat-restricted": "此用户限制了他的聊天消息。必须他先关注您,您才能和他聊天。", "too-many-messages": "您发送了太多消息,请稍等片刻。", diff --git a/public/language/zh_CN/user.json b/public/language/zh_CN/user.json index 65f038b7e4..583c03fd09 100644 --- a/public/language/zh_CN/user.json +++ b/public/language/zh_CN/user.json @@ -68,16 +68,16 @@ "has_no_watched_topics": "此用户还未订阅任何主题", "email_hidden": "电子邮箱已隐藏", "hidden": "隐藏", - "paginate_description": "Paginate topics and posts instead of using infinite scroll", + "paginate_description": "使用分页式版块浏览", "topics_per_page": "每页主题数", "posts_per_page": "每页帖子数", - "notification_sounds": "Play a sound when you receive a notification", + "notification_sounds": "收到通知时播放提示音", "browsing": "浏览设置", - "open_links_in_new_tab": "Open outgoing links in new tab", + "open_links_in_new_tab": "在新标签打开外部链接", "enable_topic_searching": "启用主题内搜索", - "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - "follow_topics_you_reply_to": "Follow topics that you reply to", - "follow_topics_you_create": "Follow topics you create", + "topic_search_help": "如果启用,主题内搜索会替代浏览器默认的网页搜索,使你可以在整个主题内搜索,而不仅仅时页面上展现的内容。", + "follow_topics_you_reply_to": "关注你回复的主题", + "follow_topics_you_create": "关注你创建的主题", "grouptitle": "选择展现的组内称号", "no-group-title": "无组内头衔" } \ No newline at end of file diff --git a/public/language/zh_TW/error.json b/public/language/zh_TW/error.json index 99dfb9912f..5fa681cee7 100644 --- a/public/language/zh_TW/error.json +++ b/public/language/zh_TW/error.json @@ -21,11 +21,11 @@ "email-not-confirmed-chat": "You are unable to chat until your email is confirmed, please click here to confirm your email.", "no-email-to-confirm": "This forum requires email confirmation, please click here to enter an email", "email-confirm-failed": "We could not confirm your email, please try again later.", - "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minutes to send another one.", + "confirm-email-already-sent": "Confirmation email already sent, please wait %1 minute(s) to send another one.", "username-too-short": "用戶名太短", "username-too-long": "用戶名太長", "user-banned": "該使用者已被停用", - "user-too-new": "對不起,您要先等%1秒鐘才能發佈第一篇文章", + "user-too-new": "Sorry, you are required to wait %1 second(s) before making your first post", "no-category": "類別並不存在", "no-topic": "主題並不存在", "no-post": "文章並不存在", @@ -36,17 +36,17 @@ "no-emailers-configured": "未加載電郵插件,所以無法發送測試郵件", "category-disabled": "該類別已被關閉", "topic-locked": "該主題已被鎖定", - "post-edit-duration-expired": "You are only allowed to edit posts for %1 seconds after posting", + "post-edit-duration-expired": "You are only allowed to edit posts for %1 second(s) after posting", "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 秒後才能發表文章-請稍後", - "too-many-posts-newbie": "新用戶在贏得%2信譽前,每隔%1秒才能發佈新文章-請稍後再試", - "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 characters", - "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 characters", - "file-too-big": "Maximum allowed file size is %1 kb - please upload a smaller file", + "content-too-short": "Please enter a longer post. Posts should contain at least %1 character(s).", + "content-too-long": "Please enter a shorter post. Posts can't be longer than %1 character(s).", + "title-too-short": "Please enter a longer title. Titles should contain at least %1 character(s).", + "title-too-long": "Please enter a shorter title. Titles can't be longer than %1 character(s).", + "too-many-posts": "You can only post once every %1 second(s) - please wait before posting again", + "too-many-posts-newbie": "As a new user, you can only post once every %1 second(s) until you have earned %2 reputation - please wait before posting again", + "tag-too-short": "Please enter a longer tag. Tags should contain at least %1 character(s)", + "tag-too-long": "Please enter a shorter tag. Tags can't be longer than %1 character(s)", + "file-too-big": "Maximum allowed file size is %1 kB - please upload a smaller file", "cant-vote-self-post": "你不能對自己的文章說讚!", "already-favourited": "你已經收藏了這篇文章", "already-unfavourited": "你已放棄收藏這篇文章", @@ -67,7 +67,7 @@ "topic-thumbnails-are-disabled": "禁用主題縮圖", "invalid-file": "無效的檔案", "uploads-are-disabled": "上傳功能被停用", - "signature-too-long": "對不起,簽名檔長度不能超過 %1 字元!", + "signature-too-long": "Sorry, your signature cannot be longer than %1 character(s).", "cant-chat-with-yourself": "你不能與自己聊天!", "chat-restricted": "此用戶已限制了他的聊天功能。你要在他關注你之後,才能跟他聊天", "too-many-messages": "You have sent too many messages, please wait awhile.", From 122aacdc577448b7eb7236d9e235be89653bf4a1 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Sat, 2 May 2015 15:52:43 -0400 Subject: [PATCH 295/295] check err item --- src/navigation/index.js | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/navigation/index.js b/src/navigation/index.js index b9a8a99e16..6c8be11d2f 100644 --- a/src/navigation/index.js +++ b/src/navigation/index.js @@ -10,19 +10,22 @@ var navigation = {}, navigation.get = function(callback) { admin.get(function(err, data) { - callback(err, data - .filter(function(item) { - return item.enabled; - }) - .map(function(item) { - for (var i in item) { - if (item.hasOwnProperty(i)) { - item[i] = translator.unescape(item[i]); - } + if (err) { + return callback(err); + } + + data = data.filter(function(item) { + return item && item.enabled; + }).map(function(item) { + for (var i in item) { + if (item.hasOwnProperty(i)) { + item[i] = translator.unescape(item[i]); } + } + return item; + }); - return item; - })); + callback(null, data); }); };