From 7ac01b4c062e7821b216b20a945e24ce606aa02f Mon Sep 17 00:00:00 2001 From: yariplus Date: Sun, 12 Nov 2017 02:44:13 -0500 Subject: [PATCH 01/81] Fixes https://github.com/NodeBB/nodebb-rewards-essentials/issues/6 Fixes https://github.com/NodeBB/nodebb-rewards-essentials/issues/11 --- src/views/admin/extend/rewards.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/admin/extend/rewards.tpl b/src/views/admin/extend/rewards.tpl index 5177d1a77e..9df8ac01d0 100644 --- a/src/views/admin/extend/rewards.tpl +++ b/src/views/admin/extend/rewards.tpl @@ -27,9 +27,9 @@

From cf9fe0d5af76ad0219c313e9f2a3a5ce0a506781 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 15 Nov 2017 12:38:22 -0500 Subject: [PATCH 02/81] closes #6069 --- public/src/modules/alerts.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js index ccd90eb790..62f6da940e 100644 --- a/public/src/modules/alerts.js +++ b/public/src/modules/alerts.js @@ -63,7 +63,7 @@ define('alerts', ['translator', 'components', 'benchpress'], function (translato function updateAlert(alert, params) { alert.find('strong').html(params.title); alert.find('p').html(params.message); - alert.attr('class', 'alert alert-dismissable alert-' + params.type); + alert.attr('class', 'alert alert-dismissable alert-' + params.type + ' clearfix'); clearTimeout(parseInt(alert.attr('timeoutId'), 10)); if (params.timeout) { @@ -102,6 +102,23 @@ define('alerts', ['translator', 'components', 'benchpress'], function (translato }, timeout); alert.attr('timeoutId', timeoutId); + + // Reset and start animation + alert.css('transition-property', 'none'); + alert.removeClass('animate'); + + setTimeout(function () { + alert.css('transition-property', ''); + alert.css('transition', 'width ' + (timeout + 450) + 'ms linear, background-color ' + (timeout + 450) + 'ms ease-in'); + alert.addClass('animate'); + }, 50); + + // Handle mouseenter/mouseleave + alert + .on('mouseenter', function () { + $(this).css('transition-duration', 0); + console.log(this); + }); } return module; From dd176dd5f25378aef587a1f1a1d24b0346cb1c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 15 Nov 2017 21:35:10 -0500 Subject: [PATCH 03/81] Notification delivery (#6072) * ability for users to choose how they receive notifications add type field to more notifications, the type field is used to determine what to do based on user setting(none,notification,email,notificationemail) * change var name to types * cleanup * add event types for privileged users * remove unused language keys * fix uids check * changed if statements * upgrade script to preserver old settings --- public/language/en-GB/notifications.json | 18 ++- public/language/en-GB/user.json | 2 - src/controllers/accounts/settings.js | 68 ++++++++++- src/flags.js | 1 + src/groups/membership.js | 1 + src/messaging/notifications.js | 43 ------- src/notifications.js | 127 +++++++++++++++----- src/posts/queue.js | 44 ++++--- src/topics/follow.js | 34 ------ src/upgrades/1.7.1/notification-settings.js | 48 ++++++++ src/user.js | 16 ++- src/user/approval.js | 1 + src/user/settings.js | 6 + src/views/emails/notification.tpl | 57 +++++++++ 14 files changed, 329 insertions(+), 137 deletions(-) create mode 100644 src/upgrades/1.7.1/notification-settings.js create mode 100644 src/views/emails/notification.tpl diff --git a/public/language/en-GB/notifications.json b/public/language/en-GB/notifications.json index 7812eabf7c..50214f3f95 100644 --- a/public/language/en-GB/notifications.json +++ b/public/language/en-GB/notifications.json @@ -10,6 +10,7 @@ "continue_to": "Continue to %1", "return_to": "Return to %1", "new_notification": "New Notification", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "You have unread notifications.", "all": "All", @@ -50,5 +51,20 @@ "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-confirm-sent": "Confirmation email sent.", + + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index 3916663282..a5bbf4d1ff 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -84,8 +84,6 @@ "digest_daily": "Daily", "digest_weekly": "Weekly", "digest_monthly": "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.", "has_no_follower": "This user doesn't have any followers :(", diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 515cb33a4e..ea9c10126b 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -84,13 +84,19 @@ settingsController.get = function (req, res, callback) { plugins.fireHook('filter:user.customSettings', { settings: results.settings, customSettings: [], uid: req.uid }, next); }, function (data, next) { - getHomePageRoutes(userData, function (err, routes) { - userData.homePageRoutes = routes; - next(err, data); - }); - }, - function (data) { userData.customSettings = data.customSettings; + async.parallel({ + notificationSettings: function (next) { + getNotificationSettings(userData, next); + }, + routes: function (next) { + getHomePageRoutes(userData, next); + }, + }, next); + }, + function (results) { + userData.homePageRoutes = results.routes; + userData.notificationSettings = results.notificationSettings; userData.disableEmailSubscriptions = parseInt(meta.config.disableEmailSubscriptions, 10) === 1; userData.dailyDigestFreqOptions = [ @@ -149,6 +155,56 @@ settingsController.get = function (req, res, callback) { ], callback); }; +function getNotificationSettings(userData, callback) { + var types = [ + 'notificationType_upvote', + 'notificationType_new-topic', + 'notificationType_new-reply', + 'notificationType_follow', + 'notificationType_new-chat', + 'notificationType_group-invite', + ]; + + var privilegedTypes = []; + + async.waterfall([ + function (next) { + user.getPrivileges(userData.uid, next); + }, + function (privileges, next) { + if (privileges.isAdmin) { + privilegedTypes.push('notificationType_new-register'); + } + if (privileges.isAdmin || privileges.isGlobalMod || privileges.isModeratorOfAnyCategory) { + privilegedTypes.push('notificationType_post-queue', 'notificationType_new-post-flag'); + } + if (privileges.isAdmin || privileges.isGlobalMod) { + privilegedTypes.push('notificationType_new-user-flag'); + } + plugins.fireHook('filter:user.notificationTypes', { + userData: userData, + types: types, + privilegedTypes: privilegedTypes, + }, next); + }, + function (results, next) { + function modifyType(type) { + var setting = userData.settings[type] || 'notification'; + + return { + name: type, + label: '[[notifications:' + type + ']]', + none: setting === 'none', + notification: setting === 'notification', + email: setting === 'email', + notificationemail: setting === 'notificationemail', + }; + } + var notificationSettings = results.types.map(modifyType).concat(results.privilegedTypes.map(modifyType)); + next(null, notificationSettings); + }, + ], callback); +} function getHomePageRoutes(userData, callback) { async.waterfall([ diff --git a/src/flags.js b/src/flags.js index df6ec625f3..093757251b 100644 --- a/src/flags.js +++ b/src/flags.js @@ -696,6 +696,7 @@ Flags.notify = function (flagObj, uid, callback) { } notifications.create({ + type: 'new-user-flag', bodyShort: '[[notifications:user_flagged_user, ' + flagObj.reporter.username + ', ' + flagObj.target.username + ']]', bodyLong: flagObj.description, path: '/uid/' + flagObj.targetId, diff --git a/src/groups/membership.js b/src/groups/membership.js index 7547159910..f11eebcc0b 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -161,6 +161,7 @@ module.exports = function (Groups) { async.waterfall([ async.apply(inviteOrRequestMembership, groupName, uid, 'invite'), async.apply(notifications.create, { + type: 'group-invite', bodyShort: '[[groups:invited.notification_title, ' + groupName + ']]', bodyLong: '', nid: 'group:' + groupName + ':uid:' + uid + ':invite', diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js index a3512f478b..3116c31a2b 100644 --- a/src/messaging/notifications.js +++ b/src/messaging/notifications.js @@ -1,12 +1,9 @@ 'use strict'; var async = require('async'); -var winston = require('winston'); var user = require('../user'); -var emailer = require('../emailer'); var notifications = require('../notifications'); -var meta = require('../meta'); var sockets = require('../socket.io'); var plugins = require('../plugins'); @@ -92,46 +89,6 @@ module.exports = function (Messaging) { if (notification) { notifications.push(notification, uids); } - sendNotificationEmails(uids, messageObj); - } - }); - } - - function sendNotificationEmails(uids, messageObj) { - if (parseInt(meta.config.disableEmailSubscriptions, 10) === 1) { - return; - } - - async.waterfall([ - function (next) { - async.parallel({ - userData: function (next) { - user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); - }, - userSettings: function (next) { - user.getMultipleUserSettings(uids, next); - }, - }, next); - }, - - function (results, next) { - results.userData = results.userData.filter(function (userData, index) { - return userData && results.userSettings[index] && results.userSettings[index].sendChatNotifications; - }); - async.each(results.userData, function (userData, next) { - emailer.send('notif_chat', userData.uid, { - subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', - summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - message: messageObj, - roomId: messageObj.roomId, - username: userData.username, - userslug: userData.userslug, - }, next); - }, next); - }, - ], function (err) { - if (err) { - return winston.error(err); } }); } diff --git a/src/notifications.js b/src/notifications.js index cbc58dae8e..193427e8aa 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -13,6 +13,7 @@ var meta = require('./meta'); var batch = require('./batch'); var plugins = require('./plugins'); var utils = require('./utils'); +var emailer = require('./emailer'); var Notifications = module.exports; @@ -178,9 +179,78 @@ Notifications.push = function (notification, uids, callback) { }; function pushToUids(uids, notification, callback) { - var oneWeekAgo = Date.now() - 604800000; - var unreadKeys = []; - var readKeys = []; + function sendNotification(uids, callback) { + if (!uids.length) { + return callback(); + } + var oneWeekAgo = Date.now() - 604800000; + var unreadKeys = []; + var readKeys = []; + async.waterfall([ + function (next) { + uids.forEach(function (uid) { + unreadKeys.push('uid:' + uid + ':notifications:unread'); + readKeys.push('uid:' + uid + ':notifications:read'); + }); + + db.sortedSetsAdd(unreadKeys, notification.datetime, notification.nid, next); + }, + function (next) { + db.sortedSetsRemove(readKeys, notification.nid, next); + }, + function (next) { + db.sortedSetsRemoveRangeByScore(unreadKeys, '-inf', oneWeekAgo, next); + }, + function (next) { + db.sortedSetsRemoveRangeByScore(readKeys, '-inf', oneWeekAgo, next); + }, + function (next) { + var websockets = require('./socket.io'); + if (websockets.server) { + uids.forEach(function (uid) { + websockets.in('uid_' + uid).emit('event:new_notification', notification); + }); + } + next(); + }, + ], callback); + } + + function sendEmail(uids, callback) { + async.eachLimit(uids, 3, function (uid, next) { + emailer.send('notification', uid, { + path: notification.path, + subject: '[' + (meta.config.title || 'NodeBB') + '] ' + notification.bodyShort, + intro: '[[notifications:new_notification_from, ' + meta.config.title + ']]', + body: notification.bodyLong || notification.bodyShort, + showUnsubscribe: true, + }, next); + }, callback); + } + + function getUidsBySettings(uids, callback) { + var uidsToNotify = []; + var uidsToEmail = []; + async.waterfall([ + function (next) { + User.getMultipleUserSettings(uids, next); + }, + function (usersSettings, next) { + usersSettings.forEach(function (userSettings) { + var setting = userSettings['notificationType_' + notification.type] || 'notification'; + + if (setting === 'notification' || setting === 'notificationemail') { + uidsToNotify.push(userSettings.uid); + } + + if (setting === 'email' || setting === 'notificationemail') { + uidsToEmail.push(userSettings.uid); + } + }); + next(null, { uidsToNotify: uidsToNotify, uidsToEmail: uidsToEmail }); + }, + ], callback); + } async.waterfall([ function (next) { @@ -190,35 +260,32 @@ function pushToUids(uids, notification, callback) { if (!data || !data.notification || !data.uids || !data.uids.length) { return callback(); } - - uids = data.uids; notification = data.notification; - - uids.forEach(function (uid) { - unreadKeys.push('uid:' + uid + ':notifications:unread'); - readKeys.push('uid:' + uid + ':notifications:read'); - }); - - db.sortedSetsAdd(unreadKeys, notification.datetime, notification.nid, next); - }, - function (next) { - db.sortedSetsRemove(readKeys, notification.nid, next); - }, - function (next) { - db.sortedSetsRemoveRangeByScore(unreadKeys, '-inf', oneWeekAgo, next); - }, - function (next) { - db.sortedSetsRemoveRangeByScore(readKeys, '-inf', oneWeekAgo, next); - }, - function (next) { - var websockets = require('./socket.io'); - if (websockets.server) { - uids.forEach(function (uid) { - websockets.in('uid_' + uid).emit('event:new_notification', notification); - }); + if (notification.type) { + getUidsBySettings(data.uids, next); + } else { + next(null, { uidsToNotify: data.uids, uidsToEmail: [] }); } - - plugins.fireHook('action:notification.pushed', { notification: notification, uids: uids }); + }, + function (results, next) { + async.parallel([ + function (next) { + sendNotification(results.uidsToNotify, next); + }, + function (next) { + sendEmail(results.uidsToEmail, next); + }, + ], function (err) { + next(err, results); + }); + }, + function (results, next) { + plugins.fireHook('action:notification.pushed', { + notification: notification, + uids: results.uidsToNotify, + uidsNotified: results.uidsToNotify, + uidsEmailed: results.uidsToEmail, + }); next(); }, ], callback); diff --git a/src/posts/queue.js b/src/posts/queue.js index 553fbb764e..6d8001f2f7 100644 --- a/src/posts/queue.js +++ b/src/posts/queue.js @@ -53,17 +53,25 @@ module.exports = function (Posts) { user.setUserField(data.uid, 'lastqueuetime', Date.now(), next); }, function (next) { - notifications.create({ - nid: 'post-queued-' + id, - mergeId: 'post-queue', - bodyShort: '[[notifications:post_awaiting_review]]', - bodyLong: data.content, - path: '/post-queue', + async.parallel({ + notification: function (next) { + notifications.create({ + type: 'post-queue', + nid: 'post-queue-' + id, + mergeId: 'post-queue', + bodyShort: '[[notifications:post_awaiting_review]]', + bodyLong: data.content, + path: '/post-queue', + }, next); + }, + cid: function (next) { + getCid(type, data, next); + }, }, next); }, - function (notification, next) { - if (notification) { - notifications.pushGroups(notification, ['administrators', 'Global Moderators'], next); + function (results, next) { + if (results.notification) { + notifications.pushGroups(results.notification, ['administrators', 'Global Moderators', 'cid:' + results.cid + ':privileges:moderate'], next); } else { next(); } @@ -79,20 +87,26 @@ module.exports = function (Posts) { ], callback); }; + function getCid(type, data, callback) { + if (type === 'topic') { + return setImmediate(callback, null, data.cid); + } else if (type === 'reply') { + topics.getTopicField(data.tid, 'cid', callback); + } else { + return setImmediate(callback, null, null); + } + } + function canPost(type, data, callback) { async.waterfall([ function (next) { - if (type === 'topic') { - next(null, data.cid); - } else if (type === 'reply') { - topics.getTopicField(data.tid, 'cid', next); - } + getCid(type, data, next); }, function (cid, next) { async.parallel({ canPost: function (next) { if (type === 'topic') { - privileges.categories.can('topics:create', data.cid, data.uid, next); + privileges.categories.can('topics:create', cid, data.uid, next); } else if (type === 'reply') { privileges.categories.can('topics:reply', cid, data.uid, next); } diff --git a/src/topics/follow.js b/src/topics/follow.js index f1bad3ccf3..cf8754bcc5 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -2,15 +2,11 @@ 'use strict'; var async = require('async'); -var winston = require('winston'); var db = require('../database'); -var user = require('../user'); var posts = require('../posts'); var notifications = require('../notifications'); var privileges = require('../privileges'); -var meta = require('../meta'); -var emailer = require('../emailer'); var plugins = require('../plugins'); var utils = require('../utils'); @@ -239,36 +235,6 @@ module.exports = function (Topics) { notifications.push(notification, followers); } - if (parseInt(meta.config.disableEmailSubscriptions, 10) === 1) { - return next(); - } - - async.eachLimit(followers, 3, function (toUid, next) { - async.parallel({ - userData: async.apply(user.getUserFields, toUid, ['username', 'userslug']), - userSettings: async.apply(user.getSettings, toUid), - }, function (err, data) { - if (err) { - return next(err); - } - - if (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 + ', ' + titleEscaped + ']]', - postBody: postData.content.replace(/"\/\//g, '"https://'), - username: data.userData.username, - userslug: data.userData.userslug, - topicSlug: postData.topic.slug, - showUnsubscribe: true, - }, next); - } else { - winston.debug('[topics.notifyFollowers] uid ' + toUid + ' does not have post notifications enabled, skipping.'); - next(); - } - }); - }); next(); }, ], callback); diff --git a/src/upgrades/1.7.1/notification-settings.js b/src/upgrades/1.7.1/notification-settings.js new file mode 100644 index 0000000000..df6fe27404 --- /dev/null +++ b/src/upgrades/1.7.1/notification-settings.js @@ -0,0 +1,48 @@ +'use strict'; + +var async = require('async'); +var batch = require('../../batch'); +var db = require('../../database'); + +module.exports = { + name: 'Convert old notification digest settings', + timestamp: Date.UTC(2017, 10, 15), + method: function (callback) { + var progress = this.progress; + + batch.processSortedSet('users:joindate', function (uids, next) { + async.eachLimit(uids, 500, function (uid, next) { + progress.incr(); + async.waterfall([ + function (next) { + db.getObjectFields('user:' + uid + ':settings', ['sendChatNotifications', 'sendPostNotifications'], next); + }, + function (userSettings, _next) { + if (!userSettings) { + return next(); + } + var tasks = []; + if (parseInt(userSettings.sendChatNotifications, 10) === 1) { + tasks.push(async.apply(db.setObjectField, 'user:' + uid + ':settings', 'notificationType_new-chat', 'notificationemail')); + } + if (parseInt(userSettings.sendPostNotifications, 10) === 1) { + tasks.push(async.apply(db.setObjectField, 'user:' + uid + ':settings', 'notificationType_new-reply', 'notificationemail')); + } + if (!tasks.length) { + return next(); + } + + async.series(tasks, function (err) { + _next(err); + }); + }, + function (next) { + db.deleteObjectFields('user:' + uid + ':settings', ['sendChatNotifications', 'sendPostNotifications'], next); + }, + ], next); + }, next); + }, { + progress: progress, + }, callback); + }, +}; diff --git a/src/user.js b/src/user.js index 3275e25db3..2ad441c5ce 100644 --- a/src/user.js +++ b/src/user.js @@ -208,13 +208,17 @@ User.isGlobalModerator = function (uid, callback) { privileges.users.isGlobalModerator(uid, callback); }; +User.getPrivileges = function (uid, callback) { + async.parallel({ + isAdmin: async.apply(User.isAdministrator, uid), + isGlobalModerator: async.apply(User.isGlobalModerator, uid), + isModeratorOfAnyCategory: async.apply(User.isModeratorOfAnyCategory, uid), + }, callback); +}; + User.isPrivileged = function (uid, callback) { - async.parallel([ - async.apply(User.isAdministrator, uid), - async.apply(User.isGlobalModerator, uid), - async.apply(User.isModeratorOfAnyCategory, uid), - ], function (err, results) { - callback(err, results ? results.some(Boolean) : false); + User.getPrivileges(uid, function (err, results) { + callback(err, results ? (results.isAdmin || results.isGlobalModerator || results.isModeratorOfAnyCategory) : false); }); }; diff --git a/src/user/approval.js b/src/user/approval.js index 96c25d8ad5..710b66930a 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -49,6 +49,7 @@ module.exports = function (User) { async.waterfall([ function (next) { notifications.create({ + type: 'new-register', bodyShort: '[[notifications:new_register, ' + username + ']]', nid: 'new_register:' + username, path: '/admin/manage/registration', diff --git a/src/user/settings.js b/src/user/settings.js index f713b113d8..784213e603 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -131,6 +131,12 @@ module.exports = function (User) { notificationSound: data.notificationSound, incomingChatSound: data.incomingChatSound, outgoingChatSound: data.outgoingChatSound, + notificationType_upvote: data.notificationType_upvote, + 'notificationType_new-topic': data['notificationType_new-topic'], + 'notificationType_new-reply': data['notificationType_new-reply'], + notificationType_follow: data.notificationType_follow, + 'notificationType_new-chat': data['notificationType_new-chat'], + 'notificationType_group-invite': data['notificationType_group-invite'], }; if (data.bootswatchSkin) { diff --git a/src/views/emails/notification.tpl b/src/views/emails/notification.tpl new file mode 100644 index 0000000000..b0f79b042c --- /dev/null +++ b/src/views/emails/notification.tpl @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + +
+

{intro}

+
+ {body} +
+ + + + + +
+ +     [[email:notif.cta]]     + +
+ +
+

[[email:closing]]

+

{site_title}

+
+
+ + + From b62a7bf0ad40fbdee0233d4dba406925c5ae5331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 15 Nov 2017 21:50:11 -0500 Subject: [PATCH 04/81] up themes --- package.default.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.default.json b/package.default.json index a357382221..ad25463d17 100644 --- a/package.default.json +++ b/package.default.json @@ -67,9 +67,9 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.0.1", + "nodebb-theme-persona": "7.0.2", "nodebb-theme-slick": "1.1.1", - "nodebb-theme-vanilla": "8.0.1", + "nodebb-theme-vanilla": "8.0.2", "nodebb-widget-essentials": "4.0.1", "nodemailer": "4.3.0", "passport": "^0.4.0", From 0f9c2f5a9a4068a9d986cbb510b263651fbc2943 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 16 Nov 2017 10:13:11 -0500 Subject: [PATCH 05/81] updated theme deps for #6069 --- package.default.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.default.json b/package.default.json index ad25463d17..ff5a66c29c 100644 --- a/package.default.json +++ b/package.default.json @@ -67,9 +67,9 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.0.2", + "nodebb-theme-persona": "7.1.0", "nodebb-theme-slick": "1.1.1", - "nodebb-theme-vanilla": "8.0.2", + "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", "nodemailer": "4.3.0", "passport": "^0.4.0", From b6562325a4f883750d1d4f7d4fbdd1605cf0aad9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 16 Nov 2017 10:20:55 -0500 Subject: [PATCH 06/81] up persona for #6069 --- package.default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.default.json b/package.default.json index ff5a66c29c..ed8c576704 100644 --- a/package.default.json +++ b/package.default.json @@ -67,7 +67,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.1.0", + "nodebb-theme-persona": "7.1.1", "nodebb-theme-slick": "1.1.1", "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", From 5da24b41204692e20ca255c65a325c9d91e37d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 16 Nov 2017 10:55:55 -0500 Subject: [PATCH 07/81] https://github.com/NodeBB/NodeBB/issues/6073 --- src/socket.io/topics/tags.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/socket.io/topics/tags.js b/src/socket.io/topics/tags.js index fd0c0d0987..2c50999b70 100644 --- a/src/socket.io/topics/tags.js +++ b/src/socket.io/topics/tags.js @@ -7,7 +7,7 @@ var utils = require('../../utils'); module.exports = function (SocketTopics) { SocketTopics.isTagAllowed = function (socket, data, callback) { - if (!data || !data.cid || !data.tag) { + if (!data || !utils.isNumber(data.cid) || !data.tag) { return callback(new Error('[[error:invalid-data]]')); } async.waterfall([ @@ -15,10 +15,7 @@ module.exports = function (SocketTopics) { db.getSortedSetRange('cid:' + data.cid + ':tag:whitelist', 0, -1, next); }, function (tagWhitelist, next) { - if (!tagWhitelist.length) { - return next(null, true); - } - next(null, tagWhitelist.indexOf(data.tag) !== -1); + next(null, !tagWhitelist.length || tagWhitelist.includes(data.tag)); }, ], callback); }; From 643008041cb204606a40c3d9d48c1a4b6f4c1c15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 16 Nov 2017 10:59:34 -0500 Subject: [PATCH 08/81] up composer default --- package.default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.default.json b/package.default.json index ed8c576704..10b8973b82 100644 --- a/package.default.json +++ b/package.default.json @@ -57,7 +57,7 @@ "morgan": "^1.9.0", "mousetrap": "^1.6.1", "nconf": "^0.8.5", - "nodebb-plugin-composer-default": "6.0.5", + "nodebb-plugin-composer-default": "6.0.6", "nodebb-plugin-dbsearch": "2.0.9", "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.2.1", From f5385e38bfe07b88616e0ea435f75b57bdc9aff1 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Thu, 16 Nov 2017 15:38:26 -0700 Subject: [PATCH 09/81] Add `/me*` route which redirects to `/user/[userslug]*` (#6063) * Add `/me*` route which redirects to the current user's information - `/me` -> `/user/[usertslug]` - `/me/bookmarks` -> `/user/[userslug]/bookmarks` - `/me/settings` -> `/user/[userslug]/settings` etc * Add tests for `/me/*` --- src/middleware/user.js | 16 ++++++++++++++++ src/routes/accounts.js | 3 ++- test/authentication.js | 3 ++- test/controllers.js | 29 +++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/middleware/user.js b/src/middleware/user.js index b80b91fea3..3c59bd8923 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -140,6 +140,22 @@ module.exports = function (middleware) { ], next); }; + middleware.redirectMeToUserslug = function (req, res, next) { + var uid = req.uid; + async.waterfall([ + function (next) { + user.getUserField(uid, 'userslug', next); + }, + function (userslug) { + if (!userslug) { + return res.status(401).send('not-authorized'); + } + var path = req.path.replace(/^(\/api)?\/me/, '/user/' + userslug); + controllers.helpers.redirect(res, path); + }, + ], next); + }; + middleware.isAdmin = function (req, res, next) { async.waterfall([ function (next) { diff --git a/src/routes/accounts.js b/src/routes/accounts.js index 336a38e442..5c040b6af1 100644 --- a/src/routes/accounts.js +++ b/src/routes/accounts.js @@ -7,7 +7,8 @@ module.exports = function (app, middleware, controllers) { var middlewares = [middleware.checkGlobalPrivacySettings]; var accountMiddlewares = [middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]; - setupPageRoute(app, '/uid/:uid/:section1?/:section2?', middleware, [], middleware.redirectUidToUserslug); + setupPageRoute(app, '/me/*', middleware, [], middleware.redirectMeToUserslug); + setupPageRoute(app, '/uid/:uid*', middleware, [], middleware.redirectUidToUserslug); setupPageRoute(app, '/user/:userslug', middleware, middlewares, controllers.accounts.profile.get); setupPageRoute(app, '/user/:userslug/following', middleware, middlewares, controllers.accounts.follow.getFollowing); diff --git a/test/authentication.js b/test/authentication.js index 6dd781710c..bacbcb679a 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -186,8 +186,9 @@ describe('authentication', function () { url: nconf.get('url') + '/api/me', json: true, jar: jar, - }, function (err, response, body) { + }, function (err, res, body) { assert.ifError(err); + assert.equal(res.statusCode, 401); assert.equal(body, 'not-authorized'); done(); }); diff --git a/test/controllers.js b/test/controllers.js index 15d2be3765..b5f0c40b3f 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -937,6 +937,35 @@ describe('Controllers', function () { }); }); + describe('/me/*', function () { + it('api should redirect to /user/[userslug]/bookmarks', function (done) { + request(nconf.get('url') + '/api/me/bookmarks', { jar: jar, json: true }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert.equal(res.headers['x-redirect'], '/user/foo/bookmarks'); + assert.equal(body, '/user/foo/bookmarks'); + done(); + }); + }); + it('api should redirect to /user/[userslug]/edit/username', function (done) { + request(nconf.get('url') + '/api/me/edit/username', { jar: jar, json: true }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert.equal(res.headers['x-redirect'], '/user/foo/edit/username'); + assert.equal(body, '/user/foo/edit/username'); + done(); + }); + }); + it('should 401 if user is not logged in', function (done) { + request(nconf.get('url') + '/me/bookmarks', { json: true }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 401); + assert.equal(body, 'not-authorized'); + done(); + }); + }); + }); + it('should 401 if user is not logged in', function (done) { request(nconf.get('url') + '/api/admin', { json: true }, function (err, res) { assert.ifError(err); From c47c47f7e3d9c3595d9383c1346be6e6b64134da Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Thu, 16 Nov 2017 15:43:52 -0700 Subject: [PATCH 10/81] Use less memory to build translation files (#6070) * Change languages build to use less memory Add graceful-fs so no ned to worry about fs limits * Specify encoding for fs.readFile Use eachLimit since graceful-fs handles that now --- package.default.json | 1 + src/admin/search.js | 3 +- src/controllers/admin/settings.js | 6 +- src/controllers/admin/themes.js | 2 +- src/file.js | 3 + src/image.js | 4 +- src/install.js | 10 +- src/languages.js | 8 +- src/meta/cacheBuster.js | 8 +- src/meta/js.js | 10 +- src/meta/languages.js | 204 ++++++++++++++---------------- src/meta/minifier.js | 15 ++- src/meta/package-install.js | 2 +- src/meta/templates.js | 8 +- src/meta/themes.js | 8 +- src/middleware/index.js | 4 +- src/plugins/data.js | 4 +- 17 files changed, 142 insertions(+), 158 deletions(-) diff --git a/package.default.json b/package.default.json index 10b8973b82..ce6780128f 100644 --- a/package.default.json +++ b/package.default.json @@ -40,6 +40,7 @@ "express": "^4.16.2", "express-session": "^1.15.6", "express-useragent": "1.0.8", + "graceful-fs": "^4.1.11", "html-to-text": "3.3.0", "ipaddr.js": "^1.5.4", "jimp": "0.2.28", diff --git a/src/admin/search.js b/src/admin/search.js index 1803f3298c..6f9792138e 100644 --- a/src/admin/search.js +++ b/src/admin/search.js @@ -63,12 +63,11 @@ var fallbackCacheInProgress = {}; var fallbackCache = {}; function initFallback(namespace, callback) { - fs.readFile(path.resolve(nconf.get('views_dir'), namespace + '.tpl'), function (err, file) { + fs.readFile(path.resolve(nconf.get('views_dir'), namespace + '.tpl'), 'utf8', function (err, template) { if (err) { return callback(err); } - var template = file.toString(); var title = nsToTitle(namespace); var translations = sanitize(template); diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index 28322892f3..8944655881 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -45,16 +45,16 @@ function renderEmail(req, res, next) { async.waterfall([ function (next) { - fs.readFile(email, next); + fs.readFile(email, 'utf8', next); }, function (original, next) { - var text = meta.config['email:custom:' + path] ? meta.config['email:custom:' + path] : original.toString(); + var text = meta.config['email:custom:' + path] ? meta.config['email:custom:' + path] : original; next(null, { path: path, fullpath: email, text: text, - original: original.toString(), + original: original, }); }, ], next); diff --git a/src/controllers/admin/themes.js b/src/controllers/admin/themes.js index 850feb201d..717d4bf0dc 100644 --- a/src/controllers/admin/themes.js +++ b/src/controllers/admin/themes.js @@ -23,7 +23,7 @@ themesController.get = function (req, res, next) { return next(Error('invalid-data')); } - fs.readFile(themeConfigPath, next); + fs.readFile(themeConfigPath, 'utf8', next); }, function (themeConfig, next) { try { diff --git a/src/file.js b/src/file.js index c091da614f..8027f7ad77 100644 --- a/src/file.js +++ b/src/file.js @@ -7,9 +7,12 @@ var winston = require('winston'); var jimp = require('jimp'); var mkdirp = require('mkdirp'); var mime = require('mime'); +var graceful = require('graceful-fs'); var utils = require('./utils'); +graceful.gracefulify(fs); + var file = module.exports; /** diff --git a/src/image.js b/src/image.js index fc3ddd5e76..f2afb21003 100644 --- a/src/image.js +++ b/src/image.js @@ -120,9 +120,7 @@ image.size = function (path, callback) { }; image.convertImageToBase64 = function (path, callback) { - fs.readFile(path, function (err, data) { - callback(err, data ? data.toString('base64') : null); - }); + fs.readFile(path, 'base64', callback); }; image.mimeFromBase64 = function (imageData) { diff --git a/src/install.js b/src/install.js index 3a69595599..fecf86b379 100644 --- a/src/install.js +++ b/src/install.js @@ -371,7 +371,7 @@ function createCategories(next) { 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) { + fs.readFile(path.join(__dirname, '../', 'install/data/categories.json'), 'utf8', function (err, default_categories) { if (err) { return next(err); } @@ -402,7 +402,7 @@ function createWelcomePost(next) { async.parallel([ function (next) { - fs.readFile(path.join(__dirname, '../', 'install/data/welcome.md'), next); + fs.readFile(path.join(__dirname, '../', 'install/data/welcome.md'), 'utf8', next); }, function (next) { db.getObjectField('global', 'topicCount', next); @@ -421,7 +421,7 @@ function createWelcomePost(next) { uid: 1, cid: 2, title: 'Welcome to your NodeBB!', - content: content.toString(), + content: content, }, next); } else { next(); @@ -473,7 +473,7 @@ function setCopyrightWidget(next) { var db = require('./database'); async.parallel({ footerJSON: function (next) { - fs.readFile(path.join(__dirname, '../', 'install/data/footer.json'), next); + fs.readFile(path.join(__dirname, '../', 'install/data/footer.json'), 'utf8', next); }, footer: function (next) { db.getObjectField('widgets:global', 'footer', next); @@ -484,7 +484,7 @@ function setCopyrightWidget(next) { } if (!results.footer && results.footerJSON) { - db.setObjectField('widgets:global', 'footer', results.footerJSON.toString(), next); + db.setObjectField('widgets:global', 'footer', results.footerJSON, next); } else { next(); } diff --git a/src/languages.js b/src/languages.js index 77945bacc6..cdf56bf81d 100644 --- a/src/languages.js +++ b/src/languages.js @@ -29,7 +29,7 @@ Languages.listCodes = function (callback) { return callback(null, codeCache); } - fs.readFile(path.join(languagesPath, 'metadata.json'), function (err, buffer) { + fs.readFile(path.join(languagesPath, 'metadata.json'), 'utf8', function (err, file) { if (err && err.code === 'ENOENT') { return callback(null, []); } @@ -39,7 +39,7 @@ Languages.listCodes = function (callback) { var parsed; try { - parsed = JSON.parse(buffer.toString()); + parsed = JSON.parse(file); } catch (e) { return callback(e); } @@ -64,7 +64,7 @@ Languages.list = function (callback) { async.map(codes, function (folder, next) { var configPath = path.join(languagesPath, folder, 'language.json'); - fs.readFile(configPath, function (err, buffer) { + fs.readFile(configPath, 'utf8', function (err, file) { if (err && err.code === 'ENOENT') { return next(); } @@ -72,7 +72,7 @@ Languages.list = function (callback) { return next(err); } try { - var lang = JSON.parse(buffer.toString()); + var lang = JSON.parse(file); next(null, lang); } catch (e) { next(e); diff --git a/src/meta/cacheBuster.js b/src/meta/cacheBuster.js index f88cebb680..4ea3109dbe 100644 --- a/src/meta/cacheBuster.js +++ b/src/meta/cacheBuster.js @@ -31,18 +31,18 @@ exports.read = function read(callback) { return callback(null, cached); } - fs.readFile(filePath, function (err, buffer) { + fs.readFile(filePath, 'utf8', function (err, buster) { if (err) { winston.warn('[cache-buster] could not read cache buster', err); return callback(null, generate()); } - if (!buffer || buffer.toString().length !== 11) { - winston.warn('[cache-buster] cache buster string invalid: expected /[a-z0-9]{11}/, got `' + buffer + '`'); + if (!buster || buster.length !== 11) { + winston.warn('[cache-buster] cache buster string invalid: expected /[a-z0-9]{11}/, got `' + buster + '`'); return callback(null, generate()); } - cached = buffer.toString(); + cached = buster; callback(null, cached); }); }; diff --git a/src/meta/js.js b/src/meta/js.js index 28b114434a..cac47834be 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -106,7 +106,7 @@ function minifyModules(modules, fork, callback) { return prev; }, []); - async.eachLimit(moduleDirs, 1000, mkdirp, function (err) { + async.each(moduleDirs, mkdirp, function (err) { if (err) { return callback(err); } @@ -126,7 +126,7 @@ function minifyModules(modules, fork, callback) { minifier.js.minifyBatch(filtered.minify, fork, cb); }, function (cb) { - async.eachLimit(filtered.skip, 500, function (mod, next) { + async.each(filtered.skip, function (mod, next) { linkIfLinux(mod.srcPath, mod.destPath, next); }, cb); }, @@ -137,7 +137,7 @@ function minifyModules(modules, fork, callback) { function linkModules(callback) { var modules = JS.scripts.modules; - async.eachLimit(Object.keys(modules), 1000, function (relPath, next) { + async.each(Object.keys(modules), function (relPath, next) { var srcPath = path.join(__dirname, '../../', modules[relPath]); var destPath = path.join(__dirname, '../../build/public/src/modules', relPath); @@ -183,7 +183,7 @@ function getModuleList(callback) { modules = modules.concat(coreDirs); var moduleFiles = []; - async.eachLimit(modules, 1000, function (module, next) { + async.each(modules, function (module, next) { var srcPath = module.srcPath; var destPath = module.destPath; @@ -255,7 +255,7 @@ JS.linkStatics = function (callback) { if (err) { return callback(err); } - async.eachLimit(Object.keys(plugins.staticDirs), 1000, function (mappedPath, next) { + async.each(Object.keys(plugins.staticDirs), function (mappedPath, next) { var sourceDir = plugins.staticDirs[mappedPath]; var destDir = path.join(__dirname, '../../build/public/plugins', mappedPath); diff --git a/src/meta/languages.js b/src/meta/languages.js index 3b9f3c3a9e..fc907e60be 100644 --- a/src/meta/languages.js +++ b/src/meta/languages.js @@ -13,7 +13,7 @@ var Plugins = require('../plugins'); var buildLanguagesPath = path.join(__dirname, '../../build/public/language'); var coreLanguagesPath = path.join(__dirname, '../../public/language'); -function getTranslationTree(callback) { +function getTranslationMetadata(callback) { async.waterfall([ // generate list of languages and namespaces function (next) { @@ -49,129 +49,113 @@ function getTranslationTree(callback) { // save a list of languages to `${buildLanguagesPath}/metadata.json` // avoids readdirs later on function (ref, next) { - async.waterfall([ + async.series([ function (next) { mkdirp(buildLanguagesPath, next); }, - function (x, next) { + function (next) { fs.writeFile(path.join(buildLanguagesPath, 'metadata.json'), JSON.stringify({ languages: ref.languages, namespaces: ref.namespaces, }), next); }, - function (next) { - next(null, ref); - }, - ], next); - }, - - // for each language and namespace combination, - // run through core and all plugins to generate - // a full translation hash - function (ref, next) { - var languages = ref.languages; - var namespaces = ref.namespaces; - var plugins = _.values(Plugins.pluginsData).filter(function (plugin) { - return typeof plugin.languages === 'string'; - }); - - var tree = {}; - - async.eachLimit(languages, 10, function (lang, next) { - async.eachLimit(namespaces, 10, function (namespace, next) { - var translations = {}; - - async.series([ - // core first - function (cb) { - fs.readFile(path.join(coreLanguagesPath, lang, namespace + '.json'), function (err, buffer) { - if (err) { - if (err.code === 'ENOENT') { - return cb(); - } - return cb(err); - } - - try { - Object.assign(translations, JSON.parse(buffer.toString())); - cb(); - } catch (err) { - cb(err); - } - }); - }, - function (cb) { - // for each plugin, fallback in this order: - // 1. correct language string (en-GB) - // 2. old language string (en_GB) - // 3. corrected plugin defaultLang (en-US) - // 4. old plugin defaultLang (en_US) - async.eachLimit(plugins, 20, function (pluginData, done) { - var pluginLanguages = path.join(__dirname, '../../node_modules/', pluginData.id, pluginData.languages); - var defaultLang = pluginData.defaultLang || 'en-GB'; - - async.eachSeries([ - defaultLang.replace('-', '_').replace('-x-', '@'), - defaultLang.replace('_', '-').replace('@', '-x-'), - lang.replace('-', '_').replace('-x-', '@'), - lang, - ], function (language, next) { - fs.readFile(path.join(pluginLanguages, language, namespace + '.json'), function (err, buffer) { - if (err) { - if (err.code === 'ENOENT') { - return next(null, false); - } - return next(err); - } - - try { - Object.assign(translations, JSON.parse(buffer.toString())); - next(null, true); - } catch (err) { - next(err); - } - }); - }, done); - }, function (err) { - if (err) { - return cb(err); - } - - if (Object.keys(translations).length) { - tree[lang] = tree[lang] || {}; - tree[lang][namespace] = translations; - } - cb(); - }); - }, - ], next); - }, next); - }, function (err) { - next(err, tree); + ], function (err) { + next(err, ref); }); }, ], callback); } -// write translation hashes from the generated tree to language files -function writeLanguageFiles(tree, callback) { - // iterate over languages and namespaces - async.eachLimit(Object.keys(tree), 100, function (language, cb) { - var namespaces = tree[language]; - async.eachLimit(Object.keys(namespaces), 10, function (namespace, next) { - var translations = namespaces[namespace]; +function writeLanguageFile(language, namespace, translations, callback) { + var dev = global.env === 'development'; + var filePath = path.join(buildLanguagesPath, language, namespace + '.json'); - var filePath = path.join(buildLanguagesPath, language, namespace + '.json'); + async.series([ + async.apply(mkdirp, path.dirname(filePath)), + async.apply(fs.writeFile, filePath, JSON.stringify(translations, null, dev ? 2 : 0)), + ], callback); +} - mkdirp(path.dirname(filePath), function (err) { - if (err) { - return next(err); - } +// for each language and namespace combination, +// run through core and all plugins to generate +// a full translation hash +function buildTranslations(ref, next) { + var namespaces = ref.namespaces; + var languages = ref.languages; + var plugins = _.values(Plugins.pluginsData).filter(function (plugin) { + return typeof plugin.languages === 'string'; + }); - fs.writeFile(filePath, JSON.stringify(translations), next); - }); - }, cb); - }, callback); + async.each(namespaces, function (namespace, next) { + async.each(languages, function (lang, next) { + var translations = {}; + + async.series([ + // core first + function (cb) { + fs.readFile(path.join(coreLanguagesPath, lang, namespace + '.json'), 'utf8', function (err, file) { + if (err) { + if (err.code === 'ENOENT') { + return cb(); + } + return cb(err); + } + + try { + Object.assign(translations, JSON.parse(file)); + cb(); + } catch (err) { + cb(err); + } + }); + }, + function (cb) { + // for each plugin, fallback in this order: + // 1. correct language string (en-GB) + // 2. old language string (en_GB) + // 3. corrected plugin defaultLang (en-US) + // 4. old plugin defaultLang (en_US) + async.each(plugins, function (pluginData, done) { + var pluginLanguages = path.join(__dirname, '../../node_modules/', pluginData.id, pluginData.languages); + var defaultLang = pluginData.defaultLang || 'en-GB'; + + async.eachSeries([ + defaultLang.replace('-', '_').replace('-x-', '@'), + defaultLang.replace('_', '-').replace('@', '-x-'), + lang.replace('-', '_').replace('-x-', '@'), + lang, + ], function (language, next) { + fs.readFile(path.join(pluginLanguages, language, namespace + '.json'), 'utf8', function (err, file) { + if (err) { + if (err.code === 'ENOENT') { + return next(null, false); + } + return next(err); + } + + try { + Object.assign(translations, JSON.parse(file)); + next(null, true); + } catch (err) { + next(err); + } + }); + }, done); + }, function (err) { + if (err) { + return cb(err); + } + + if (Object.keys(translations).length) { + writeLanguageFile(lang, namespace, translations, cb); + return; + } + cb(); + }); + }, + ], next); + }, next); + }, next); } exports.build = function buildLanguages(callback) { @@ -179,7 +163,7 @@ exports.build = function buildLanguages(callback) { function (next) { rimraf(buildLanguagesPath, next); }, - getTranslationTree, - writeLanguageFiles, + getTranslationMetadata, + buildTranslations, ], callback); }; diff --git a/src/meta/minifier.js b/src/meta/minifier.js index c51f41578b..ed6a68a625 100644 --- a/src/meta/minifier.js +++ b/src/meta/minifier.js @@ -11,6 +11,7 @@ var autoprefixer = require('autoprefixer'); var clean = require('postcss-clean'); var fork = require('./debugFork'); +require('../file'); // for graceful-fs var Minifier = module.exports; @@ -139,12 +140,12 @@ function executeAction(action, fork, callback) { function concat(data, callback) { if (data.files && data.files.length) { async.mapLimit(data.files, 1000, function (ref, next) { - fs.readFile(ref.srcPath, function (err, buffer) { + fs.readFile(ref.srcPath, 'utf8', function (err, file) { if (err) { return next(err); } - next(null, buffer.toString()); + next(null, file); }); }, function (err, files) { if (err) { @@ -163,18 +164,18 @@ function concat(data, callback) { actions.concat = concat; function minifyJS_batch(data, callback) { - async.eachLimit(data.files, 1000, function (ref, next) { + async.each(data.files, function (ref, next) { var srcPath = ref.srcPath; var destPath = ref.destPath; var filename = ref.filename; - fs.readFile(srcPath, function (err, buffer) { + fs.readFile(srcPath, 'utf8', function (err, file) { if (err) { return next(err); } var scripts = {}; - scripts[filename] = buffer.toString(); + scripts[filename] = file; try { var minified = uglifyjs.minify(scripts, { @@ -203,7 +204,7 @@ function minifyJS(data, callback) { var srcPath = ref.srcPath; var filename = ref.filename; - fs.readFile(srcPath, function (err, buffer) { + fs.readFile(srcPath, 'utf8', function (err, file) { if (err) { return next(err); } @@ -211,7 +212,7 @@ function minifyJS(data, callback) { next(null, { srcPath: srcPath, filename: filename, - source: buffer.toString(), + source: file, }); }); }, function (err, files) { diff --git a/src/meta/package-install.js b/src/meta/package-install.js index 3fee4cb9e4..ca465493bd 100644 --- a/src/meta/package-install.js +++ b/src/meta/package-install.js @@ -59,7 +59,7 @@ function preserveExtraneousPlugins() { }) // reduce to a map of package names to package versions .reduce(function (map, pkgName) { - var pkgConfig = JSON.parse(fs.readFileSync(path.join(modulesPath, pkgName, 'package.json'))); + var pkgConfig = JSON.parse(fs.readFileSync(path.join(modulesPath, pkgName, 'package.json'), 'utf8')); map[pkgName] = pkgConfig.version; return map; }, {}); diff --git a/src/meta/templates.js b/src/meta/templates.js index 4f9f59d861..03097ef9dd 100644 --- a/src/meta/templates.js +++ b/src/meta/templates.js @@ -32,12 +32,11 @@ Templates.compile = function (callback) { var partial = '/' + matches[1]; if (paths[partial] && relativePath !== partial) { - fs.readFile(paths[partial], function (err, file) { + fs.readFile(paths[partial], 'utf8', function (err, partialSource) { if (err) { return callback(err); } - var partialSource = file.toString(); source = source.replace(regex, partialSource); processImports(paths, relativePath, source, callback); @@ -58,10 +57,9 @@ Templates.compile = function (callback) { async.each(Object.keys(paths), function (relativePath, next) { async.waterfall([ function (next) { - fs.readFile(paths[relativePath], next); + fs.readFile(paths[relativePath], 'utf8', next); }, - function (file, next) { - var source = file.toString(); + function (source, next) { processImports(paths, relativePath, source, next); }, function (source, next) { diff --git a/src/meta/themes.js b/src/meta/themes.js index 2ebc091036..e6eeb7011d 100644 --- a/src/meta/themes.js +++ b/src/meta/themes.js @@ -42,7 +42,7 @@ Themes.get = function (callback) { async.map(themes, function (theme, next) { var config = path.join(themePath, theme, 'theme.json'); - fs.readFile(config, function (err, file) { + fs.readFile(config, 'utf8', function (err, file) { if (err) { if (err.code === 'ENOENT') { return next(null, null); @@ -50,7 +50,7 @@ Themes.get = function (callback) { return next(err); } try { - var configObj = JSON.parse(file.toString()); + var configObj = JSON.parse(file); // Minor adjustments for API output configObj.type = 'local'; @@ -96,9 +96,9 @@ Themes.set = function (data, callback) { }); }, function (next) { - fs.readFile(path.join(nconf.get('themes_path'), data.id, 'theme.json'), function (err, config) { + fs.readFile(path.join(nconf.get('themes_path'), data.id, 'theme.json'), 'utf8', function (err, config) { if (!err) { - config = JSON.parse(config.toString()); + config = JSON.parse(config); next(null, config); } else { next(err); diff --git a/src/middleware/index.js b/src/middleware/index.js index d5f7e5e6a3..28ce7c3e10 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -218,11 +218,11 @@ middleware.templatesOnDemand = function (req, res, next) { return next(); } - fs.readFile(filePath.replace(/\.js$/, '.tpl'), cb); + fs.readFile(filePath.replace(/\.js$/, '.tpl'), 'utf8', cb); }, function (source, cb) { Benchpress.precompile({ - source: source.toString(), + source: source, minify: global.env !== 'development', }, cb); }, diff --git a/src/plugins/data.js b/src/plugins/data.js index b793a365d0..0dd7fa3a67 100644 --- a/src/plugins/data.js +++ b/src/plugins/data.js @@ -33,10 +33,10 @@ Data.getPluginPaths = getPluginPaths; function loadPluginInfo(pluginPath, callback) { async.parallel({ package: function (next) { - fs.readFile(path.join(pluginPath, 'package.json'), next); + fs.readFile(path.join(pluginPath, 'package.json'), 'utf8', next); }, plugin: function (next) { - fs.readFile(path.join(pluginPath, 'plugin.json'), next); + fs.readFile(path.join(pluginPath, 'plugin.json'), 'utf8', next); }, }, function (err, results) { if (err) { From 610a1c943fa8360caa89008588b1d50f80682fc5 Mon Sep 17 00:00:00 2001 From: aStonedPenguin Date: Thu, 16 Nov 2017 23:40:39 +0000 Subject: [PATCH 11/81] Add unread-class to category children (#6071) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add unread-class to category children * unused variables * Move child unread-class to a better place * comma? ¯\_(ツ)_/¯ * feedback --- src/categories.js | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/categories.js b/src/categories.js index 1487b543e2..6013091050 100644 --- a/src/categories.js +++ b/src/categories.js @@ -153,10 +153,10 @@ Categories.getCategories = function (cids, uid, callback) { uid = parseInt(uid, 10); results.categories.forEach(function (category, i) { if (category) { - category['unread-class'] = (parseInt(category.topic_count, 10) === 0 || (results.hasRead[i] && uid !== 0)) ? '' : 'unread'; category.children = results.children[i]; category.parent = results.parents[i] || undefined; category.tagWhitelist = results.tagWhitelist[i]; + category['unread-class'] = (parseInt(category.topic_count, 10) === 0 || (results.hasRead[i] && uid !== 0)) ? '' : 'unread'; calculateTopicPostCount(category); } }); @@ -259,9 +259,25 @@ function getChildrenRecursive(category, uid, callback) { } Categories.getCategoriesData(children, next); }, - function (childrenData, next) { - childrenData = childrenData.filter(Boolean); - category.children = childrenData; + function (children, next) { + children = children.filter(Boolean); + category.children = children; + + var cids = children.map(function (child) { + return child.cid; + }); + + Categories.hasReadCategories(cids, uid, next); + }, + function (hasRead, next) { + hasRead.forEach(function (read, i) { + var child = category.children[i]; + child['unread-class'] = (parseInt(child.topic_count, 10) === 0 || (read && uid !== 0)) ? '' : 'unread'; + }); + + next(); + }, + function (next) { async.each(category.children, function (child, next) { getChildrenRecursive(child, uid, next); }, next); From c839d1cbc0abde6944975ee71d6a6b5894b735d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 17 Nov 2017 08:10:25 -0500 Subject: [PATCH 12/81] closes #6080 closes #6078 --- public/language/en-GB/email.json | 2 ++ src/notifications.js | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/public/language/en-GB/email.json b/public/language/en-GB/email.json index a55f4f1f52..488af122bd 100644 --- a/public/language/en-GB/email.json +++ b/public/language/en-GB/email.json @@ -40,6 +40,8 @@ "notif.post.cta": "Click here to read the full topic", "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.cta": "Click here to go to forum", + "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", diff --git a/src/notifications.js b/src/notifications.js index 193427e8aa..6a7940d50d 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -220,9 +220,9 @@ function pushToUids(uids, notification, callback) { async.eachLimit(uids, 3, function (uid, next) { emailer.send('notification', uid, { path: notification.path, - subject: '[' + (meta.config.title || 'NodeBB') + '] ' + notification.bodyShort, - intro: '[[notifications:new_notification_from, ' + meta.config.title + ']]', - body: notification.bodyLong || notification.bodyShort, + subject: '[[notifications:new_notification_from, ' + meta.config.title + ']]', + intro: utils.stripHTMLTags(notification.bodyShort), + body: utils.stripHTMLTags(notification.bodyLong || ''), showUnsubscribe: true, }, next); }, callback); From 11b9cb76886f194c8d8281645580494da81bf7a5 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Fri, 17 Nov 2017 06:11:33 -0700 Subject: [PATCH 13/81] Fix #6076, `action:home.get:*` returned to previous functionality (#6077) Added tests to confirm `buildHeader` is used and `/api` works --- src/controllers/home.js | 29 +++-- src/routes/helpers.js | 4 +- src/routes/index.js | 4 +- test/controllers.js | 256 +++++++++++++++++++++++----------------- 4 files changed, 171 insertions(+), 122 deletions(-) diff --git a/src/controllers/home.js b/src/controllers/home.js index c044f889c5..6c67e7aaa2 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -36,7 +36,7 @@ function getRouteAllowUserHomePage(uid, next) { pubsub.on('config:update', configUpdated); configUpdated(); -module.exports = function (req, res, next) { +function rewrite(req, res, next) { if (req.path !== '/' && req.path !== '/api/' && req.path !== '/api') { return next(); } @@ -48,15 +48,26 @@ module.exports = function (req, res, next) { var hook = 'action:homepage.get:' + route; - if (plugins.hasListeners(hook)) { - return plugins.fireHook(hook, { - req: req, - res: res, - next: next, - }); + if (!plugins.hasListeners(hook)) { + req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + route; + } else { + res.locals.homePageRoute = route; } - req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + route; next(); }); -}; +} + +exports.rewrite = rewrite; + +function pluginHook(req, res, next) { + var hook = 'action:homepage.get:' + res.locals.homePageRoute; + + plugins.fireHook(hook, { + req: req, + res: res, + next: next, + }); +} + +exports.pluginHook = pluginHook; diff --git a/src/routes/helpers.js b/src/routes/helpers.js index 0aae67cbec..8cf4e38c90 100644 --- a/src/routes/helpers.js +++ b/src/routes/helpers.js @@ -1,6 +1,6 @@ 'use strict'; -var helpers = {}; +var helpers = module.exports; helpers.setupPageRoute = function (router, name, middleware, middlewares, controller) { middlewares = [middleware.maintenanceMode, middleware.registrationComplete, middleware.pageView, middleware.pluginHooks].concat(middlewares); @@ -13,5 +13,3 @@ helpers.setupAdminPageRoute = function (router, name, middleware, middlewares, c router.get(name, middleware.admin.buildHeader, middlewares, controller); router.get('/api' + name, middlewares, controller); }; - -module.exports = helpers; diff --git a/src/routes/index.js b/src/routes/index.js index 9feaa0ff60..e9f9b26c0a 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -122,7 +122,9 @@ module.exports = function (app, middleware, hotswapIds, callback) { app.use(middleware.stripLeadingSlashes); // handle custom homepage routes - app.use(relativePath, controllers.home); + app.use(relativePath, controllers.home.rewrite); + // homepage handled by `action:homepage.get:[route]` + setupPageRoute(app, '/', middleware, [], controllers.home.pluginHook); adminRoutes(router, middleware, controllers); metaRoutes(router, middleware, controllers); diff --git a/test/controllers.js b/test/controllers.js index b5f0c40b3f..213472d548 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -4,6 +4,8 @@ var async = require('async'); var assert = require('assert'); var nconf = require('nconf'); var request = require('request'); +var fs = require('fs'); +var path = require('path'); var db = require('./mocks/databasemock'); var categories = require('../src/categories'); @@ -15,6 +17,7 @@ var meta = require('../src/meta'); var translator = require('../src/translator'); var privileges = require('../src/privileges'); var plugins = require('../src/plugins'); +var utils = require('../src/utils'); var helpers = require('./helpers'); describe('Controllers', function () { @@ -58,126 +61,161 @@ describe('Controllers', function () { }); }); - - it('should load default home route', function (done) { - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - done(); - }); - }); - - it('should load unread as home route', function (done) { - meta.configs.set('homePageRoute', 'unread', function (err) { - assert.ifError(err); - - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - done(); - }); - }); - }); - - it('should load recent as home route', function (done) { - meta.configs.set('homePageRoute', 'recent', function (err) { - assert.ifError(err); - - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - done(); - }); - }); - }); - - it('should load popular as home route', function (done) { - meta.configs.set('homePageRoute', 'popular', function (err) { - assert.ifError(err); - - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - done(); - }); - }); - }); - - it('should load category as home route', function (done) { - meta.configs.set('homePageRoute', 'category/1/test-category', function (err) { - assert.ifError(err); - - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - done(); - }); - }); - }); - - it('should load not load breadcrumbs on home page route', function (done) { - request(nconf.get('url') + '/api', { json: true }, function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - assert(!body.breadcrumbs); - done(); - }); - }); - - it('should redirect to custom homepage', function (done) { - meta.configs.set('homePageRoute', 'groups', function (err) { - assert.ifError(err); - - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 200); - assert(body); - done(); - }); - }); - }); - - it('should 404 if custom homepage does not exist', function (done) { - meta.configs.set('homePageRoute', 'this-route-does-not-exist', function (err) { - assert.ifError(err); - - request(nconf.get('url'), function (err, res, body) { - assert.ifError(err); - assert.equal(res.statusCode, 404); - assert(body); - done(); - }); - }); - }); - - it('should render custom homepage with hook', function (done) { + describe('homepage', function () { function hookMethod(hookData) { assert(hookData.req); assert(hookData.res); assert(hookData.next); - hookData.res.json('works'); - } - plugins.registerHook('myTestPlugin', { - hook: 'action:homepage.get:custom', - method: hookMethod, - }); - meta.configs.set('homePageRoute', 'custom', function (err) { - assert.ifError(err); + hookData.res.render('custom', { + works: true, + }); + } + var message = utils.generateUUID(); + var tplPath = path.join(nconf.get('views_dir'), 'custom.tpl'); + + before(function () { + plugins.registerHook('myTestPlugin', { + hook: 'action:homepage.get:custom', + method: hookMethod, + }); + + fs.writeFileSync(tplPath, message); + }); + + it('should load default', function (done) { request(nconf.get('url'), function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert.equal(body, '"works"'); - plugins.unregisterHook('myTestPlugin', 'action:homepage.get:custom', hookMethod); + assert(body); done(); }); }); + + it('should load unread', function (done) { + meta.configs.set('homePageRoute', 'unread', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + done(); + }); + }); + }); + + it('should load recent', function (done) { + meta.configs.set('homePageRoute', 'recent', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + done(); + }); + }); + }); + + it('should load popular', function (done) { + meta.configs.set('homePageRoute', 'popular', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + done(); + }); + }); + }); + + it('should load category', function (done) { + meta.configs.set('homePageRoute', 'category/1/test-category', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + done(); + }); + }); + }); + + it('should not load breadcrumbs on home page route', function (done) { + request(nconf.get('url') + '/api', { json: true }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + assert(!body.breadcrumbs); + done(); + }); + }); + + it('should redirect to custom', function (done) { + meta.configs.set('homePageRoute', 'groups', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert(body); + done(); + }); + }); + }); + + it('should 404 if custom does not exist', function (done) { + meta.configs.set('homePageRoute', 'this-route-does-not-exist', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 404); + assert(body); + done(); + }); + }); + }); + + it('api should work with hook', function (done) { + meta.configs.set('homePageRoute', 'custom', function (err) { + assert.ifError(err); + + request(nconf.get('url') + '/api', { json: true }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert.equal(body.works, true); + assert.equal(body.template.custom, true); + + done(); + }); + }); + }); + + it('should render with hook', function (done) { + meta.configs.set('homePageRoute', 'custom', function (err) { + assert.ifError(err); + + request(nconf.get('url'), function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 200); + assert.ok(body); + assert.ok(body.indexOf('
Date: Fri, 17 Nov 2017 12:00:39 -0500 Subject: [PATCH 14/81] fixed #6082 --- src/user/picture.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/user/picture.js b/src/user/picture.js index 429b67efe9..60991aa39c 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -3,6 +3,7 @@ var async = require('async'); var request = require('request'); var mime = require('mime'); +var winston = require('winston'); var plugins = require('../plugins'); var file = require('../file'); @@ -53,6 +54,12 @@ module.exports = function (User) { }; User.updateCoverPosition = function (uid, position, callback) { + // Reject anything that isn't two percentages + if (!/^[\d.]+%\s[\d.]+%$/.test(position)) { + winston.warn('[user/updateCoverPosition] Invalid position received: ' + position); + return callback(new Error('[[error:invalid-data]]')); + } + User.setUserField(uid, 'cover:position', position, callback); }; From 4e029556dfcb764686a0f2ecff9259ef49ded12f Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 17 Nov 2017 13:43:18 -0500 Subject: [PATCH 15/81] closes #6081 --- public/src/client/category/tools.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/client/category/tools.js b/public/src/client/category/tools.js index 0f0dc7b77d..3f211400c4 100644 --- a/public/src/client/category/tools.js +++ b/public/src/client/category/tools.js @@ -239,7 +239,8 @@ define('forum/category/tools', [ } function handlePinnedTopicSort() { - if (!ajaxify.data.privileges.isAdminOrMod) { + var env = utils.findBootstrapEnvironment(); + if (!ajaxify.data.privileges.isAdminOrMod || env === 'xs' || env === 'sm') { return; } app.loadJQueryUI(function () { From ea3fde332b9d9d2841f1d403f33b6d8b7bc728f9 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 17 Nov 2017 14:13:55 -0500 Subject: [PATCH 16/81] notification email fixes add new notification image fix url to user settings, no need for userslug to be passed in --- public/images/emails/notification.png | Bin 0 -> 6117 bytes src/views/emails/notification.tpl | 2 +- src/views/emails/partials/footer.tpl | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 public/images/emails/notification.png diff --git a/public/images/emails/notification.png b/public/images/emails/notification.png new file mode 100644 index 0000000000000000000000000000000000000000..4a45ab6e478bf0dd7176d443592a6ebe21c8e539 GIT binary patch literal 6117 zcmb_=hdhkJzp%r?GdUXp#~g)VBGf9=K{;u1d*3^XNWbQszzZ^>Sg|PY6;9~ zau5XhupRc^UpwS4OY!Cc8VDPV@$Mm7xRd4 z{kDOoi9ft9U6xt%Eo;S`2*Q#Br_eB!+0_^6i`wLB$r$&u-!R%ye=CX7rgp&bw=@s8 zcS}nMcY$>#)+z$cUXr}rzFP+rET85YdexxSxjbsdaDE!wsq)Q;6%7UZ>$uyh6`wro z2`|&8zTfOHPpDEM5j6TbgIdnRj-0LaG2)i^=yMe!|#S) z4LJs}@b$&KLIlSE_pe{UJlpZDVI5l0rh^&Tb$dt1!-v-_ujslS53w0hzw&$I)o`@j z=tg_4FBR^WNxSJXUMGG2qX#5rufN;HSLa%k3WkE`jZL@TmpjW`;S^%2!21s_d{PZD zBDI+LmWQv)kxKntPWlqBis#E(oPda_Qk|Bxx1bDuN0-lUp@>V&P8ME23qs*a9i zd>=0@8cM?W1#4tqLFr?`l!e?Nywfx+^IMIcLlN?$53)DQW|7CyzZ(*fbC({KJ2N17|H4 zK(`k{gwm?0(nqP6(jjAu0K*RB^4MhT$BAmVN@%C6@INB5{@|Ha;4!_~U8J7a(P4Iib*J8{QtSkCa@c82kaj}qx zR(QMU1KXC!lZpo^T?>zr;(@SE6?hyypK)GU)V%2Lh}t0s3ln0T?m`e8Ett5mEq|kL zKSjg6b@SGk&}7MSM>I4+&a2ROJ>xaooUeIjVpGULba`h}I|cwy)XJdn>E#eS^ISdK zTt3?zgD@dJEhRFCnSG_f|w-YSmb4i&PbSeJYYU&Js=XS9Fp?78s|M^$J=U z6}+To?!r1(CQ?PPHm*Me-4)3EtK-2X(f$TY6gynR?z#9f9R9>Qf~mRv4Tc`mZzGjqH3<3LOl(+N($!5UCefTYu`pOXu=3 z3qW;`i{sjmtD=qmQ*zfZsT!vplm>Qb^9)@vJdm3QJRkc|0$Cf_6R&WJ25teJ-x`(qc>T!%%-O4}*({zi)*@xa3K(%d8xi#QNXCpP~w=vW4RaYZe33dL6&jd}VHTTxUd&doTjWf+(&vOZ{tUhvwgbATi`A z_dAh%H!0JPK<2aYU3%;S@k%O#Jv-=^7517dsP8!=%&|Vea6?7mi>kfajX#)0D|Z!g zyKjG$x!1MMJ;m~_RYT3Zp+L4@PwtcJZylSZzg)Ok$ns`TC=;A?!MxvaWseI7Z`CrB z*bUb!te6!l)}tQ9&ZsBb6O=rE|9P3q$~nb)krs?S?zpAfey@;MqEYa}xY2qlxnzp| zB}eUy7RiXJ<}a@cdWceR*gMyqVwK4^e)#eik2vz}#dkM}a>7e#_lMrV_exd2>Qh@% zZpEk4sO^1OS%%gQ_0RGV*DG0c$xi)FAyX^MSCj;^KJzUFC(@)YbKp#vvSU9i=sDEm zaWZSV!D+n2^_SOmVLu57b7!=uYKdq3?;iHg2Bf7lCHK>D;^4RdOWDZI;a}-U z-n_y~`qU};e0_bM`Jg?u(=P|h6N9}M!B`KBm^~IDYAkpzWT)bnab!Bh3dVBh=rhov z!~V%n_TayP9)IHVrA8K|%4bZSlCe)uGgwtX+e4HjOiF=d^khCO;w@#2E6Sa2T8`+g zeAFuPw3U1xKNj|Ma=8RB%WS*Do`ef<6Yk8OybZ=ibsVi%!*-;PD~SD`V3>D~nH z<#{0|NhA{@r{wWuWs;)w>~$=lPmQgTh`bSrQ!L1)UP7kxDu8RW&2dlYB7?x#9~c&= z#BSx8+7yI-8d=%w^F=AAL^w`q0t2Xd#EE;CQb+yv^`Me-NOfr-DVF;h1Yz#RPpjF* zG!jv5a?5c*MBYN4=v}GILgT|3=1!MLPxO|Srk&U;eGvL3{I>ZeCWItC(8u*B<>EzN zuso3&F6~~BP01rG_n*~u!s$em7GrHT$oG5R^!M}ofU$u&UcZ8=`ndd|MRjw1*j7#z zgLa%YRUpw2^cTNsP6=#t<1WskA{cc+uRUB*m(7&Dr}ifQvv&Fhsr%7#8|qG29d?28 z^jH?`Ka8c(HRX)J)zmGdsMLvnE9(Sf4KQG*lAMaywN=~z^0d1APYxI-X!X;{RjpLo z?AT0OLTfItgH>Oup{R~HSM)dpj;pa;@22={g?5%=rcX5skV>$mBgx$v^79UeBg>F+h7EXJYI!zUxd%WBK8@CXyyco@Yn)C3xk_z{B|sCY z+OAI(NJ@bYzG}wZD9wDh&4nXzBOcy%k|M|R)d}8?Pyb)O`@U^hsgngLs(OQGp+SjP zCGmY^58j9;-$#6Ak%}SBXYw&lBK!+otJo^Q2ZC@D1F25fLCa#ganjTGFj9u(y;^E9n`w%ORlzhRf+pYkTiJZsI+N{D|-0Ahmdqiai%HKaw zfv43)WqJ*M6Xo4<=Z3J{ceWeit74FyE|=Q&$DFtXx##f5A*B}6MzH=w>@YDh>4ohQ zJ6{oVp^$mg1+RmGXXTSU8NA0kODK&8B%>~)6z4-#}gQv$v?r*!*^G z_J9MtwMNDFT!js#+OR6R8PAz;wrK6RX6fz^J(IgNJr61V<=G`TI0E~4J6i}NkW2Y~ z7B5<{s_t06I<2x~h4%;{MZV(Pxrz*3`I}JGnw~9y(LV4y-|h$%Zd@ftW&hZg0=oK+ z3WpKM7uoz6;bxsc^A@{w$7V6nwf8EYv7P&m^xbDgul=LDk9pq)9wnhy-PQjb-jT^} z=EFH_TA9!cZV%J$sYJ!xjXK4~$ctaE6MVu=ct*d4i+>EmRmQ4*SjgO8$aZ7@ZJFNzT)=Bd+6}eHr`?vgl zNvLwQ(B#QFX*Nd$e*QdI1XPWE*{N=}Jh*v&Ph);Md!|BovTfV)atZt5>S2)LZ$= zN>Am4sG0pqI8BcZMyX0bKwuQeCObv-9KqE?$eOZ+MXrt5;ub_?@L2?5*zYq&W=@D` zH|J%A0NJv{c8(Fw><9n03J@CMxXPOhx2r>cJ!_tpm|y=nTfI#btgaBOv7y~uKN#6? zDHv?#CESAJA}57t9-#L#H+~v3j(3hHktuG$;FBLMfyZW!L6=eKY_q2x$!=}&BWM~d zI;26LVD$1 zb4y)J2(1&sAZaExK}2Q{j}=aR;m(~J--z5^Vn19FWU@rhBM*X_ZqsU&^gUJqgZ&qC zNFXsbZ?>;W6*M5C5tUZUrt-h^L>rK(Off)1V`UyIgS4t9Kl#P?678InXvr?X6^vG4 zc(kUK6W}})hBtowvxu_OqFOGQ--5M2;2xLHJgx%!Co)W)fHd#V21O>1PmrUw(l^DU z!ZPl26fRssdavKi6C*=cDbF06wWwo1T78mY9lNoJfU~fhYRI|B;z-jQtu)j=pp=9l z=!71bgHOcpGuL|9D{VM&Eo;Kx!*qRK#vX5;9BU%CBd0!D>K3>p(UI#J&rjvOj?V6t zXm+RM*GM2c%iNMDZ_=p1j(kjKG|z_&POi%QeO6`j_PUSiZtcIcn~8pC*(5Y;TX4Lu z{4kKLZKA>q1MlBzj~GVW!wkP=oLWo{J`UJ)}V*>R&`Q5>j~brZ$El^NGyl)j%}u)@s7>1 z+-WhR;}kocPx5xX=?__R%B(BLfCnjZmgHR>*eFQOeg*bFt(Zj<)QOD{`4=TM_IWkczK)nv~1LKs4T&-DI9y2V=G8Wnx&v zxCuXQX3RKq@Imu*!om(jny_C3Pf58@0)3;!lQMp&#}xBeQuX8Ac?)UYRF!zK=M^?z zHHwWb@7Gc^whSJn3OMd_(bX1CQTPt?;}kyjovI6ej*;E+%!_%!Fo$TSf>Vbl{VMls z+Ost``V}wCt+m|vU^(~M+Q3aePbRk=R_y=LcVn3gXZ<6qiP0o6CZ{m;{LJ_g3^6Gz z;(D?6yL1wWIo}!b&MP1FHBK3*WB(o55YZ%U?=_?l3cLXFN22*}>QB4^3O^owEFBL* zLzRD>+CnK!*s|__lQU1A(&lkO5MRn7F5P56iNsg$cqnq<06u|am+WQ5Qp*%a)>E~> zhRNW1BY2qLtqbOj5*)azO>28zNxI8bb5|ZxQnYW00-}#=Z|zQdv*)aqHmXfZr(`D@ zHLgPtIXnc#2A}prm5zZAwsyA*Ml&9%i2!x)MorL((~mdj$5Op@qqAT z?2X0_xID&EuQ!BWxFv4|K||dWv9D75j8>`vM(w5Mj+7lU1R*6%7!>k(HKx;1Bop(R zVZuy{DzQq1QFIn%GB=qEVsdsfV5@x*wEzQwIAEI+B9#2q>45IPuDwkhqX7sQ7DrF@ z4S3eKC(kFDnVO)OC!B&-g<4&WI9P!FoUr1dYTx^%b?m8C1MjWuT$a2^F0HOqTgx`Z zq45bB)qc3j8h zo#`t38@gJ%CttDMAZYPYJijH(phPS2{_tFd-5FT?G!4y%lf z4gisSmbvJt^;+sGH}H?M?}1@gq~Y8rUKpiFAw=~#0~%_{NPQR;_67a1?~VfpEqH)rS+Of%o6$yG1EdW{$_qYC-)n1zOBw)}nIvPGJ_@qmTM0^Z;=oarW7#oN z^H|+3$^Er=09ZydM0 - + diff --git a/src/views/emails/partials/footer.tpl b/src/views/emails/partials/footer.tpl index 23a9371134..20bbd90f0e 100644 --- a/src/views/emails/partials/footer.tpl +++ b/src/views/emails/partials/footer.tpl @@ -4,7 +4,7 @@

- [[email:notif.post.unsub.info]] [[email:unsub.cta]]. + [[email:notif.post.unsub.info]] [[email:unsub.cta]].

From 2065f895d5f2e86da47ba0b64d35705765b9e26f Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Fri, 17 Nov 2017 15:26:36 -0500 Subject: [PATCH 17/81] closes #6037 --- public/language/en-GB/admin/settings/user.json | 2 ++ src/middleware/user.js | 10 ++++++---- src/views/admin/settings/user.tpl | 7 +++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/public/language/en-GB/admin/settings/user.json b/public/language/en-GB/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/en-GB/admin/settings/user.json +++ b/public/language/en-GB/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/src/middleware/user.js b/src/middleware/user.js index 3c59bd8923..d7b70377f6 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -173,10 +173,12 @@ module.exports = function (middleware) { } var loginTime = req.session.meta ? req.session.meta.datetime : 0; - if (loginTime && parseInt(loginTime, 10) > Date.now() - 3600000) { - var timeLeft = parseInt(loginTime, 10) - (Date.now() - 3600000); - if (timeLeft < 300000) { - req.session.meta.datetime += 300000; + var adminReloginDuration = (meta.config.adminReloginDuration || 60) * 60000; + var disabled = parseInt(meta.config.adminReloginDuration, 10) === 0; + if (disabled || (loginTime && parseInt(loginTime, 10) > Date.now() - adminReloginDuration)) { + var timeLeft = parseInt(loginTime, 10) - (Date.now() - adminReloginDuration); + if (timeLeft < Math.min(300000, adminReloginDuration)) { + req.session.meta.datetime += Math.min(300000, adminReloginDuration); } return next(); diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index 9d933b54e1..1d2042e97d 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -105,6 +105,13 @@
[[admin/settings/user:account-protection]]
+
+ + +

+ [[admin/settings/user:admin-relogin-duration-help]] +

+
From 63388be44cc95451087818c2f404b90a328c60a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 18 Nov 2017 15:39:47 -0500 Subject: [PATCH 18/81] closes #6084 --- public/src/modules/translator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index b98ad68abe..f192020ec5 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -505,7 +505,7 @@ Translator.compile = function compile() { var args = Array.prototype.slice.call(arguments, 0).map(function (text) { // escape commas and percent signs in arguments - return text.replace(/%/g, '%').replace(/,/g, ','); + return String(text).replace(/%/g, '%').replace(/,/g, ','); }); return '[[' + args.join(', ') + ']]'; From 018b054c42e98c2a71ee645faf1b0ea952cc4a28 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 19 Nov 2017 09:25:27 +0000 Subject: [PATCH 19/81] Latest translations and fallbacks --- public/language/pl/admin/general/homepage.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/language/pl/admin/general/homepage.json b/public/language/pl/admin/general/homepage.json index 8f5360c47b..c80a434fa4 100644 --- a/public/language/pl/admin/general/homepage.json +++ b/public/language/pl/admin/general/homepage.json @@ -1,7 +1,7 @@ { - "home-page": "Strona startowa", + "home-page": "Strona Główna", "description": "Wybierz stronę startową dla twojego forum.", - "home-page-route": "Ścieżka strony startowej", - "custom-route": "Niestandardowy Adres", + "home-page-route": "Ścieżka strony głównej", + "custom-route": "Niestandardowa Ścieżka", "allow-user-home-pages": "Zezwalaj na strony startowe użytkowników" } \ No newline at end of file From c934416544898a4dd0119778546e07f739666641 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 20 Nov 2017 10:49:43 -0500 Subject: [PATCH 20/81] up mentions --- package.default.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.default.json b/package.default.json index ce6780128f..4352c43186 100644 --- a/package.default.json +++ b/package.default.json @@ -63,7 +63,7 @@ "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.2.1", "nodebb-plugin-markdown": "8.2.0", - "nodebb-plugin-mentions": "2.2.0", + "nodebb-plugin-mentions": "2.2.1", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", From 3bf7faf5fce5d0f20cc7839f149476442fcca3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 20 Nov 2017 19:58:46 -0500 Subject: [PATCH 21/81] increase rate limit delay --- test/messaging.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/messaging.js b/test/messaging.js index c2d7ee1b67..29d381658b 100644 --- a/test/messaging.js +++ b/test/messaging.js @@ -90,10 +90,13 @@ describe('Messaging Library', function () { it('should return rate limit error on second try', function (done) { var socketMock = { uid: fooUid }; + var oldValue = meta.config.chatMessageDelay; + meta.config.chatMessageDelay = 1000; socketModules.chats.newRoom(socketMock, { touid: bazUid }, function (err) { assert.ifError(err); socketModules.chats.newRoom(socketMock, { touid: bazUid }, function (err) { assert.equal(err.message, '[[error:too-many-messages]]'); + meta.configs.chatMessageDelay = oldValue; done(); }); }); @@ -250,10 +253,13 @@ describe('Messaging Library', function () { it('should fail to send second message due to rate limit', function (done) { var socketMock = { uid: fooUid }; + var oldValue = meta.config.chatMessageDelay; + meta.config.chatMessageDelay = 1000; socketModules.chats.send(socketMock, { roomId: roomId, message: 'first chat message' }, function (err) { assert.ifError(err); socketModules.chats.send(socketMock, { roomId: roomId, message: 'first chat message' }, function (err) { assert.equal(err.message, '[[error:too-many-messages]]'); + meta.config.chatMessageDelay = oldValue; done(); }); }); From 12ca1c4e7a87ee36e9ed516a878e3cb3a41db0e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 20 Nov 2017 19:58:56 -0500 Subject: [PATCH 22/81] closes #6093 --- src/controllers/composer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/composer.js b/src/controllers/composer.js index c0b0da2236..3bc95fae4a 100644 --- a/src/controllers/composer.js +++ b/src/controllers/composer.js @@ -10,13 +10,13 @@ var helpers = require('./helpers'); exports.get = function (req, res, next) { async.waterfall([ - function (next) { + function (_next) { plugins.fireHook('filter:composer.build', { req: req, res: res, next: next, templateData: {}, - }, next); + }, _next); }, function (data) { if (data.templateData.disabled) { From 415940af02e1e09041de392576d32b399de64f0c Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 21 Nov 2017 09:25:22 +0000 Subject: [PATCH 23/81] Latest translations and fallbacks --- public/language/fa-IR/flags.json | 14 +++++++------- public/language/fa-IR/notifications.json | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index 7d16875d5d..fbdf9fec19 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -1,16 +1,16 @@ { "state": "وضعیت", - "reporter": "گزارش دهنده", + "reporter": "کاربر گزارش دهنده", "reported-at": "گزارش شده در", "description": "شرح", "no-flags": "هووووورا ! هیچ گزارشی یافت نشد.", "assignee": "اختصاص دادن ", "update": "به روزرسانی", "updated": "به روز رسانی شد", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "target-purged": "محتوای این گزارش حذف شده است و در دسترس نیست.", "quick-filters": "فیلتر های سریع", - "filter-active": "There are one or more filters active in this list of flags", + "filter-active": "یک یا تعداد بیشتری از فیلتر ها در لیست گزارش ها فعال هستند", "filter-reset": "حذف فیلتر ها", "filters": "گزینه های فیلتر", "filter-reporterId": "UID گزارش دهنده", @@ -29,7 +29,7 @@ "flagged-user": "کاربر گزارش شده", "view-profile": "نمایش پروفایل", "start-new-chat": "شروع چت جدید", - "go-to-target": "مشاهده محتوا گزارش شده", + "go-to-target": "مشاهده محتوای گزارش شده", "user-view": "نمایش پروفایل", "user-edit": "ویرایش پروفایل", @@ -51,7 +51,7 @@ "note-added": "یادداشت افزوده شد", "modal-title": "گزارش محتوای نامناسب", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-body": "لطفا علت گزارش 1% 2% را برای بررسی مشخص کنید. همچنین می توانید از یکی از دکمه های ارسال سریع استفاده کنید.", "modal-reason-spam": "هرزنامه", "modal-reason-offensive": "توهین آمیز", "modal-reason-other": "دیگر (در زیر مشخص کنید)", @@ -59,6 +59,6 @@ "modal-submit": "ارسال گزارش", "modal-submit-success": "محتوا برای بررسی نشانه گذاری شد", "modal-submit-confirm": "تأیید ارسال", - "modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?", - "modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined." + "modal-submit-confirm-text": "شما همواره علت دیگری را مشخص کردید. آیا مطمئن هستید که می خواهید از طریق گزینه های گزارش سریع ارسال کنید؟", + "modal-submit-confirm-text-help": "ارسال از طریق گزارش سریع جایگزین علت های مشخص شده دیگر می شود." } \ No newline at end of file diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index 2d5f0547b0..0bf284a28d 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -28,9 +28,9 @@ "user_flagged_post_in": "%1 پست شما را در %2 علامتدار کرده", "user_flagged_post_in_dual": "%1 و %2 نشانه‌گذاری کرده اند پست را در %3", "user_flagged_post_in_multiple": "%1 و %2 نفر دیگر این پست را نشانه‌گذاری کرده در %3", - "user_flagged_user": "%1 flagged a user profile (%2)", - "user_flagged_user_dual": "%1 and %2 flagged a user profile (%3)", - "user_flagged_user_multiple": "%1 and %2 others flagged a user profile (%3)", + "user_flagged_user": "1%کاربری را برای بررسی گزارش کرد (2%)", + "user_flagged_user_dual": "1%و 2%کاربری را برای بررسی گزارش کردند (3%)", + "user_flagged_user_multiple": "1%و 2% دیگران کاربری را برای بررسی گزارش کردند (3%)", "user_posted_to": "پاسخ دادن به %2 از سوی %1", "user_posted_to_dual": "%1 و %2 پاسخ به پست دادند در: %3", "user_posted_to_multiple": "%1 و %2 نفر دیگر به پست شما پاسخ ارسال کرده‌اند در: %3", @@ -40,7 +40,7 @@ "user_started_following_you_multiple": "%1 و %2 نفر دیگر شروع به دنبال کردن شما کرده.", "new_register": "%1 یک درخواست ثبت نام ارسال کرده است", "new_register_multiple": "تعداد %1 درخواست عضویت برای بررسی وجود دارد.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", + "flag_assigned_to_you": "گزارش 1%به شما تعلق گرفت", "post_awaiting_review": "Post awaiting review", "email-confirmed": "ایمیل تایید شد", "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", From 4fcedc6f31071dcd5e6d26143bbe08d4dca2121c Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 21 Nov 2017 08:51:20 -0700 Subject: [PATCH 24/81] Enable imports in custom email templates (#6052) * Enable imports in custom email templates * Compile emails on config change * Add error logging * Add emailer tests * Fix tests * Only build when config changes --- package.default.json | 3 +- src/controllers/admin/settings.js | 40 +------- src/emailer.js | 152 +++++++++++++++++++++++++----- src/meta/templates.js | 56 +++++------ test/emailer.js | 141 +++++++++++++++++++++++++++ 5 files changed, 300 insertions(+), 92 deletions(-) create mode 100644 test/emailer.js diff --git a/package.default.json b/package.default.json index 4352c43186..42551f279d 100644 --- a/package.default.json +++ b/package.default.json @@ -110,7 +110,8 @@ "jsdom": "^11.3.0", "mocha": "^4.0.1", "mocha-lcov-reporter": "^1.3.0", - "nyc": "^11.2.1" + "nyc": "^11.2.1", + "smtp-server": "^3.3.0" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index 8944655881..860de1290d 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -1,12 +1,8 @@ 'use strict'; var async = require('async'); -var nconf = require('nconf'); -var fs = require('fs'); -var path = require('path'); var meta = require('../../meta'); -var file = require('../../file'); var emailer = require('../../emailer'); var settingsController = module.exports; @@ -26,42 +22,8 @@ settingsController.get = function (req, res, next) { function renderEmail(req, res, next) { - var emailsPath = path.join(nconf.get('views_dir'), 'emails'); - async.parallel({ - emails: function (cb) { - async.waterfall([ - function (next) { - file.walk(emailsPath, next); - }, - function (emails, next) { - // exclude .js files - emails = emails.filter(function (email) { - return !email.endsWith('.js'); - }); - - async.map(emails, function (email, next) { - var path = email.replace(emailsPath, '').substr(1).replace('.tpl', ''); - - async.waterfall([ - function (next) { - fs.readFile(email, 'utf8', next); - }, - function (original, next) { - var text = meta.config['email:custom:' + path] ? meta.config['email:custom:' + path] : original; - - next(null, { - path: path, - fullpath: email, - text: text, - original: original, - }); - }, - ], next); - }, next); - }, - ], cb); - }, + emails: async.apply(emailer.getTemplates, meta.config), services: emailer.listServices, }, function (err, results) { if (err) { diff --git a/src/emailer.js b/src/emailer.js index 38535367b9..10163cc512 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -8,14 +8,19 @@ var nodemailer = require('nodemailer'); var wellKnownServices = require('nodemailer/lib/well-known/services'); var htmlToText = require('html-to-text'); var url = require('url'); +var path = require('path'); +var fs = require('fs'); var User = require('./user'); var Plugins = require('./plugins'); var meta = require('./meta'); var translator = require('./translator'); var pubsub = require('./pubsub'); +var file = require('./file'); -var transports = { +var Emailer = module.exports; + +Emailer.transports = { sendmail: nodemailer.createTransport({ sendmail: true, newline: 'unix', @@ -25,9 +30,45 @@ var transports = { }; var app; -var fallbackTransport; -var Emailer = module.exports; +var viewsDir = nconf.get('views_dir'); +var emailsPath = path.join(viewsDir, 'emails'); + +Emailer.getTemplates = function (config, cb) { + async.waterfall([ + function (next) { + file.walk(emailsPath, next); + }, + function (emails, next) { + // exclude .js files + emails = emails.filter(function (email) { + return !email.endsWith('.js'); + }); + + async.map(emails, function (email, next) { + var path = email.replace(emailsPath, '').substr(1).replace('.tpl', ''); + + async.waterfall([ + function (next) { + fs.readFile(email, 'utf8', next); + }, + function (original, next) { + var isCustom = !!config['email:custom:' + path]; + var text = config['email:custom:' + path] || original; + + next(null, { + path: path, + fullpath: email, + text: text, + original: original, + isCustom: isCustom, + }); + }, + ], next); + }, next); + }, + ], cb); +}; Emailer.listServices = function (callback) { var services = Object.keys(wellKnownServices); @@ -71,13 +112,30 @@ Emailer.setupFallbackTransport = function (config) { smtpOptions.service = config['email:smtpTransport:service']; } - transports.smtp = nodemailer.createTransport(smtpOptions); - fallbackTransport = transports.smtp; + Emailer.transports.smtp = nodemailer.createTransport(smtpOptions); + Emailer.fallbackTransport = Emailer.transports.smtp; } else { - fallbackTransport = transports.sendmail; + Emailer.fallbackTransport = Emailer.transports.sendmail; } }; +var prevConfig = meta.config; +function smtpSettingsChanged(config) { + var settings = [ + 'email:smtpTransport:enabled', + 'email:smtpTransport:user', + 'email:smtpTransport:pass', + 'email:smtpTransport:service', + 'email:smtpTransport:port', + 'email:smtpTransport:host', + 'email:smtpTransport:security', + ]; + + return settings.some(function (key) { + return config[key] !== prevConfig[key]; + }); +} + Emailer.registerApp = function (expressApp) { app = expressApp; @@ -97,16 +155,21 @@ Emailer.registerApp = function (expressApp) { }; Emailer.setupFallbackTransport(meta.config); + buildCustomTemplates(meta.config); // Update default payload if new logo is uploaded pubsub.on('config:update', function (config) { if (config) { - if ('email:smtpTransport:enabled' in config) { - Emailer.setupFallbackTransport(config); - } Emailer._defaultPayload.logo.src = config['brand:emailLogo']; Emailer._defaultPayload.logo.height = config['brand:emailLogo:height']; Emailer._defaultPayload.logo.width = config['brand:emailLogo:width']; + + if (smtpSettingsChanged(config)) { + Emailer.setupFallbackTransport(config); + } + buildCustomTemplates(config); + + prevConfig = config; } }); @@ -150,7 +213,7 @@ Emailer.sendToEmail = function (template, email, language, params, callback) { function (next) { async.parallel({ html: function (next) { - renderAndTranslate('emails/' + template, params, lang, next); + Emailer.renderAndTranslate(template, params, lang, next); }, subject: function (next) { translator.translate(params.subject, lang, function (translated) { @@ -203,7 +266,7 @@ Emailer.sendViaFallback = function (data, callback) { delete data.from_name; winston.verbose('[emailer] Sending email to uid ' + data.uid + ' (' + data.to + ')'); - fallbackTransport.sendMail(data, function (err) { + Emailer.fallbackTransport.sendMail(data, function (err) { if (err) { winston.error(err); } @@ -211,23 +274,64 @@ Emailer.sendViaFallback = function (data, callback) { }); }; -function render(tpl, params, next) { - var customTemplate = meta.config['email:custom:' + tpl.replace('emails/', '')]; - if (customTemplate) { - Benchpress.compileParse(customTemplate, params, next); - } else { - app.render(tpl, params, next); - } -} +function buildCustomTemplates(config) { + async.waterfall([ + function (next) { + Emailer.getTemplates(config, next); + }, + function (templates, next) { + templates = templates.filter(function (template) { + return template.isCustom && template.text !== prevConfig['email:custom:' + path]; + }); + async.each(templates, function (template, next) { + async.waterfall([ + function (next) { + file.walk(viewsDir, next); + }, + function (paths, next) { + paths = paths.reduce(function (obj, p) { + var relative = path.relative(viewsDir, p); + obj['/' + relative] = p; + return obj; + }, {}); + meta.templates.processImports(paths, template.path, template.text, next); + }, + function (source, next) { + Benchpress.precompile(source, { + minify: global.env !== 'development', + }, next); + }, + function (compiled, next) { + fs.writeFile(template.fullpath.replace(/\.tpl$/, '.js'), compiled, next); + }, + ], next); + }, next); + }, + function (next) { + Benchpress.flush(); + next(); + }, + ], function (err) { + if (err) { + winston.error('[emailer] Failed to build custom email templates', err); + return; + } -function renderAndTranslate(tpl, params, lang, callback) { - render(tpl, params, function (err, html) { - translator.translate(html, lang, function (translated) { - callback(err, translated); - }); + winston.verbose('[emailer] Built custom email templates'); }); } +Emailer.renderAndTranslate = function (template, params, lang, callback) { + app.render('emails/' + template, params, function (err, html) { + if (err) { + return callback(err); + } + translator.translate(html, lang, function (translated) { + callback(null, translated); + }); + }); +}; + function getHostname() { var configUrl = nconf.get('url'); var parsed = url.parse(configUrl); diff --git a/src/meta/templates.js b/src/meta/templates.js index 03097ef9dd..943978ff56 100644 --- a/src/meta/templates.js +++ b/src/meta/templates.js @@ -15,40 +15,40 @@ var viewsPath = nconf.get('views_dir'); var Templates = module.exports; +function processImports(paths, templatePath, source, callback) { + var regex = //; + + var matches = source.match(regex); + + if (!matches) { + return callback(null, source); + } + + var partial = '/' + matches[1]; + if (paths[partial] && templatePath !== partial) { + fs.readFile(paths[partial], 'utf8', function (err, partialSource) { + if (err) { + return callback(err); + } + + source = source.replace(regex, partialSource); + processImports(paths, templatePath, source, callback); + }); + } else { + winston.warn('[meta/templates] Partial not loaded: ' + matches[1]); + source = source.replace(regex, ''); + + processImports(paths, templatePath, source, callback); + } +} +Templates.processImports = processImports; + Templates.compile = function (callback) { callback = callback || function () {}; var themeConfig = require(nconf.get('theme_config')); var baseTemplatesPaths = themeConfig.baseTheme ? getBaseTemplates(themeConfig.baseTheme) : [nconf.get('base_templates_path')]; - function processImports(paths, relativePath, source, callback) { - var regex = //; - - var matches = source.match(regex); - - if (!matches) { - return callback(null, source); - } - - var partial = '/' + matches[1]; - if (paths[partial] && relativePath !== partial) { - fs.readFile(paths[partial], 'utf8', function (err, partialSource) { - if (err) { - return callback(err); - } - - source = source.replace(regex, partialSource); - - processImports(paths, relativePath, source, callback); - }); - } else { - winston.warn('[meta/templates] Partial not loaded: ' + matches[1]); - source = source.replace(regex, ''); - - processImports(paths, relativePath, source, callback); - } - } - async.waterfall([ function (next) { preparePaths(baseTemplatesPaths, next); diff --git a/test/emailer.js b/test/emailer.js new file mode 100644 index 0000000000..8c0a525ed2 --- /dev/null +++ b/test/emailer.js @@ -0,0 +1,141 @@ +'use strict'; + +var SMTPServer = require('smtp-server').SMTPServer; +var assert = require('assert'); +var fs = require('fs'); +var path = require('path'); + +var Plugins = require('../src/plugins'); +var Emailer = require('../src/emailer'); +var Meta = require('../src/meta'); + +describe('emailer', function () { + var onMail = function (address, session, callback) { callback(); }; + var onTo = function (address, session, callback) { callback(); }; + + var template = 'test'; + var email = 'test@example.org'; + var language = 'en-GB'; + var params = { + subject: 'Welcome to NodeBB', + }; + + before(function (done) { + var server = new SMTPServer({ + allowInsecureAuth: true, + onAuth: function (auth, session, callback) { + callback(null, { + user: auth.username, + }); + }, + onMailFrom: function (address, session, callback) { + onMail(address, session, callback); + }, + onRcptTo: function (address, session, callback) { + onTo(address, session, callback); + }, + }); + + server.on('error', function (err) { + throw err; + }); + server.listen(4000, done); + }); + + // TODO: test sendmail here at some point + + it('plugin hook should work', function (done) { + var error = new Error(); + + Plugins.registerHook('emailer-test', { + hook: 'filter:email.send', + method: function (data, next) { + assert(data); + assert.equal(data.to, email); + assert.equal(data.subject, params.subject); + + next(error); + }, + }); + + Emailer.sendToEmail(template, email, language, params, function (err) { + assert.equal(err, error); + + Plugins.unregisterHook('emailer-test', 'filter:email.send'); + done(); + }); + }); + + it('should build custom template on config change', function (done) { + var text = 'a random string of text'; + + // make sure it's not already set + Emailer.renderAndTranslate('test', {}, 'en-GB', function (err, output) { + assert.ifError(err); + + assert.notEqual(output, text); + + Meta.configs.set('email:custom:test', text, function (err) { + assert.ifError(err); + + // wait for pubsub stuff + setTimeout(function () { + Emailer.renderAndTranslate('test', {}, 'en-GB', function (err, output) { + assert.ifError(err); + + assert.equal(output, text); + done(); + }); + }, 500); + }); + }); + }); + + it('should send via SMTP', function (done) { + var from = 'admin@example.org'; + var username = 'another@example.com'; + + onMail = function (address, session, callback) { + assert.equal(address.address, from); + assert.equal(session.user, username); + + callback(); + }; + + onTo = function (address, session, callback) { + assert.equal(address.address, email); + + callback(); + done(); + }; + + Meta.configs.setMultiple({ + 'email:smtpTransport:enabled': '1', + 'email:smtpTransport:user': username, + 'email:smtpTransport:service': 'nodebb-custom-smtp', + 'email:smtpTransport:port': 4000, + 'email:smtpTransport:host': 'localhost', + 'email:smtpTransport:security': 'NONE', + 'email:from': from, + }, function (err) { + assert.ifError(err); + + // delay so emailer has a chance to update after config changes + setTimeout(function () { + assert.equal(Emailer.fallbackTransport, Emailer.transports.smtp); + + Emailer.sendToEmail(template, email, language, params, function (err) { + assert.ifError(err); + }); + }, 200); + }); + }); + + after(function (done) { + fs.unlinkSync(path.join(__dirname, '../build/public/templates/emails/test.js')); + Meta.configs.setMultiple({ + 'email:smtpTransport:enabled': '0', + 'email:custom:test': '', + }, done); + }); +}); From 3fd25257e0fd26595f6a2002e132106fec9a1cdd Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 21 Nov 2017 11:31:06 -0500 Subject: [PATCH 25/81] v1.7.0 compatibility for slick theme --- package.default.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.default.json b/package.default.json index 42551f279d..7212ac8dfe 100644 --- a/package.default.json +++ b/package.default.json @@ -69,7 +69,7 @@ "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", "nodebb-theme-persona": "7.1.1", - "nodebb-theme-slick": "1.1.1", + "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", "nodemailer": "4.3.0", @@ -136,4 +136,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} From 74ceb78800a2052c4ec7fea6bcae90e432119a78 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 21 Nov 2017 12:14:14 -0700 Subject: [PATCH 26/81] Upvote notification frequency selection (#6087) Closes #5963 - Notify on every upvote - Notify on every tenth upvote - Notify logarithmically (on 10, 100, 1000...) - Disable upvote notifications --- public/language/en-GB/user.json | 5 +++ src/controllers/accounts/settings.js | 14 ++++++++ src/posts/votes.js | 1 + src/socket.io/helpers.js | 49 ++++++++++++++++++++++++++-- src/socket.io/posts/helpers.js | 4 ++- src/user/settings.js | 4 +-- 6 files changed, 71 insertions(+), 6 deletions(-) diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index a5bbf4d1ff..a3be8c30b4 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -110,6 +110,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index ea9c10126b..0bb3ef1744 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -135,6 +135,20 @@ settingsController.get = function (req, res, callback) { language.selected = language.code === userData.settings.userLang; }); + var notifFreqOptions = [ + 'all', + 'everyTen', + 'logarithmic', + 'disabled', + ]; + + userData.upvoteNotifFreq = notifFreqOptions.map(function (name) { + return { + name: name, + selected: name === userData.notifFreqOptions, + }; + }); + userData.disableCustomUserSkins = parseInt(meta.config.disableCustomUserSkins, 10) === 1; userData.allowUserHomePage = parseInt(meta.config.allowUserHomePage, 10) === 1; diff --git a/src/posts/votes.js b/src/posts/votes.js index 5598be9b24..e37cbff017 100644 --- a/src/posts/votes.js +++ b/src/posts/votes.js @@ -232,6 +232,7 @@ module.exports = function (Posts) { user: { reputation: newreputation, }, + fromuid: uid, post: postData, upvote: type === 'upvote' && !unvote, downvote: type === 'downvote' && !unvote, diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index cbc01aff60..ae4c2b0b5a 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -13,7 +13,7 @@ var notifications = require('../notifications'); var plugins = require('../plugins'); var utils = require('../utils'); -var SocketHelpers = {}; +var SocketHelpers = module.exports; SocketHelpers.notifyOnlineUsers = function (uid, result) { winston.warn('[deprecated] SocketHelpers.notifyOnlineUsers, consider using socketHelpers.notifyNew(uid, \'newPost\', result);'); @@ -171,6 +171,51 @@ SocketHelpers.sendNotificationToTopicOwner = function (tid, fromuid, command, no }); }; +SocketHelpers.upvote = function (data, notification) { + if (!data || !data.post || !data.post.uid || !data.post.votes || !data.post.pid || !data.fromuid) { + return; + } + + var votes = data.post.votes; + var touid = data.post.uid; + var fromuid = data.fromuid; + var pid = data.post.pid; + + var shouldNotify = { + all: function () { + return votes > 0; + }, + everyTen: function () { + return votes > 0 && votes % 10 === 0; + }, + logarithmic: function () { + return votes > 1 && Math.log10(votes) % 1 === 0; + }, + disabled: function () { + return false; + }, + }; + + async.waterfall([ + function (next) { + user.getSettings(touid, next); + }, + function (settings, next) { + var should = shouldNotify[settings.upvoteNotifFreq] || shouldNotify.all; + + if (should()) { + SocketHelpers.sendNotificationToPostOwner(pid, fromuid, 'upvote', notification); + } + + next(); + }, + ], function (err) { + if (err) { + winston.error(err); + } + }); +}; + SocketHelpers.rescindUpvoteNotification = function (pid, fromuid) { var uid; async.waterfall([ @@ -199,5 +244,3 @@ SocketHelpers.emitToTopicAndCategory = function (event, data) { websockets.in('topic_' + data.tid).emit(event, data); websockets.in('category_' + data.cid).emit(event, data); }; - -module.exports = SocketHelpers; diff --git a/src/socket.io/posts/helpers.js b/src/socket.io/posts/helpers.js index a9bb9b451d..a4438ba981 100644 --- a/src/socket.io/posts/helpers.js +++ b/src/socket.io/posts/helpers.js @@ -69,7 +69,9 @@ function executeCommand(socket, command, eventName, notification, data, callback websockets.in(data.room_id).emit('event:' + eventName, result); } - if (result && notification) { + if (result && command === 'upvote') { + socketHelpers.upvote(result, notification); + } else if (result && notification) { socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, command, notification); } else if (result && command === 'unvote') { socketHelpers.rescindUpvoteNotification(data.pid, socket.uid); diff --git a/src/user/settings.js b/src/user/settings.js index 784213e603..df22ff5c42 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -74,8 +74,7 @@ module.exports = function (User) { settings.categoryTopicSort = getSetting(settings, 'categoryTopicSort', 'newest_to_oldest'); settings.followTopicsOnCreate = parseInt(getSetting(settings, 'followTopicsOnCreate', 1), 10) === 1; settings.followTopicsOnReply = parseInt(getSetting(settings, 'followTopicsOnReply', 0), 10) === 1; - settings.sendChatNotifications = parseInt(getSetting(settings, 'sendChatNotifications', 0), 10) === 1; - settings.sendPostNotifications = parseInt(getSetting(settings, 'sendPostNotifications', 0), 10) === 1; + settings.upvoteNotifFreq = getSetting(settings, 'upvoteNotifFreq', 'all'); settings.restrictChat = parseInt(getSetting(settings, 'restrictChat', 0), 10) === 1; settings.topicSearchEnabled = parseInt(getSetting(settings, 'topicSearchEnabled', 0), 10) === 1; settings.delayImageLoading = parseInt(getSetting(settings, 'delayImageLoading', 1), 10) === 1; @@ -131,6 +130,7 @@ module.exports = function (User) { notificationSound: data.notificationSound, incomingChatSound: data.incomingChatSound, outgoingChatSound: data.outgoingChatSound, + upvoteNotifFreq: data.upvoteNotifFreq, notificationType_upvote: data.notificationType_upvote, 'notificationType_new-topic': data['notificationType_new-topic'], 'notificationType_new-reply': data['notificationType_new-reply'], From 6b5a0891cb36b969a73d72e8b573b46000c92c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 21 Nov 2017 14:38:24 -0500 Subject: [PATCH 27/81] add install\package.json for #6083 --- .gitignore | 2 +- install/package.json | 138 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 install/package.json diff --git a/.gitignore b/.gitignore index 68651e533d..76eb6aa59c 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,4 @@ build test/files/normalise.jpg.png test/files/normalise-resized.jpg package-lock.json -package.json +/package.json diff --git a/install/package.json b/install/package.json new file mode 100644 index 0000000000..b43fd3badf --- /dev/null +++ b/install/package.json @@ -0,0 +1,138 @@ +{ + "name": "nodebb", + "license": "GPL-3.0", + "description": "NodeBB Forum", + "version": "1.7.0", + "homepage": "http://www.nodebb.org", + "repository": { + "type": "git", + "url": "https://github.com/NodeBB/NodeBB/" + }, + "main": "app.js", + "scripts": { + "start": "node loader.js", + "lint": "eslint --cache ./nodebb .", + "pretest": "npm run lint", + "test": "nyc --reporter=html --reporter=text-summary mocha", + "coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage" + }, + "dependencies": { + "ace-builds": "^1.2.9", + "async": "2.5.0", + "autoprefixer": "7.1.6", + "bcryptjs": "2.4.3", + "benchpressjs": "^1.1.2", + "body-parser": "^1.18.2", + "bootstrap": "^3.3.7", + "chart.js": "^2.7.0", + "colors": "^1.1.2", + "compression": "^1.7.1", + "connect-ensure-login": "^0.1.1", + "connect-flash": "^0.1.1", + "connect-mongo": "2.0.0", + "connect-multiparty": "^2.1.0", + "connect-redis": "3.3.2", + "cookie-parser": "^1.4.3", + "cron": "^1.3.0", + "cropperjs": "^1.1.3", + "csurf": "^1.9.0", + "daemon": "^1.1.0", + "express": "^4.16.2", + "express-session": "^1.15.6", + "express-useragent": "1.0.8", + "graceful-fs": "^4.1.11", + "html-to-text": "3.3.0", + "ipaddr.js": "^1.5.4", + "jimp": "0.2.28", + "jquery": "^3.2.1", + "jsesc": "2.5.1", + "json-2-csv": "^2.1.2", + "less": "^2.7.2", + "lodash": "^4.17.4", + "logrotate-stream": "^0.2.5", + "lru-cache": "4.1.1", + "mime": "^2.0.3", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "mongodb": "2.2.33", + "morgan": "^1.9.0", + "mousetrap": "^1.6.1", + "nconf": "^0.8.5", + "nodebb-plugin-composer-default": "6.0.6", + "nodebb-plugin-dbsearch": "2.0.9", + "nodebb-plugin-emoji-extended": "1.1.1", + "nodebb-plugin-emoji-one": "1.2.1", + "nodebb-plugin-markdown": "8.2.0", + "nodebb-plugin-mentions": "2.2.1", + "nodebb-plugin-soundpack-default": "1.0.0", + "nodebb-plugin-spam-be-gone": "0.5.1", + "nodebb-rewards-essentials": "0.0.9", + "nodebb-theme-lavender": "5.0.0", + "nodebb-theme-persona": "7.1.1", + "nodebb-theme-slick": "1.1.1", + "nodebb-theme-vanilla": "8.1.0", + "nodebb-widget-essentials": "4.0.1", + "nodemailer": "4.3.0", + "passport": "^0.4.0", + "passport-local": "1.0.0", + "postcss": "6.0.13", + "postcss-clean": "1.1.0", + "promise-polyfill": "^6.0.2", + "prompt": "^1.0.0", + "redis": "2.8.0", + "request": "2.83.0", + "rimraf": "2.6.2", + "rss": "^1.2.2", + "sanitize-html": "^1.14.1", + "semver": "^5.4.1", + "serve-favicon": "^2.4.5", + "sitemap": "^1.13.0", + "socket.io": "2.0.4", + "socket.io-client": "2.0.4", + "socket.io-redis": "5.2.0", + "socketio-wildcard": "2.0.0", + "spdx-license-list": "^3.0.1", + "toobusy-js": "^0.5.1", + "uglify-js": "^3.1.5", + "validator": "9.0.0", + "winston": "^2.4.0", + "xml": "^1.0.1", + "xregexp": "3.2.0", + "zxcvbn": "^4.4.2" + }, + "devDependencies": { + "coveralls": "^3.0.0", + "eslint": "^4.9.0", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-plugin-import": "^2.8.0", + "grunt": "^1.0.1", + "grunt-contrib-watch": "^1.0.0", + "jsdom": "^11.3.0", + "mocha": "^4.0.1", + "mocha-lcov-reporter": "^1.3.0", + "nyc": "^11.2.1" + }, + "bugs": { + "url": "https://github.com/NodeBB/NodeBB/issues" + }, + "engines": { + "node": ">=6" + }, + "maintainers": [ + { + "name": "Andrew Rodrigues", + "email": "andrew@nodebb.org", + "url": "https://github.com/psychobunny" + }, + { + "name": "Julian Lam", + "email": "julian@nodebb.org", + "url": "https://github.com/julianlam" + }, + { + "name": "Barış Soner Uşaklı", + "email": "baris@nodebb.org", + "url": "https://github.com/barisusakli" + } + ] + } \ No newline at end of file From e1ae0500af3eeb64357eaeab290f387fd5427b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 21 Nov 2017 14:40:01 -0500 Subject: [PATCH 28/81] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5af55c3d9d..6238f2c744 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/NodeBB/NodeBB?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://travis-ci.org/NodeBB/NodeBB.svg?branch=master)](https://travis-ci.org/NodeBB/NodeBB) [![Coverage Status](https://coveralls.io/repos/github/NodeBB/NodeBB/badge.svg?branch=master)](https://coveralls.io/github/NodeBB/NodeBB?branch=master) -[![Dependency Status](https://david-dm.org/nodebb/nodebb.svg)](https://david-dm.org/nodebb/nodebb) +[![Dependency Status](https://david-dm.org/nodebb/nodebb.svg?path=install)](https://david-dm.org/nodebb/nodebb?path=install) [![Code Climate](https://codeclimate.com/github/NodeBB/NodeBB/badges/gpa.svg)](https://codeclimate.com/github/NodeBB/NodeBB) [![Documentation Status](https://readthedocs.org/projects/nodebb/badge/?version=latest)](https://readthedocs.org/projects/nodebb/?badge=latest) From eb47a81c46b9a457cefd52026831babcdb0238bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 21 Nov 2017 14:43:56 -0500 Subject: [PATCH 29/81] remove package.default.json --- .travis.yml | 2 +- Dockerfile | 2 +- package.default.json | 139 ------------------------------------ src/meta/package-install.js | 2 +- 4 files changed, 3 insertions(+), 142 deletions(-) delete mode 100644 package.default.json diff --git a/.travis.yml b/.travis.yml index 9a8a0fd66a..10f03d19ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ before_install: - "sudo service mongod start" before_script: - sleep 15 # wait for mongodb to be ready - - cp package.default.json package.json + - cp install/package.json package.json - npm install - sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":0}\"; fi" - sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"abcdef\\\",\\\"admin:password:confirm\\\":\\\"abcdef\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":0}\"; fi" diff --git a/Dockerfile b/Dockerfile index adce1f33ad..872d15667e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ WORKDIR /usr/src/app ARG NODE_ENV ENV NODE_ENV $NODE_ENV -COPY package.default.json /usr/src/app/package.json +COPY install/package.json /usr/src/app/package.json RUN npm install && npm cache clean --force COPY . /usr/src/app diff --git a/package.default.json b/package.default.json deleted file mode 100644 index 7212ac8dfe..0000000000 --- a/package.default.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "name": "nodebb", - "license": "GPL-3.0", - "description": "NodeBB Forum", - "version": "1.7.0", - "homepage": "http://www.nodebb.org", - "repository": { - "type": "git", - "url": "https://github.com/NodeBB/NodeBB/" - }, - "main": "app.js", - "scripts": { - "start": "node loader.js", - "lint": "eslint --cache ./nodebb .", - "pretest": "npm run lint", - "test": "nyc --reporter=html --reporter=text-summary mocha", - "coveralls": "nyc report --reporter=text-lcov | coveralls && rm -r coverage" - }, - "dependencies": { - "ace-builds": "^1.2.9", - "async": "2.5.0", - "autoprefixer": "7.1.6", - "bcryptjs": "2.4.3", - "benchpressjs": "^1.1.2", - "body-parser": "^1.18.2", - "bootstrap": "^3.3.7", - "chart.js": "^2.7.0", - "colors": "^1.1.2", - "compression": "^1.7.1", - "connect-ensure-login": "^0.1.1", - "connect-flash": "^0.1.1", - "connect-mongo": "2.0.0", - "connect-multiparty": "^2.1.0", - "connect-redis": "3.3.2", - "cookie-parser": "^1.4.3", - "cron": "^1.3.0", - "cropperjs": "^1.1.3", - "csurf": "^1.9.0", - "daemon": "^1.1.0", - "express": "^4.16.2", - "express-session": "^1.15.6", - "express-useragent": "1.0.8", - "graceful-fs": "^4.1.11", - "html-to-text": "3.3.0", - "ipaddr.js": "^1.5.4", - "jimp": "0.2.28", - "jquery": "^3.2.1", - "jsesc": "2.5.1", - "json-2-csv": "^2.1.2", - "less": "^2.7.2", - "lodash": "^4.17.4", - "logrotate-stream": "^0.2.5", - "lru-cache": "4.1.1", - "mime": "^2.0.3", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "mongodb": "2.2.33", - "morgan": "^1.9.0", - "mousetrap": "^1.6.1", - "nconf": "^0.8.5", - "nodebb-plugin-composer-default": "6.0.6", - "nodebb-plugin-dbsearch": "2.0.9", - "nodebb-plugin-emoji-extended": "1.1.1", - "nodebb-plugin-emoji-one": "1.2.1", - "nodebb-plugin-markdown": "8.2.0", - "nodebb-plugin-mentions": "2.2.1", - "nodebb-plugin-soundpack-default": "1.0.0", - "nodebb-plugin-spam-be-gone": "0.5.1", - "nodebb-rewards-essentials": "0.0.9", - "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.1.1", - "nodebb-theme-slick": "1.1.2", - "nodebb-theme-vanilla": "8.1.0", - "nodebb-widget-essentials": "4.0.1", - "nodemailer": "4.3.0", - "passport": "^0.4.0", - "passport-local": "1.0.0", - "postcss": "6.0.13", - "postcss-clean": "1.1.0", - "promise-polyfill": "^6.0.2", - "prompt": "^1.0.0", - "redis": "2.8.0", - "request": "2.83.0", - "rimraf": "2.6.2", - "rss": "^1.2.2", - "sanitize-html": "^1.14.1", - "semver": "^5.4.1", - "serve-favicon": "^2.4.5", - "sitemap": "^1.13.0", - "socket.io": "2.0.4", - "socket.io-client": "2.0.4", - "socket.io-redis": "5.2.0", - "socketio-wildcard": "2.0.0", - "spdx-license-list": "^3.0.1", - "toobusy-js": "^0.5.1", - "uglify-js": "^3.1.5", - "validator": "9.0.0", - "winston": "^2.4.0", - "xml": "^1.0.1", - "xregexp": "3.2.0", - "zxcvbn": "^4.4.2" - }, - "devDependencies": { - "coveralls": "^3.0.0", - "eslint": "^4.9.0", - "eslint-config-airbnb-base": "^12.1.0", - "eslint-plugin-import": "^2.8.0", - "grunt": "^1.0.1", - "grunt-contrib-watch": "^1.0.0", - "jsdom": "^11.3.0", - "mocha": "^4.0.1", - "mocha-lcov-reporter": "^1.3.0", - "nyc": "^11.2.1", - "smtp-server": "^3.3.0" - }, - "bugs": { - "url": "https://github.com/NodeBB/NodeBB/issues" - }, - "engines": { - "node": ">=6" - }, - "maintainers": [ - { - "name": "Andrew Rodrigues", - "email": "andrew@nodebb.org", - "url": "https://github.com/psychobunny" - }, - { - "name": "Julian Lam", - "email": "julian@nodebb.org", - "url": "https://github.com/julianlam" - }, - { - "name": "Barış Soner Uşaklı", - "email": "baris@nodebb.org", - "url": "https://github.com/barisusakli" - } - ] -} diff --git a/src/meta/package-install.js b/src/meta/package-install.js index ca465493bd..9f96b70a2e 100644 --- a/src/meta/package-install.js +++ b/src/meta/package-install.js @@ -5,7 +5,7 @@ var fs = require('fs'); var cproc = require('child_process'); var packageFilePath = path.join(__dirname, '../../package.json'); -var packageDefaultFilePath = path.join(__dirname, '../../package.default.json'); +var packageDefaultFilePath = path.join(__dirname, '../../install/package.json'); var modulesPath = path.join(__dirname, '../../node_modules'); function updatePackageFile() { From 86a4fd6c92113488f220b8f6d966b7c2b8a055b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 21 Nov 2017 15:00:22 -0500 Subject: [PATCH 30/81] add missing dep, my bad --- install/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b43fd3badf..1a58afde65 100644 --- a/install/package.json +++ b/install/package.json @@ -110,7 +110,8 @@ "jsdom": "^11.3.0", "mocha": "^4.0.1", "mocha-lcov-reporter": "^1.3.0", - "nyc": "^11.2.1" + "nyc": "^11.2.1", + "smtp-server": "^3.3.0" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" From 64895310a9b192e626acea2fc51498e153ef9bb2 Mon Sep 17 00:00:00 2001 From: Muhammad Osama Arshad Date: Wed, 22 Nov 2017 09:50:58 +0500 Subject: [PATCH 31/81] fix #5973 --- public/language/en-GB/error.json | 1 + public/src/client/topic/votes.js | 6 +----- src/posts/votes.js | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index 9d716ce95f..34b41edae5 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -144,6 +144,7 @@ "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", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot upvote/downvote your own 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.", diff --git a/public/src/client/topic/votes.js b/public/src/client/topic/votes.js index 9bd20fc1a6..007fa5e6dd 100644 --- a/public/src/client/topic/votes.js +++ b/public/src/client/topic/votes.js @@ -70,11 +70,7 @@ define('forum/topic/votes', ['components', 'translator', 'benchpress'], function room_id: 'topic_' + ajaxify.data.tid, }, function (err) { if (err) { - if (err.message === 'self-vote') { - Votes.showVotes(post.attr('data-pid')); - } else { - app.alertError(err.message); - } + app.alertError(err.message); } }); diff --git a/src/posts/votes.js b/src/posts/votes.js index e37cbff017..f7fdde759e 100644 --- a/src/posts/votes.js +++ b/src/posts/votes.js @@ -153,7 +153,7 @@ module.exports = function (Posts) { }, function (results, next) { if (parseInt(uid, 10) === parseInt(results.owner, 10)) { - return callback(new Error('self-vote')); + return callback(new Error('[[error:self-vote]]')); } if (command === 'downvote' && parseInt(results.reputation, 10) < parseInt(meta.config['privileges:downvote'], 10)) { From c834d6134e3f1771690610da7869d7abca62dbde Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 10:26:13 -0500 Subject: [PATCH 32/81] bump persona, nodebb/nodebb-theme-persona#383 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 1a58afde65..cf1a0a2f77 100644 --- a/install/package.json +++ b/install/package.json @@ -68,7 +68,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.1.1", + "nodebb-theme-persona": "7.1.2", "nodebb-theme-slick": "1.1.1", "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", From f92efc509c5507e1b24faca96adfc3058037acef Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 10:56:15 -0500 Subject: [PATCH 33/81] bump mentions for https://nodesecurity.io/advisories/536 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cf1a0a2f77..65b90cc3f2 100644 --- a/install/package.json +++ b/install/package.json @@ -63,7 +63,7 @@ "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.2.1", "nodebb-plugin-markdown": "8.2.0", - "nodebb-plugin-mentions": "2.2.1", + "nodebb-plugin-mentions": "2.2.2", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", From 252f6114817295304cfd917a766bdd67a0854885 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 11:59:49 -0500 Subject: [PATCH 34/81] changed error text wording --- public/language/en-GB/error.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index 34b41edae5..c336b8129e 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -144,7 +144,7 @@ "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", "already-flagged": "You have already flagged this post", - "self-vote": "You cannot upvote/downvote your own post", + "self-vote": "You cannot vote on your own 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.", From d0c9c52f9b0a8cb97ffdc24a9e5d53745a9899da Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 12:03:40 -0500 Subject: [PATCH 35/81] update persona for nodebb/nodebb-theme-persona#387 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 65b90cc3f2..fe0797d3f7 100644 --- a/install/package.json +++ b/install/package.json @@ -68,7 +68,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.1.2", + "nodebb-theme-persona": "7.1.3", "nodebb-theme-slick": "1.1.1", "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", From dbf815ed47fd7856b6c8c9873f46dbaec6752674 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Wed, 22 Nov 2017 12:10:34 -0500 Subject: [PATCH 36/81] closes #6103 --- src/database/redis/hash.js | 2 +- test/database/hash.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/database/redis/hash.js b/src/database/redis/hash.js index 9cf320fb3d..1a9388f0a2 100644 --- a/src/database/redis/hash.js +++ b/src/database/redis/hash.js @@ -102,7 +102,7 @@ module.exports = function (redisClient, module) { module.deleteObjectField = function (key, field, callback) { callback = callback || function () {}; - if (field === null) { + if (key === undefined || key === null || field === undefined || field === null) { return setImmediate(callback); } redisClient.hdel(key, field, function (err) { diff --git a/test/database/hash.js b/test/database/hash.js index 0f8f3d0cc6..3eb84c693b 100644 --- a/test/database/hash.js +++ b/test/database/hash.js @@ -330,6 +330,34 @@ describe('Hash methods', function () { }); }); }); + + it('should not error if key is undefined', function (done) { + db.deleteObjectField(undefined, 'someField', function (err) { + assert.ifError(err); + done(); + }); + }); + + it('should not error if key is null', function (done) { + db.deleteObjectField(null, 'someField', function (err) { + assert.ifError(err); + done(); + }); + }); + + it('should not error if field is undefined', function (done) { + db.deleteObjectField('someKey', undefined, function (err) { + assert.ifError(err); + done(); + }); + }); + + it('should not error if field is null', function (done) { + db.deleteObjectField('someKey', null, function (err) { + assert.ifError(err); + done(); + }); + }); }); describe('incrObjectField()', function () { From 5ca3b535e74ce4cd05697c126d9a7708d96f6768 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Wed, 22 Nov 2017 12:19:08 -0500 Subject: [PATCH 37/81] closes #6105 --- install/web.js | 10 +++++++--- src/database/mongo.js | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/install/web.js b/install/web.js index 6898ee864d..55f7db2a3a 100644 --- a/install/web.js +++ b/install/web.js @@ -77,10 +77,14 @@ function setupRoutes() { function welcome(req, res) { var dbs = ['redis', 'mongo']; - var databases = dbs.map(function (el) { + var databases = dbs.map(function (databaseName) { + var questions = require('../src/database/' + databaseName).questions.filter(function (question) { + return question && !question.hideOnWebInstall; + }); + return { - name: el, - questions: require('../src/database/' + el).questions, + name: databaseName, + questions: questions, }; }); diff --git a/src/database/mongo.js b/src/database/mongo.js index 04addc07d5..5bcab76a6f 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -22,6 +22,7 @@ mongoModule.questions = [ name: 'mongo:uri', description: 'MongoDB connection URI: (leave blank if you wish to specify host, port, username/password and database individually)\nFormat: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]', default: nconf.get('mongo:uri') || '', + hideOnWebInstall: true, }, { name: 'mongo:host', From c3c22cfdcc0b450e1458ad58d4b41985b8eee3a9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 14:14:13 -0500 Subject: [PATCH 38/81] closes #6107 --- src/meta/package-install.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/meta/package-install.js b/src/meta/package-install.js index 9f96b70a2e..2bca570533 100644 --- a/src/meta/package-install.js +++ b/src/meta/package-install.js @@ -53,9 +53,12 @@ function preserveExtraneousPlugins() { var packageContents = JSON.parse(fs.readFileSync(packageFilePath, 'utf8')); var extraneous = packages - // only extraneous plugins (ones not in package.json) + // only extraneous plugins (ones not in package.json) which are not links .filter(function (pkgName) { - return !packageContents.dependencies.hasOwnProperty(pkgName); + const extraneous = !packageContents.dependencies.hasOwnProperty(pkgName); + const isLink = fs.lstatSync(path.join(modulesPath, pkgName)).isSymbolicLink(); + + return extraneous && !isLink; }) // reduce to a map of package names to package versions .reduce(function (map, pkgName) { @@ -67,6 +70,8 @@ function preserveExtraneousPlugins() { // Add those packages to package.json Object.assign(packageContents.dependencies, extraneous); fs.writeFileSync(packageFilePath, JSON.stringify(packageContents, null, 2)); + console.log('written'); + process.exit(0); } exports.preserveExtraneousPlugins = preserveExtraneousPlugins; From c8395a9bfb28de39e508ec73635caa129c48fb97 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 14:54:10 -0500 Subject: [PATCH 39/81] Fixes #6056 Waiting for someone to qq my clever code in 3... 2... --- public/src/admin/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/admin/settings.js b/public/src/admin/settings.js index 6198984e19..493afc91f0 100644 --- a/public/src/admin/settings.js +++ b/public/src/admin/settings.js @@ -143,7 +143,7 @@ define('admin/settings', ['uploader'], function (uploader) { if (ajaxify.currentPage === 'admin/general/sounds') { ajaxify.refresh(); } else { - $('#' + uploadBtn.attr('data-target')).val(image); + $('#' + uploadBtn.attr('data-target')).val([image, Date.now()].join('?v=')); } }); }); From 2fa4b2918eb65d7fb9c3e9978d97a64e131dc63d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 15:03:07 -0500 Subject: [PATCH 40/81] removing premature return :laughing: --- src/meta/package-install.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/meta/package-install.js b/src/meta/package-install.js index 2bca570533..2ae93612a0 100644 --- a/src/meta/package-install.js +++ b/src/meta/package-install.js @@ -70,8 +70,6 @@ function preserveExtraneousPlugins() { // Add those packages to package.json Object.assign(packageContents.dependencies, extraneous); fs.writeFileSync(packageFilePath, JSON.stringify(packageContents, null, 2)); - console.log('written'); - process.exit(0); } exports.preserveExtraneousPlugins = preserveExtraneousPlugins; From 947fc739eb54206ba83bf8c88d215f05a2174503 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Wed, 22 Nov 2017 16:04:30 -0500 Subject: [PATCH 41/81] remove extra translator require --- public/src/client/register.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/public/src/client/register.js b/public/src/client/register.js index 4289c75d10..fe738418fe 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -87,11 +87,9 @@ define('forum/register', ['translator', 'zxcvbn'], function (translator, zxcvbn) if (data.referrer) { window.location.href = data.referrer; } else if (data.message) { - require(['translator'], function (translator) { - translator.translate(data.message, function (msg) { - bootbox.alert(msg); - ajaxify.go('/'); - }); + translator.translate(data.message, function (msg) { + bootbox.alert(msg); + ajaxify.go('/'); }); } }, From aecbcd9e8981ce0333670c63d808962b92c3e43a Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Wed, 22 Nov 2017 16:26:35 -0500 Subject: [PATCH 42/81] add verbose message for field whitelist --- src/user/data.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/user/data.js b/src/user/data.js index 131d034f96..db41509aa0 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -78,7 +78,11 @@ module.exports = function (User) { function (results, next) { if (fields.length) { fields = fields.filter(function (field) { - return field && results.whitelist.includes(field); + var isFieldWhitelisted = field && results.whitelist.includes(field); + if (!isFieldWhitelisted) { + winston.verbose('[user/getUsersFields] ' + field + ' removed because it is not whitelisted, see `filter:user.whietlistFields`'); + } + return isFieldWhitelisted; }); } else { fields = results.whitelist; From cdc00cc0f276880336e0133988c64f816828032c Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 22 Nov 2017 16:36:24 -0500 Subject: [PATCH 43/81] added 'dissociate' translation string for #5955 --- 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 a3be8c30b4..7483a041a2 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -144,6 +144,7 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", From 563fe0383c3c5901ecb439668dba15af21977aa7 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 23 Nov 2017 09:25:35 +0000 Subject: [PATCH 44/81] Latest translations and fallbacks --- public/language/ar/error.json | 1 + public/language/bg/error.json | 1 + public/language/bn/error.json | 1 + public/language/cs/error.json | 1 + public/language/da/error.json | 1 + public/language/de/error.json | 1 + public/language/el/error.json | 1 + public/language/en-US/error.json | 1 + public/language/en-x-pirate/error.json | 1 + public/language/es/error.json | 1 + public/language/et/error.json | 1 + public/language/fa-IR/error.json | 1 + public/language/fa-IR/flags.json | 4 ++-- public/language/fi/error.json | 1 + public/language/fr/error.json | 1 + public/language/gl/error.json | 1 + public/language/he/error.json | 1 + public/language/hr/error.json | 1 + public/language/hu/error.json | 1 + public/language/id/error.json | 1 + public/language/it/error.json | 1 + public/language/ja/error.json | 1 + public/language/ko/error.json | 1 + public/language/lt/error.json | 1 + public/language/ms/error.json | 1 + public/language/nb/error.json | 1 + public/language/nl/error.json | 1 + public/language/pl/error.json | 1 + public/language/pt-BR/error.json | 1 + public/language/pt-PT/error.json | 1 + public/language/ro/error.json | 1 + public/language/ru/error.json | 1 + public/language/rw/error.json | 1 + public/language/sc/error.json | 1 + public/language/sk/error.json | 1 + public/language/sl/error.json | 1 + public/language/sr/error.json | 1 + public/language/sv/error.json | 1 + public/language/th/error.json | 1 + public/language/tr/error.json | 1 + public/language/uk/error.json | 1 + public/language/vi/error.json | 1 + public/language/zh-CN/error.json | 1 + public/language/zh-TW/error.json | 1 + 44 files changed, 45 insertions(+), 2 deletions(-) diff --git a/public/language/ar/error.json b/public/language/ar/error.json index 75f6a0ee07..43db636e38 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "ليس لديك سمعة تكفي لإضافة صوت سلبي لهذا الموضوع", "not-enough-reputation-to-flag": "ليس لديك سمعة تكفي للإشعار بموضوع مخل", "already-flagged": "لقد بلغت عن هذه المشاركة من قبل.", + "self-vote": "You cannot vote on your own post", "reload-failed": "المنتدى واجه مشكلة أثناء إعادة التحميل: \"%1\". سيواصل المنتدى خدمة العملاء السابقين لكن يجب عليك إلغاء أي تغيير قمت به قبل إعادة التحميل.", "registration-error": "حدث خطأ أثناء التسجيل", "parse-error": "حدث خطأ ما أثناء تحليل استجابة الخادم", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index a8c2bb52ee..f6a63b01c7 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Нямате достатъчно репутация, за да гласувате отрицателно за тази публикация", "not-enough-reputation-to-flag": "Нямате достатъчно репутация, за да докладвате тази публикация", "already-flagged": "Вече сте докладвали тази публикация", + "self-vote": "Не можете да гласувате за собствената си публикация", "reload-failed": "NodeBB срещна проблем при презареждането: „%1“. NodeBB ще продължи да поддържа съществуващите клиентски ресурси, но Вие трябва да отмените последните си действия преди презареждането.", "registration-error": "Грешка при регистрацията", "parse-error": "Нещо се обърка при прочитането на отговора на сървъра", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index c63665943f..c3f8e6e12d 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "আপনার এই পোস্ট downvote করার জন্য পর্যাপ্ত সম্মাননা নেই", "not-enough-reputation-to-flag": "এই পোষ্টকে ফ্লাগ করার জন্য আপনার পর্যাপ্ত সম্মাননা নেই", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own post", "reload-failed": "\"%1\" রিলোড করতে সমস্যা হয়েছে। রিলোডের পূর্বে যা করা হয়েছিল সেটি আনডু করা সমীচীন। ", "registration-error": "নিবন্ধন এরর!", "parse-error": "Something went wrong while parsing server response", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 465ada0755..eaf4f9e1ee 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Nemáte dostatečnou reputaci pro vyjádření nesouhlasu u tohoto příspěvku", "not-enough-reputation-to-flag": "Pro označení tohoto příspěvku nemáte dostatečnou reputaci", "already-flagged": "Tento příspěvek jste již označil", + "self-vote": "You cannot vote on your own post", "reload-failed": "Vyskytla se chyba v NodeBB při znovu načtení: \"%1\". NodeBB bude pokračovat v běhu na straně klienta, nicméně byste měl/a přenastavit zpět to, co jste udělal/a před opětovným načtením.", "registration-error": "Chyba při registraci", "parse-error": "Při analýze odpovědi serveru nastala chyba", diff --git a/public/language/da/error.json b/public/language/da/error.json index 2165cad861..15b862fa43 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Du har ikke nok omdømme til at nedstemme dette indlæg", "not-enough-reputation-to-flag": "Du har ikke nok omdømme til at vurdere dette indlæg", "already-flagged": "Du har allerede vurderet dette indlæg", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB stødte på et problem under genindlæsningen : \"%1\". NodeBB vil fortsætte med en ældre version, og det er nok god ide at genoptage fra lige før du genindlæste siden.", "registration-error": "Registeringsfejl", "parse-error": "Noget gik galt under fortolknings er serverens respons", diff --git a/public/language/de/error.json b/public/language/de/error.json index 8aa2b0eb3c..4f9f333e5d 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Dein Ansehen ist zu niedrig, um diesen Beitrag negativ zu bewerten.", "not-enough-reputation-to-flag": "Dein Ansehen ist zu niedrig, um diesen Beitrag zu melden", "already-flagged": "Du hast diesen Beitrag bereits gemeldet", + "self-vote": "You cannot vote on your own post", "reload-failed": "Es ist ein Problem während des Reloads von NodeBB aufgetreten: \"%1\". NodeBB wird weiterhin clientseitige Assets bereitstellen, allerdings solltest du das, was du vor dem Reload gemacht hast, rückgängig machen.", "registration-error": "Registrierungsfehler", "parse-error": "Beim auswerten der Serverantwort ist etwas schiefgegangen", diff --git a/public/language/el/error.json b/public/language/el/error.json index 39862021c4..270e782a28 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Δεν έχεις αρκετή φήμη για να καταψηφίσεις αυτή την δημοσίευση", "not-enough-reputation-to-flag": "You do not have enough reputation to flag this post", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own post", "reload-failed": "Το NodeBB συνάντησε ένα πρόβλημα καθώς γινόταν η ανανέωση: \"%1\". Το NodeBB θα συνεχίσει να προσφέρει τα στοιχεία του χρήστη, αν και θα ήταν καλή ιδέα να επαναφέρεις ότι έκανες πριν την ανανέωση.", "registration-error": "Registration Error", "parse-error": "Something went wrong while parsing server response", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index 82d34b5e05..904416d3fd 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -119,6 +119,7 @@ "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", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own 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", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index 82d34b5e05..904416d3fd 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -119,6 +119,7 @@ "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", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own 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", diff --git a/public/language/es/error.json b/public/language/es/error.json index da31813650..4736caa77e 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "No tienes suficiente reputación para votar negativo este post", "not-enough-reputation-to-flag": "No tiene suficiente reputación para poner reportar esta publicación", "already-flagged": "Ya reportaste este mensaje anteriormente", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB encontró un problema al refrescar: \"%1\". NodeBB intentará cargar el resto de contenido, aunque deberías deshacer lo que hiciste justo antes.", "registration-error": "Error de registro", "parse-error": "Algo ha ido mal mientras se parseaba la respuesta del servidor", diff --git a/public/language/et/error.json b/public/language/et/error.json index 6d31ddc060..8896f3d278 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Sul ei ole piisavalt reputatsiooni, et anda negatiivset hinnangut sellele postitusele.", "not-enough-reputation-to-flag": "Sul ei ole piisavalt reputatsiooni, et seda postitust raporteerida", "already-flagged": "Te juba teatasite sellest postitusest.", + "self-vote": "You cannot vote on your own post", "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...", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index e92a1e5f67..37aa99cb64 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "شما اعتبار کافی برای دادن رأی منفی به این پست را ندارید.", "not-enough-reputation-to-flag": "شما اعتبار کافی برای نشاندار کردن این پست ندارید", "already-flagged": "شما قبلا این پست را پرچمگذاری کرده اید", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB در هنگام بارگذاری مجدد با یک مشکل مواجه شده است: \"%1\". NodeBB سرویس رسانی به کلاینت های سرویس گیرنده را ادامه خواهد داد، اگرچه شما کاری را قبل از بارگیری مجدد انجام دادید بازگردانی کنید", "registration-error": "خطای ثبت نام", "parse-error": "هنگام تجزیه پاسخ سرور اشتباهی پیش امد", diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index fbdf9fec19..588c6fb38b 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -36,7 +36,7 @@ "notes": "یادداشت های گزارش", "add-note": "افزودن یادداشت", - "no-notes": "بدون یادداشت های به اشتراک گذاشته شده", + "no-notes": "بدون یادداشت", "history": "تاریخچه گزارش ", "back": "بازگشت به لیست گزارش ها", @@ -57,7 +57,7 @@ "modal-reason-other": "دیگر (در زیر مشخص کنید)", "modal-reason-custom": "علت گزارش این محتوا...", "modal-submit": "ارسال گزارش", - "modal-submit-success": "محتوا برای بررسی نشانه گذاری شد", + "modal-submit-success": "محتوا برای بررسی گزارش شد", "modal-submit-confirm": "تأیید ارسال", "modal-submit-confirm-text": "شما همواره علت دیگری را مشخص کردید. آیا مطمئن هستید که می خواهید از طریق گزینه های گزارش سریع ارسال کنید؟", "modal-submit-confirm-text-help": "ارسال از طریق گزارش سریع جایگزین علت های مشخص شده دیگر می شود." diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 8e73db4c3f..6b4eda750a 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -119,6 +119,7 @@ "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", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own 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", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index a992ed875e..bf27c00d0f 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Vous n'avez pas une réputation assez élevée pour noter négativement ce message", "not-enough-reputation-to-flag": "Vous n'avez pas une réputation assez élevée pour signaler ce message", "already-flagged": "Vous avez déjà signalé ce message", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB a rencontré un problème lors du rechargement : \"% 1\" . NodeBB continuera de fonctionner côté client, même si vous devez annuler ce que vous avez fait juste avant de recharger .", "registration-error": "Erreur d'enregistrement", "parse-error": "Une erreur est survenue en analysant la réponse du serveur", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 8756006b92..5284042e18 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Non tes reputación dabonda para esta acción", "not-enough-reputation-to-flag": "Non tes reputación dabondo para reportar esta mensaxe.", "already-flagged": "Xa reportache-la mensaxe.", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB atopou un erro mentras recargaba: \"%1\". NodeBB seguirá a servir os activos dos clientes aínda que se deberá desfacer o que se fixo antes da descarga.", "registration-error": "Erro de rexistro", "parse-error": "Algo foi mal namentras se agardaba a resposta do servidor", diff --git a/public/language/he/error.json b/public/language/he/error.json index a0ff49b481..89e62a5fe2 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "אין לך מספיק מוניטין כדי להוריד את הדירוג של פוסט זה", "not-enough-reputation-to-flag": "אין לך מוניטין מספק על מנת לסמן את הפוסט הזה", "already-flagged": "כבר סימנת את הפוסט הזה", + "self-vote": "You cannot vote on your own post", "reload-failed": "אירעה תקלה ב NodeBB בזמן הטעינה של: \"%1\". המערכת תמשיך להגיש דפים קיימים, אבל כדאי שתשחזר את הפעולות שלך מהפעם האחרונה שהמערכת עבדה כראוי.", "registration-error": "שגיאה בהרשמה", "parse-error": "אירעה שגיאה בעת בעת ניתוח תגובת השרת", diff --git a/public/language/hr/error.json b/public/language/hr/error.json index 7c4bdb5b79..26cc2bf007 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Nemate dovoljno reputacije da bi ste glasali", "not-enough-reputation-to-flag": "Nemate dovoljno reputacije da bi stavili zastavicu na ovu objavu", "already-flagged": "Već ste označili zastavicom ovu objavu", + "self-vote": "You cannot vote on your own post", "reload-failed": "Problem kod ponovnog podizanja: \"%1\" will continue to serve the existing client-side assets.", "registration-error": "Greška prilikom registracije", "parse-error": "Došlo je do pogreške u komunikaciji sa serverom", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 09f5e7a15f..e5c4c2f198 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Nem rendelkezel elég Hírnév ponttal, hogy leszavazhasd ezt a hozzászólást", "not-enough-reputation-to-flag": "Nem rendelkezel elég Hírnév ponttal, hogy jelentsd ezt a hozzászólást", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB egy hibát észlelt újratöltés közben: \"% 1\". A fórum továbbra is kiszolgálja a kliens-oldali eszközöket, bár vissza kellene csinálnod amit az újratöltés előtt elállítottál.", "registration-error": "Regisztrációs hiba", "parse-error": "Hiba történt a szerver válaszának feldolgozása közben", diff --git a/public/language/id/error.json b/public/language/id/error.json index 8fed86543e..174ad7be79 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Tidak cukup reputation untuk downvote post ini", "not-enough-reputation-to-flag": "Tidak cukup reputation untuk flag post ini", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB mengalami masalah saat memuat \"%1\". NodeBB akan melanjutkan pemuatan, kamu harus membatalkan tindakanmu sebelum pemuatan kembali dilakukan.", "registration-error": "Registrasti Error", "parse-error": "Something went wrong while parsing server response", diff --git a/public/language/it/error.json b/public/language/it/error.json index 4484e91246..b5ccbdf88d 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Non hai i privilegi per votare negativamente questo post", "not-enough-reputation-to-flag": "Tu non hai abbastanza reputazione per segnalare questo Post", "already-flagged": "Hai già messo marcato questo post", + "self-vote": "You cannot vote on your own post", "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", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index ea59517924..b46a3b93ac 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -119,6 +119,7 @@ "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", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own 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", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 40af6bfcd7..511d875543 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "인지도가 낮아 이 포스트를 비추천할 수 없습니다.", "not-enough-reputation-to-flag": "인지도가 낮아 이 포스트를 신고할 수 없습니다.", "already-flagged": "이미 이 게시물을 신고했습니다.", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB 서버를 다시 읽어들이는 중 다음과 같은 문제가 발생했으나 사용자측은 지속적으로 자원을 제공받습니다. 오류 문구: \"%1\" 문제를 해결하시려면 다시 읽어들이기 전의 수정사항을 원래대로 되돌려주세요. ", "registration-error": "등록 오류", "parse-error": "서버로 부터의 응답을 읽는 동안 문제가 발생했습니다.", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index ab2b25b580..69c546337d 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Jūs neturite pakankamai reputacijos balsuoti prieš šį pranešimą", "not-enough-reputation-to-flag": "Jūs neturite pakankamai reputacijos kad įspėti dėl šito pranešimo", "already-flagged": "Jūs jau pranešėte apie šį pranešimą", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB susidūrė su problema persikraunant: \"%1\", NodeBB pratęs veikti su šiuo klientu. bet jums reiktu patikrinti ką jūs darėte prieš perkraunant NodeBB", "registration-error": "Registracijos klaida", "parse-error": "Kažkokia klaida įvyko bandant gaut serverio atsaykmą", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index bbef66b65a..889912e5d0 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -119,6 +119,7 @@ "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", "already-flagged": "Anda telah menanda kiriman ini", + "self-vote": "You cannot vote on your own post", "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)", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 37c81b0a5d..bfdefc58cb 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Du har ikke nok rykte til å nedstemme det innlegget", "not-enough-reputation-to-flag": "Du har ikke nok rykte til å flagge dette innlegget", "already-flagged": "Du har allerede flagget dette innlegget", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB støtte på et problem under lasting på nytt: \"%1\". NodeBB vil fortsette å servere eksisterende klientside ressurser, 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", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 621adea52c..fbc9f95c1a 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Je hebt onvoldoende reputatie om een negatieve stem uit te mogen brengen", "not-enough-reputation-to-flag": "Je hebt onvoldoende reputatie om dit bericht aan de beheerders te mogen melden", "already-flagged": "Je hebt deze post al gerapporteerd", + "self-vote": "You cannot vote on your own post", "reload-failed": "Tijdens het herladen van \"%1\" is NodeBB een fout of probleem tegengekomen. NodeBB blijft operationeel. Echter het is verstandig om de oorzaak te onderzoeken en wellicht de vorige actie, voor het herladen, ongedaan te maken.", "registration-error": "Fout tijdens registratie", "parse-error": "Tijdens het verwerken van het antwoord van de server is er iets misgegaan.", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 644b83c6b0..7a8ce1a07f 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Masz za mało reputacji, aby negatywnie ocenić ten post", "not-enough-reputation-to-flag": "Nie masz dość reputacji, by flagować ten post", "already-flagged": "Ten post jest już przez Ciebie oznaczony", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB napotkało problem w czasie przeładowywania \"%1\". Forum będzie nadal dostarczać istniejące zasoby strony klienta, jednak powinieneś cofnąć ostatnią akcję.", "registration-error": "Błąd rejestracji", "parse-error": "Coś poszło nie tak podczas przetwarzania odpowiedzi serwera", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index 8a69b5cd5f..d49ad01827 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Você não possui reputação suficiente para negativar este post", "not-enough-reputation-to-flag": "Você não possui reputação suficiente para sinalizar este post", "already-flagged": "Você já sinalizou esse post", + "self-vote": "You cannot vote on your own post", "reload-failed": "O NodeBB encontrou um problema ao recarregar: \"%1\". O NodeBB continuará a servir os assets existentes no lado do cliente, apesar de que você deve desfazer o que você fez antes de recarregar.", "registration-error": "Erro de Cadastro", "parse-error": "Algo deu errado ao receber a resposta do servidor", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index f61987ca2c..08a351e5e1 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Não tens reputação suficiente para atribuir um voto negativo a esta publicação", "not-enough-reputation-to-flag": "Não tens reputação suficiente para sinalizar esta publicação", "already-flagged": "Já sinalizaste esta publicação", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB encontrou um erro enquanto recarregava: \"%1\". NodeBB irá continuar a servir os ativos existentes do lado do utilizador. No entanto deverias desfazer o que fizeste mesmo antes de teres voltado a recarregar.", "registration-error": "Erro de registro", "parse-error": "Ocorreu um erro enquanto analisávamos a resposta do servidor", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index beb63b29a6..5b7c43a530 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Nu ai destulă reputație pentru a vota negativ acest post.", "not-enough-reputation-to-flag": "You do not have enough reputation to flag this post", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB a întâmpinat o problemă la reîncarcare: \"%1\". NodeBB va continua să servească fișierele existente pentru partea-client, dar tu va trebuie să refaci modificările pe care le-ai facut înainte de reîncarcare.", "registration-error": "Registration Error", "parse-error": "Something went wrong while parsing server response", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index f8f2c2d9e7..63f1c5ad0c 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "У вас недостаточно репутации для понижения оценки сообщения", "not-enough-reputation-to-flag": "У Вас недостаточно репутации, чтобы пометить это сообщение.", "already-flagged": "Вы уже отметили это сообщение", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB обнаружил проблему при перезагрузке: \"%1\". NodeBB продолжит работать с существующими ресурсами клиента, но вы должны отменить то, что сделали перед перезагрузкой.", "registration-error": "Ошибка при регистрации", "parse-error": "Похоже, что-то пошло не так в процессе обработки ответа сервера.", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index d36cc5e802..bbf35c17af 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Ntabwo ufite amanota ahagije ngo ube wakwemererwa kugira uwo wambura amanota", "not-enough-reputation-to-flag": "Ntabwo ufite amanota ahagije ngo ube wakwemererwa gutambikana uyu muntu", "already-flagged": "Wari waramaze gutambikana ibi", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB yahuye n'ingorane mu gihe cy'ipakira: \"%1\". NodeBB irakomeza kuzana ibyo yari ifite ku ruhande rw'imbere nubwo ufite kuba wasubira inyuma ugafata ibyo wari wakoze mbere yo gupakira. ", "registration-error": "Ukwibeshya mu Iyandika", "parse-error": "Hari ikibazo cyavutse mu gihe twari kugerageza kuzana igisubizo kivuye kuri server", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 82d34b5e05..904416d3fd 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -119,6 +119,7 @@ "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", "already-flagged": "You have already flagged this post", + "self-vote": "You cannot vote on your own 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", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 544c3d8ea9..2f4cc4e2e9 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Nemáte dostatočnú reputáciu k odobratiu hlasu pre tento príspevok", "not-enough-reputation-to-flag": "Nemáte dostatočnú reputáciu na označenie tohto príspevku", "already-flagged": "Už ste označili tento príspevok", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB narazil na problém pri načítaní: \"%1\". NodeBB bude pokračovať v službe existujúcej aktívnej klientskej strane, aj keď by ste mali vrátiť to, čo ste spravili tesne pred znovu načítaním.", "registration-error": "Chyba registrácie", "parse-error": "Niečo sa pokazilo pri analýze odpovede servera", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index a33f7a3c7b..be4e3a2121 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Nimate dovolj ugleda za negativno glasovanje.", "not-enough-reputation-to-flag": "Nimate dovolj ugleda za prijavo te objave.", "already-flagged": "To objavo ste že prijavili.", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB je zaznal težavo pri osveževanju: ", "registration-error": "Napaka pri registraciji", "parse-error": "Nekaj je šlo narobe pri pridobivanju odgovora s strežnika.", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 08b1e81236..d313aa88a6 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Немате довољно велики углед да бисте негативно гласали за ову поруку", "not-enough-reputation-to-flag": "Немате довољно велики углед да бисте означили заставицом ову поруку", "already-flagged": "Већ сте означили заставицом ову поруку", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB је наишао на проблем док се поново учитавао: \"%1\". NodeBB ће наставити да опслужује постојећа клијентска средства , иако би требало да опозовете оно што сте урадили пре поновног учитавања.", "registration-error": "Грешка при регистрацији", "parse-error": "Нешто је кренуло погрешно приликом анализе одговора сервера", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index ee35a84906..30ab7144d0 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Du har inte tillräckligt förtroende för att rösta ner det här meddelandet", "not-enough-reputation-to-flag": "Du har inte tillräckligt förtroende för att flagga det här inlägget.", "already-flagged": "Du har redan flaggat det här inlägget", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB stötte på problem med att ladda om: \"%1\". NodeBB kommer fortsätta servera befintliga resurser till klienten, men du borde återställa det du gjorde innan du försökte ladda om.", "registration-error": "Registreringsfel", "parse-error": "Något gick fel vid tolkning av svar från servern", diff --git a/public/language/th/error.json b/public/language/th/error.json index 1d740b7b0b..294f4c657f 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "คุณไม่มีชื่อเสียงพอที่จะโหวตโพสต์นี้ลง", "not-enough-reputation-to-flag": "คุณไม่มีชื่อเสียงพอที่จะปักธงให้โพสต์นี้", "already-flagged": "คุณได้ปักธงให้โพสต์นี้แล้ว", + "self-vote": "You cannot vote on your own 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": "การสมัครสมาชิกผิดพลาด", "parse-error": "มีบางอย่างผิดพลาดขณะรอการตอบกลับจากเซิร์ฟเวอร์", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index bee58ae855..a2676e3216 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Bu iletiyi eksilemek için yeterince itibarınız yok.", "not-enough-reputation-to-flag": "Bu iletiyi bayraklamak için yeterince itibarınız yok", "already-flagged": "Bu iletiyi zaten bayrakladınız", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB tekrar yüklenirken bir sorunla karşılaştı: “%1“. NodeBB varolan dosyaları servis etmeye devam edecek.", "registration-error": "Kayıt Hatası", "parse-error": "Sunucu yanıtı çözümlemesi sırasında bir şeyler ters gitti", diff --git a/public/language/uk/error.json b/public/language/uk/error.json index 08c5c91e75..f13c6bfc3c 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "У вас недостатньо репутації, щоб голосувати проти цього посту", "not-enough-reputation-to-flag": "У вас недостатньо репутації, щоб помітити цей пост", "already-flagged": "Ви вже помітили цей пост", + "self-vote": "You cannot vote on your own post", "reload-failed": "У NodeBB виникла проблема при перевантаженні: \"%1\". NodeBB продовжить надавати існуючі клієнтські ресурси, проте радимо вам скасувати те, що було зроблено до перевантаження.", "registration-error": "Помилка реєстрації", "parse-error": "Щось пішло не так при розборі відповіді сервера", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 5bdefda0a5..a566eb3308 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "Bạn không có đủ phiếu tín nhiệm để downvote bài này", "not-enough-reputation-to-flag": "Bạn không đủ tín nhiệm để đánh dấu bài viết này", "already-flagged": "Bạn đã gắn cờ cho bài viết này", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB gặp lỗi trong khi tải lại: \"%1\". NodeBB sẽ tiếp tục hoạt động với dữ liệu trước đó, tuy nhiên bạn nên tháo gỡ những gì bạn vừa thực hiện trước khi tải lại.", "registration-error": "Lỗi đăng kí", "parse-error": "Có gì không ổn khi nhận kết quả từ máy chủ", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index 90827ce8f4..ef3a112469 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "您的声望不足以踩此帖", "not-enough-reputation-to-flag": "您的声望不足以举报此帖", "already-flagged": "您已举报此帖", + "self-vote": "You cannot vote on your own post", "reload-failed": "刷新 NodeBB 时遇到问题: \"%1\"。NodeBB 保持给已连接的客户端服务,您应该撤销刷新前做的更改。", "registration-error": "注册错误", "parse-error": "服务器响应解析出错", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index 4408dcb9ac..8b21e7ed10 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -119,6 +119,7 @@ "not-enough-reputation-to-downvote": "你沒有足夠的信譽可以對這個張貼進行反向投票", "not-enough-reputation-to-flag": "你沒有足夠的信譽來舉報這個帖子", "already-flagged": "你已經對這個張貼標記過了", + "self-vote": "You cannot vote on your own post", "reload-failed": "NodeBB重載\"%1\"時遇到了問題。 NodeBB將繼續提供現有的客戶端資源,但請你撤消重載前的動作。", "registration-error": "註冊錯誤", "parse-error": "當剖析伺服器回應時發生了某個錯誤", From b0488fec61ef67e670155feeab01137a1027f0c5 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 Nov 2017 10:21:41 -0500 Subject: [PATCH 45/81] smaller notification image --- public/images/emails/notification.png | Bin 6117 -> 4673 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/emails/notification.png b/public/images/emails/notification.png index 4a45ab6e478bf0dd7176d443592a6ebe21c8e539..0e10a1580cfe84bb628be27d29c4e8585586177e 100644 GIT binary patch delta 4450 zcmV-o5uNVkFTo^`NPiLINklaJ#xRw`;L#e1=Pg%oqQYAyoG9{{;oRjO7b7k#e%yGn>@^I5;Dv<)Hw5jW6?D0k zype?OK~+ZZ!h@lEJgRLRcezHA@ZGE0f27f4NSU%2wb^Wk~F zE*6W2lciuaAb4q)ZZ~}7A8f^QPi@{7-R|lO-wr3snIwGoStAHu+QDnBeDbUPe>?7V zz@hUF-LF+btC&tkGrHY4begSv4XbZmjRt=8PY>T5&ik-yY;4TYZs>T)ol>h`!0k1C z(R9zIhi?u;A39$IFS+!58eYWBbps3CJX9aNA^I*^2K$!bFI zLUTIad*Q1>2ww6e3*BTX>3SXIe@0VuC;?3{9zA#!i3fD8T^n_E_e33?9Z}D^_4jUH zzj5<|kH0-V9bLP6`QE=TU$`*)b?VCHXl7=5C9gA_fc=Qoh2SMO!Q0W%IUB6&H*Jb~ z`_|6}?)^c#6dU`u{Qp0me(=7_UtfrBUZ0u`;_&^oD{~ zO@<+cm%lpq#o*eW-ergEQmx;(DM{u{kA(5erKh8gZ$2JPo%%&IeQtcw@J*HxYmY{9 z00s39+rjcj_Mu9{3#~SD>3lTx@o04ISI1|+zt5XV$GhK}MDUV@z#Wd}4htU4+H1dl z>O^$q#JkbWv!8^2jwZpof6E%hPy=ZV+i>24`M`~{`g^S1zH@d7o$uBEe!mcnjaj+q zcu8gG9xMlL9#6A4o-A+te0TqdHI3jU4S^fRZVzR-!(D>WasZE7^9WvA5x5~}!wF?d zZTRbl&Ub$jz^0i|7mi$`me4&I&7Ib<)TSjE4!?i7+Xo#l4GrA+f72!os>VIx$hN(@ zUj#3W2;I=-g|S@MD0@^0-5(nJWw{JBuu$k8E_b>@cVVF}$CEm_b{jfgRvfsqff5;7 zSc;LP^WCcq2ws*Gy2f*tZ}!@4#(k;PY9*i?x}npJRbyGg8P<2las2+L|M9QF7r{%- zp=&&Mh2i^HSMR=oe>-2VI`iqTN0kG?i_mSx#?)7cy0`8q_22kn=&2_ke}7_PLidZ{ z<$=(h-;p+;8ubm|wcmPv;Oa;JHXO(Cxg>l~stSUa`$P9x)o4ukb`<)%ub(Lwj_)h8SAxp&^H0 zJXu~C8yhp%e^>Wmgq>`iTOL^@hwN+`ljnvROiOC8iOVx9{uyCD??Xqj-Op4&!Api1W>|4I zd#7p76^0uYF=&Q^;3Yc@Gpx|rE4Q2WTor~J0#gD7FKK6(A$!7b!vY6W%o|oA!AtrT zl^}Z-IhZ0S6pKZlU<5BIXCuvG@Gd^i8yK?}f4rpCo@0}7$QyrhhcvdPY0um90)-A`2vULCLCMaP@xP^~_z zf8omp1aFmb-f+gU*xC`iq(FK8uJPSEYDB2kqO-qhuIhRPFS=dox-nLs&l?z061=3u z^Gc8(YbtlW{>TbmQo=b~bENC3s?*A>Z^26n=z?;j!WAj3Z^26%lnZYw`hzQYX@xzkqHsf2Bq2 zSj(|hT|LzvVk%*Vbtpk*`KZ}I;R+Lr9Twb-s}Qf*QnjJg@d{pay!rCM|K6BgQcUn> zn4yLYDqnSi9IN4EIbmi)Nu>lYx*fa^5WKl%n4t}H8s`3GD?XYoHpUeA{DrJ+M zYuRLjYp}ojlgfwf{`ADfhMf$3e_oi&d-LokI$j+wDPeqMv-VYgM=UVoZl%Vmd?Kqp7zT1@7 z5l)IebLo7ghZt@UyflHck~Kk?wU7oi%xnld*p66Z8T&M&1es$`b{nZ-f1KCULcvQT z?Kw6XK32vm(MG}R=rzHMZkOf?JJ+i0U@NJT;H9x_WV+r*m{KNqX)ISAXhSueB2w@Q zUUa z;&4M;EEXNXCV0{DQcpFEfAi{k1uylq=h)&$=M}uHRCzXo`I+1kcCb~L-Js(YywrhV1{UagcP-xX7K^4He+ph!(Cx;_7aI|e z==;Mzt#r4khk}CE1b8%;lqL# z-7fVOcCfA6`O;!{+czM1Sz@<4sN1EcuJ?OCTI_%d@1K-gtpuqG-7t0Ron#qM4XRny zu_o%={A4usoBw?Hf3EI0j(<5ZG4Wef((zK=p~&g|Sb}gEap4CGHn@fxbiCBi?H=|K zk>%)ma(i_9()nn5a{T_ApG~^nx09~-q6!IKgf0!~d|zBBd<#kN9#tK|i_oQk;Tv|g z-T0rA^EVCZdef;x30fAoVMp5W$e1p56sDMk@V)Rae>Hzof0&xMS7mg(LU--}iT8vq zjj(1*oGjmpZk#z8-JO{ZUGLGP>;1jT2;O!M-BP*Jja7q23DeBhK0O%S{QR@%&b5nw zl!Wg;B;k8QWdv_KhVF1QH&3@)HE8(8-B*Zup8MnI*5{uM+`e>vz>YS-+m4|d=IH)~ zO3+Nf919cGrOTob%NvzgB;e|XcxHLC!@+hi`8Lgw8(`$;Vii&aYS z3SOv#nM>zueW>6Syy@`s-TfDZFKy86B6w5hZ6zS9uAlmaA_(408c_nWC=4@PKXpPO z1aJ0~ha28h39{z$2mh!Df;ZFNNS1MBAS=Sy?zN9cm-1gsofN#O?0SFb%}EwapBs<9 zfBfgaTVLgAIQ8j=hw}FOO?_iqG`0DeO#cp@*T0H3 zoXz)?s_Dt`<#f3B+n)rl9ms+=dy2*4f0?{>z*nAlA-eoTw$B*Yb>;WbH$HvO8?>^G zN$}c#Q3u9&o9_)JAcNi%x`H>ek~i;2@?|tnzf3ln7BS@tHOJFXlJ_=Ked z=};^d<0!+k9nL@d(#yB{`uAn=wfB5=I@);VgIXWHEAOEzYy~eFvF-Jd@JHiJ7GL}3 z)BhfIUp!mWW0O#_&9L%MSxP`Xf1Li=aOjebWNrhveXHisjT|nE;3b9L%GwL=JNN6Q zJlvjr1TU%UdPk!S&D03pZtuAzUGhf9i{K@dGBeSB-RB?8hVK&m(&|OCuxcu95Fo9ZiZZ1~-Wf6F=A?ua#u z;3e(h8+JtPPuuGX!wWrMo?gy>eal)!@REh_9ZA0IP0Q;EN2rBvcNvZtWhX&=R6aWDzq<5Qcr6>hE@h^BisEjet%)gyYo z{H&f=kr+)vcbBz;;3e1Ln|wK*EQLF(*UX0Rt#yyj-ghhc{%&&Hf4uo{4Hww#ynZ2C zeY5V@dkbUHyIf-o!Ao0(Zwp_>NV4n~x(Hs{DSYE-ZpztU3!eUsBybN}3kY7?HGo3^ z9%$0jjYo4AbsSZB1TXC#zM<kO~Q6WH4(h9{7yIoaF_-0eDvUKh%hDWQZzSydol@I o*GdDC(Ls^mB^!Vh`ab~%0KXZ9>g`t882|tP07*qoM6N<$f(1J282|tP delta 5974 zcmW+)cOaWx7dK+nro`S|)F@R&W0to?Rf$cg7PZx=l<*L%uTfoAX;GyyL#-kSp{P-6 z#4JK<3!&5u-}8RYfA`$y-h0OHoO{oYD7T>e;uZi+ynRz2j+|VdcJ_sPMs;m)c<+%~n$z=-rb|WuAJV7PZ(n zaLW8gci`!B%a?;jK(UW2t1DVDfO}`Txt5T=u_QXw5HS|@QuN_RJu1Tji(md`_^uz8 z;Qjzr7FPucM6hgm8S_DutAfajJJZCf&lMxENbQmUMy)vZ6eU&!`Jff{AwWOV$&={pHaNIIcN#pKGf$n#@#Sx{oF^<#J5FDo{bK9JH~P2{Fi>ZPGL}wEfnX6oojK z_2H$o9z%iXaBVN7I z{k&rKgNK8*spR4gCE4tJ@Uu)_I4*y(!kOf#iU~NvMCo_14~y4s-PSb^fY+odvg^L% zESr@;*zn*~>L$}WdLsN#8+=V^WByL-roguLJ6V)IwGEEHrhBlpQ(Q#230fLotqKmi zNy~Qdi?^Hamqt#T%uQk2HNKm2qM?ug0}ltS!sF*%PfPTvA2!;o;wm&q z1f8Dtpr+OD+oiE&BRtc48sTykBN}?E?e{ip#`EOIa;Zkwvludy{Lb%#*B60|;5c4G z%eO)dBL-coN~H0Ta)+tOMgI@#=T7~BC$YZXmXyQlb85p@tAoqS!MdBo>8ZOdI=hrH z)4b%;$J_UF6HQ4u-oa^*A87bW`lGqbWeYF>TUrl8^fCU?<-g6cyO4;#o5R}lqAdE;GHZ4Zkq7rK*<3Jucr?IeO8qA6gV(|_@T2RU_`a5ToG0z1 zDtI6F1dQyH*uDR56<(ZeQp+0%o-?!9`cQgb;R3H1M;Sh#fBv&(h$#tZvh*u`x~4=b z4sbi}iN7eFt7v^pM@*J$w_&&jW%eicZcYm(RK-=sZ7#=ikBn5bwI$+v1R2m!62?DR zC#}5{p16uUrycg1oK6?DGvT_@OYe9_-Y5;q_vP~uO73TBr%dr?8s>^Pp|FLP*49`f z>FaS*kBV-s;PoR`(H9LsO;Zkr?dVqk%9zL;SQL*~2N9Ah@z5u(G-kW~b``1l7`r%V1;+j{w zLd;a}qY)?l*~5^1F4ePA$dVxaU3N4S-iUy=94*t_bOa56unQpz7sJ`FJifA8v>h_$VF}KE2}08R*n$6{!WfmvI zrX)pVkzAiFn-op8KiXefRGz)$JZFavbI}3vmV7l5Rno?sXmOP-O~4blI-v0a@Nmao zc->v4cshqp#u+#67f{ zKLsM9JzV;fwimL0l7`9}YCwn+jM_5EMxP55jxr<@0#sdA()G zeR(`t0&D+pP}D<(EW9!nToe^>TM0a!<03H`QaW9j6zgTzb_mmT*}v2_=2k1x$Lh@X zb5EG<@_{kMtSljcS^Y6>==kp5k0<%_Mh6(Dst=W8Gfv|{`P)VFMxgfhBKHJkV=g{S znrKfxZKMvvau~^tPZJTf8)Me2`lyb9wvBXsm0;) z_aiIfvL)rS>9eE|+V4-Mk++L4NO;DvA}lB}_r?D*On`Yt{-lwN zRv5*8qnEZ5!G^dI`a)XomG!3T$AR8%0cJOe0KYQlr?SU|ZZk@JGHZYPe@fm1qh2H- z<0&w!ESM~*<^abLR;~M{jM{!{`6*m)yUcB{K~hK>|9gpC zcR7nsU=6hQTYTik3V0`!z@G2-DvEp0=GAtc5N0{=V)&tw@CD6o{rW+6$?_eQ?9S`o z6mE5_@lSHRZ`RSWs>@UCHB$Qg@V9~e;$J@84C~THP$(OmbjGUJWO$jGop`bRwvE{r>YRo0E5v^DF}dd(?K#u=Q5HARtpO`f<#3Ety<2$@Ge+ zdRmWUO4SNbHl(|UQgPlrHJs#B$Thq7>X(2t^4;0@SBXmEiz#;o-okf_HNP2Co06`@ zCev%}eqCOIRuA;f2ocxHISk3Jy{;jX%S#v3L^Hk!Ee6NaCol2f%-J%dKh7ID*Wz&s ztA@cTg2c5~mjT1*aIfiF*;T{rX+5e|{E6`Ud%ZJ(DM<~9y^Op#I4;meF`|9wS1M94 zC;yx=by7Lk*jQjLXjhB&b$@BRzxyl%>xq$a!XhNiL{G&WHT=^KEhaf3SpFsX!dK8^Pkg^tDWWum%&3zJPN^xkS5(kWtZFjmKrvXBp3G&0zoU%uMS3t!DG`0t z51S>PHIwh)N5h^?EER!zS#GsCk#K?T;_aCe*CE)*wu9!KZr3;Po#Dh`r)>0pzT+!F zHq>zP&>i2K^<-7x$i+u^v{Fhh}R_?+K zx*cr8;g#msT>2!Gt(A#BrlLAY_@qNxnZx zXU_^kl!@$cd5^qIN)B1Q_oSvB&M2X_5N*FszSH%#w^!H~f_&NI*MdD59{^D1xD34p*`3p0s2o^)SH=Yks=PlKJCU+_`z3FodNC3@v!WaaA?*Ng6fM-%Hvd*xMM0Yf)C&o9YUF5Po_c0mu6+;|#{B z&)R?Pg|hAuvO3XN`306fT&ctZKs=N?HDTp4aM9Pu3*kc zltZp133FDp%%|$sNV|^k9Ts-+SZv7$x+mN3Zp#APjX#gR?wa0{G%t%G zSEL1|0?a4d5$2T*e*?xO>`x3}=y|JTg0Kmz>Mb+!9CnLRsvHL7gbh^BQQ7zC7& znxml695m5@%zj6oc^ zLTi#EP#3A$YD^VLNP_miZp2+FPQSOsha>SL?p=44BgYEWh+YR`Q~zK2er%bP8)Sex zRlLP>(4(X)5`;c+2d~GH?;yT#$N{9ebRm`rWB?D&T0e(=#%t=Z5W~&6{0H1kFNa=& zd9(65g}D@g*3g{uWtK-+>?)<{C=+uo8bD`~t~CFb_jgA06X*!9COCQT7UvI`QqRje zMP#Oe_;rvXZs!D=yDlzTA1rHj`B5ToMwT0>N>!h&S;@;PK_)Dx0Jq zOa||2MOkM=;LY2%IkDb)w-)~xmxpKnF{frwUJ$B#A$`NUuk(zb+GV^5kShGMdhWWBw=RQ+tX)aN-{Cv6O*BxyYV1#fPhAHptu=nKpTt6gX56L*bE zUAO2=ZSl@neB)4i7AQ65a-Og_oH!f3(9I^mo00M{S{f<)QqZtfg-#)24m)GN0(bLZ zG9vF1)txDS|3F2aRTh*O)%lN?b}F5kz_Q;vtV^#*v2J&`RkuFk#l{mVK^S5T)+;$ zg1X@EWL=ZC@%_~DE)QgLm5T4W2pdSY=Tvn!n>FWc(%XKRVYoN&T9Bbh(uMW}v zVc4hZnPM1`Y|4+5Sjn;#ZI{v&U`k`r7VjBCig?YteGwVD{5P(kIWs~yGSMn~hK;rT;dQsX{zgH9L-R~@Z;2g7(__(LT|q7xRM<_bjcvwv9;&JL0a>6cbl(Ag!8e@hG0s8X(w8&P zoEwz`3+)Uk&jton?!;?RM4(YRYHAjjJU7U4|)1LNf9$7pUTJeqU6li zkN{fQ44R-#tY<~e+3ml-faEL*XZL-*ZmxFCT=aAGx1ejtcEqMm$D5jE(e^&M*s5m< z*=)>2v+bD;_SrQERv(yC064?=34>SDrtk9zL30ek!uBN^u-_ijNZC*VQ@!<*5@D$4 zB>QMW<)fWBYk9$BjaaD{W%l263e9ZpR8w>|Z$C&DaoOWztj?dL2p#0csC??7X^VdW z6gRzcfS1g(h(;q~q% zyTObG7V~%@D?jw~#OxdlF(EGT@ND%D`2;%l-21HWy>n6DV${Jd_ut`l30>0GZe0=~ z&l@C&WE%e_|HP}H@MBR&^09PisQNFO1C-K$E$RF>G5z=%Lk=%1;%iCxxvR`5iP*|* zPgNcq$TyGx$3$;ij%v0TvXQ1WHcSE69WKBIZ=ScRm*K%(Y*^j(PB2`mn7we1lB9o4 z5)^$}edkE)&YZPfT(2}Qo>UyK*SXA!$Pyr^*7>#`Xtecxba1?$H1O9JeQ*Q4h{wK8?lE1i1c|p- zy4!M&?5qemaYDbC@9R;6wgLs<4fD9A9#v+A3Zob-D5P(&=K)zeX|R=^@M@5vK}(BC%oAQw+kCx_dK@g!X;xhIKojWs zu(*b$+13eO%gpA;nc&mwNOrJkQ5_f?SJ3SBYMsvPhyU^Bi}YmzduzP>Y>3@~1f1FF z7F?-U=@Xsp!S?!vkh+L0TS9yN; zxg9Tsgav!6fG!pzzz#Q@N+>GBlO^YES}=^r-Ji7Dlj|lzrsouD_}`wFD9sqedRtHM zHGzDp@xGFgZKrpA^+HaX`*{OS1$zS!Cb=B5QITua)D?d4pZk9MCO}7o$?RuA7^OfZ zMDqnR8fwEry%!nw75%B_hBFT?P##sZnm%giN*-2NcFg0N)<;|drFDnu^S%u~s;h>I z>OicSCt}$?iE`gs4vKf>!BN$txiOQqQXfmxdv`f_zJM@e^;E?l`eO;Z=be~L$9vMR z_Agg0SguPUV=kOCuv Date: Thu, 23 Nov 2017 08:50:10 -0700 Subject: [PATCH 46/81] Remove external sources from installer page (#6101) * Remove external sources from installer page * Remove bootstrap.min.css * Make spinner display consistently cross-platform * Change spinner to look better --- install/web.js | 31 +++++++++++++++------- public/less/install.less | 47 ++++++++++++++++++++++++++++++++- public/src/installer/install.js | 4 +-- src/views/install/index.tpl | 37 +++++++++----------------- 4 files changed, 82 insertions(+), 37 deletions(-) diff --git a/install/web.js b/install/web.js index 55f7db2a3a..730c8130c4 100644 --- a/install/web.js +++ b/install/web.js @@ -26,6 +26,7 @@ winston.add(winston.transports.File, { var web = {}; var scripts = [ + 'node_modules/jquery/dist/jquery.js', 'public/vendor/xregexp/xregexp.js', 'public/vendor/xregexp/unicode/unicode-base.js', 'public/src/utils.js', @@ -53,7 +54,7 @@ web.install = function (port) { extended: true, })); - async.parallel([compileLess, compileJS], function (err) { + async.parallel([compileLess, compileJS, copyCSS], function (err) { if (err) { winston.error(err); } @@ -136,14 +137,15 @@ function launch(req, res) { process.stdout.write(' "./nodebb log" to view server output\n'); process.stdout.write(' "./nodebb restart" to restart NodeBB\n'); - async.parallel([ - function (next) { - fs.unlink(path.join(__dirname, '../public/installer.css'), next); - }, - function (next) { - fs.unlink(path.join(__dirname, '../public/installer.min.js'), next); - }, - ], function (err) { + var filesToDelete = [ + 'installer.css', + 'installer.min.js', + 'bootstrap.min.css', + ]; + + async.each(filesToDelete, function (filename, next) { + fs.unlink(path.join(__dirname, '../public', filename), next); + }, function (err) { if (err) { winston.warn('Unable to remove installer files'); } @@ -198,4 +200,15 @@ function compileJS(callback) { }); } +function copyCSS(next) { + async.waterfall([ + function (next) { + fs.readFile(path.join(__dirname, '../node_modules/bootstrap/dist/css/bootstrap.min.css'), 'utf8', next); + }, + function (src, next) { + fs.writeFile(path.join(__dirname, '../public/bootstrap.min.css'), src, next); + }, + ], next); +} + module.exports = web; diff --git a/public/less/install.less b/public/less/install.less index 1289c62941..a9f59dbb7b 100644 --- a/public/less/install.less +++ b/public/less/install.less @@ -1,3 +1,48 @@ +.working { + width: 24px; + height: 24px; + + position: relative; + display: inline-block; + vertical-align: bottom; + + &::before, &::after { + content: ' '; + + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #fff; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + + -webkit-animation: sk-bounce 2.0s infinite ease-in-out; + animation: sk-bounce 2.0s infinite ease-in-out; + } + + &::after { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; + } +} + +@-webkit-keyframes sk-bounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } +} + +@keyframes sk-bounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} + .btn, .form-control, .navbar { border-radius: 0; } @@ -8,7 +53,7 @@ } body, small, p, div { - font-family: "Roboto", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .input-row { diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 9fa8a248c7..201905a3c1 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -46,7 +46,7 @@ $('document').ready(function () { return false; } - $('#submit .fa-spin').removeClass('hide'); + $('#submit .working').removeClass('hide'); } function activate(type, el) { @@ -112,7 +112,7 @@ $('document').ready(function () { } function launchForum() { - $('#launch .fa-spin').removeClass('hide'); + $('#launch .working').removeClass('hide'); $.post('/launch', function () { var successCount = 0; diff --git a/src/views/install/index.tpl b/src/views/install/index.tpl index 5183debbb4..39cc52f305 100644 --- a/src/views/install/index.tpl +++ b/src/views/install/index.tpl @@ -2,37 +2,28 @@ - - + + NodeBB Web Installer - - - + - + + @@ -104,7 +95,7 @@
- +
@@ -113,7 +104,7 @@

Congratulations! Your NodeBB has been set-up.

- +

@@ -131,9 +122,5 @@ - - - - \ No newline at end of file From ae24bca16e2c4eba585cbd22c296040b78866fe8 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Thu, 23 Nov 2017 08:55:03 -0700 Subject: [PATCH 47/81] CLI refactor with commander (#6058) * CLI refactor with commander - Modularized the functionality - All functionality done directly from `./nodebb` now (still available from `app` for backwards compatibility) - Moved all CLI code from `./nodebb` to `src/cli` - Fixed `nodebb.bat` to work from any location, like `./nodebb`, and also hides command output - Overwrite some commander methods to add CLI color support - Added `./nodebb info` for quick info including git hash, NodeBB version, node version, and some database info - Refactored `./nodebb reset` to allow multiple resets at once - Changed `./nodebb restart` to essentially stop and start, as Windows doesn't support signals - Added `-l, --log` option which works on `./nodebb start` and `./nodebb restart` to show logging, like `./nodebb slog` - Expanded `-d, --dev` option which works on them as well, like `./nodebb dev` - Improvements to self-help. `./nodebb build -h` will output all possible targets - `./nodebb reset` explains usage better * Fix some style inconsistencies * Fix prestart being required before modules installed * Fix travis failures * Fix `help` command to output help for subcommands * Pick steps of the upgrade process to run * Fix formatting for upgrade help * Fix web installer --- app.js | 266 ++---------------- install/package.json | 2 +- nodebb | 547 +------------------------------------ nodebb.bat | 2 +- src/cli/colors.js | 127 +++++++++ src/cli/index.js | 265 ++++++++++++++++++ src/cli/manage.js | 143 ++++++++++ src/cli/paths.js | 15 + src/{ => cli}/reset.js | 113 ++++---- src/cli/running.js | 119 ++++++++ src/cli/setup.js | 59 ++++ src/cli/upgrade-plugins.js | 216 +++++++++++++++ src/cli/upgrade.js | 117 ++++++++ src/meta/build.js | 2 + src/prestart.js | 84 ++++++ src/upgrade.js | 3 +- 16 files changed, 1233 insertions(+), 847 deletions(-) create mode 100644 src/cli/colors.js create mode 100644 src/cli/index.js create mode 100644 src/cli/manage.js create mode 100644 src/cli/paths.js rename src/{ => cli}/reset.js (53%) create mode 100644 src/cli/running.js create mode 100644 src/cli/setup.js create mode 100644 src/cli/upgrade-plugins.js create mode 100644 src/cli/upgrade.js create mode 100644 src/prestart.js diff --git a/app.js b/app.js index d1bf1c7c08..7942646c21 100644 --- a/app.js +++ b/app.js @@ -30,47 +30,16 @@ nconf.argv().env({ separator: '__', }); -var url = require('url'); var async = require('async'); var winston = require('winston'); var path = require('path'); -var pkg = require('./package.json'); + var file = require('./src/file'); -var debug = require('./src/meta/debugFork').debugging; global.env = process.env.NODE_ENV || 'production'; -winston.remove(winston.transports.Console); -winston.add(winston.transports.Console, { - colorize: true, - timestamp: function () { - var date = new Date(); - return nconf.get('json-logging') ? date.toJSON() : date.getDate() + '/' + (date.getMonth() + 1) + ' ' + date.toTimeString().substr(0, 8) + ' [' + global.process.pid + ']'; - }, - level: nconf.get('log-level') || (global.env === 'production' ? 'info' : 'verbose'), - json: (!!nconf.get('json-logging')), - stringify: (!!nconf.get('json-logging')), -}); - -if (debug) { - var winstonCommon = require('winston/lib/winston/common'); - // Override to use real console.log etc for VSCode debugger - winston.transports.Console.prototype.log = function (level, message, meta, callback) { - const output = winstonCommon.log(Object.assign({}, this, { - level, - message, - meta, - })); - - console[level in console ? level : 'log'](output); - - setImmediate(callback, null, true); - }; -} - - // Alternate configuration file support -var configFile = path.join(__dirname, '/config.json'); +var configFile = path.join(__dirname, 'config.json'); if (nconf.get('config')) { configFile = path.resolve(__dirname, nconf.get('config')); @@ -78,8 +47,9 @@ if (nconf.get('config')) { var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database')); -loadConfig(); -versionCheck(); +var prestart = require('./src/prestart'); +prestart.loadConfig(configFile); +prestart.versionCheck(); if (!process.send) { // If run using `node app`, log GNU copyright info along with server info @@ -89,224 +59,40 @@ if (!process.send) { winston.info(''); } - if (nconf.get('setup') || nconf.get('install')) { - setup(); + require('./src/cli/setup').setup(); } else if (!configExists) { require('./install/web').install(nconf.get('port')); } else if (nconf.get('upgrade')) { - upgrade(); + require('./src/cli/upgrade').upgrade(true); } else if (nconf.get('reset')) { - async.waterfall([ - async.apply(require('./src/reset').reset), - async.apply(require('./src/meta/build').buildAll), + var options = { + theme: nconf.get('t'), + plugin: nconf.get('p'), + widgets: nconf.get('w'), + settings: nconf.get('s'), + all: nconf.get('a'), + }; + + async.series([ + async.apply(require('./src/cli/reset').reset, options), + require('./src/meta/build').buildAll, ], function (err) { - process.exit(err ? 1 : 0); + if (err) { + throw err; + } + + process.exit(0); }); } else if (nconf.get('activate')) { - activate(); + require('./src/cli/manage').activate(nconf.get('activate')); } else if (nconf.get('plugins')) { - listPlugins(); + require('./src/cli/manage').listPlugins(); } else if (nconf.get('build')) { require('./src/meta/build').build(nconf.get('build')); } else if (nconf.get('events')) { - async.series([ - async.apply(require('./src/database').init), - async.apply(require('./src/events').output), - ]); + require('./src/cli/manage').listEvents(); } else { require('./src/start').start(); } -function loadConfig(callback) { - winston.verbose('* using configuration stored in: %s', configFile); - - nconf.file({ - file: configFile, - }); - - nconf.defaults({ - base_dir: __dirname, - themes_path: path.join(__dirname, 'node_modules'), - upload_path: 'public/uploads', - views_dir: path.join(__dirname, 'build/public/templates'), - version: pkg.version, - }); - - if (!nconf.get('isCluster')) { - nconf.set('isPrimary', 'true'); - nconf.set('isCluster', 'false'); - } - - // Ensure themes_path is a full filepath - nconf.set('themes_path', path.resolve(__dirname, nconf.get('themes_path'))); - nconf.set('core_templates_path', path.join(__dirname, 'src/views')); - nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates')); - - nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path'))); - - if (nconf.get('url')) { - nconf.set('url_parsed', url.parse(nconf.get('url'))); - } - - // Explicitly cast 'jobsDisabled' as Bool - var castAsBool = ['jobsDisabled']; - nconf.stores.env.readOnly = false; - castAsBool.forEach(function (prop) { - var value = nconf.get(prop); - if (value) { - nconf.set(prop, typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true'); - } - }); - nconf.stores.env.readOnly = true; - - if (typeof callback === 'function') { - callback(); - } -} - -function setup() { - winston.info('NodeBB Setup Triggered via Command Line'); - - var install = require('./src/install'); - var build = require('./src/meta/build'); - - 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'); - - async.series([ - async.apply(install.setup), - async.apply(loadConfig), - async.apply(build.buildAll), - ], function (err, data) { - // Disregard build step data - data = data[0]; - - var separator = ' '; - if (process.stdout.columns > 10) { - for (var x = 0, cols = process.stdout.columns - 10; x < cols; x += 1) { - separator += '='; - } - } - process.stdout.write('\n' + separator + '\n\n'); - - if (err) { - winston.error('There was a problem completing NodeBB setup', err); - throw err; - } else { - if (data.hasOwnProperty('password')) { - process.stdout.write('An administrative user was automatically created for you:\n'); - process.stdout.write(' Username: ' + data.username + '\n'); - process.stdout.write(' Password: ' + data.password + '\n'); - process.stdout.write('\n'); - } - process.stdout.write('NodeBB Setup Completed. Run \'./nodebb start\' to manually start your NodeBB server.\n'); - - // If I am a child process, notify the parent of the returned data before exiting (useful for notifying - // hosts of auto-generated username/password during headless setups) - if (process.send) { - process.send(data); - } - } - - process.exit(); - }); -} - -function upgrade() { - var db = require('./src/database'); - var meta = require('./src/meta'); - var upgrade = require('./src/upgrade'); - var build = require('./src/meta/build'); - var tasks = [db.init, meta.configs.init]; - - if (nconf.get('upgrade') !== true) { - // Likely an upgrade script name passed in - tasks.push(async.apply(upgrade.runParticular, nconf.get('upgrade').split(','))); - } else { - tasks.push(upgrade.run, build.buildAll); - } - // disable mongo timeouts during upgrade - nconf.set('mongo:options:socketTimeoutMS', 0); - async.series(tasks, function (err) { - if (err) { - winston.error(err.stack); - process.exit(1); - } else { - process.exit(0); - } - }); -} - -function activate() { - var db = require('./src/database'); - var plugins = require('./src/plugins'); - var events = require('./src/events'); - var plugin = nconf.get('activate'); - async.waterfall([ - function (next) { - db.init(next); - }, - function (next) { - if (plugin.indexOf('nodebb-') !== 0) { - // Allow omission of `nodebb-plugin-` - plugin = 'nodebb-plugin-' + plugin; - } - plugins.isInstalled(plugin, next); - }, - function (isInstalled, next) { - if (!isInstalled) { - return next(new Error('plugin not installed')); - } - - winston.info('Activating plugin `%s`', plugin); - db.sortedSetAdd('plugins:active', 0, plugin, next); - }, - function (next) { - events.log({ - type: 'plugin-activate', - text: plugin, - }, next); - }, - ], function (err) { - if (err) { - winston.error('An error occurred during plugin activation', err); - throw err; - } - process.exit(0); - }); -} - -function listPlugins() { - require('./src/database').init(function (err) { - if (err) { - winston.error(err.stack); - process.exit(1); - } - - var db = require('./src/database'); - - db.getSortedSetRange('plugins:active', 0, -1, function (err, plugins) { - if (err) { - winston.error(err.stack); - process.exit(1); - } - - winston.info('Active plugins: \n\t - ' + plugins.join('\n\t - ')); - process.exit(); - }); - }); -} - -function versionCheck() { - var version = process.version.slice(1); - var range = pkg.engines.node; - var semver = require('semver'); - var compatible = semver.satisfies(version, range); - - if (!compatible) { - winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.'); - winston.warn('Recommended ' + range.green + ', '.reset + version.yellow + ' provided\n'.reset); - } -} diff --git a/install/package.json b/install/package.json index fe0797d3f7..6d8b0b423f 100644 --- a/install/package.json +++ b/install/package.json @@ -27,6 +27,7 @@ "chart.js": "^2.7.0", "colors": "^1.1.2", "compression": "^1.7.1", + "commander": "^2.11.0", "connect-ensure-login": "^0.1.1", "connect-flash": "^0.1.1", "connect-mongo": "2.0.0", @@ -52,7 +53,6 @@ "logrotate-stream": "^0.2.5", "lru-cache": "4.1.1", "mime": "^2.0.3", - "minimist": "^1.2.0", "mkdirp": "^0.5.1", "mongodb": "2.2.33", "morgan": "^1.9.0", diff --git a/nodebb b/nodebb index adedd30826..546e608cd2 100755 --- a/nodebb +++ b/nodebb @@ -2,549 +2,4 @@ 'use strict'; -var fs = require('fs'); -var path = require('path'); -var cproc = require('child_process'); - -var packageInstall = require('./src/meta/package-install'); - -// check to make sure dependencies are installed -try { - fs.readFileSync(path.join(__dirname, './package.json')); - fs.readFileSync(path.join(__dirname, 'node_modules/async/package.json')); -} catch (e) { - if (e.code === 'ENOENT') { - process.stdout.write('Dependencies not yet installed.\n'); - process.stdout.write('Installing them now...\n\n'); - - packageInstall.updatePackageFile(); - packageInstall.preserveExtraneousPlugins(); - packageInstall.npmInstallProduction(); - } else { - throw e; - } -} - -var minimist; -var request; -var semver; -var prompt; -var async; - -try { - require('colors'); - minimist = require('minimist'); - request = require('request'); - semver = require('semver'); - prompt = require('prompt'); - async = require('async'); -} catch (e) { - process.stdout.write( - '\x1b[31mNodeBB could not be initialised because there was an error while loading dependencies.\n' + - 'Please run "\x1b[33mnpm install --production\x1b[31m" and try again.\x1b[0m\n\n' + - 'For more information, please see: https://docs.nodebb.org/installing/os/\n\n' - ); - - throw e; -} - -var args = minimist(process.argv.slice(2)); - -var loaderPath = path.join(__dirname, 'loader.js'); -var appPath = path.join(__dirname, 'app.js'); - -if (args.dev) { - process.env.NODE_ENV = 'development'; -} - -function getRunningPid(callback) { - fs.readFile(path.join(__dirname, 'pidfile'), { - encoding: 'utf-8', - }, function (err, pid) { - if (err) { - return callback(err); - } - - try { - process.kill(parseInt(pid, 10), 0); - callback(null, parseInt(pid, 10)); - } catch (e) { - callback(e); - } - }); -} -function getCurrentVersion(callback) { - fs.readFile(path.join(__dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) { - if (err) { - return callback(err); - } - - try { - pkg = JSON.parse(pkg); - return callback(null, pkg.version); - } catch (err) { - return callback(err); - } - }); -} -function fork(args) { - return cproc.fork(appPath, args, { - cwd: __dirname, - silent: false, - }); -} -function getInstalledPlugins(callback) { - async.parallel({ - files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')), - deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }), - }, function (err, payload) { - if (err) { - return callback(err); - } - - var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/; - var moduleName; - var isGitRepo; - - payload.files = payload.files.filter(function (file) { - return isNbbModule.test(file); - }); - - try { - payload.deps = JSON.parse(payload.deps).dependencies; - payload.bundled = []; - payload.installed = []; - } catch (err) { - return callback(err); - } - - for (moduleName in payload.deps) { - if (isNbbModule.test(moduleName)) { - payload.bundled.push(moduleName); - } - } - - // Whittle down deps to send back only extraneously installed plugins/themes/etc - payload.files.forEach(function (moduleName) { - try { - fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git')); - isGitRepo = true; - } catch (e) { - isGitRepo = false; - } - - if ( - payload.files.indexOf(moduleName) !== -1 && // found in `node_modules/` - payload.bundled.indexOf(moduleName) === -1 && // not found in `package.json` - !fs.lstatSync(path.join(__dirname, 'node_modules/' + moduleName)).isSymbolicLink() && // is not a symlink - !isGitRepo // .git/ does not exist, so it is not a git repository - ) { - payload.installed.push(moduleName); - } - }); - - getModuleVersions(payload.installed, callback); - }); -} -function getModuleVersions(modules, callback) { - var versionHash = {}; - - async.eachLimit(modules, 50, function (module, next) { - fs.readFile(path.join(__dirname, 'node_modules/' + module + '/package.json'), { encoding: 'utf-8' }, function (err, pkg) { - if (err) { - return next(err); - } - - try { - pkg = JSON.parse(pkg); - versionHash[module] = pkg.version; - next(); - } catch (err) { - next(err); - } - }); - }, function (err) { - callback(err, versionHash); - }); -} -function checkPlugins(standalone, callback) { - if (standalone) { - process.stdout.write('Checking installed plugins and themes for updates... '); - } - - async.waterfall([ - async.apply(async.parallel, { - plugins: async.apply(getInstalledPlugins), - version: async.apply(getCurrentVersion), - }), - function (payload, next) { - var toCheck = Object.keys(payload.plugins); - - if (!toCheck.length) { - process.stdout.write('OK'.green + '\n'.reset); - return next(null, []); // no extraneous plugins installed - } - - request({ - method: 'GET', - url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), - json: true, - }, function (err, res, body) { - if (err) { - process.stdout.write('error'.red + '\n'.reset); - return next(err); - } - process.stdout.write('OK'.green + '\n'.reset); - - if (!Array.isArray(body) && toCheck.length === 1) { - body = [body]; - } - - var current; - var suggested; - var upgradable = body.map(function (suggestObj) { - current = payload.plugins[suggestObj.package]; - suggested = suggestObj.version; - - if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { - return { - name: suggestObj.package, - current: current, - suggested: suggested, - }; - } - return null; - }).filter(Boolean); - - next(null, upgradable); - }); - }, - ], callback); -} -function upgradePlugins(callback) { - var standalone = false; - if (typeof callback !== 'function') { - callback = function () {}; - standalone = true; - } - - checkPlugins(standalone, function (err, found) { - if (err) { - process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); - return callback(err); - } - - if (found && found.length) { - process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n'); - found.forEach(function (suggestObj) { - process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); - }); - process.stdout.write('\n'); - } else { - if (standalone) { - process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset); - } - return callback(); - } - - prompt.message = ''; - prompt.delimiter = ''; - - prompt.start(); - prompt.get({ - name: 'upgrade', - description: 'Proceed with upgrade (y|n)?'.reset, - type: 'string', - }, function (err, result) { - if (err) { - return callback(err); - } - - if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) { - process.stdout.write('\nUpgrading packages...'); - var args = ['i']; - found.forEach(function (suggestObj) { - args.push(suggestObj.name + '@' + suggestObj.suggested); - }); - - cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, function (err) { - if (!err) { - process.stdout.write(' OK\n'.green); - } - - callback(err); - }); - } else { - process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset); - callback(); - } - }); - }); -} - -var commands = { - status: { - description: 'View the status of the NodeBB server', - usage: 'Usage: ' + './nodebb status'.yellow, - handler: function () { - getRunningPid(function (err, pid) { - if (!err) { - process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan); - process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n'); - process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); - } else { - process.stdout.write('\nNodeBB is not running\n'.bold); - process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset); - } - }); - }, - }, - start: { - description: 'Start the NodeBB server', - usage: 'Usage: ' + './nodebb start'.yellow, - handler: function () { - process.stdout.write('\nStarting NodeBB\n'.bold); - process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n'); - process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset); - - // Spawn a new NodeBB process - cproc.fork(loaderPath, process.argv.slice(3), { - env: process.env, - }); - }, - }, - stop: { - description: 'Stop the NodeBB server', - usage: 'Usage: ' + './nodebb stop'.yellow, - handler: function () { - getRunningPid(function (err, pid) { - if (!err) { - process.kill(pid, 'SIGTERM'); - process.stdout.write('Stopping NodeBB. Goodbye!\n'); - } else { - process.stdout.write('NodeBB is already stopped.\n'); - } - }); - }, - }, - restart: { - description: 'Restart the NodeBB server', - usage: 'Usage: ' + './nodebb restart'.yellow, - handler: function () { - getRunningPid(function (err, pid) { - if (!err) { - process.kill(pid, 'SIGHUP'); - process.stdout.write('\nRestarting NodeBB\n'.bold); - } else { - process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n'); - } - }); - }, - }, - log: { - description: 'Open the output log (useful for debugging)', - usage: 'Usage: ' + './nodebb log'.yellow, - handler: function () { - process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); - process.stdout.write('\n\n'.reset); - cproc.spawn('tail', ['-F', './logs/output.log'], { - cwd: __dirname, - stdio: 'inherit', - }); - }, - }, - slog: { - description: 'Start the NodeBB server and view the live output log', - usage: 'Usage: ' + './nodebb slog'.yellow, - handler: function () { - process.stdout.write('\nStarting NodeBB with logging output\n'.bold); - process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); - process.stdout.write('\n\n'.reset); - - // Spawn a new NodeBB process - cproc.fork(loaderPath, { - env: process.env, - }); - cproc.spawn('tail', ['-F', './logs/output.log'], { - cwd: __dirname, - stdio: 'inherit', - }); - }, - }, - dev: { - description: 'Start NodeBB in verbose development mode', - usage: 'Usage: ' + './nodebb dev'.yellow, - handler: function () { - process.env.NODE_ENV = 'development'; - cproc.fork(loaderPath, ['--no-daemon', '--no-silent'], { - env: process.env, - }); - }, - }, - build: { - description: 'Compile static assets (CSS, Javascript, etc)', - usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' + - ' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' + - ' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n', - handler: function () { - var arr = ['--build'].concat(process.argv.slice(3)); - fork(arr); - }, - }, - setup: { - description: 'Run the NodeBB setup script', - usage: 'Usage: ' + './nodebb setup'.yellow, - handler: function () { - var arr = ['--setup'].concat(process.argv.slice(3)); - fork(arr); - }, - }, - reset: { - description: 'Disable plugins and restore the default theme', - usage: 'Usage: ' + './nodebb reset '.yellow + '{-t|-p|-w|-s|-a}'.red + '\n' + - ' -t \tuse specified theme\n' + - ' -p \tdisable specified plugin\n' + - '\n' + - ' -t\t\tuse default theme\n' + - ' -p\t\tdisable all but core plugins\n' + - ' -w\t\twidgets\n' + - ' -s\t\tsettings\n' + - ' -a\t\tall of the above\n', - handler: function () { - var arr = ['--reset'].concat(process.argv.slice(3)); - fork(arr); - }, - }, - activate: { - description: 'Activate a plugin for the next startup of NodeBB', - usage: 'Usage: ' + './nodebb activate '.yellow, - handler: function () { - var name = args._[1]; - if (!name) { - process.stdout.write(commands.activate.usage + '\n'); - process.exit(); - } - if (name.startsWith('nodebb-theme')) { - fork(['--reset', '-t', name]); - return; - } - var arr = ['--activate=' + name].concat(process.argv.slice(4)); - fork(arr); - }, - }, - plugins: { - description: 'List all installed plugins', - usage: 'Usage: ' + './nodebb plugins'.yellow, - handler: function () { - var arr = ['--plugins'].concat(process.argv.slice(3)); - fork(arr); - }, - }, - upgrade: { - description: 'Run NodeBB upgrade scripts, ensure packages are up-to-date', - usage: 'Usage: ' + './nodebb upgrade'.yellow, - handler: function () { - if (process.argv[3]) { - process.stdout.write('\nUpdating NodeBB data store schema...\n'.yellow); - var arr = ['--upgrade'].concat(process.argv.slice(3)); - var upgradeProc = fork(arr); - - return upgradeProc.on('close', function (err) { - if (err) { - process.stdout.write('Error occurred during upgrade'); - throw err; - } - }); - } - - async.series([ - function (next) { - packageInstall.updatePackageFile(); - packageInstall.preserveExtraneousPlugins(); - next(); - }, - function (next) { - process.stdout.write('1. '.bold + 'Bringing base dependencies up to date... \n'.yellow); - packageInstall.npmInstallProduction(); - next(); - }, - function (next) { - process.stdout.write('OK\n'.green); - process.stdout.write('2. '.bold + 'Checking installed plugins for updates... '.yellow); - upgradePlugins(next); - }, - function (next) { - process.stdout.write('3. '.bold + 'Updating NodeBB data store schema...\n'.yellow); - var arr = ['--upgrade'].concat(process.argv.slice(3)); - var upgradeProc = fork(arr); - - upgradeProc.on('close', next); - upgradeProc.on('error', next); - }, - ], function (err) { - if (err) { - process.stdout.write('Error occurred during upgrade'); - throw err; - } - - var message = 'NodeBB Upgrade Complete!'; - // some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count - var columns = process.stdout.columns; - var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; - - process.stdout.write('OK\n'.green); - process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset); - }); - }, - }, - upgradePlugins: { - hidden: true, - description: '', - handler: function () { - upgradePlugins(); - }, - }, - events: { - description: 'Outputs the last ten (10) administrative events recorded by NodeBB', - usage: 'Usage: ' + './nodebb events'.yellow, - handler: function () { - fork(['--events']); - }, - }, - help: { - description: 'Display the help message for a given command', - usage: 'Usage: ' + './nodebb help '.yellow, - handler: function () { - var command = commands[args._[1]]; - if (command) { - process.stdout.write(command.description + '\n'.reset); - process.stdout.write(command.usage + '\n'.reset); - - return; - } - var keys = Object.keys(commands).filter(function (key) { - return !commands[key].hidden; - }); - - process.stdout.write('\nWelcome to NodeBB\n\n'.bold); - process.stdout.write('Usage: ./nodebb {' + keys.join('|') + '}\n\n'); - - var usage = keys.map(function (key) { - var line = '\t' + key.yellow + (key.length < 8 ? '\t\t' : '\t'); - return line + commands[key].description; - }).join('\n'); - - process.stdout.write(usage + '\n'.reset); - }, - }, -}; - -commands['upgrade-plugins'] = commands.upgradePlugins; - -if (!commands[args._[0]]) { - commands.help.handler(); -} else { - commands[args._[0]].handler(); -} +require('./src/cli'); diff --git a/nodebb.bat b/nodebb.bat index daaf09224f..ba0e75d249 100644 --- a/nodebb.bat +++ b/nodebb.bat @@ -1 +1 @@ -node ./nodebb %* +@echo off && cd %~dp0 && node ./src/cli %* diff --git a/src/cli/colors.js b/src/cli/colors.js new file mode 100644 index 0000000000..bb2648e1d5 --- /dev/null +++ b/src/cli/colors.js @@ -0,0 +1,127 @@ +'use strict'; + + +// override commander functions +// to include color styling in the output +// so the CLI looks nice + +var Command = require('commander').Command; + +var commandColor = 'yellow'; +var optionColor = 'cyan'; +var argColor = 'magenta'; +var subCommandColor = 'green'; +var subOptionColor = 'blue'; +var subArgColor = 'red'; + +Command.prototype.helpInformation = function () { + var desc = []; + if (this._description) { + desc = [ + ' ' + this._description, + '', + ]; + } + + var cmdName = this._name; + if (this._alias) { + cmdName = cmdName + ' | ' + this._alias; + } + var usage = [ + '', + ' Usage: ' + cmdName[commandColor] + ' '.reset + this.usage(), + '', + ]; + + var cmds = []; + var commandHelp = this.commandHelp(); + if (commandHelp) { + cmds = [commandHelp]; + } + + var options = [ + '', + ' Options:', + '', + '' + this.optionHelp().replace(/^/gm, ' '), + '', + ]; + + return usage + .concat(desc) + .concat(options) + .concat(cmds) + .join('\n'.reset); +}; + +function humanReadableArgName(arg) { + var nameOutput = arg.name + (arg.variadic === true ? '...' : ''); + + return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']'; +} + +Command.prototype.usage = function () { + var args = this._args.map(function (arg) { + return humanReadableArgName(arg); + }); + + var usage = '[options]'[optionColor] + + (this.commands.length ? ' [command]' : '')[subCommandColor] + + (this._args.length ? ' ' + args.join(' ') : '')[argColor]; + + return usage; +}; + +function pad(str, width) { + var len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +Command.prototype.commandHelp = function () { + if (!this.commands.length) { + return ''; + } + + var commands = this.commands.filter(function (cmd) { + return !cmd._noHelp; + }).map(function (cmd) { + var args = cmd._args.map(function (arg) { + return humanReadableArgName(arg); + }).join(' '); + + return [ + cmd._name[subCommandColor] + + (cmd._alias ? ' | ' + cmd._alias : '')[subCommandColor] + + (cmd.options.length ? ' [options]' : '')[subOptionColor] + + ' ' + args[subArgColor], + cmd._description, + ]; + }); + + var width = commands.reduce(function (max, command) { + return Math.max(max, command[0].length); + }, 0); + + return [ + '', + ' Commands:', + '', + commands.map(function (cmd) { + var desc = cmd[1] ? ' ' + cmd[1] : ''; + return pad(cmd[0], width) + desc; + }).join('\n').replace(/^/gm, ' '), + '', + ].join('\n'); +}; + +Command.prototype.optionHelp = function () { + var width = this.largestOptionLength(); + + // Append the help information + return this.options + .map(function (option) { + return pad(option.flags, width)[optionColor] + ' ' + option.description; + }) + .concat([pad('-h, --help', width)[optionColor] + ' output usage information']) + .join('\n'); +}; diff --git a/src/cli/index.js b/src/cli/index.js new file mode 100644 index 0000000000..5a1ed820e0 --- /dev/null +++ b/src/cli/index.js @@ -0,0 +1,265 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +var packageInstall = require('../meta/package-install'); +var dirname = require('./paths').baseDir; + +// check to make sure dependencies are installed +try { + fs.readFileSync(path.join(dirname, 'package.json')); + fs.readFileSync(path.join(dirname, 'node_modules/async/package.json')); +} catch (e) { + if (e.code === 'ENOENT') { + process.stdout.write('Dependencies not yet installed.\n'); + process.stdout.write('Installing them now...\n\n'); + + packageInstall.updatePackageFile(); + packageInstall.preserveExtraneousPlugins(); + packageInstall.npmInstallProduction(); + + require('colors'); + process.stdout.write('OK'.green + '\n'.reset); + } else { + throw e; + } +} + +require('colors'); +var nconf = require('nconf'); +var program = require('commander'); + +var pkg = require('../../package.json'); +var file = require('../file'); +var prestart = require('../prestart'); + +program + .name('./nodebb') + .description('Welcome to NodeBB') + .version(pkg.version) + .option('--json-logging', 'Output to logs in JSON format', false) + .option('--log-level ', 'Default logging level to use', 'info') + .option('-d, --dev', 'Development mode, including verbose logging', false) + .option('-l, --log', 'Log subprocess output to console', false) + .option('-c, --config ', 'Specify a config file', 'config.json') + .parse(process.argv); + +nconf.argv().env({ + separator: '__', +}); + +var env = program.dev ? 'development' : (process.env.NODE_ENV || 'production'); +process.env.NODE_ENV = env; +global.env = env; + +prestart.setupWinston(); + +// Alternate configuration file support +var configFile = path.resolve(dirname, program.config); +var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get('secret') && nconf.get('database')); + +prestart.loadConfig(configFile); +prestart.versionCheck(); + +if (!configExists && process.argv[2] !== 'setup') { + require('./setup').webInstall(); + return; +} + +// running commands +program + .command('start') + .description('Start the NodeBB server') + .action(function () { + require('./running').start(program); + }); +program + .command('slog', null, { + noHelp: true, + }) + .description('Start the NodeBB server and view the live output log') + .action(function () { + program.log = true; + require('./running').start(program); + }); +program + .command('dev', null, { + noHelp: true, + }) + .description('Start NodeBB in verbose development mode') + .action(function () { + program.dev = true; + process.env.NODE_ENV = 'development'; + global.env = 'development'; + require('./running').start(program); + }); +program + .command('stop') + .description('Stop the NodeBB server') + .action(function () { + require('./running').stop(program); + }); +program + .command('restart') + .description('Restart the NodeBB server') + .action(function () { + require('./running').restart(program); + }); +program + .command('status') + .description('Check the running status of the NodeBB server') + .action(function () { + require('./running').status(program); + }); +program + .command('log') + .description('Open the output log (useful for debugging)') + .action(function () { + require('./running').log(program); + }); + +// management commands +program + .command('setup') + .description('Run the NodeBB setup script') + .action(function () { + require('./setup').setup(); + }); + +program + .command('install') + .description('Launch the NodeBB web installer for configuration setup') + .action(function () { + require('./setup').webInstall(); + }); +program + .command('build [targets...]') + .description('Compile static assets ' + '(JS, CSS, templates, languages, sounds)'.red) + .action(function (targets) { + require('./manage').build(targets.length ? targets : true); + }) + .on('--help', function () { + require('./manage').buildTargets(); + }); +program + .command('activate [plugin]') + .description('Activate a plugin for the next startup of NodeBB (nodebb-plugin- prefix is optional)') + .action(function (plugin) { + require('./manage').activate(plugin); + }); +program + .command('plugins') + .action(function () { + require('./manage').listPlugins(); + }) + .description('List all installed plugins'); +program + .command('events') + .description('Outputs the last ten (10) administrative events recorded by NodeBB') + .action(function () { + require('./manage').listEvents(); + }); +program + .command('info') + .description('Outputs various system info') + .action(function () { + require('./manage').info(); + }); + +// reset +var resetCommand = program.command('reset'); + +resetCommand + .description('Reset plugins, themes, settings, etc') + .option('-t, --theme [theme]', 'Reset to [theme] or to the default theme') + .option('-p, --plugin [plugin]', 'Disable [plugin] or all plugins') + .option('-w, --widgets', 'Disable all widgets') + .option('-s, --settings', 'Reset settings to their default values') + .option('-a, --all', 'All of the above') + .action(function (options) { + var valid = ['theme', 'plugin', 'widgets', 'settings', 'all'].some(function (x) { + return options[x]; + }); + if (!valid) { + process.stdout.write('\n No valid options passed in, so nothing was reset.\n'.red); + resetCommand.help(); + } + + require('./reset').reset(options, function (err) { + if (err) { throw err; } + require('../meta/build').buildAll(function (err) { + if (err) { throw err; } + + process.exit(); + }); + }); + }); + +// upgrades +program + .command('upgrade [scripts...]') + .description('Run NodeBB upgrade scripts and ensure packages are up-to-date, or run a particular upgrade script') + .option('-m, --package', 'Update package.json from defaults', false) + .option('-i, --install', 'Bringing base dependencies up to date', false) + .option('-p, --plugins', 'Check installed plugins for updates', false) + .option('-s, --schema', 'Update NodeBB data store schema', false) + .option('-b, --build', 'Rebuild assets', false) + .on('--help', function () { + process.stdout.write( + '\n' + + 'When running particular upgrade scripts, options are ignored.\n' + + 'By default all options are enabled. Passing any options disables that default.\n' + + 'Only package and dependency updates: ' + './nodebb upgrade -mi\n'.yellow + + 'Only database update: ' + './nodebb upgrade -d\n\n'.yellow + ); + }) + .action(function (scripts, options) { + require('./upgrade').upgrade(scripts.length ? scripts : true, options); + }); + +program + .command('upgrade-plugins', null, { + noHelp: true, + }) + .alias('upgradePlugins') + .description('Upgrade plugins') + .action(function () { + require('./upgrade-plugins').upgradePlugins(function (err) { + if (err) { + throw err; + } + process.stdout.write('OK\n'.green); + process.exit(); + }); + }); + +program + .command('help [command]') + .description('Display help for [command]') + .action(function (name) { + if (!name) { + return program.help(); + } + + var command = program.commands.find(function (command) { return command._name === name; }); + if (command) { + command.help(); + } else { + program.help(); + } + }); + +program + .command('*', {}, { + noHelp: true, + }) + .action(function () { + program.help(); + }); + +require('./colors'); + +program.executables = false; + +program.parse(process.argv); diff --git a/src/cli/manage.js b/src/cli/manage.js new file mode 100644 index 0000000000..393c3f0753 --- /dev/null +++ b/src/cli/manage.js @@ -0,0 +1,143 @@ +'use strict'; + +var async = require('async'); +var winston = require('winston'); +var childProcess = require('child_process'); +var _ = require('lodash'); + +var build = require('../meta/build'); +var db = require('../database'); +var plugins = require('../plugins'); +var events = require('../events'); +var reset = require('./reset'); + +function buildTargets() { + var aliases = build.aliases; + var length = 0; + var output = Object.keys(aliases).map(function (name) { + var arr = aliases[name]; + if (name.length > length) { + length = name.length; + } + + return [name, arr.join(', ')]; + }).map(function (tuple) { + return ' ' + _.padEnd('"' + tuple[0] + '"', length + 2).magenta + ' | ' + tuple[1]; + }).join('\n'); + process.stdout.write( + '\n\n Build targets:\n' + + ('\n ' + _.padEnd('Target', length + 2) + ' | Aliases').green + + '\n ------------------------------------------------------\n'.blue + + output + '\n\n' + ); +} + +function activate(plugin) { + if (plugin.startsWith('nodebb-theme-')) { + reset.reset({ + theme: plugin, + }, function (err) { + if (err) { throw err; } + process.exit(); + }); + return; + } + + async.waterfall([ + function (next) { + db.init(next); + }, + function (next) { + if (!plugin.startsWith('nodebb-')) { + // Allow omission of `nodebb-plugin-` + plugin = 'nodebb-plugin-' + plugin; + } + plugins.isInstalled(plugin, next); + }, + function (isInstalled, next) { + if (!isInstalled) { + return next(new Error('plugin not installed')); + } + + winston.info('Activating plugin `%s`', plugin); + db.sortedSetAdd('plugins:active', 0, plugin, next); + }, + function (next) { + events.log({ + type: 'plugin-activate', + text: plugin, + }, next); + }, + ], function (err) { + if (err) { + winston.error('An error occurred during plugin activation', err); + throw err; + } + process.exit(0); + }); +} + +function listPlugins() { + async.waterfall([ + db.init, + function (next) { + db.getSortedSetRange('plugins:active', 0, -1, next); + }, + function (plugins) { + winston.info('Active plugins: \n\t - ' + plugins.join('\n\t - ')); + process.exit(); + }, + ], function (err) { + throw err; + }); +} + +function listEvents() { + async.series([ + db.init, + events.output, + ]); +} + +function info() { + async.waterfall([ + function (next) { + var version = require('../../package.json').version; + process.stdout.write('\n version: ' + version); + + process.stdout.write('\n Node ver: ' + process.version); + next(); + }, + function (next) { + process.stdout.write('\n git hash: '); + childProcess.execSync('git rev-parse HEAD', { + stdio: 'inherit', + }); + next(); + }, + function (next) { + var config = require('../../config.json'); + process.stdout.write('\n database: ' + config.database); + next(); + }, + db.init, + function (next) { + db.info(db.client, next); + }, + function (info, next) { + process.stdout.write('\n version: ' + info.version); + process.stdout.write('\n engine: ' + info.storageEngine); + next(); + }, + ], function (err) { + if (err) { throw err; } + process.exit(); + }); +} + +exports.build = build.build; +exports.buildTargets = buildTargets; +exports.activate = activate; +exports.listPlugins = listPlugins; +exports.listEvents = listEvents; +exports.info = info; diff --git a/src/cli/paths.js b/src/cli/paths.js new file mode 100644 index 0000000000..df5532cacd --- /dev/null +++ b/src/cli/paths.js @@ -0,0 +1,15 @@ +'use strict'; + +var path = require('path'); + +var baseDir = path.join(__dirname, '../../'); +var loader = path.join(baseDir, 'loader.js'); +var app = path.join(baseDir, 'app.js'); +var pidfile = path.join(baseDir, 'pidfile'); + +module.exports = { + baseDir: baseDir, + loader: loader, + app: app, + pidfile: pidfile, +}; diff --git a/src/reset.js b/src/cli/reset.js similarity index 53% rename from src/reset.js rename to src/cli/reset.js index d45c48deb5..85831d366d 100644 --- a/src/reset.js +++ b/src/cli/reset.js @@ -3,79 +3,85 @@ require('colors'); var path = require('path'); var winston = require('winston'); -var nconf = require('nconf'); var async = require('async'); -var db = require('./database'); -var events = require('./events'); +var fs = require('fs'); -var Reset = {}; +var db = require('../database'); +var events = require('../events'); +var meta = require('../meta'); +var plugins = require('../plugins'); +var widgets = require('../widgets'); -Reset.reset = function (callback) { - db.init(function (err) { - if (err) { - winston.error(err); - throw err; - } +var dirname = require('./paths').baseDir; - if (nconf.get('t')) { - var themeId = nconf.get('t'); +exports.reset = function (options, callback) { + var map = { + theme: function (next) { + var themeId = options.theme; if (themeId === true) { - resetThemes(callback); + resetThemes(next); } else { - if (themeId.indexOf('nodebb-') !== 0) { + if (!themeId.startsWith('nodebb-theme-')) { // Allow omission of `nodebb-theme-` themeId = 'nodebb-theme-' + themeId; } - resetTheme(themeId, callback); + resetTheme(themeId, next); } - } else if (nconf.get('p')) { - var pluginId = nconf.get('p'); + }, + plugin: function (next) { + var pluginId = options.plugin; if (pluginId === true) { - resetPlugins(callback); + resetPlugins(next); } else { - if (pluginId.indexOf('nodebb-') !== 0) { + if (!pluginId.startsWith('nodebb-plugin-')) { // Allow omission of `nodebb-plugin-` pluginId = 'nodebb-plugin-' + pluginId; } - resetPlugin(pluginId, callback); + resetPlugin(pluginId, next); } - } else if (nconf.get('w')) { - resetWidgets(callback); - } else if (nconf.get('s')) { - resetSettings(callback); - } else if (nconf.get('a')) { - require('async').series([resetWidgets, resetThemes, resetPlugins, resetSettings], function (err) { - if (!err) { - winston.info('[reset] Reset complete.'); - } else { - winston.error('[reset] Errors were encountered while resetting your forum settings: %s', err); - } + }, + widgets: resetWidgets, + settings: resetSettings, + all: function (next) { + async.series([resetWidgets, resetThemes, resetPlugins, resetSettings], next); + }, + }; - callback(); - }); - } else { - process.stdout.write('\nNodeBB Reset\n'.bold); - process.stdout.write('No arguments passed in, so nothing was reset.\n\n'.yellow); - process.stdout.write('Use ./nodebb reset ' + '{-t|-p|-w|-s|-a}\n'.red); - process.stdout.write(' -t\tthemes\n'); - process.stdout.write(' -p\tplugins\n'); - process.stdout.write(' -w\twidgets\n'); - process.stdout.write(' -s\tsettings\n'); - process.stdout.write(' -a\tall of the above\n'); + var tasks = Object.keys(map) + .filter(function (x) { return options[x]; }) + .map(function (x) { return map[x]; }); - process.stdout.write('\nPlugin and theme reset flags (-p & -t) can take a single argument\n'); - process.stdout.write(' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona\n'); - process.stdout.write(' Prefix is optional, e.g. ./nodebb reset -p markdown, ./nodebb reset -t persona\n'); + if (!tasks.length) { + process.stdout.write('\nNodeBB Reset\n'.bold); + process.stdout.write('No arguments passed in, so nothing was reset.\n\n'.yellow); + process.stdout.write('Use ./nodebb reset ' + '{-t|-p|-w|-s|-a}\n'.red); + process.stdout.write(' -t\tthemes\n'); + process.stdout.write(' -p\tplugins\n'); + process.stdout.write(' -w\twidgets\n'); + process.stdout.write(' -s\tsettings\n'); + process.stdout.write(' -a\tall of the above\n'); - process.exit(0); + process.stdout.write('\nPlugin and theme reset flags (-p & -t) can take a single argument\n'); + process.stdout.write(' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona\n'); + process.stdout.write(' Prefix is optional, e.g. ./nodebb reset -p markdown, ./nodebb reset -t persona\n'); + + process.exit(0); + } + + async.series([db.init].concat(tasks), function (err) { + if (err) { + winston.error('[reset] Errors were encountered during reset', err); + throw err; } + + winston.info('[reset] Reset complete'); + callback(); }); }; function resetSettings(callback) { - var meta = require('./meta'); meta.configs.set('allowLocalLogin', 1, function (err) { winston.info('[reset] Settings reset to default'); callback(err); @@ -83,10 +89,7 @@ function resetSettings(callback) { } function resetTheme(themeId, callback) { - var meta = require('./meta'); - var fs = require('fs'); - - fs.access(path.join(__dirname, '../node_modules', themeId, 'package.json'), function (err) { + fs.access(path.join(dirname, 'node_modules', themeId, 'package.json'), function (err) { if (err) { winston.warn('[reset] Theme `%s` is not installed on this forum', themeId); callback(new Error('theme-not-found')); @@ -108,8 +111,6 @@ function resetTheme(themeId, callback) { } function resetThemes(callback) { - var meta = require('./meta'); - meta.themes.set({ type: 'local', id: 'nodebb-theme-persona', @@ -163,13 +164,11 @@ function resetPlugins(callback) { function resetWidgets(callback) { async.waterfall([ - require('./plugins').reload, - require('./widgets').reset, + plugins.reload, + widgets.reset, function (next) { winston.info('[reset] All Widgets moved to Draft Zone'); next(); }, ], callback); } - -module.exports = Reset; diff --git a/src/cli/running.js b/src/cli/running.js new file mode 100644 index 0000000000..edd9627ee8 --- /dev/null +++ b/src/cli/running.js @@ -0,0 +1,119 @@ +'use strict'; + +var fs = require('fs'); +var childProcess = require('child_process'); + +var fork = require('../meta/debugFork'); +var paths = require('./paths'); + +var dirname = paths.baseDir; + +function getRunningPid(callback) { + fs.readFile(paths.pidfile, { + encoding: 'utf-8', + }, function (err, pid) { + if (err) { + return callback(err); + } + + pid = parseInt(pid, 10); + + try { + process.kill(pid, 0); + callback(null, pid); + } catch (e) { + callback(e); + } + }); +} + +function start(options) { + if (options.dev) { + process.env.NODE_ENV = 'development'; + fork(paths.loader, ['--no-daemon', '--no-silent'], { + env: process.env, + cwd: dirname, + stdio: 'inherit', + }); + return; + } + if (options.log) { + process.stdout.write('\nStarting NodeBB with logging output\n'.bold); + process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); + + process.stdout.write('\nThe NodeBB process will continue to run in the background'); + process.stdout.write('\nUse "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write('\n\n'.reset); + } else if (!options.silent) { + process.stdout.write('\nStarting NodeBB\n'.bold); + process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n'); + process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset); + } + + // Spawn a new NodeBB process + fork(paths.loader, process.argv.slice(3), { + env: process.env, + cwd: dirname, + }); + if (options.log) { + childProcess.spawn('tail', ['-F', './logs/output.log'], { + cwd: dirname, + stdio: 'inherit', + }); + } +} + +function stop() { + getRunningPid(function (err, pid) { + if (!err) { + process.kill(pid, 'SIGTERM'); + process.stdout.write('Stopping NodeBB. Goodbye!\n'); + } else { + process.stdout.write('NodeBB is already stopped.\n'); + } + }); +} + +function restart(options) { + getRunningPid(function (err, pid) { + if (!err) { + process.stdout.write('\nRestarting NodeBB\n'.bold); + process.kill(pid, 'SIGTERM'); + + options.silent = true; + start(options); + } else { + process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n'); + } + }); +} + +function status() { + getRunningPid(function (err, pid) { + if (!err) { + process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan); + process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n'); + process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); + } else { + process.stdout.write('\nNodeBB is not running\n'.bold); + process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset); + } + }); +} + +function log() { + process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); + process.stdout.write('\n\n'.reset); + childProcess.spawn('tail', ['-F', './logs/output.log'], { + cwd: dirname, + stdio: 'inherit', + }); +} + +exports.start = start; +exports.stop = stop; +exports.restart = restart; +exports.status = status; +exports.log = log; diff --git a/src/cli/setup.js b/src/cli/setup.js new file mode 100644 index 0000000000..f10e7def9b --- /dev/null +++ b/src/cli/setup.js @@ -0,0 +1,59 @@ +'use strict'; + +var winston = require('winston'); +var async = require('async'); + +var install = require('../../install/web').install; + +function setup() { + var install = require('../install'); + var build = require('../meta/build'); + var prestart = require('../prestart'); + + winston.info('NodeBB Setup Triggered via Command Line'); + + 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'); + + async.series([ + install.setup, + prestart.loadConfig, + build.buildAll, + ], function (err, data) { + // Disregard build step data + data = data[0]; + + var separator = ' '; + if (process.stdout.columns > 10) { + for (var x = 0, cols = process.stdout.columns - 10; x < cols; x += 1) { + separator += '='; + } + } + process.stdout.write('\n' + separator + '\n\n'); + + if (err) { + winston.error('There was a problem completing NodeBB setup', err); + throw err; + } else { + if (data.hasOwnProperty('password')) { + process.stdout.write('An administrative user was automatically created for you:\n'); + process.stdout.write(' Username: ' + data.username + '\n'); + process.stdout.write(' Password: ' + data.password + '\n'); + process.stdout.write('\n'); + } + process.stdout.write('NodeBB Setup Completed. Run \'./nodebb start\' to manually start your NodeBB server.\n'); + + // If I am a child process, notify the parent of the returned data before exiting (useful for notifying + // hosts of auto-generated username/password during headless setups) + if (process.send) { + process.send(data); + } + } + + process.exit(); + }); +} + +exports.setup = setup; +exports.webInstall = install; diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js new file mode 100644 index 0000000000..db04d5cc35 --- /dev/null +++ b/src/cli/upgrade-plugins.js @@ -0,0 +1,216 @@ +'use strict'; + +var async = require('async'); +var prompt = require('prompt'); +var request = require('request'); +var cproc = require('child_process'); +var semver = require('semver'); +var fs = require('fs'); +var path = require('path'); + +var paths = require('./paths'); + +var dirname = paths.baseDir; + +function getModuleVersions(modules, callback) { + var versionHash = {}; + + async.eachLimit(modules, 50, function (module, next) { + fs.readFile(path.join(dirname, 'node_modules', module, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) { + if (err) { + return next(err); + } + + try { + pkg = JSON.parse(pkg); + versionHash[module] = pkg.version; + next(); + } catch (err) { + next(err); + } + }); + }, function (err) { + callback(err, versionHash); + }); +} + +function getInstalledPlugins(callback) { + async.parallel({ + files: async.apply(fs.readdir, path.join(dirname, 'node_modules')), + deps: async.apply(fs.readFile, path.join(dirname, 'package.json'), { encoding: 'utf-8' }), + }, function (err, payload) { + if (err) { + return callback(err); + } + + var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/; + var moduleName; + var isGitRepo; + + payload.files = payload.files.filter(function (file) { + return isNbbModule.test(file); + }); + + try { + payload.deps = JSON.parse(payload.deps).dependencies; + payload.bundled = []; + payload.installed = []; + } catch (err) { + return callback(err); + } + + for (moduleName in payload.deps) { + if (isNbbModule.test(moduleName)) { + payload.bundled.push(moduleName); + } + } + + // Whittle down deps to send back only extraneously installed plugins/themes/etc + payload.files.forEach(function (moduleName) { + try { + fs.accessSync(path.join(dirname, 'node_modules', moduleName, '.git')); + isGitRepo = true; + } catch (e) { + isGitRepo = false; + } + + if ( + payload.files.indexOf(moduleName) !== -1 && // found in `node_modules/` + payload.bundled.indexOf(moduleName) === -1 && // not found in `package.json` + !fs.lstatSync(path.join(dirname, 'node_modules', moduleName)).isSymbolicLink() && // is not a symlink + !isGitRepo // .git/ does not exist, so it is not a git repository + ) { + payload.installed.push(moduleName); + } + }); + + getModuleVersions(payload.installed, callback); + }); +} + +function getCurrentVersion(callback) { + fs.readFile(path.join(dirname, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) { + if (err) { + return callback(err); + } + + try { + pkg = JSON.parse(pkg); + } catch (err) { + return callback(err); + } + callback(null, pkg.version); + }); +} + +function checkPlugins(standalone, callback) { + if (standalone) { + process.stdout.write('Checking installed plugins and themes for updates... '); + } + + async.waterfall([ + async.apply(async.parallel, { + plugins: async.apply(getInstalledPlugins), + version: async.apply(getCurrentVersion), + }), + function (payload, next) { + var toCheck = Object.keys(payload.plugins); + + if (!toCheck.length) { + process.stdout.write('OK'.green + '\n'.reset); + return next(null, []); // no extraneous plugins installed + } + + request({ + method: 'GET', + url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), + json: true, + }, function (err, res, body) { + if (err) { + process.stdout.write('error'.red + '\n'.reset); + return next(err); + } + process.stdout.write('OK'.green + '\n'.reset); + + if (!Array.isArray(body) && toCheck.length === 1) { + body = [body]; + } + + var current; + var suggested; + var upgradable = body.map(function (suggestObj) { + current = payload.plugins[suggestObj.package]; + suggested = suggestObj.version; + + if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { + return { + name: suggestObj.package, + current: current, + suggested: suggested, + }; + } + return null; + }).filter(Boolean); + + next(null, upgradable); + }); + }, + ], callback); +} + +function upgradePlugins(callback) { + var standalone = false; + if (typeof callback !== 'function') { + callback = function () {}; + standalone = true; + } + + checkPlugins(standalone, function (err, found) { + if (err) { + process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); + return callback(err); + } + + if (found && found.length) { + process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n'); + found.forEach(function (suggestObj) { + process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); + }); + process.stdout.write('\n'); + } else { + if (standalone) { + process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset); + } + return callback(); + } + + prompt.message = ''; + prompt.delimiter = ''; + + prompt.start(); + prompt.get({ + name: 'upgrade', + description: 'Proceed with upgrade (y|n)?'.reset, + type: 'string', + }, function (err, result) { + if (err) { + return callback(err); + } + + if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) { + process.stdout.write('\nUpgrading packages...'); + var args = ['i']; + found.forEach(function (suggestObj) { + args.push(suggestObj.name + '@' + suggestObj.suggested); + }); + + cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, callback); + } else { + process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset); + callback(); + } + }); + }); +} + +exports.upgradePlugins = upgradePlugins; diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js new file mode 100644 index 0000000000..b2255707f4 --- /dev/null +++ b/src/cli/upgrade.js @@ -0,0 +1,117 @@ +'use strict'; + +var async = require('async'); +var nconf = require('nconf'); + +var packageInstall = require('../meta/package-install'); +var upgrade = require('../upgrade'); +var build = require('../meta/build'); +var db = require('../database'); +var meta = require('../meta'); +var upgradePlugins = require('./upgrade-plugins').upgradePlugins; + +var steps = { + package: function (next) { + process.stdout.write('Updating package.json file with defaults... \n'.yellow); + packageInstall.updatePackageFile(); + packageInstall.preserveExtraneousPlugins(); + process.stdout.write('OK\n'.green); + next(); + }, + install: function (next) { + process.stdout.write('Bringing base dependencies up to date... \n'.yellow); + packageInstall.npmInstallProduction(); + process.stdout.write('OK\n'.green); + next(); + }, + plugins: function (next) { + process.stdout.write('Checking installed plugins for updates... \n'.yellow); + async.series([ + db.init, + upgradePlugins, + function (next) { + process.stdout.write('OK\n'.green); + next(); + }, + ], next); + }, + schema: function (next) { + process.stdout.write('Updating NodeBB data store schema...\n'.yellow); + async.series([ + db.init, + upgrade.run, + function (next) { + process.stdout.write('OK\n'.green); + next(); + }, + ], next); + }, + build: function (next) { + process.stdout.write('Rebuilding assets...\n'.yellow); + async.series([ + build.buildAll, + function (next) { + process.stdout.write('OK\n'.green); + next(); + }, + ], next); + }, +}; + +function runSteps(tasks) { + tasks = tasks.map(function (key, i) { + return function (next) { + process.stdout.write(((i + 1) + '. ').bold); + return steps[key](next); + }; + }); + + async.series(tasks, function (err) { + if (err) { + process.stdout.write('Error occurred during upgrade'); + throw err; + } + + var message = 'NodeBB Upgrade Complete!'; + // some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count + var columns = process.stdout.columns; + var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; + + process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset); + + process.exit(); + }); +} + +function runUpgrade(upgrades, options) { + process.stdout.write('\nUpdating NodeBB...\n'.cyan); + + // disable mongo timeouts during upgrade + nconf.set('mongo:options:socketTimeoutMS', 0); + + if (upgrades === true) { + var tasks = Object.keys(steps); + if (options.package || options.install || + options.plugins || options.schema || options.build) { + tasks = tasks.filter(function (key) { + return options[key]; + }); + } + runSteps(tasks); + return; + } + + async.series([ + db.init, + meta.configs.init, + async.apply(upgrade.runParticular, upgrades), + ], function (err) { + if (err) { + throw err; + } + + process.exit(0); + }); +} + +exports.upgrade = runUpgrade; diff --git a/src/meta/build.js b/src/meta/build.js index b01a92cb86..df68e93375 100644 --- a/src/meta/build.js +++ b/src/meta/build.js @@ -83,6 +83,8 @@ var aliases = { sounds: ['sound'], }; +exports.aliases = aliases; + aliases = Object.keys(aliases).reduce(function (prev, key) { var arr = aliases[key]; arr.forEach(function (alias) { diff --git a/src/prestart.js b/src/prestart.js new file mode 100644 index 0000000000..9b592cf4af --- /dev/null +++ b/src/prestart.js @@ -0,0 +1,84 @@ +'use strict'; + +var nconf = require('nconf'); +var url = require('url'); +var winston = require('winston'); +var path = require('path'); + +var pkg = require('../package.json'); +var dirname = require('./cli/paths').baseDir; + +function setupWinston() { + winston.remove(winston.transports.Console); + winston.add(winston.transports.Console, { + colorize: true, + timestamp: function () { + var date = new Date(); + return nconf.get('json-logging') ? date.toJSON() : + date.getDate() + '/' + (date.getMonth() + 1) + ' ' + + date.toTimeString().substr(0, 8) + ' [' + global.process.pid + ']'; + }, + level: nconf.get('log-level') || (global.env === 'production' ? 'info' : 'verbose'), + json: !!nconf.get('json-logging'), + stringify: !!nconf.get('json-logging'), + }); +} + +function loadConfig(configFile) { + winston.verbose('* using configuration stored in: %s', configFile); + + nconf.file({ + file: configFile, + }); + + nconf.defaults({ + base_dir: dirname, + themes_path: path.join(dirname, 'node_modules'), + upload_path: 'public/uploads', + views_dir: path.join(dirname, 'build/public/templates'), + version: pkg.version, + }); + + if (!nconf.get('isCluster')) { + nconf.set('isPrimary', 'true'); + nconf.set('isCluster', 'false'); + } + + // Ensure themes_path is a full filepath + nconf.set('themes_path', path.resolve(dirname, nconf.get('themes_path'))); + nconf.set('core_templates_path', path.join(dirname, 'src/views')); + nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates')); + + nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path'))); + + if (nconf.get('url')) { + nconf.set('url_parsed', url.parse(nconf.get('url'))); + } + + // Explicitly cast 'jobsDisabled' as Bool + var castAsBool = ['jobsDisabled']; + nconf.stores.env.readOnly = false; + castAsBool.forEach(function (prop) { + var value = nconf.get(prop); + if (value) { + nconf.set(prop, typeof value === 'boolean' ? value : String(value).toLowerCase() === 'true'); + } + }); + nconf.stores.env.readOnly = true; +} + +function versionCheck() { + var version = process.version.slice(1); + var range = pkg.engines.node; + var semver = require('semver'); + var compatible = semver.satisfies(version, range); + + if (!compatible) { + winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.'); + winston.warn('Recommended ' + range.green + ', '.reset + version.yellow + ' provided\n'.reset); + } +} + +exports.setupWinston = setupWinston; +exports.loadConfig = loadConfig; +exports.versionCheck = versionCheck; diff --git a/src/upgrade.js b/src/upgrade.js index 7229c87227..5c9cd6ea2d 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -18,7 +18,7 @@ var file = require('../src/file'); * 3. Add your script under the "method" property */ -var Upgrade = {}; +var Upgrade = module.exports; Upgrade.getAll = function (callback) { async.waterfall([ @@ -212,4 +212,3 @@ Upgrade.incrementProgress = function (value) { process.stdout.write(' [' + (filled ? new Array(filled).join('#') : '') + new Array(unfilled).join(' ') + '] (' + this.current + '/' + (this.total || '??') + ') ' + percentage + ' '); }; -module.exports = Upgrade; From f1d79635ffe72a1145ec4a0467db82c79a8aa12d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 23 Nov 2017 13:57:25 -0500 Subject: [PATCH 48/81] bump slick for v1.7.0 compatibility --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 6d8b0b423f..a89aeb20a6 100644 --- a/install/package.json +++ b/install/package.json @@ -69,7 +69,7 @@ "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", "nodebb-theme-persona": "7.1.3", - "nodebb-theme-slick": "1.1.1", + "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", "nodemailer": "4.3.0", From 71895f37367383f67a5367189b42f4e43f1e532f 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 Nov 2017 14:19:22 -0500 Subject: [PATCH 49/81] closes #6079 --- src/socket.io/posts/tools.js | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index 7f80ce9805..a9bbc6137b 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -75,7 +75,7 @@ module.exports = function (SocketPosts) { }, function (results, next) { if (results.isMain && results.isLast) { - deleteTopicOf(data.pid, socket, next); + deleteOrRestoreTopicOf('delete', data.pid, socket, next); } else { next(); } @@ -99,12 +99,23 @@ module.exports = function (SocketPosts) { if (!data || !data.pid) { return callback(new Error('[[error:invalid-data]]')); } - + var postData; async.waterfall([ function (next) { posts.tools.restore(socket.uid, data.pid, next); }, - function (postData, next) { + function (_postData, next) { + postData = _postData; + isMainAndLastPost(data.pid, next); + }, + function (results, next) { + if (results.isMain && results.isLast) { + deleteOrRestoreTopicOf('restore', data.pid, socket, next); + } else { + setImmediate(next); + } + }, + function (next) { websockets.in('topic_' + data.tid).emit('event:post_restored', postData); events.log({ @@ -185,13 +196,19 @@ module.exports = function (SocketPosts) { ], callback); }; - function deleteTopicOf(pid, socket, callback) { + function deleteOrRestoreTopicOf(command, pid, socket, callback) { async.waterfall([ function (next) { - posts.getTopicFields(pid, ['tid', 'cid'], next); + posts.getTopicFields(pid, ['tid', 'cid', 'deleted'], next); }, function (topic, next) { - socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, { tids: [topic.tid], cid: topic.cid }, next); + if (parseInt(topic.deleted, 10) !== 1 && command === 'delete') { + socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, { tids: [topic.tid], cid: topic.cid }, next); + } else if (parseInt(topic.deleted, 10) === 1 && command === 'restore') { + socketTopics.doTopicAction('restore', 'event:topic_restored', socket, { tids: [topic.tid], cid: topic.cid }, next); + } else { + setImmediate(next); + } }, ], callback); } From 3299324534e5045c57134998d187341074dbd5fe Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Thu, 23 Nov 2017 12:27:21 -0700 Subject: [PATCH 50/81] Fix console colors with `app.js` Closes #6110 --- app.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app.js b/app.js index 7942646c21..748a68bb54 100644 --- a/app.js +++ b/app.js @@ -50,6 +50,7 @@ var configExists = file.existsSync(configFile) || (nconf.get('url') && nconf.get var prestart = require('./src/prestart'); prestart.loadConfig(configFile); prestart.versionCheck(); +prestart.setupWinston(); if (!process.send) { // If run using `node app`, log GNU copyright info along with server info From 830028b1d573ec63f568e6b697c1c2b051350729 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 23 Nov 2017 15:24:51 -0500 Subject: [PATCH 51/81] language strings and fallbacks for #5955 --- public/language/ar/user.json | 10 ++++++++-- public/language/bg/user.json | 10 ++++++++-- public/language/bn/user.json | 10 ++++++++-- public/language/cs/user.json | 10 ++++++++-- public/language/da/user.json | 10 ++++++++-- public/language/de/user.json | 16 +++++++++++----- public/language/el/user.json | 10 ++++++++-- public/language/en-GB/user.json | 2 ++ public/language/en-US/user.json | 10 ++++++++-- public/language/en-x-pirate/user.json | 10 ++++++++-- public/language/es/user.json | 10 ++++++++-- public/language/et/user.json | 10 ++++++++-- public/language/fa-IR/user.json | 10 ++++++++-- public/language/fi/user.json | 10 ++++++++-- public/language/fr/user.json | 10 ++++++++-- public/language/gl/user.json | 10 ++++++++-- public/language/he/user.json | 10 ++++++++-- public/language/hr/user.json | 10 ++++++++-- public/language/hu/user.json | 10 ++++++++-- public/language/id/user.json | 10 ++++++++-- public/language/it/user.json | 10 ++++++++-- public/language/ja/user.json | 10 ++++++++-- public/language/ko/user.json | 10 ++++++++-- public/language/lt/user.json | 10 ++++++++-- public/language/ms/user.json | 10 ++++++++-- public/language/nb/user.json | 10 ++++++++-- public/language/nl/user.json | 10 ++++++++-- public/language/pl/user.json | 10 ++++++++-- public/language/pt-BR/user.json | 10 ++++++++-- public/language/pt-PT/user.json | 10 ++++++++-- public/language/ro/user.json | 10 ++++++++-- public/language/ru/user.json | 10 ++++++++-- public/language/rw/user.json | 10 ++++++++-- public/language/sc/user.json | 10 ++++++++-- public/language/sk/user.json | 10 ++++++++-- public/language/sl/user.json | 10 ++++++++-- public/language/sr/user.json | 10 ++++++++-- public/language/sv/user.json | 10 ++++++++-- public/language/th/user.json | 10 ++++++++-- public/language/tr/user.json | 10 ++++++++-- public/language/uk/user.json | 10 ++++++++-- public/language/vi/user.json | 10 ++++++++-- public/language/zh-CN/user.json | 10 ++++++++-- public/language/zh-TW/user.json | 10 ++++++++-- 44 files changed, 349 insertions(+), 89 deletions(-) diff --git a/public/language/ar/user.json b/public/language/ar/user.json index 6436c70082..22372e4733 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -79,8 +79,6 @@ "digest_daily": "يوميا", "digest_weekly": "أسبوعيًّا", "digest_monthly": "شهريًّا", - "send_chat_notifications": "استلام رسالة إلكترونية عند ورود محادثة وأنا غير متصل.", - "send_post_notifications": "Send an email when replies are made to topics I am subscribed to", "settings-require-reload": "تغيير بعض اﻹعدادات يتطلب تحديث الصفحة. إضغط هنا لتحديث الصفحة", "has_no_follower": "هذا المستخدم ليس لديه أي متابع :(", "follows_no_one": "هذا المستخدم لا يتابع أحد :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "خيارات التصفح", "open_links_in_new_tab": "فتح الروابط الخارجية في نافدة جديدة", "enable_topic_searching": "تفعيل خاصية البحث داخل المواضيع", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 453d45c0a5..08c87fb78b 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -79,8 +79,6 @@ "digest_daily": "Ежедневно", "digest_weekly": "Ежеседмично", "digest_monthly": "Ежемесечно", - "send_chat_notifications": "Изпращане на е-писмо, ако получа ново съобщение в разговор, а не съм на линия", - "send_post_notifications": "Изпращане на е-писмо, когато се появи отговор в темите, за които съм абониран(а).", "settings-require-reload": "Някои промени в настройките изискват презареждане. Натиснете тук, за да презаредите страницата.", "has_no_follower": "Този потребител няма последователи :(", "follows_no_one": "Този потребител не следва никого :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Звук за изходящо съобщение", "notification-sound": "Звук за известие", "no-sound": "Без звук", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Настройки за страниците", "open_links_in_new_tab": "Отваряне на външните връзки в нов подпрозорец", "enable_topic_searching": "Включване на търсенето в темите", @@ -123,6 +126,9 @@ "sso.title": "Услуги за еднократно вписване", "sso.associated": "Свързан с", "sso.not-associated": "Натиснете тук, за да свържете с", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Последни доклади", "info.no-flags": "Не са намерени докладвани публикации", "info.ban-history": "Скорошна история на блокиранията", diff --git a/public/language/bn/user.json b/public/language/bn/user.json index a9688ce532..ad611b4642 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -79,8 +79,6 @@ "digest_daily": "দৈনিক", "digest_weekly": "সাপ্তাহিক", "digest_monthly": "মাসিক", - "send_chat_notifications": "যদি আমি অনলাইনে না থাকি, সেক্ষেত্রে নতুন চ্যাট মেসেজ আসলে আমাকে ইমেইল করুন", - "send_post_notifications": "আমার সাবস্ক্রাইব করা টপিকগুলোতে রিপ্লাই করা হলে আমাকে মেইল করা হোক", "settings-require-reload": "কিছু কিছু পরিবর্তনের জন্য রিলোড করা আবশ্যক। পেজটি রিলোড করতে এখানে ক্লিক করুন", "has_no_follower": "এই সদস্যের কোন ফলোয়ার নেই :(", "follows_no_one": "এই সদস্য কাউকে ফলো করছেন না :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing সেটিংস", "open_links_in_new_tab": "আউটগোয়িং লিংকগুলো নতুন ট্যাবে খুলুন", "enable_topic_searching": "In-Topic সার্চ সক্রীয় করো", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 1dbf2cd49e..0042eb8ec6 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -79,8 +79,6 @@ "digest_daily": "Denně", "digest_weekly": "Týdně", "digest_monthly": "Měsíčně", - "send_chat_notifications": "Odeslat e-mail, dorazí-li nová zpráva chatu a já nejsem připojen", - "send_post_notifications": "Zaslat e-mail, přibudou-li nové odpovědi k tématu, kde mám přihlášen odběr", "settings-require-reload": "Některá nastavení vyžadují znovu načtení. Pro znovu načtení stránky, klikněte zde.", "has_no_follower": "Tohoto uživatele nikdo nesleduje :(", "follows_no_one": "Tento uživatel nikoho nesleduje :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Zvuk odchozí zprávy", "notification-sound": "Zvuk oznámení", "no-sound": "Bez zvuku", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Nastavení prohlížení", "open_links_in_new_tab": "Otevřít odchozí odkaz v nové záložce", "enable_topic_searching": "Povolit vyhledávání v tématu", @@ -123,6 +126,9 @@ "sso.title": "Služby jednotného přihlášení", "sso.associated": "Přiřazeno k", "sso.not-associated": "Zde klikněte pro přiřazení k", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Poslední označené", "info.no-flags": "Nebyly nalezeny žádné označené příspěvky", "info.ban-history": "Poslední historie blokovaných", diff --git a/public/language/da/user.json b/public/language/da/user.json index 9e87553d30..58936317a2 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -79,8 +79,6 @@ "digest_daily": "Daglig", "digest_weekly": "Ugentlig", "digest_monthly": "Månedlig", - "send_chat_notifications": "Send en email hvis en ny chat besked er modtaget og jeg ikke er online", - "send_post_notifications": "Send en email når der er skrevet svar til indlæg jeg abonnere på", "settings-require-reload": "Nogle indstillinger kræver en genindlæsning. Klik her for at genindlæse siden.", "has_no_follower": "Denne bruger har ingen følgere :(", "follows_no_one": "Denne bruger følger ikke nogen :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Udgående besked lyd", "notification-sound": "Meddelelse lyd", "no-sound": "Ingen lyd", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Gennemsenings indstillinger", "open_links_in_new_tab": "Åben udgående link i en ny tab", "enable_topic_searching": "Slå In-Topic søgning til", @@ -123,6 +126,9 @@ "sso.title": "Enkeltgangs Sign-on Servicer", "sso.associated": "Forbundet med", "sso.not-associated": "Klik her for at forbinde med", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/de/user.json b/public/language/de/user.json index d6dcbd6753..0e15297afc 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -25,7 +25,7 @@ "reputation": "Ansehen", "bookmarks": "Lesezeichen", "watched": "Beobachtet", - "ignored": "Ignored", + "ignored": "Ignoriert", "followers": "Follower", "following": "Folge ich", "aboutme": "Über mich", @@ -79,15 +79,13 @@ "digest_daily": "Täglich", "digest_weekly": "Wöchentlich", "digest_monthly": "Monatlich", - "send_chat_notifications": "Sende eine E-Mail, wenn eine neue Chat-Nachricht eingeht während ich nicht online bin", - "send_post_notifications": "Sende eine E-Mail bei Antworten auf Themen die ich abonniert habe.", "settings-require-reload": "Einige Einstellungsänderung benötigen eine Aktualisierung. Hier klicken um die Seite neu zu laden.", "has_no_follower": "Diesem Benutzer folgt noch niemand. :(", "follows_no_one": "Dieser Benutzer folgt noch niemandem. :(", "has_no_posts": "Dieser Benutzer hat noch nichts geschrieben.", "has_no_topics": "Dieser Benutzer hat noch keine Themen erstellt.", "has_no_watched_topics": "Dieser Benutzer beobachtet keine Themen.", - "has_no_ignored_topics": "This user hasn't ignored any topics yet.", + "has_no_ignored_topics": "Dieser Benutzer ignoriert bisher keine Themen.", "has_no_upvoted_posts": "Dieser Benutzer hat bisher keine Beiträge positiv bewertet.", "has_no_downvoted_posts": "Dieser Benutzer hat bisher keine Beiträge negativ bewertet.", "has_no_voted_posts": "Dieser Benutzer hat keine bewerteten Beiträge.", @@ -96,13 +94,18 @@ "paginate_description": "Themen und Beiträge in Seiten aufteilen, anstatt unendlich zu scrollen", "topics_per_page": "Themen pro Seite", "posts_per_page": "Beiträge pro Seite", - "max_items_per_page": "Maximum %1", + "max_items_per_page": "Maximal %1", "notification_sounds": "Ton abspielen, wenn du eine Benachrichtigung erhältst", "notifications_and_sounds": "Benachrichtigungen & Klänge", "incoming-message-sound": "Ton bei empfangener Nachricht", "outgoing-message-sound": "Ton bei versendeter Nachricht", "notification-sound": "Benachrichtigungston ", "no-sound": "Kein Ton", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing", "open_links_in_new_tab": "Ausgehende Links in neuem Tab öffnen", "enable_topic_searching": "Suchen innerhalb von Themen aktivieren", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Dienste", "sso.associated": "Verbunden mit", "sso.not-associated": "Verbinde dich mit", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Neuste Meldungen", "info.no-flags": "Keine gemeldeten Beiträge gefunden", "info.ban-history": "Sperrungsverlauf", diff --git a/public/language/el/user.json b/public/language/el/user.json index 04c306f982..242f7e1080 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -79,8 +79,6 @@ "digest_daily": "Ημερήσια", "digest_weekly": "Εβδομαδιαίως", "digest_monthly": "Μηνιαία", - "send_chat_notifications": "Αποστολή email αν μου έρθει μήνυμα συνομιλίας και δεν είμαι συνδεδεμένος", - "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.", "has_no_follower": "Αυτός ο χρήστης δεν έχει κανέναν ακόλουθο :(", "follows_no_one": "Αυτός ο χρήστης δεν ακολουθεί κανέναν :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Επιλογές Περιήγησης", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index 7483a041a2..466f6c27e4 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -145,6 +145,8 @@ "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", diff --git a/public/language/en-US/user.json b/public/language/en-US/user.json index fb7fda5945..f92b22c3d5 100644 --- a/public/language/en-US/user.json +++ b/public/language/en-US/user.json @@ -79,8 +79,6 @@ "digest_daily": "Daily", "digest_weekly": "Weekly", "digest_monthly": "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.", "has_no_follower": "This user doesn't have any followers :(", "follows_no_one": "This user isn't following anyone :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/en-x-pirate/user.json b/public/language/en-x-pirate/user.json index d60f568fa9..477d4992f5 100644 --- a/public/language/en-x-pirate/user.json +++ b/public/language/en-x-pirate/user.json @@ -79,8 +79,6 @@ "digest_daily": "Daily", "digest_weekly": "Weekly", "digest_monthly": "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.", "has_no_follower": "This user doesn't have any followers :(", "follows_no_one": "This user isn't following anyone :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/es/user.json b/public/language/es/user.json index a46d95d741..87d86d5e66 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -79,8 +79,6 @@ "digest_daily": "Diariamente", "digest_weekly": "Semanalmente", "digest_monthly": "Mensualmente", - "send_chat_notifications": "Enviar un email si recibo un mensaje de chat cuando no esté en línea.", - "send_post_notifications": "Enviarme un email cuando se realicen contestaciones en los temas en los que estoy subscrito", "settings-require-reload": "Algunos cambios de configuración requieren una recarga la página. Haz click aquí para recargar la página.", "has_no_follower": "Este usuario no tiene seguidores :(", "follows_no_one": "Este miembro no sigue a nadie :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Sonido del mensaje saliente", "notification-sound": "Sonido de notificación", "no-sound": "Sin sonido", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Preferencias de navegación.", "open_links_in_new_tab": "Abrir los enlaces externos en una nueva pestaña", "enable_topic_searching": "Activar la búsqueda \"dentro del tema\"", @@ -123,6 +126,9 @@ "sso.title": "Servicios de Inicio de sesión Único", "sso.associated": "Asociado con", "sso.not-associated": "Da clic aquí para asociarse con", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Ultimos reportes", "info.no-flags": "Ningun mensaje reportado encontrado", "info.ban-history": "Histórico reciente de bans", diff --git a/public/language/et/user.json b/public/language/et/user.json index 94acd29c19..b1523455f9 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -79,8 +79,6 @@ "digest_daily": "Igapäevaselt", "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": "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 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Sirvimis sätted", "open_links_in_new_tab": "Ava väljaminevad lingid uues aknas", "enable_topic_searching": "Võimalda teemasisene otsing", @@ -123,6 +126,9 @@ "sso.title": "Ühekordse sisselogimisega teenused", "sso.associated": "Seotud koos", "sso.not-associated": "Kliki siia, et siduda koos", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Viimased raporteerimised", "info.no-flags": "Raporteeritud postitusi ei leitud", "info.ban-history": "Hiljutiste keeldude ajalugu", diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index f4769ca682..5a2ec2f428 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -79,8 +79,6 @@ "digest_daily": "روزانه", "digest_weekly": "هفتگی", "digest_monthly": "ماهانه", - "send_chat_notifications": "اگر من پیام جدیدی داشتم و آنلاین نبودم یک ایمیل به من بفرست", - "send_post_notifications": "اگر به موضوع های مورد اشتراک من پاسخی داده شد یک ایمیل به من ارسال کن", "settings-require-reload": "تغییر برخی تنظیمات مستلزم بارگذاری مجدد هستند. برای بارگذاری مجدد صفحه اینجا کلیک کنید.", "has_no_follower": "این کاربر هیچ دنبال‌کننده‌ای ندارد :(", "follows_no_one": "این کاربر هیچ کسی را دنبال نمی‌کند :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "صدای پیام ارسال شده", "notification-sound": "آگاه‌سازی‌ از طریق صدا", "no-sound": "بدون صدا", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "تنظیمات مرور", "open_links_in_new_tab": "پیوندهای به بیرون را در برگ جدید باز کن", "enable_topic_searching": "فعال کردن جستجوی داخل-موضوع", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "آخرین نشانه گذاری‌ها", "info.no-flags": "هیچ پست‌ نشانه‌گذاری شده یافت نشد", "info.ban-history": "تاریخچه مسدودیت اخیر", diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 9f5d8010a6..b15d2c3492 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -79,8 +79,6 @@ "digest_daily": "Päivittäin", "digest_weekly": "Viikottain", "digest_monthly": "Kuukausittain", - "send_chat_notifications": "Lähetä minulle sähköposti, jos uusi pikaviesti saapuu, kun en ole paikalla", - "send_post_notifications": "Lähetä minulle sähköposti, kun tilaamiini aiheisiin tulee vastauksia", "settings-require-reload": "Some setting changes require a reload. Click here to reload the page.", "has_no_follower": "Kukaan ei seuraa tätä käyttäjää :(", "follows_no_one": "Tämä käyttäjä ei seuraa ketään :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Selataan asetuksia", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Salli aiheen sisäiset haut", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 8b27a0f0af..6dc0fb85d2 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -79,8 +79,6 @@ "digest_daily": "Quotidien", "digest_weekly": "Hebdomadaire", "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": "Certains réglages nécessitent un rechargement. Cliquez ici pour recharger la page.", "has_no_follower": "Personne n'est abonné à cet utilisateur :(", "follows_no_one": "Cet utilisateur n'est abonné à personne :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Son pour les messages sortants", "notification-sound": "Son de notification", "no-sound": "Pas de son", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Paramètres de navigation", "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet", "enable_topic_searching": "Activer la recherche dans les sujets", @@ -123,6 +126,9 @@ "sso.title": "Services d'authentification unique", "sso.associated": "Associé avec", "sso.not-associated": "Cliquez ici pour associer", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Derniers signalements", "info.no-flags": "Aucun signalement trouvé", "info.ban-history": "Historique de bannissement récent", diff --git a/public/language/gl/user.json b/public/language/gl/user.json index 79833e3a40..b9b1948287 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -79,8 +79,6 @@ "digest_daily": "Diariamente", "digest_weekly": "Semanalmente", "digest_monthly": "Mensualmente", - "send_chat_notifications": "Enviar un correo se me chega unha mensaxe mentres estou desconectado.", - "send_post_notifications": "Enviádeme un correo cando haxa respostas nos temas nos que estou subscrito", "settings-require-reload": "Algúns cambios nas opcións requiren recarga-la páxina. Pica aquí para facelo.", "has_no_follower": "Ninguén segue a este usuario :(", "follows_no_one": "Este usuario non sigue a ninguén :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Son da mensaxe saínte", "notification-sound": "Son de notificación", "no-sound": "Sen son", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Opcións de busca", "open_links_in_new_tab": "Abrir ligazóns externos nunca nova pestaña", "enable_topic_searching": "Permitir buscar dentro dun tema", @@ -123,6 +126,9 @@ "sso.title": "Servizos de Inicio de Sesión Único", "sso.associated": "Asociado con", "sso.not-associated": "Pica aquí para asociarte con", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Últimos reportes", "info.no-flags": "Non se atopou ninguna mensaxe reportada", "info.ban-history": "Histórico recente de bans", diff --git a/public/language/he/user.json b/public/language/he/user.json index 4b46bc93ef..bb1b1a092f 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -79,8 +79,6 @@ "digest_daily": "יומי", "digest_weekly": "שבועי", "digest_monthly": "חודשי", - "send_chat_notifications": "שלח לי הודעה למייל כאשר הודעת צ'אט נשלחה אלי בזמן שאיני מחובר", - "send_post_notifications": "שלח לי הודעה למייל כאשר תגובות חדשות פורסמו לנושאים שאני עוקב אחריהם", "settings-require-reload": "כמה שינויים בהגדרות דורשים ריענון לדף. לחץ כאן כדי לרענן את הדף.", "has_no_follower": "למשתמש זה אין עוקבים :(", "follows_no_one": "משתמש זה אינו עוקב אחרי אחרים :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "צליל הודעה יוצאת", "notification-sound": "צליל הודעה", "no-sound": "ללא צליל", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "הגדרות צפייה", "open_links_in_new_tab": "פתח קישורים חיצוניים בכרטיסייה חדשה", "enable_topic_searching": "הפעל חיפוש בתוך נושא", @@ -123,6 +126,9 @@ "sso.title": "שירות יחיד להתחברות", "sso.associated": "משוייך עם", "sso.not-associated": "לחץ כאן כדי לשייך", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "דיווחים אחרונים", "info.no-flags": "לא נמצאו פוסטים שמשתמשים דיווחו עליהם", "info.ban-history": "היסטוריית הרחקות", diff --git a/public/language/hr/user.json b/public/language/hr/user.json index b93a75c577..e3c8e767fe 100644 --- a/public/language/hr/user.json +++ b/public/language/hr/user.json @@ -79,8 +79,6 @@ "digest_daily": "Dnevno", "digest_weekly": "Tjedno", "digest_monthly": "Mjesečno", - "send_chat_notifications": "Pošalji email ako stigne nova poruka i nisam na mreži", - "send_post_notifications": "Pošalji email kada se objavi odgovor na teme koje sam pretplaćen", "settings-require-reload": "Neke promjene zahtjevaju osvježenje. Kliknite ovdje za osvježavanje stranice.", "has_no_follower": "Ovaj korisnik nema pratitelja :(.", "follows_no_one": "Ovaj korisnik nikog ne prati :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Zvuk odlazećih poruka", "notification-sound": "Zvuk obavijesti", "no-sound": "Bez zvuka", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Postavke pretraživanja", "open_links_in_new_tab": "Otvori odlazne poveznice u novom tabu", "enable_topic_searching": "Omogući pretragu unutar tema", @@ -123,6 +126,9 @@ "sso.title": "Jednokratne usluge prijave", "sso.associated": "Povezano sa", "sso.not-associated": "Klikni ovdje za povezivanje sa", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Zadnja zastava", "info.no-flags": "Nema objava sa zastavama", "info.ban-history": "Povijest nedavno blokiranih", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index cc0b0a70a7..68cc1adcb3 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -79,8 +79,6 @@ "digest_daily": "Napi", "digest_weekly": "Heti", "digest_monthly": "Havi", - "send_chat_notifications": "E-mail küldése, ha új chat üzenetem érkezett és nem vagyok aktív", - "send_post_notifications": "E-mail küldése, ha válasz érkezik a feliratkozott témakörökbe", "settings-require-reload": "Néhány módosítás újratöltést igényel. Kattints ide az oldal frissítéséhez.", "has_no_follower": "Ezt a felhasználót nem követi senki :(", "follows_no_one": "Ez a felhasználó már nem követ :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Kimenő üzenet hangja", "notification-sound": "Értesítési hang", "no-sound": "Nincs hang", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Böngészési beállítások", "open_links_in_new_tab": "Kimenő hivatkozások megnyitása új lapon", "enable_topic_searching": "Témán belüli keresés bekapcsolása", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/id/user.json b/public/language/id/user.json index b2f67b1298..7f2b874e76 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -79,8 +79,6 @@ "digest_daily": "Harian", "digest_weekly": "Mingguan", "digest_monthly": "Bulanan", - "send_chat_notifications": "Kirimkan email jika menerima pesan percakapan dan saya sedang tidak 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.", "has_no_follower": "User ini tidak memiliki pengikut :(", "follows_no_one": "User ini tidak mengikuti seorangpun :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Pengaturan Penelusuran", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Gunakan Pencarian Di dalam Topik", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/it/user.json b/public/language/it/user.json index 9eea1dccfc..a24f325d24 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -79,8 +79,6 @@ "digest_daily": "Quotidiano", "digest_weekly": "Settimanale", "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 ci sono nuove risposte a discussioni a cui sono sottoscritto", "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 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Suono messaggio in uscita", "notification-sound": "Suono di notifica", "no-sound": "Nessun suono", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Impostazioni di Navigazione", "open_links_in_new_tab": "Apri i link web in una nuova pagina", "enable_topic_searching": "Abilita la ricerca negli argomenti", @@ -123,6 +126,9 @@ "sso.title": "Servizi Single-Sign-On", "sso.associated": "Associa con", "sso.not-associated": "Clicca qui per associare con", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Ultime Segnalazioni", "info.no-flags": "Non è stato trovato nessun post segnalato", "info.ban-history": "Storico dei Ban recenti", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 552c6c944f..a9e5689f76 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -79,8 +79,6 @@ "digest_daily": "デイリー", "digest_weekly": "ウィークリー", "digest_monthly": "マンスリー", - "send_chat_notifications": "オンラインではない時に新しいチャットメッセージを受信した場合、通知メールを送信する。", - "send_post_notifications": "購読中のスレッドに返信があった場合、メールで通知する。", "settings-require-reload": "設定を変更するにはページを更新する必要があります。ここを押して、ページを更新します。", "has_no_follower": "フォロワーはまだいません :(", "follows_no_one": "フォロー中のユーザーはまだいません :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "送信メッセージの音", "notification-sound": "通知音", "no-sound": "無音", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "ブラウジングの設定", "open_links_in_new_tab": "外部リンクを新しいタブで開く", "enable_topic_searching": "インースレッドの検索を有効にします", @@ -123,6 +126,9 @@ "sso.title": "シングルサインオンサービス", "sso.associated": "関連付けられています", "sso.not-associated": "ここを押して、関連付けられています", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "最近のフラグ", "info.no-flags": "フラグのついた投稿はありません", "info.ban-history": "最近停止した履歴", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 60050414b5..dc2826829e 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -79,8 +79,6 @@ "digest_daily": "매일", "digest_weekly": "매주", "digest_monthly": "매월", - "send_chat_notifications": "오프라인일 때 채팅 메시지가 도착하면 알림 메일을 보냅니다.", - "send_post_notifications": "내가 관심있는 게시물에 답글이 달리면 메일을 보냅니다.", "settings-require-reload": "일부 설정 변경은 새로고침이 필요합니다. 여기를 눌러서 페이지를 새로고침 해주세요.", "has_no_follower": "이 사용자는 팔로워가 없습니다 :(", "follows_no_one": "이 사용자는 아무도 팔로우하고 있지 않습니다 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "발신 메시지 알림음", "notification-sound": "알림음", "no-sound": "음소거", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "브라우징 설정", "open_links_in_new_tab": "외부 링크를 새로운 탭에서 열람", "enable_topic_searching": "게시물 내 검색 허용", @@ -123,6 +126,9 @@ "sso.title": "통합 인증 서비스", "sso.associated": "와/과 연동된", "sso.not-associated": "이 곳을 클릭하여 연동시키세요.", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "최근에 들어온 신고", "info.no-flags": "신고된 포스트가 없습니다.", "info.ban-history": "최근 차단 히스토리", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 0f4ecf0164..9e440fb137 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -79,8 +79,6 @@ "digest_daily": "Kas dieną", "digest_weekly": "Kas savaitę", "digest_monthly": "Kas mėnesį", - "send_chat_notifications": "Jeigu gaunama nauja pokalbių žinutė ir aš neprisijungęs, siųsti el. laišką", - "send_post_notifications": "Atsiųsti el. laišką kai parašomi atsakymai į mano prenumeruojamas temas", "settings-require-reload": "Kai kurie nustatymų pakeitimai reikalauja perkrovimo. Spauskite čia kad perkrauti puslapį", "has_no_follower": "Šis vartotojas neturi jokių sekėjų :(", "follows_no_one": "Šis vartotojas nieko neseka :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Siunčiamos žinutės garsas", "notification-sound": "Pranešimo garsas", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Naršymo nustatymai", "open_links_in_new_tab": "Atidaryti išeinančias nuorodas naujam skirtuke", "enable_topic_searching": "Įjungti Temų Ieškojimą ", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "Nerasta pažymėtų pranešimų", "info.ban-history": "Blokavimų istorija", diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 43eb03be3c..e202ac1921 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -79,8 +79,6 @@ "digest_daily": "Harian", "digest_weekly": "Mingguan", "digest_monthly": "Bulanan", - "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 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Melihat-lihat Tetapan", "open_links_in_new_tab": "Buka pautan luar di tab yang baru", "enable_topic_searching": "Aktifkan Pencarian Dalam-Topik", @@ -123,6 +126,9 @@ "sso.title": "Servis Satu Log Masuk", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index a89d0f54ab..67b8e22f12 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -79,8 +79,6 @@ "digest_daily": "Daglig", "digest_weekly": "Ukentlig", "digest_monthly": "Månedlig", - "send_chat_notifications": "Send en epost hvis jeg mottar en chat-melding når jeg ikke er pålogget", - "send_post_notifications": "Send en e-post når svar postes til emner jeg abonnerer på", "settings-require-reload": "Noen innstillingsendringer krever at du laster siden på nytt. Klikk her for å laste på nytt.", "has_no_follower": "Denne brukeren har ingen følgere :(", "follows_no_one": "Denne brukeren følger ingen :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Surfeinnstillinger", "open_links_in_new_tab": "Åpne utgående lenker i en ny fane", "enable_topic_searching": "Aktiver søk-i-emne", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Assosiert med", "sso.not-associated": "Klikk her for å assosiere med", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 3df4814190..6351ae8827 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -79,8 +79,6 @@ "digest_daily": "Dagelijks", "digest_weekly": "Wekelijks", "digest_monthly": "Maandelijks", - "send_chat_notifications": "Meld het mij per e-mail als iemand een chatbericht verstuurt wanneer ik niet online ben", - "send_post_notifications": "Meld het mij per e-mail wanneer er reacties volgen op onderwerpen waarop geabonneerd is", "settings-require-reload": "Sommige veranderingen vereisen het herladen van de pagina: klik hier om de pagina te herladen.", "has_no_follower": "Deze gebruiker heeft geen volgers :(", "follows_no_one": "Deze gebruiker volgt niemand :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Uitgaand bericht geluid", "notification-sound": "Notificatie geluid", "no-sound": "Geen geluid", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Instellingen voor bladeren", "open_links_in_new_tab": "Open uitgaande links naar een externe site in een nieuw tabblad", "enable_topic_searching": "Inschakelen mogelijkheid op onderwerp te kunnen zoeken", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Geassocieerd met", "sso.not-associated": "Klik hier om geassocieerd te worden met", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Laatste markeringen", "info.no-flags": "Geen gemarkeerde berichten gevonden", "info.ban-history": "Recente verban-geschiedenis", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 831e94cc04..6ad02f18e7 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -79,8 +79,6 @@ "digest_daily": "Codziennie", "digest_weekly": "Co tydzień", "digest_monthly": "Co miesiąc", - "send_chat_notifications": "Wyślij e-maila, jeśli dostanę nową wiadomość, a nie jestem on-line", - "send_post_notifications": "Wyślij email, kiedy w tematach, które subskrybuję, pojawią się odpowiedzi", "settings-require-reload": "Niektóre zmiany ustawień wymagają przeładowania. Kliknij tutaj, aby przeładować stronę.", "has_no_follower": "Ten użytkownik nie ma jeszcze żadnych śledzących", "follows_no_one": "Użytkownik jeszcze nikogo nie śledzi.", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Dźwięk wychodzącej wiadomości", "notification-sound": "Dźwięk powiadomienia", "no-sound": "Bez dźwięku", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Ustawienia szukania", "open_links_in_new_tab": "Otwieraj odnośniki wychodzące w nowej karcie", "enable_topic_searching": "Włącz szukanie w temacie", @@ -123,6 +126,9 @@ "sso.title": "Usługi Pojedynczego Logowania", "sso.associated": "Powiązane z", "sso.not-associated": "Kliknij tutaj, aby powiązać z", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Ostatnie flagi", "info.no-flags": "Brak oflagowanych postów", "info.ban-history": "Historia ostatnich banów", diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 344e578fce..3a5ff85a58 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -79,8 +79,6 @@ "digest_daily": "Diariamente", "digest_weekly": "Semanalmente", "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": "Algumas mudanças de configuração exigem que recarregue. Clique aqui para recarregar 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 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Som de envio de mensagem", "notification-sound": "Som de notificação", "no-sound": "Sem som", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Configurações de Navegação", "open_links_in_new_tab": "Abrir links externos em nova aba", "enable_topic_searching": "Habilitar Pesquisa dentro de Tópico", @@ -123,6 +126,9 @@ "sso.title": "Logar por outros Serviços", "sso.associated": "Associado com", "sso.not-associated": "Clique aqui para associar com", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Últimas Sinalizações", "info.no-flags": "Nenhum Post Sinalizado Encontrado", "info.ban-history": "Histórico de Banimentos Recentes", diff --git a/public/language/pt-PT/user.json b/public/language/pt-PT/user.json index 1f03ab13ca..2c21950e37 100644 --- a/public/language/pt-PT/user.json +++ b/public/language/pt-PT/user.json @@ -79,8 +79,6 @@ "digest_daily": "Diariamente ", "digest_weekly": "Semanalmente", "digest_monthly": "Mensalmente", - "send_chat_notifications": "Enviar um e-mail se receber uma nova mensagem e não estiver online", - "send_post_notifications": "Enviar um -email quando respostas forem dadas a tópicos que subscrevi", "settings-require-reload": "Algumas alterações requerem um recarregamento. Carregue aqui para recarregar a página.", "has_no_follower": "Este utilizador não tem nenhum seguidor :(", "follows_no_one": "Este utilizador não está a seguir ninguém :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Som de mensagem enviada", "notification-sound": "Som de notificação", "no-sound": "Sem som", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Definições de navegação", "open_links_in_new_tab": "Abrir links num novo separador", "enable_topic_searching": "Permitir pesquisa dentro dos tópicos", @@ -123,6 +126,9 @@ "sso.title": "Serviços de login único", "sso.associated": "Associado a", "sso.not-associated": "Carrega aqui para associares com", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Últimas sinalizações", "info.no-flags": "Não foram encontrados publicações sinalizadas", "info.ban-history": "Histórico de expulsões recentes", diff --git a/public/language/ro/user.json b/public/language/ro/user.json index c9415ea2a8..1a0d1d47e1 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -79,8 +79,6 @@ "digest_daily": "Zilnic", "digest_weekly": "Săptămânal", "digest_monthly": "Lunar", - "send_chat_notifications": "Trimite-mi un email dacă primesc un mesaj în chat si eu nu sunt 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.", "has_no_follower": "Pe acest utilizator nu îl urmărește nimeni :(", "follows_no_one": "Acest utilizator nu urmărește pe nimeni :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Setări navigare", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 4d311a0b85..242763bade 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -79,8 +79,6 @@ "digest_daily": "За день", "digest_weekly": "За неделю", "digest_monthly": "За месяц", - "send_chat_notifications": "Отправлять уведомления по электронной почте при поступлении нового сообщения чата", - "send_post_notifications": "Отправлять уведомления по электронной почте при появлении новых ответов в подписанных темах", "settings-require-reload": "Для отображения изменений необходимо обновить страницу. Нажмите здесь, чтобы продолжить.", "has_no_follower": "На этого участника никто не подписан", "follows_no_one": "Этот участник ни на кого не подписан", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Звук исходящего сообщения", "notification-sound": "Звук уведомления", "no-sound": "Без звука", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Настройки просмотра", "open_links_in_new_tab": "Открывать внешние ссылки в новом окне", "enable_topic_searching": "Поиск во всех записях темы", @@ -123,6 +126,9 @@ "sso.title": "Для вашего удобства вы можете связать ваши учётные записи на других социальных сервисах с учётной записью на нашем сайте", "sso.associated": "Связан с", "sso.not-associated": "Нажмите здесь, что бы связать учётную запись с", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Новые отмеченные сообщения", "info.no-flags": "Отмеченных сообщений не найдено", "info.ban-history": "Недавно заблокированы", diff --git a/public/language/rw/user.json b/public/language/rw/user.json index ed0b275bdf..ed5bd999d7 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -79,8 +79,6 @@ "digest_daily": "Buri Munsi", "digest_weekly": "Buri Cyumweru", "digest_monthly": "Buri Kwezi", - "send_chat_notifications": "Njye nohererezwa email igihe hari ubutumwa bwo mu gikari banyoherereje ntari ku murongo", - "send_post_notifications": "Njye nohererezwa email mu gihe hari abanditse ku biganiro niyandikishijeho", "settings-require-reload": "Hari igihe ibyo watunganyije bitagaragara iyo utongeye ngo upakire paji uriho. Kanda hano upakire iyi paji bundibushya. ", "has_no_follower": "Uyu muntu ntabwo afite abamukurikira :(", "follows_no_one": "Uyu muntu ntabwo akurikira umuntu numwe :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Gutunganya Uburyo Usoma", "open_links_in_new_tab": "Fungurira imirongo ijya hanze mu idirishya rishya", "enable_topic_searching": "Emerera Ugushakira mu Kiganiro", @@ -123,6 +126,9 @@ "sso.title": "Kwinjiramo ukoreshe serivisi za SSO", "sso.associated": "Bisanishijwe na", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 601342a8b1..d22c0e62c3 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -79,8 +79,6 @@ "digest_daily": "Daily", "digest_weekly": "Weekly", "digest_monthly": "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.", "has_no_follower": "Custu impitadore non tenet perunu sighidore :(", "follows_no_one": "Custu impitadore no est sighende nissunu :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", "no-sound": "No sound", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Browsing Settings", "open_links_in_new_tab": "Open outgoing links in new tab", "enable_topic_searching": "Enable In-Topic Searching", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Associated with", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index e6224d0d86..43c94065e4 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -79,8 +79,6 @@ "digest_daily": "Denne", "digest_weekly": "Týždenne", "digest_monthly": "Mesačne", - "send_chat_notifications": "Poslať e-mail, ak nová správa konverzácie príde a ja nie som on-line", - "send_post_notifications": "Poslať e-mail, ak bude nová odpoveď na témy, v ktorých mám prihlásený odber", "settings-require-reload": "Niektoré zmeny nastavení vyžadujú znovu načítanie stránky. Kliknutím sem znova načítate stránku.", "has_no_follower": "Tohto užívateľa nikto nesleduje :(", "follows_no_one": "Tento užívateľ nikoho nesleduje :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Odchádzajúci zvuk správy", "notification-sound": "Zvuk oznámenia", "no-sound": "Žiadny zvuk", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Nastavenia prehľadávania", "open_links_in_new_tab": "Otvárať odchádzajúce odkazy v novom liste", "enable_topic_searching": "Povoliť vyhľadávanie priamo v téme", @@ -123,6 +126,9 @@ "sso.title": "Služby jednotného prihlasovania", "sso.associated": "Spojené s", "sso.not-associated": "Kliknite tu pre spojenie s", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Najnovšie príznaky", "info.no-flags": "Neboli nájdené žiadne označené príspevky", "info.ban-history": "Nedávna história zablokovania", diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 417b556497..b6eeb8763d 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -79,8 +79,6 @@ "digest_daily": "Dnevno", "digest_weekly": "Tedensko", "digest_monthly": "Mesečno", - "send_chat_notifications": "Pošlji mi e-pošto, če se pojavi novo sporočilo v klepetu, medtem ko sem neprijavljen", - "send_post_notifications": "Pošlji mi e-pošto, če se pojavijo nove objave v temi, kateri sledim", "settings-require-reload": "Nekatere spremembe potrebujejo osvežitev strani. Pritisni tukaj za ponovno nalaganje.", "has_no_follower": "Uporabniku nihče ne sledi :(", "follows_no_one": "Uporabnik nikomur ne sledi :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Zvok za poslano sporočilo", "notification-sound": "Zvok obvestila", "no-sound": "Ni zvoka", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Preglej nastavitve", "open_links_in_new_tab": "Zunanje povezave odpri v novem zavihku", "enable_topic_searching": "Omogoči iskanje znotraj teme", @@ -123,6 +126,9 @@ "sso.title": "Storitev enotne prijave ", "sso.associated": "Povezan z", "sso.not-associated": "Click here to associate with", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 0e7b5ad6ab..60a5eadcfc 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -79,8 +79,6 @@ "digest_daily": "Дневно", "digest_weekly": "Седмично", "digest_monthly": "Месечно", - "send_chat_notifications": "Пошаљи е-поруку ако пристигне нова порука ћаскања а ја нисам на мрежи", - "send_post_notifications": "Пошаљи е-поруку када се појаве одговори на теме на које сам претплаћен", "settings-require-reload": "Неке измене у подешавањима захтевају поновно учитавање. Кликните овде да бисте поново учитали страницу.", "has_no_follower": "Овај корисник нема пратиоце :(", "follows_no_one": "Овај корисник не прати никога :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Звук одлазне поруке", "notification-sound": "Звук обавештења", "no-sound": "Без звука", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Подешавање прегледања", "open_links_in_new_tab": "Отвори одлазне везе у новој картици", "enable_topic_searching": "Омогући претрагу унутар тема", @@ -123,6 +126,9 @@ "sso.title": "Једноструки Sign-on сервиси", "sso.associated": "Повезано са", "sso.not-associated": "Кликните овде за повезивање са", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Најновије ознаке", "info.no-flags": "Нема пронађених означених порука", "info.ban-history": "Историја недавно забрањених налога", diff --git a/public/language/sv/user.json b/public/language/sv/user.json index 9b1749b9b3..2cb295f536 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -79,8 +79,6 @@ "digest_daily": "Dagligen", "digest_weekly": "Veckovis", "digest_monthly": "Månadsvis", - "send_chat_notifications": "Skicka ett e-postmeddelande om nya chatt-meddelanden tas emot när jag inte är online.", - "send_post_notifications": "Skicka ett e-postmeddelande när svar tillkommit på ämnen jag prenumererar på", "settings-require-reload": "Vissa inställningar som ändrades kräver att sidan laddas om. Klicka här för att ladda om sidan.", "has_no_follower": "Denna användare har inga följare :(", "follows_no_one": "Denna användare följer ingen :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Utgående meddelande ljud", "notification-sound": "Meddelandeljud", "no-sound": "Inget ljud", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Inställning för bläddring", "open_links_in_new_tab": "Öppna utgående länkar i ny flik", "enable_topic_searching": "Aktivera sökning inom ämne", @@ -123,6 +126,9 @@ "sso.title": "Single Sign-on-tjänster", "sso.associated": "Associerad med", "sso.not-associated": "Klicka här för att associera med", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Senaste flaggade", "info.no-flags": "Inga flaggade inlägg hittades", "info.ban-history": "Ban historik", diff --git a/public/language/th/user.json b/public/language/th/user.json index b4cb257cf5..0da95b8fa9 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -79,8 +79,6 @@ "digest_daily": "รายวัน", "digest_weekly": "รายสัปดาห์", "digest_monthly": "รายเดือน", - "send_chat_notifications": "ส่งอีเมลเมื่อมีข้อความใหม่เข้ามาขณะที่ฉันไม่ได้ออนไลน์", - "send_post_notifications": "ส่งอีเมลให้ฉันเมื่อมีการตอบกลับในหัวข้อที่ฉันเคยบอกรับเป็นสมาชิกไว้", "settings-require-reload": "การตั้งค่าบางอย่างต้องโหลดหน้าใหม่ คลิกที่นี่เพื่อโหลดหน้าใหม่", "has_no_follower": "ผู้ใช้รายนี้ไม่มีใครติดตาม :(", "follows_no_one": "ผู้ใช้รายนี้ไม่ติดตามใคร :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "เสียงข้อความออก", "notification-sound": "เสียงแจ้งเตือน", "no-sound": "ไม่มีเสียง", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "เปิดดูการตั้งค่า", "open_links_in_new_tab": "เปิดลิงค์ในแท็บใหม่", "enable_topic_searching": "เปิดใช้การค้นหาแบบ In-Topic", @@ -123,6 +126,9 @@ "sso.title": "บริการ Single Sign-on ", "sso.associated": "เกี่ยวข้องกับ", "sso.not-associated": "คลิกที่นี่เพื่อเชื่อมโยงกับ", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "ปักธงล่าสุด", "info.no-flags": "ไม่พบโพสต์ที่ถูกปักธง", "info.ban-history": "ประวัติแบนล่าสุด", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 809bb2ba47..cb287892cc 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -79,8 +79,6 @@ "digest_daily": "Günlük", "digest_weekly": "Haftalık", "digest_monthly": "Aylık", - "send_chat_notifications": "Çevrimiçi değilken gelen iletileri e-posta olarak gönder", - "send_post_notifications": "Abone olduğum konulara cevap gelince bana e-posta yolla", "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 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Giden ileti sesi", "notification-sound": "Bildirim sesi", "no-sound": "Ses yok", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Tarayıcı Ayaları", "open_links_in_new_tab": "Dışarı giden bağlantıları yeni sekmede aç", "enable_topic_searching": "Konu içi aramayı aktive et", @@ -123,6 +126,9 @@ "sso.title": "Tek giriş servisleri", "sso.associated": "Birleştirilmiş", "sso.not-associated": "Birleştirmek için buraya tıklayın", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Son Bayraklar", "info.no-flags": "Hiç bayraklanan bir ileti bulunamadı", "info.ban-history": "Yasaklama Olayları", diff --git a/public/language/uk/user.json b/public/language/uk/user.json index d483c8e14d..eabe845183 100644 --- a/public/language/uk/user.json +++ b/public/language/uk/user.json @@ -79,8 +79,6 @@ "digest_daily": "Щоденно", "digest_weekly": "Щотижнево", "digest_monthly": "Щомісячно", - "send_chat_notifications": "Надсилати листа, коли я не в мережі, якщо приходить чат повідомлення", - "send_post_notifications": "Надсилати листа, коли в темах на які я підписаний з'являються відповіді", "settings-require-reload": "Змінам певних налаштувань необхідне перевантаження. Натисніть тут, щоб перевантажити сторінку.", "has_no_follower": "Цей користувач не має відстежувачів :(", "follows_no_one": "Цей користувач нікого не відстежує :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Звук вихідного повідомлення", "notification-sound": "Звук сповіщення", "no-sound": "Без звуку", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Налаштування перегляду", "open_links_in_new_tab": "Відкривати зовнішні посилання у новій вкладці", "enable_topic_searching": "Увімкнути пошук у темах", @@ -123,6 +126,9 @@ "sso.title": "Сервіси єдиного входу", "sso.associated": "Зв'язані з", "sso.not-associated": "Натисніть тут, щоб зв'язати з", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Останні скарги", "info.no-flags": "Не знайдено постів зі скаргами", "info.ban-history": "Історія банів", diff --git a/public/language/vi/user.json b/public/language/vi/user.json index eb0b34313f..fb7413330f 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -79,8 +79,6 @@ "digest_daily": "Hàng ngày", "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": "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 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "Âm báo tin nhắn đi", "notification-sound": "Âm thanh thông báo", "no-sound": "Không có âm thanh", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "Đang xem cài đặt", "open_links_in_new_tab": "Mở link trong tab mới.", "enable_topic_searching": "Bật In-topic Searching", @@ -123,6 +126,9 @@ "sso.title": "Đăng nhập một lần", "sso.associated": "Đã liên kết với", "sso.not-associated": "Nhấn vào đây để liên kết với", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Cờ mới nhất", "info.no-flags": "Không có bài viết nào bị gắn c", "info.ban-history": "Lịch sử khóa tài khoản gần đây", diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index c6aa9f9d89..4cb132bc59 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -79,8 +79,6 @@ "digest_daily": "每天", "digest_weekly": "每周", "digest_monthly": "每月", - "send_chat_notifications": "当我不在线并收到新的聊天消息时,给我发送邮件通知", - "send_post_notifications": "当我订阅的主题有新回复时,给我发送邮件通知", "settings-require-reload": "某些设置变更需要刷新页面。点击这里刷新页面。", "has_no_follower": "此用户还没有粉丝 :(", "follows_no_one": "此用户尚未关注任何人 :(", @@ -103,6 +101,11 @@ "outgoing-message-sound": "消息送出提示音", "notification-sound": "通知提示音", "no-sound": "无提示音", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "浏览设置", "open_links_in_new_tab": "在新标签打开外部链接", "enable_topic_searching": "启用主题内搜索", @@ -123,6 +126,9 @@ "sso.title": "单点登录服务", "sso.associated": "已关联到", "sso.not-associated": "点击这里来关联", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "最新举报", "info.no-flags": "没有找到被举报的帖子", "info.ban-history": "最近封禁历史", diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index 190ce21484..0455cb32b7 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -79,8 +79,6 @@ "digest_daily": "每日", "digest_weekly": "每週", "digest_monthly": "每月", - "send_chat_notifications": "如果有新的聊天消息而我不在線,發送郵件給我", - "send_post_notifications": "當我訂閱的主題有新回覆時寄送Email給我", "settings-require-reload": "有些設定的更動是需要重新整理。點擊這裡來重新整理頁面。", "has_no_follower": "該使用者還沒有被任何人關注。", "follows_no_one": "該使用者還沒有關注過任何人。", @@ -103,6 +101,11 @@ "outgoing-message-sound": "發出訊息音效", "notification-sound": "通知音效", "no-sound": "沒有聲音", + "upvote-notif-freq": "Upvote Notification Frequency", + "upvote-notif-freq.all": "All Upvotes", + "upvote-notif-freq.everyTen": "Every Ten Upvotes", + "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", + "upvote-notif-freq.disabled": "Disabled", "browsing": "瀏覽設定", "open_links_in_new_tab": "在新的資料標籤裡打開外部的連結", "enable_topic_searching": "啟用在主題中的搜尋", @@ -123,6 +126,9 @@ "sso.title": "單一簽入SSO服務", "sso.associated": "關連於", "sso.not-associated": "點擊這裡進行關連於", + "sso.dissociate": "Dissociate", + "sso.dissociate-confirm-title": "Confirm Dissociation", + "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "最近標註", "info.no-flags": "沒有找到標註的張貼", "info.ban-history": "最近禁用歷史", From d96674da64308f1265b99036cac90905029f8a24 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 Nov 2017 19:13:43 -0500 Subject: [PATCH 52/81] add test for composer fix --- src/controllers/composer.js | 10 +++++----- test/controllers.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/controllers/composer.js b/src/controllers/composer.js index 3bc95fae4a..7bd61a5bb2 100644 --- a/src/controllers/composer.js +++ b/src/controllers/composer.js @@ -8,15 +8,15 @@ var plugins = require('../plugins'); var topics = require('../topics'); var helpers = require('./helpers'); -exports.get = function (req, res, next) { +exports.get = function (req, res, callback) { async.waterfall([ - function (_next) { + function (next) { plugins.fireHook('filter:composer.build', { req: req, res: res, - next: next, + next: callback, templateData: {}, - }, _next); + }, next); }, function (data) { if (data.templateData.disabled) { @@ -28,7 +28,7 @@ exports.get = function (req, res, next) { res.render('compose', data.templateData); } }, - ], next); + ], callback); }; exports.post = function (req, res) { diff --git a/test/controllers.js b/test/controllers.js index 213472d548..6293f60e2f 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -2036,6 +2036,27 @@ describe('Controllers', function () { }); }); + it('should 404 if plugin calls next', function (done) { + function hookMethod(hookData, callback) { + hookData.next(); + } + + plugins.registerHook('myTestPlugin', { + hook: 'filter:composer.build', + method: hookMethod, + }); + + request(nconf.get('url') + '/api/compose', { json: true }, function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 404); + console.log(body); + + plugins.unregisterHook('myTestPlugin', 'filter:composer.build', hookMethod); + done(); + }); + }); + + it('should error with invalid data', function (done) { request.post(nconf.get('url') + '/compose', { form: { From 54b12119e930f95717c6a9929983d260988cb790 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 Nov 2017 20:08:55 -0500 Subject: [PATCH 53/81] add registered query param --- public/src/client/register.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/public/src/client/register.js b/public/src/client/register.js index fe738418fe..5d1794e9d3 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -85,7 +85,13 @@ define('forum/register', ['translator', 'zxcvbn'], function (translator, zxcvbn) return; } if (data.referrer) { - window.location.href = data.referrer; + var pathname = utils.urlToLocation(data.referrer).pathname; + + var params = utils.params({ url: data.referrer }); + params.registered = true; + var qs = decodeURIComponent($.param(params)); + + window.location.href = pathname + '?' + qs; } else if (data.message) { translator.translate(data.message, function (msg) { bootbox.alert(msg); From 373ee17a126b3e390fa2a4446ca537a6c2f14155 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 24 Nov 2017 09:25:02 +0000 Subject: [PATCH 54/81] Latest translations and fallbacks --- public/language/de/admin/manage/post-queue.json | 2 +- public/language/de/admin/menu.json | 2 +- .../language/de/admin/settings/pagination.json | 4 ++-- public/language/de/error.json | 6 +++--- public/language/de/flags.json | 8 ++++---- public/language/de/pages.json | 2 +- public/language/de/unread.json | 4 ++-- public/language/de/user.json | 16 ++++++++-------- public/language/fa-IR/error.json | 12 ++++++------ public/language/fa-IR/flags.json | 2 +- public/language/fa-IR/global.json | 8 ++++---- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/public/language/de/admin/manage/post-queue.json b/public/language/de/admin/manage/post-queue.json index 4c6686e57d..e36b4de07e 100644 --- a/public/language/de/admin/manage/post-queue.json +++ b/public/language/de/admin/manage/post-queue.json @@ -7,5 +7,5 @@ "content": "Inhalt", "posted": "Gepostet", "reply-to": "Auf \"%1\" antworten", - "content-editable": "You can click on individual content to edit before posting." + "content-editable": "Du kannst auf den einzelnen Inhalt klicken um ihn zu ändern bevor du ihn postest." } \ No newline at end of file diff --git a/public/language/de/admin/menu.json b/public/language/de/admin/menu.json index 228ae81121..6184c1b671 100644 --- a/public/language/de/admin/menu.json +++ b/public/language/de/admin/menu.json @@ -65,7 +65,7 @@ "logout": "Abmelden", "view-forum": "Forum anzeigen", - "search.placeholder": "Search for settings", + "search.placeholder": "Nach Einstellungen suchen", "search.no-results": "Keine Ergebnisse...", "search.search-forum": "Suche im Forum nach ", "search.keep-typing": "Gib mehr ein, um die Ergebnisse zu sehen...", diff --git a/public/language/de/admin/settings/pagination.json b/public/language/de/admin/settings/pagination.json index 960cf3d0be..69d4f4484d 100644 --- a/public/language/de/admin/settings/pagination.json +++ b/public/language/de/admin/settings/pagination.json @@ -3,9 +3,9 @@ "enable": "Themen in Seiten einteilen anstatt endlos zu scrollen", "topics": "Themen Seitennummerierung", "posts-per-page": "Beiträge pro Seite", - "max-posts-per-page": "Maximum posts per page", + "max-posts-per-page": "Maximale Anzahl von Beiträgen pro Seite", "categories": "Kategorie Seitennummerierung", "topics-per-page": "Themen pro Seite", - "max-topics-per-page": "Maximum topics per page", + "max-topics-per-page": "Maximale Anzahl von Themen pro Seite", "initial-num-load": "Ursprüngliche Anzahl an Themen, die bei ungelesen, aktuell und beliebt geladen werden sollen" } \ No newline at end of file diff --git a/public/language/de/error.json b/public/language/de/error.json index 4f9f333e5d..05b944a09b 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -11,7 +11,7 @@ "invalid-uid": "Ungültige Benutzer-ID", "invalid-username": "Ungültiger Benutzername", "invalid-email": "Ungültige E-Mail-Adresse", - "invalid-title": "Invalid title", + "invalid-title": "Ungültiger Titel", "invalid-user-data": "Ungültige Benutzerdaten", "invalid-password": "Ungültiges Passwort", "invalid-login-credentials": "Ungültige Zugangsdaten", @@ -81,7 +81,7 @@ "cant-ban-other-admins": "Du kannst andere Administratoren nicht sperren!", "cant-remove-last-admin": "Du bist der einzige Administrator. Füge zuerst einen anderen Administrator hinzu, bevor du dich selbst als Administrator entfernst", "cant-delete-admin": "Bevor du versuchst dieses Konto zu löschen, entferne die zugehörigen Administratorrechte.", - "invalid-image": "Invalid image", + "invalid-image": "Ungültiges Bild", "invalid-image-type": "Falsche Bildart. Erlaubte Arten sind: %1", "invalid-image-extension": "Ungültige Dateinamenerweiterung", "invalid-file-type": "Ungültiger Dateityp. Erlaubte Typen sind: %1", @@ -119,7 +119,7 @@ "not-enough-reputation-to-downvote": "Dein Ansehen ist zu niedrig, um diesen Beitrag negativ zu bewerten.", "not-enough-reputation-to-flag": "Dein Ansehen ist zu niedrig, um diesen Beitrag zu melden", "already-flagged": "Du hast diesen Beitrag bereits gemeldet", - "self-vote": "You cannot vote on your own post", + "self-vote": "Du kannst deine eigenen Beiträge nicht bewerten", "reload-failed": "Es ist ein Problem während des Reloads von NodeBB aufgetreten: \"%1\". NodeBB wird weiterhin clientseitige Assets bereitstellen, allerdings solltest du das, was du vor dem Reload gemacht hast, rückgängig machen.", "registration-error": "Registrierungsfehler", "parse-error": "Beim auswerten der Serverantwort ist etwas schiefgegangen", diff --git a/public/language/de/flags.json b/public/language/de/flags.json index 78ac4b540d..9ef54211e3 100644 --- a/public/language/de/flags.json +++ b/public/language/de/flags.json @@ -54,11 +54,11 @@ "modal-body": "Bitte geben Sie den Grund an, weshalb Sie %1 %2 melden wollen. Alternativ können Sie einen der Schnell-Meldungs-Knöpfe verwenden, wenn anwendbar.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Beleidigend", - "modal-reason-other": "Other (specify below)", + "modal-reason-other": "Anderer (unten Angegeben)", "modal-reason-custom": "Grund für die Meldung dieses Inhalts...", "modal-submit": "Meldung abschicken", "modal-submit-success": "Der Inhalt wurde gemeldet.", - "modal-submit-confirm": "Confirm Submission", - "modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?", - "modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined." + "modal-submit-confirm": "Einreichung bestätigen", + "modal-submit-confirm-text": "Du hast bereits einen benutzerdefinierten Grund angegeben. Bis du sicher, dass du per schnell-funktion abschicken willst?", + "modal-submit-confirm-text-help": "Das einreichen per schnell-funktion werden alle näher angegebenen Gründe ignoriert." } \ No newline at end of file diff --git a/public/language/de/pages.json b/public/language/de/pages.json index 0a30df43ac..7c6d59d6e5 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -44,7 +44,7 @@ "account/bookmarks": "Lesezeichen von %1", "account/settings": "Benutzer-Einstellungen", "account/watched": "Von %1 beobachtete Themen", - "account/ignored": "Topics ignored by %1", + "account/ignored": "Ignorierte Themen von %1", "account/upvoted": "Von %1 positiv bewertete Beiträge", "account/downvoted": "Von %1 negativ bewertete Beiträge", "account/best": "Bestbewertete Beiträge von %1", diff --git a/public/language/de/unread.json b/public/language/de/unread.json index 4c2de5984c..ccfce6bbb5 100644 --- a/public/language/de/unread.json +++ b/public/language/de/unread.json @@ -10,6 +10,6 @@ "all-topics": "Alle Themen", "new-topics": "Neue Themen", "watched-topics": "Beobachtete Themen", - "unreplied-topics": "Unreplied Topics", - "multiple-categories-selected": "Multiple Selected" + "unreplied-topics": "Unbeantwortete Themen", + "multiple-categories-selected": "Mehrere ausgewählt" } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 0e15297afc..38a7934f42 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -101,11 +101,11 @@ "outgoing-message-sound": "Ton bei versendeter Nachricht", "notification-sound": "Benachrichtigungston ", "no-sound": "Kein Ton", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq": "Benachrichtigungshäufigkeit für positive Bewertungen", + "upvote-notif-freq.all": "Alle positiven Bewertungen", + "upvote-notif-freq.everyTen": "Alle 10 positiven Bewertungen", + "upvote-notif-freq.logarithmic": "Bei 10, 100, 1000...", + "upvote-notif-freq.disabled": "Deaktiviert", "browsing": "Browsing", "open_links_in_new_tab": "Ausgehende Links in neuem Tab öffnen", "enable_topic_searching": "Suchen innerhalb von Themen aktivieren", @@ -126,9 +126,9 @@ "sso.title": "Single Sign-on Dienste", "sso.associated": "Verbunden mit", "sso.not-associated": "Verbinde dich mit", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", + "sso.dissociate": "Trennen", + "sso.dissociate-confirm-title": "Trennung bestätigen", + "sso.dissociate-confirm": "Bist du sicher, dass du deinen Account von %1 trennen willst?", "info.latest-flags": "Neuste Meldungen", "info.no-flags": "Keine gemeldeten Beiträge gefunden", "info.ban-history": "Sperrungsverlauf", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 37aa99cb64..897e686487 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -18,7 +18,7 @@ "invalid-username-or-password": "لطفا هم نام کاربری و هم کلمه عبور را مشخص کنید", "invalid-search-term": "کلمه جستجو نامعتبر است", "csrf-invalid": "اجازه ورود شما تمام شده است، لطفا دوباره وارد شوید.", - "invalid-pagination-value": "ارزش گذاری صفحه نامعتبر است، کمترین مقدار 1% و بیشترین مقدار 2% باید باشد", + "invalid-pagination-value": "ارزش گذاری صفحه نامعتبر است، کمترین مقدار %1 و بیشترین مقدار %2 باید باشد", "username-taken": "این نام کاربری گرفته شده است.", "email-taken": "این ایمیل گرفته شده است.", "email-not-confirmed": "ایمیل شما تاکنون تایید نشده است، برای تایید ایمیل خود را اینجا را کلیک کنید.", @@ -26,7 +26,7 @@ "email-not-confirmed-email-sent": "ایمیل شما هنوز تایید نشده است، لطفا صندوق پیام های خود را برای تایید ایمیل بررسی کنید.", "no-email-to-confirm": "ایمیل شما تایید نشده است ، لطفا برای وارد کردن ایمیل اینجا کلیک کنید", "email-confirm-failed": "سیستم موفق به تایید ایمیل شما نشد، لطفا بعدا دوباره سعی کنید", - "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری بفرستید.", + "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری بفرستید.", "sendmail-not-found": "اجازه ارسال رایانامه پیدا نشد، لطفا مطمئن شوید این قابلیت نصب شده و توسط کاربر مد نظر در نود‌بی‌بی قابل اجرا است.", "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", @@ -61,14 +61,14 @@ "post-delete-duration-expired-days": "شما تنها می توانید %1 روز(ها) پس از فرستادن پست آن‌ را پاک کنید", "post-delete-duration-expired-days-hours": "شما تنها می توانید %1 روز(ها) %2 ساعت(ها) پس از فرستادن پست آن‌ را پاک کنید", "cant-delete-topic-has-reply": "اگر کسی به موضوع شما پاسخ داده باشد، نمیتوانید آنرا حذف نمائید", - "cant-delete-topic-has-replies": "اگر 1% به موضوع جواب داده شده باشد ، نمیتوانید آنرا حذف نمائید", + "cant-delete-topic-has-replies": "اگر %1 به موضوع جواب داده شده باشد ، نمیتوانید آنرا حذف نمائید", "content-too-short": "خواهشمندیم پست بلندتری بنویسید. پست‌ها دست‌کم باید %1 کاراکتر داشته باشند.", "content-too-long": "لطفا طول مطلب را کوتاه تر کنید. طول پست نمیتواند بیشتر از %1 کاراکتر باشد.", "title-too-short": "لطفا یک عنوان بلندتر وارد کنید. عنوان باید حداقل %1 کاراکتر داشته باشد.", "title-too-long": "لطفا یک عنوان بلندتر وارد کنید. عنوان باید حداقل %1 کاراکتر داشته باشد.", "category-not-selected": "هیچ دسته‌بندی انتخاب نشده.", "too-many-posts": "شما می توانید هر %1 ثانیه یک پست ایجاد کنید - لطفا قبل از ارسال پست جدید صبر کنید", - "too-many-posts-newbie": "به عنوان یک کاربر جدید ، تا زمانی که شما 2% اعتبار کسب کنید می توانید هر %1 ثانیه یک پست ایجاد کنید - لطفا قبل از ایجاد پست جدید صبر کنید .", + "too-many-posts-newbie": "به عنوان یک کاربر جدید ، تا زمانی که شما %2 اعتبار کسب کنید می توانید هر %1 ثانیه یک پست ایجاد کنید - لطفا قبل از ایجاد پست جدید صبر کنید .", "tag-too-short": "لطفا برچسب بلندتری وارد کنید. برچسبها باید حداقل %1 کاراکتر داشته باشند.", "tag-too-long": "لطفا برچسب کوتاه تری وارد کنید . برچسب ها نباید بیشتر از %1 کاراکتر داشته باشند", "not-enough-tags": "تعداد برچسب ها کافی نیست. موضوع ها یابد حداقل %1 برچسب داشته باشند", @@ -118,8 +118,8 @@ "downvoting-disabled": "رأی منفی غیر فعال شده است", "not-enough-reputation-to-downvote": "شما اعتبار کافی برای دادن رأی منفی به این پست را ندارید.", "not-enough-reputation-to-flag": "شما اعتبار کافی برای نشاندار کردن این پست ندارید", - "already-flagged": "شما قبلا این پست را پرچمگذاری کرده اید", - "self-vote": "You cannot vote on your own post", + "already-flagged": "شما قبلا این پست را گزارش کرده اید", + "self-vote": "شما نمی توانید به پست خود رای بدهید", "reload-failed": "NodeBB در هنگام بارگذاری مجدد با یک مشکل مواجه شده است: \"%1\". NodeBB سرویس رسانی به کلاینت های سرویس گیرنده را ادامه خواهد داد، اگرچه شما کاری را قبل از بارگیری مجدد انجام دادید بازگردانی کنید", "registration-error": "خطای ثبت نام", "parse-error": "هنگام تجزیه پاسخ سرور اشتباهی پیش امد", diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index 588c6fb38b..2a25fd56c8 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -51,7 +51,7 @@ "note-added": "یادداشت افزوده شد", "modal-title": "گزارش محتوای نامناسب", - "modal-body": "لطفا علت گزارش 1% 2% را برای بررسی مشخص کنید. همچنین می توانید از یکی از دکمه های ارسال سریع استفاده کنید.", + "modal-body": "لطفا علت گزارش %2 %1 را برای بررسی مشخص کنید. همچنین می توانید از یکی از دکمه های ارسال سریع استفاده کنید.", "modal-reason-spam": "هرزنامه", "modal-reason-offensive": "توهین آمیز", "modal-reason-other": "دیگر (در زیر مشخص کنید)", diff --git a/public/language/fa-IR/global.json b/public/language/fa-IR/global.json index 6494a06de6..a9c2c21d58 100644 --- a/public/language/fa-IR/global.json +++ b/public/language/fa-IR/global.json @@ -22,7 +22,7 @@ "save": "ذخیره", "close": "بستن", "pagination": "صفحه‌بندی", - "pagination.out_of": "%1 از %2", + "pagination.out_of": "1% از %2", "pagination.enter_index": "شماره را وارد کنید", "header.admin": "مدیر", "header.categories": "دسته بندیها", @@ -53,9 +53,9 @@ "topics": "موضوع ها", "posts": "دیدگاه‌ها", "best": "بهترین", - "upvoters": "رای مثبت‌ها", + "upvoters": "موافقین", "upvoted": "رای مثبت", - "downvoters": "رای منفی‌ها", + "downvoters": "مخالفین", "downvoted": "رای منفی", "views": "بازدیدها", "reputation": "اعتبار", @@ -68,7 +68,7 @@ "posted_in_by": "پشت شده در %1 توسط 2%", "posted_in_ago": "ارسال شده در %1 %2", "posted_in_ago_by": "ارسال شده در %1 %2 توسط %3", - "user_posted_ago": "%1 در %2 ارسال کرده است", + "user_posted_ago": "1% در %2 ارسال کرده است", "guest_posted_ago": "مهمان در %1 ارسال کرده است", "last_edited_by": "آخرین ویرایش توسط %1 انجام شده", "norecentposts": "هیچ دیدگاه تازه‌ای نیست", From d34f3c72479c12ae00757e586db795a39952fbe0 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 25 Nov 2017 09:25:25 +0000 Subject: [PATCH 55/81] Latest translations and fallbacks --- public/language/bg/user.json | 18 +++++++------- public/language/ru/admin/advanced/cache.json | 4 ++-- .../language/ru/admin/advanced/database.json | 24 +++++++++---------- public/language/ru/admin/advanced/errors.json | 4 ++-- public/language/ru/admin/advanced/logs.json | 8 +++---- .../ru/admin/appearance/customise.json | 14 +++++------ .../ru/admin/manage/registration.json | 2 +- .../language/ru/admin/settings/cookies.json | 2 +- public/language/ru/flags.json | 2 +- public/language/ru/users.json | 2 +- 10 files changed, 40 insertions(+), 40 deletions(-) diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 08c87fb78b..c1d6f314e7 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -85,7 +85,7 @@ "has_no_posts": "Този потребител не е публикувал нищо досега.", "has_no_topics": "Този потребител не е създавал теми досега.", "has_no_watched_topics": "Този потребител не е следил нито една тема досега.", - "has_no_ignored_topics": "Този потребител не е пренебрегнали нито една тема досега.", + "has_no_ignored_topics": "Този потребител не е пренебрегнал нито една тема досега.", "has_no_upvoted_posts": "Този потребител не е гласувал положително досега.", "has_no_downvoted_posts": "Този потребител не е гласувал отрицателно досега.", "has_no_voted_posts": "Този потребител не е гласувал досега.", @@ -101,11 +101,11 @@ "outgoing-message-sound": "Звук за изходящо съобщение", "notification-sound": "Звук за известие", "no-sound": "Без звук", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq": "Честота на известията за положителни гласове", + "upvote-notif-freq.all": "Всички положителни гласове", + "upvote-notif-freq.everyTen": "На всеки десет положителни гласа", + "upvote-notif-freq.logarithmic": "На 10, 100, 1000…", + "upvote-notif-freq.disabled": "Изключено", "browsing": "Настройки за страниците", "open_links_in_new_tab": "Отваряне на външните връзки в нов подпрозорец", "enable_topic_searching": "Включване на търсенето в темите", @@ -126,9 +126,9 @@ "sso.title": "Услуги за еднократно вписване", "sso.associated": "Свързан с", "sso.not-associated": "Натиснете тук, за да свържете с", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", + "sso.dissociate": "Прекъсване на връзката", + "sso.dissociate-confirm-title": "Потвърждаване на прекъсването", + "sso.dissociate-confirm": "Наистина ли искате да прекъснете връзката на акаунта си от „%1“?", "info.latest-flags": "Последни доклади", "info.no-flags": "Не са намерени докладвани публикации", "info.ban-history": "Скорошна история на блокиранията", diff --git a/public/language/ru/admin/advanced/cache.json b/public/language/ru/admin/advanced/cache.json index 70e88bd261..b882409255 100644 --- a/public/language/ru/admin/advanced/cache.json +++ b/public/language/ru/admin/advanced/cache.json @@ -3,9 +3,9 @@ "posts-in-cache": "Закешировано сообщений", "average-post-size": "Средний размер сообщения", "length-to-max": "Размер / Максимум", - "percent-full": "%1% Full", + "percent-full": "Заполнен на%1%", "post-cache-size": "Размер кэша сообщений", - "items-in-cache": "Items in Cache", + "items-in-cache": "Элементы в Кэш", "control-panel": "Панель управления", "update-settings": "Обновить настройки кэша" } \ No newline at end of file diff --git a/public/language/ru/admin/advanced/database.json b/public/language/ru/admin/advanced/database.json index 50e8aae0aa..9687a6b8e9 100644 --- a/public/language/ru/admin/advanced/database.json +++ b/public/language/ru/admin/advanced/database.json @@ -1,36 +1,36 @@ { "x-b": "%1 байт", - "x-mb": "%1 мегабайт", - "x-gb": "%1 gb", + "x-mb": "%1 Мб", + "x-gb": "%1 Гб", "uptime-seconds": "Время работы в секундах", "uptime-days": "Время работы в днях", "mongo": "Mongo", "mongo.version": "Версия MongoDB", - "mongo.storage-engine": "Storage Engine", + "mongo.storage-engine": "Система хранения", "mongo.collections": "Коллекции", "mongo.objects": "Документы", "mongo.avg-object-size": "Средний размер документа", "mongo.data-size": "Размер данных", "mongo.storage-size": "Размер хранилища", - "mongo.index-size": "Index Size", + "mongo.index-size": "Размер Индекса", "mongo.file-size": "Размер файла", - "mongo.resident-memory": "Resident Memory", + "mongo.resident-memory": "Долгосрочная память", "mongo.virtual-memory": "Виртуальная память", - "mongo.mapped-memory": "Mapped Memory", + "mongo.mapped-memory": "Расширенная память", "mongo.raw-info": "Сырые данные о MongoDB", "redis": "Redis", "redis.version": "Версия Redis", "redis.connected-clients": "Подключенные клиенты", - "redis.connected-slaves": "Connected Slaves", + "redis.connected-slaves": "Подключенные устройства", "redis.blocked-clients": "Заблокированные клиенты", "redis.used-memory": "Используемая Память", - "redis.memory-frag-ratio": "Memory Fragmentation Ratio", + "redis.memory-frag-ratio": "Коэффициент фрагментации памяти", "redis.total-connections-recieved": "Общее число подключений получено", "redis.total-commands-processed": "Команд обработано в общем", - "redis.iops": "Instantaneous Ops. Per Second", - "redis.keyspace-hits": "Keyspace Hits", - "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info" + "redis.iops": "Мгновенные операции. в секунду", + "redis.keyspace-hits": "Количество ключевых просмотров", + "redis.keyspace-misses": "Количество не ключевых просмотров", + "redis.raw-info": "Redis необработанная информация" } \ No newline at end of file diff --git a/public/language/ru/admin/advanced/errors.json b/public/language/ru/admin/advanced/errors.json index b3185f3cdb..5134a7408a 100644 --- a/public/language/ru/admin/advanced/errors.json +++ b/public/language/ru/admin/advanced/errors.json @@ -4,8 +4,8 @@ "error.404": "404 Не найдено", "error.503": "503 Сервис недоступен", "manage-error-log": "Управление журналами ошибок", - "export-error-log": "Export Error Log (CSV)", - "clear-error-log": "Clear Error Log", + "export-error-log": "Экспорт логи ошибок (CSV)", + "clear-error-log": "Очистить логи ошибок", "route": "Путь", "count": "Кол-во", "no-routes-not-found": "Ура! Ошибок 404 нет!", diff --git a/public/language/ru/admin/advanced/logs.json b/public/language/ru/admin/advanced/logs.json index 5b91d16f4a..971dec1cf5 100644 --- a/public/language/ru/admin/advanced/logs.json +++ b/public/language/ru/admin/advanced/logs.json @@ -1,7 +1,7 @@ { "logs": "Логи", - "control-panel": "Logs Control Panel", - "reload": "Reload Logs", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "control-panel": "Логирование контрольной панели", + "reload": "Перезагрузить Логи", + "clear": "Очистить Логи", + "clear-success": "Логи очищены!" } \ No newline at end of file diff --git a/public/language/ru/admin/appearance/customise.json b/public/language/ru/admin/appearance/customise.json index dfed0bf11c..56bfbb64cb 100644 --- a/public/language/ru/admin/appearance/customise.json +++ b/public/language/ru/admin/appearance/customise.json @@ -1,12 +1,12 @@ { "custom-css": "Свой CSS", - "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", - "custom-css.enable": "Enable Custom CSS", + "custom-css.description": "Введите свои собственные данные CSS здесь, которые будут применяться после всех других стилей.", + "custom-css.enable": "Включить пользовательский CSS", - "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", - "custom-header.enable": "Enable Custom Header", + "custom-header": "Пользовательский Заголовок", + "custom-header.description": "Введите HTML код здесь (например, JavaScript, метатеги и т. Д.), для добавления в раздел & lt; head & gt; разметки вашего форума.", + "custom-header.enable": "Включить Пользовательский заголовок", - "custom-css.livereload": "Enable Live Reload", - "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" + "custom-css.livereload": "Включить автоматическую перезагрузку страниц", + "custom-css.livereload.description": "Включите эту опцию, чтобы принудительно обновлять все сеансы на каждом устройстве под этой учетной записью при каждом нажатии кнопки Сохранить" } \ No newline at end of file diff --git a/public/language/ru/admin/manage/registration.json b/public/language/ru/admin/manage/registration.json index f51b4d56e6..feb44fc50a 100644 --- a/public/language/ru/admin/manage/registration.json +++ b/public/language/ru/admin/manage/registration.json @@ -11,7 +11,7 @@ "list.ip-spam": "Frequency: %1 Appears: %2", "invitations": "Invitations", - "invitations.description": "Below is a complete list of invitations sent. Use ctrl-f to search through the list by email or username.

The username will be displayed to the right of the emails for users who have redeemed their invitations.", + "invitations.description": "Ниже приведен полный список отправленных приглашений. Для поиска по списку по электронной почте или имени пользователя используйте сочетание клавиш CTRL+F . < br > < br > Имена пользователей, которые приняли приглашение, будут отображаться справа от электронной почты.", "invitations.inviter-username": "Inviter Username", "invitations.invitee-email": "Invitee Email", "invitations.invitee-username": "Invitee Username (if registered)", diff --git a/public/language/ru/admin/settings/cookies.json b/public/language/ru/admin/settings/cookies.json index f8b0f0538b..d4954c13c3 100644 --- a/public/language/ru/admin/settings/cookies.json +++ b/public/language/ru/admin/settings/cookies.json @@ -1,5 +1,5 @@ { - "eu-consent": "EU Consent", + "eu-consent": "Соглашение", "consent.enabled": "Enabled", "consent.message": "Notification message", "consent.acceptance": "Acceptance message", diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index ad87949c79..4f105ca1d3 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -17,7 +17,7 @@ "filter-targetUid": "Flagged UID", "filter-type": "Flag Type", "filter-type-all": "Весь контент", - "filter-type-post": "Post", + "filter-type-post": "Написать", "filter-state": "State", "filter-assignee": "Assignee UID", "filter-cid": "Категория", diff --git a/public/language/ru/users.json b/public/language/ru/users.json index f60ce7acf9..ef9f975dee 100644 --- a/public/language/ru/users.json +++ b/public/language/ru/users.json @@ -2,7 +2,7 @@ "latest_users": "Новые пользователи", "top_posters": "Самые активные", "most_reputation": "Лучшая репутация", - "most_flags": "Больше всего отмеченных сообщений", + "most_flags": "Больше всего отмеченных", "search": "Поиск", "enter_username": "Введите имя пользователя для поиска", "load_more": "Загрузить еще", From 5354ac6b10ccc474e4fc0d054acd5cde7fa10b61 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 26 Nov 2017 09:25:18 +0000 Subject: [PATCH 56/81] Latest translations and fallbacks --- .../language/ko/admin/general/dashboard.json | 4 ++-- .../language/ko/admin/general/navigation.json | 2 +- .../language/ko/admin/manage/post-queue.json | 18 +++++++++--------- public/language/ko/admin/menu.json | 4 ++-- .../language/ko/admin/settings/pagination.json | 4 ++-- public/language/ko/admin/settings/post.json | 4 ++-- public/language/ko/notifications.json | 2 +- public/language/ko/success.json | 2 +- public/language/ko/unread.json | 4 ++-- public/language/ko/user.json | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/public/language/ko/admin/general/dashboard.json b/public/language/ko/admin/general/dashboard.json index 61879612aa..d56ec7fb1b 100644 --- a/public/language/ko/admin/general/dashboard.json +++ b/public/language/ko/admin/general/dashboard.json @@ -23,8 +23,8 @@ "running-version": "NodeBB v%1 를 사용 중입니다.", "keep-updated": "사용하시는 NodeBB의 보안 및 오류 업데이트를 항상 최신 버젼으로 유지하십시오.", "up-to-date": "

최신 버전입니다

", - "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", - "prerelease-upgrade-available": "

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

", + "upgrade-available": "

새로운 버전 (v%1)이 나왔습니다. NodeBB 업데이트가 가능합니다.

", + "prerelease-upgrade-available": "

NodeBB의 시험판을 사용중입니다. 새 버전 (v%1)이 출시되었습니다. NodeBB 업데이트를 하세요.

", "prerelease-warning": "

이것은 정식 발표 전 버젼의 NodeBB 입니다. 예상치 못한 버그가 발생할 수 있습니다.

", "running-in-development": "포럼이 개발자 모드로 실행되고 있습니다. 잠재적 취약점에 노출되어 있을 수 있으니 시스템 관리자에게 문의하십시오.", diff --git a/public/language/ko/admin/general/navigation.json b/public/language/ko/admin/general/navigation.json index f3c2940a65..81ad60c94c 100644 --- a/public/language/ko/admin/general/navigation.json +++ b/public/language/ko/admin/general/navigation.json @@ -11,7 +11,7 @@ "only-admins": "관리자에게만 보이기", "only-global-mods-and-admins": "(준)관리자와 관리자에게만 보이기", "only-logged-in": "로그인한 사용자에게만 보이기", - "only-guest": "Only display to guests", + "only-guest": "게스트에게만 보이기", "open-new-window": "새 창에서 열기", "installed-plugins-required": "설치된 플러그인 필수:", diff --git a/public/language/ko/admin/manage/post-queue.json b/public/language/ko/admin/manage/post-queue.json index 4de24c991b..176d740765 100644 --- a/public/language/ko/admin/manage/post-queue.json +++ b/public/language/ko/admin/manage/post-queue.json @@ -1,11 +1,11 @@ { - "post-queue": "Post Queue", - "description": "There are no posts in the post queue.
To enable this feature, go to Settings → Post → Posting Restrictions and enable Post Queue.", - "user": "User", - "category": "Category", - "title": "Title", - "content": "Content", - "posted": "Posted", - "reply-to": "Reply to \"%1\"", - "content-editable": "You can click on individual content to edit before posting." + "post-queue": "게시 대기열", + "description": "게시 대기열에 글이 없습니다.
이 기능을 사용하려면 설정 → 글→ 게시대기에서게시대기를 활성화 하세요.", + "user": "사용자", + "category": "카테고리", + "title": "제목", + "content": "컨텐츠", + "posted": "작성됨", + "reply-to": "'%1'에 대한 답글", + "content-editable": "게시하기 전에 콘텐츠를 클릭하여 편집 할 수 있습니다." } \ No newline at end of file diff --git a/public/language/ko/admin/menu.json b/public/language/ko/admin/menu.json index 4312e0a704..f83425652a 100644 --- a/public/language/ko/admin/menu.json +++ b/public/language/ko/admin/menu.json @@ -12,7 +12,7 @@ "manage/tags": "태그", "manage/users": "용자", "manage/registration": "회원 가입 승인 대기자", - "manage/post-queue": "Post Queue", + "manage/post-queue": "게시 대기열", "manage/groups": "그룹", "manage/ip-blacklist": "IP 블랙리스트", @@ -65,7 +65,7 @@ "logout": "로그아웃", "view-forum": "포럼 보기", - "search.placeholder": "Search for settings", + "search.placeholder": "설정 검색", "search.no-results": "검색 결과가 없습니다...", "search.search-forum": "포럼에서 를 검색하세요", "search.keep-typing": "검색 결과를 보기 위해 더 입력하세요...", diff --git a/public/language/ko/admin/settings/pagination.json b/public/language/ko/admin/settings/pagination.json index 5a5ef4fdab..ebcc672f9a 100644 --- a/public/language/ko/admin/settings/pagination.json +++ b/public/language/ko/admin/settings/pagination.json @@ -3,9 +3,9 @@ "enable": "무한 스크롤 대신 페이지로 주제와 포스트 보여주기", "topics": "주제 페이지", "posts-per-page": "페이지 당 포스트", - "max-posts-per-page": "Maximum posts per page", + "max-posts-per-page": "페이지당 최대 포스트수", "categories": "카테고리 페이지", "topics-per-page": "페이지 당 주제 수", - "max-topics-per-page": "Maximum topics per page", + "max-topics-per-page": "페이지당 최대 게시물 수", "initial-num-load": "읽지 않은 글, 최근 작성 글, 인기 글 게시판에서 처음 보여줄 게시글 개수" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/post.json b/public/language/ko/admin/settings/post.json index 6c711c797e..92f395e335 100644 --- a/public/language/ko/admin/settings/post.json +++ b/public/language/ko/admin/settings/post.json @@ -6,8 +6,8 @@ "sorting.most-votes": "추천수 순으로 정렬", "sorting.topic-default": "게시물 정렬기준 기본값", "restrictions": "글 작성 제약사항", - "restrictions.post-queue": "Enable post queue", - "restrictions.post-queue-help": "Enabling post queue will put the posts of new users in a queue for approval.", + "restrictions.post-queue": "게시 대기열 사용", + "restrictions.post-queue-help": "게시 대기열을 사용하면 사용자의 게시물이 대기열에 넣어집니다.", "restrictions.seconds-between": "글 작성 간 시간(초)", "restrictions.seconds-between-new": "신규 사용자인 경우, 글 작성 간 시간(초)", "restrictions.rep-threshold": "위 제약을 해제하기 위한 최소 등급", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 76d9cb9830..0b8ecd1f8e 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -41,7 +41,7 @@ "new_register": "%1님이 가입요청을 했습니다.", "new_register_multiple": "%1 개의 회원가입 요청이 승인 대기중입니다.", "flag_assigned_to_you": "신고 ID %1 이 나에게 배정되었습니다.", - "post_awaiting_review": "Post awaiting review", + "post_awaiting_review": "검토중인 게시물", "email-confirmed": "이메일 인증 되었습니다", "email-confirmed-message": "이메일을 인증해주셔서 감사합니다. 계정이 완전히 활성화되었습니다.", "email-confirm-error-message": "이메일 주소를 인증하지 못했습니다. 코드가 올바르지 않거나 만료 되었을 수 있습니다.", diff --git a/public/language/ko/success.json b/public/language/ko/success.json index c671b6a09a..b910a81055 100644 --- a/public/language/ko/success.json +++ b/public/language/ko/success.json @@ -1,7 +1,7 @@ { "success": "성공", "topic-post": "성공적으로 게시물을 작성했습니다.", - "post-queued": "Your post is queued for approval.", + "post-queued": "게시물이 승인 대기 중입니다.", "authentication-successful": "인증에 성공했습니다.", "settings-saved": "설정이 저장되었습니다!" } \ No newline at end of file diff --git a/public/language/ko/unread.json b/public/language/ko/unread.json index d508cae95c..48a092c25e 100644 --- a/public/language/ko/unread.json +++ b/public/language/ko/unread.json @@ -10,6 +10,6 @@ "all-topics": "모든 게시물", "new-topics": "새 게시물", "watched-topics": "관심있는 게시물", - "unreplied-topics": "Unreplied Topics", - "multiple-categories-selected": "Multiple Selected" + "unreplied-topics": "해결되지 않은 주제", + "multiple-categories-selected": "다중선택됨" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index dc2826829e..a06592b287 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -94,7 +94,7 @@ "paginate_description": "주제와 게시물을 페이지로 정리", "topics_per_page": "페이지 당 게시물 수", "posts_per_page": "페이지 당 포스트 수", - "max_items_per_page": "Maximum %1", + "max_items_per_page": "최대 %1 ", "notification_sounds": "알림 수신시 소리로 알려주기", "notifications_and_sounds": "알림 / 알림음 설정", "incoming-message-sound": "수신 메시지 알림음", From d47c5fae046148b89dba59267beee9b325657bd8 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 27 Nov 2017 09:26:00 +0000 Subject: [PATCH 57/81] Latest translations and fallbacks --- public/language/fa-IR/error.json | 8 ++++---- public/language/fa-IR/global.json | 6 +++--- public/language/fa-IR/notifications.json | 14 +++++++------- public/language/fa-IR/user.json | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 897e686487..2a36ceaa96 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -26,14 +26,14 @@ "email-not-confirmed-email-sent": "ایمیل شما هنوز تایید نشده است، لطفا صندوق پیام های خود را برای تایید ایمیل بررسی کنید.", "no-email-to-confirm": "ایمیل شما تایید نشده است ، لطفا برای وارد کردن ایمیل اینجا کلیک کنید", "email-confirm-failed": "سیستم موفق به تایید ایمیل شما نشد، لطفا بعدا دوباره سعی کنید", - "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری بفرستید.", + "confirm-email-already-sent": "ایمیل فعال‌سازی قبلا فرستاده شده، لطفا %1 دقیقه صبر کنید تا ایمیل دیگری فرستاده شود.", "sendmail-not-found": "اجازه ارسال رایانامه پیدا نشد، لطفا مطمئن شوید این قابلیت نصب شده و توسط کاربر مد نظر در نود‌بی‌بی قابل اجرا است.", "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", "password-too-long": "کلمه عبور بسیار طولانیست", "user-banned": "کاربر اخراج شد", "user-banned-reason": "با عرض پوزش، این حساب کاربری از انجمن اخراج شده است (دلیل: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason-until": "با عرض پوزش، این حساب کاربری تا %1 اخراج شده است (دلیل: %2)", "user-too-new": "با عرض پوزش، شما باید %1 ثانیه پیش از فرستادن پست نخست خود صبر کنید", "blacklisted-ip": "با عرض پوزش فراوان، نشانی آی پی شما در این انجمن مسدود شده است، اگر فکر می‌کنید اشتباهی رخ داده با مدیریت انجمن تماس بگیرید.", "ban-expiry-missing": "لطفا تاریخ پایان برای این مسدود کردن ارائه دهید", @@ -125,8 +125,8 @@ "parse-error": "هنگام تجزیه پاسخ سرور اشتباهی پیش امد", "wrong-login-type-email": "لطفا از ایمیل خود برای ورود استفاده کنید", "wrong-login-type-username": "لطفا از نام کاربری خود برای ورود استفاده کنید", - "invite-maximum-met": "ظرفیت دعوت شما تکمیل شده است (1% از 2%)", - "no-session-found": "هیچ سشن ورودی یافت نشد!", + "invite-maximum-met": "ظرفیت دعوت شما تکمیل شده است (%1 از %2)", + "no-session-found": "هیچ session ورودی یافت نشد!", "not-in-room": "هیچ کاربری در این گفتگو نیست", "no-users-in-room": "هیچ کاربری در این گفتگو نیست", "cant-kick-self": "شما نمی توانید خودتان را از گروه کیک کنید", diff --git a/public/language/fa-IR/global.json b/public/language/fa-IR/global.json index a9c2c21d58..37b89f3405 100644 --- a/public/language/fa-IR/global.json +++ b/public/language/fa-IR/global.json @@ -22,7 +22,7 @@ "save": "ذخیره", "close": "بستن", "pagination": "صفحه‌بندی", - "pagination.out_of": "1% از %2", + "pagination.out_of": "%1 از %2", "pagination.enter_index": "شماره را وارد کنید", "header.admin": "مدیر", "header.categories": "دسته بندیها", @@ -65,10 +65,10 @@ "posted_ago_by": "ارسال شده در %1 توسط %2", "posted_ago": "ارسال شده در %1", "posted_in": "پست شده در %1", - "posted_in_by": "پشت شده در %1 توسط 2%", + "posted_in_by": "پست شده در %1 توسط %2", "posted_in_ago": "ارسال شده در %1 %2", "posted_in_ago_by": "ارسال شده در %1 %2 توسط %3", - "user_posted_ago": "1% در %2 ارسال کرده است", + "user_posted_ago": "%1 در %2 ارسال کرده است", "guest_posted_ago": "مهمان در %1 ارسال کرده است", "last_edited_by": "آخرین ویرایش توسط %1 انجام شده", "norecentposts": "هیچ دیدگاه تازه‌ای نیست", diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index 0bf284a28d..6e4bb7dbd2 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -14,11 +14,11 @@ "topics": "موضوع ها", "replies": "پاسخ ها", "chat": "گفتگو ها", - "follows": "Follows", + "follows": "دنبال کننده ها", "upvote": "رای های مثبت", "new-flags": "گزارش های جدید", - "my-flags": "گزارش ها به من اختصاص یافت", - "bans": "Bans", + "my-flags": "گزارش های اختصاص یافته به من", + "bans": "اخراجی ها", "new_message_from": "پیام تازه از %1", "upvoted_your_post_in": "%1 امتیاز مثبت به پست شما در %2 داده", "upvoted_your_post_in_dual": "%1 و %2 رای مثبت به پست شما در\n %3.", @@ -28,9 +28,9 @@ "user_flagged_post_in": "%1 پست شما را در %2 علامتدار کرده", "user_flagged_post_in_dual": "%1 و %2 نشانه‌گذاری کرده اند پست را در %3", "user_flagged_post_in_multiple": "%1 و %2 نفر دیگر این پست را نشانه‌گذاری کرده در %3", - "user_flagged_user": "1%کاربری را برای بررسی گزارش کرد (2%)", - "user_flagged_user_dual": "1%و 2%کاربری را برای بررسی گزارش کردند (3%)", - "user_flagged_user_multiple": "1%و 2% دیگران کاربری را برای بررسی گزارش کردند (3%)", + "user_flagged_user": "%1کاربری را برای بررسی گزارش کرد (%2)", + "user_flagged_user_dual": "%1و %2کاربری را برای بررسی گزارش کردند (%3)", + "user_flagged_user_multiple": "%1و %2 دیگران کاربری را برای بررسی گزارش کردند (%3)", "user_posted_to": "پاسخ دادن به %2 از سوی %1", "user_posted_to_dual": "%1 و %2 پاسخ به پست دادند در: %3", "user_posted_to_multiple": "%1 و %2 نفر دیگر به پست شما پاسخ ارسال کرده‌اند در: %3", @@ -40,7 +40,7 @@ "user_started_following_you_multiple": "%1 و %2 نفر دیگر شروع به دنبال کردن شما کرده.", "new_register": "%1 یک درخواست ثبت نام ارسال کرده است", "new_register_multiple": "تعداد %1 درخواست عضویت برای بررسی وجود دارد.", - "flag_assigned_to_you": "گزارش 1%به شما تعلق گرفت", + "flag_assigned_to_you": "گزارش %1به شما تعلق گرفت", "post_awaiting_review": "Post awaiting review", "email-confirmed": "ایمیل تایید شد", "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 5a2ec2f428..58273e0c09 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -58,7 +58,7 @@ "change_password_success": "کلمه عبور‌تان تازه شد.", "confirm_password": "تکرار کلمه عبور", "password": "گذرواژه", - "username_taken_workaround": "نام کاربری درخواستی شما در حال حاضر گرفته شده است، بنابراین ما آن را کمی تغییر داده‌ایم. شما هم‌اکنون با نام %1 Date: Mon, 27 Nov 2017 11:00:52 -0500 Subject: [PATCH 58/81] up persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index a89aeb20a6..0ebb881886 100644 --- a/install/package.json +++ b/install/package.json @@ -68,7 +68,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.1.3", + "nodebb-theme-persona": "7.1.5", "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.0", "nodebb-widget-essentials": "4.0.1", From 9b11413d14e5a151d14bfa72765f105ed3ebcb86 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Mon, 27 Nov 2017 10:42:10 -0700 Subject: [PATCH 59/81] Bundle admin scripts, remove CDN scripts (#6122) Close #6120 --- install/package.json | 1 + public/vendor/jquery/sortable/Sortable.js | 15 +-------------- src/meta/js.js | 19 +++++++++++++++++-- src/views/admin/header.tpl | 10 ---------- 4 files changed, 19 insertions(+), 26 deletions(-) diff --git a/install/package.json b/install/package.json index 0ebb881886..83871adc3b 100644 --- a/install/package.json +++ b/install/package.json @@ -52,6 +52,7 @@ "lodash": "^4.17.4", "logrotate-stream": "^0.2.5", "lru-cache": "4.1.1", + "material-design-lite": "^1.3.0", "mime": "^2.0.3", "mkdirp": "^0.5.1", "mongodb": "2.2.33", diff --git a/public/vendor/jquery/sortable/Sortable.js b/public/vendor/jquery/sortable/Sortable.js index cf0b5f047b..8835d14375 100644 --- a/public/vendor/jquery/sortable/Sortable.js +++ b/public/vendor/jquery/sortable/Sortable.js @@ -7,20 +7,7 @@ (function (factory) { "use strict"; - - if (typeof define === "function" && define.amd) { - define(factory); - } - else if (typeof module != "undefined" && typeof module.exports != "undefined") { - module.exports = factory(); - } - else if (typeof Package !== "undefined") { - Sortable = factory(); // export for Meteor.js - } - else { - /* jshint sub:true */ - window["Sortable"] = factory(); - } + window.Sortable = factory(); })(function () { "use strict"; diff --git a/src/meta/js.js b/src/meta/js.js index cac47834be..e3c988736b 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -76,6 +76,19 @@ JS.scripts = { 'public/src/modules/storage.js', ], + admin: [ + 'node_modules/material-design-lite/material.js', + 'public/vendor/jquery/sortable/Sortable.js', + 'public/vendor/colorpicker/colorpicker.js', + 'public/src/admin/admin.js', + 'public/vendor/semver/semver.browser.js', + 'public/vendor/jquery/serializeObject/jquery.ba-serializeobject.min.js', + 'public/vendor/jquery/deserialize/jquery.deserialize.min.js', + 'public/vendor/snackbar/snackbar.min.js', + 'public/vendor/slideout/slideout.min.js', + 'public/vendor/nprogress.min.js', + ], + // modules listed below are built (/src/modules) so they can be defined anonymously modules: { 'Chart.js': 'node_modules/chart.js/dist/Chart.min.js', @@ -299,13 +312,15 @@ function getBundleScriptList(target, callback) { return callback(err); } - var scripts = JS.scripts.base.concat(pluginScripts); + var scripts = JS.scripts.base; if (target === 'client' && global.env !== 'development') { scripts = scripts.concat(JS.scripts.rjs); + } else if (target === 'acp') { + scripts = scripts.concat(JS.scripts.admin); } - scripts = scripts.map(function (script) { + scripts = scripts.concat(pluginScripts).map(function (script) { var srcPath = path.resolve(basePath, script).replace(/\\/g, '/'); return { srcPath: srcPath, diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl index 735dbd7264..d6eba4b640 100644 --- a/src/views/admin/header.tpl +++ b/src/views/admin/header.tpl @@ -19,17 +19,7 @@ }; - - - - - - - - - - From caaa72b7529f09311a489c06c2df22d508701014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 27 Nov 2017 12:52:08 -0500 Subject: [PATCH 60/81] closes #6124 --- src/user/profile.js | 5 ++++- test/user.js | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/user/profile.js b/src/user/profile.js index 70dffeebe6..ae1e31c475 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -196,7 +196,7 @@ module.exports = function (User) { function updateUsername(uid, newUsername, callback) { if (!newUsername) { - return callback(); + return setImmediate(callback); } async.waterfall([ @@ -204,6 +204,9 @@ module.exports = function (User) { User.getUserFields(uid, ['username', 'userslug'], next); }, function (userData, next) { + if (userData.username === newUsername) { + return callback(); + } async.parallel([ function (next) { updateUidMapping('username', uid, newUsername, userData.username, next); diff --git a/test/user.js b/test/user.js index 0decbfe0f6..0db0b69840 100644 --- a/test/user.js +++ b/test/user.js @@ -627,6 +627,19 @@ describe('User', function () { }); }); + it('should not update a user\'s username if it did not change', function (done) { + socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, username: 'updatedAgain', password: '123456' }, function (err) { + assert.ifError(err); + db.getSortedSetRevRange('user:' + uid + ':usernames', 0, -1, function (err, data) { + assert.ifError(err); + console.log(data); + assert(data[0].startsWith('updatedAgain')); + assert(data[1].startsWith('updatedUserName')); + done(); + }); + }); + }); + it('should change email', function (done) { socketUser.changeUsernameEmail({ uid: uid }, { uid: uid, email: 'updatedAgain@me.com', password: '123456' }, function (err) { assert.ifError(err); From 07ed3807d8af9cbd2a7b04d4a09f56d76a73aed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 27 Nov 2017 13:04:18 -0500 Subject: [PATCH 61/81] remove console.log --- test/user.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/user.js b/test/user.js index 0db0b69840..8a5c3136de 100644 --- a/test/user.js +++ b/test/user.js @@ -632,7 +632,6 @@ describe('User', function () { assert.ifError(err); db.getSortedSetRevRange('user:' + uid + ':usernames', 0, -1, function (err, data) { assert.ifError(err); - console.log(data); assert(data[0].startsWith('updatedAgain')); assert(data[1].startsWith('updatedUserName')); done(); From 2496b2a91a76813ea0445cd9752d15fd15154300 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 27 Nov 2017 13:25:19 -0500 Subject: [PATCH 62/81] Bump persona for subcategories fix, closes #6117 --- install/package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 83871adc3b..7514333162 100644 --- a/install/package.json +++ b/install/package.json @@ -69,9 +69,13 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", +<<<<<<< Updated upstream "nodebb-theme-persona": "7.1.5", +======= + "nodebb-theme-persona": "7.1.6", +>>>>>>> Stashed changes "nodebb-theme-slick": "1.1.2", - "nodebb-theme-vanilla": "8.1.0", + "nodebb-theme-vanilla": "8.1.1", "nodebb-widget-essentials": "4.0.1", "nodemailer": "4.3.0", "passport": "^0.4.0", From 3f2a1d3e8eb585a071355a613ad8ca4f8dcb339d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 27 Nov 2017 13:25:49 -0500 Subject: [PATCH 63/81] check error first #6116 --- src/meta/configs.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/meta/configs.js b/src/meta/configs.js index 12553d5a50..16445a2c32 100644 --- a/src/meta/configs.js +++ b/src/meta/configs.js @@ -83,9 +83,12 @@ function processConfig(data, callback) { var image = require('../image'); if (data['brand:logo']) { image.size(path.join(nconf.get('upload_path'), 'system', 'site-logo-x50.png'), function (err, size) { + if (err) { + return next(err); + } data['brand:emailLogo:height'] = size.height; data['brand:emailLogo:width'] = size.width; - next(err); + next(); }); } else { setImmediate(next); From f225aa25de643ef83aaf2b5ab240d2dc97ec0c4d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 27 Nov 2017 13:26:59 -0500 Subject: [PATCH 64/81] bloody hell... --- install/package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/install/package.json b/install/package.json index 7514333162..3465b30c08 100644 --- a/install/package.json +++ b/install/package.json @@ -69,11 +69,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", -<<<<<<< Updated upstream - "nodebb-theme-persona": "7.1.5", -======= "nodebb-theme-persona": "7.1.6", ->>>>>>> Stashed changes "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.1", "nodebb-widget-essentials": "4.0.1", From fe3a75812fcb33cb3f20ae9029146fc67a1f7080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 27 Nov 2017 14:07:59 -0500 Subject: [PATCH 65/81] closes #6113 closes #6114 --- src/controllers/categories.js | 7 ++++--- src/meta/tags.js | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 350fdd245f..25461205bc 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -13,9 +13,6 @@ categoriesController.list = function (req, res, next) { res.locals.metaTags = [{ name: 'title', content: String(meta.config.title || 'NodeBB'), - }, { - property: 'og:title', - content: '[[pages:categories]]', }, { property: 'og:type', content: 'website', @@ -42,6 +39,10 @@ categoriesController.list = function (req, res, next) { if (req.originalUrl.startsWith(nconf.get('relative_path') + '/api/categories') || req.originalUrl.startsWith(nconf.get('relative_path') + '/categories')) { data.breadcrumbs = helpers.buildBreadcrumbs([{ text: data.title }]); + res.locals.metaTags.push({ + property: 'og:title', + content: '[[pages:categories]]', + }); } data.categories.forEach(function (category) { diff --git a/src/meta/tags.js b/src/meta/tags.js index 79cb04cded..e5a6a10c9c 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -124,7 +124,7 @@ Tags.parse = function (req, data, meta, link, callback) { addIfNotExists(meta, 'property', 'og:title', Meta.config.title || 'NodeBB'); - var ogUrl = nconf.get('url') + req.path; + var ogUrl = nconf.get('url') + (req.originalUrl !== '/' ? req.originalUrl : ''); addIfNotExists(meta, 'property', 'og:url', ogUrl); addIfNotExists(meta, 'name', 'description', Meta.config.description); From b1cd68928beca8f9109825fdd4aaba63ef0c9c77 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 27 Nov 2017 14:31:05 -0500 Subject: [PATCH 66/81] updated digest header --- public/images/emails/digestheader.jpg | Bin 0 -> 11833 bytes public/images/emails/digestheader.png | Bin 8359 -> 0 bytes src/views/emails/digest.tpl | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/images/emails/digestheader.jpg delete mode 100644 public/images/emails/digestheader.png diff --git a/public/images/emails/digestheader.jpg b/public/images/emails/digestheader.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c873e41b7aff65f4e713b465ede131bfd5c245d GIT binary patch literal 11833 zcmbVx1wa+uw(y)o_W`7llI|`6Nd+WD=}wUbX(S}1yFp3`DG4d*5RjIVmPVvQLh7G` z@qORD@7?#_zxJNBSMRms%$%8hHE}f$z~t}B-31^}05Am$aJ32GN;{iaxdRXY5dZ)Y zP_zxuOPJajn*pXRpag;d5FjETqhkR8jvxTs7ytljX#ijsxS9q60Axf&L?lFHBqU@s zWbnd3MMg%&z(hyKKu5=fVO|3a6B`GHgN=!gf8z!|J~8MnE!7;K!hS8Lr_53Kjq+D zARr>a000~aXaj{J{PY0DxOn)8Fe*+Y0&!|C6>eTanj3~ZxA^R%k#RvMC?YB*0yyw% zYp^$5E^0h(1Q?Zss!{eQ9&r^1znJm`8cD}ke9l(hoW)yCuMl_ljHPZocwV7Kiw8gu ze|K~p02hE!Q5#09K#cIgSO5YN8U&sxTn7Pgskw~cf%iDYcfqjP<*h2877Xp9uciP@ z1bEj7xS-jTF96_?fCyp45blPn0IpJ^I7k9x6d;1~z)28f%|V2t=nG;*8BPFrugL`0 zBj8bi7_|>XXe}Ve!vpF74{HzsG)%q#QY->EOMtvSXoPNf9Sv#^02ByA|1g7_19lOh zP)$(s1QFgB;yhgTkHoH7Z(AkSaNz0kivh)ne>D_01WoS35eSfG0S3amfUu*~8vW*< zp073Q)bOO>@HL_U04xU#zoZSBni?BpQGa+@*8l+M7U)_)JVmT8Xd>+fH@pVO2nl&D z(6^z&`R>oKXdwWQ zpQroTE>rzEaC+cY*Kkiq<3Kd*Q7r&riUtMrv;YBbZ`7ek8NZs|SRnw*Pt83?)Up}c z_3%^y^-hgVf3_HswZPZ%_3pns5#qKF9^3fdBzW`05HdJ^xG0|8zV1rAV+cBuii7AH zIy%UpEq^77!Zy2R<+4U(E-;>-1%0P{TjvC$K`crxN;(SwZh^P!p8z2V0rSHg6o=0p zHDsQz{=jLr$?b6ct(*#gpr~U-(;=AN0Ayhv-oW9mI$z-ZwZMb@QC#)CwUWXwj@qm# zKUDyL+!23GGQxgK0KnML-1IMwKR*l3KvW8T$#`htM8GZ_ERPfFWL4tl#j-WZn zTdTZHF{^g)x->$JH*6p+qi@qwp*wi)p%tsTW^uWeam5F-&|ZQ>7LXOV;Su`P=((3A z(Mti*lxZzGX4QhjG#gu%C@+VdNYTBnCc)z_ij$=;*i#LkOf~Lmo2@AhTHLEXbDAS( zV=cux;?mI7e>!t?=xJBRVO;m%1S6(JHxjyRPeju;=`w!&1;g^>q^OjGS}8P-Il0jI z&7bDRE3r76Bc#pGt4;X!kXzWE#93!t3n%UkXM>~@!-Io3jrn~n?p-Y zjfN^KDTxP*4hXnrNTiCVFGVjtO-)}!m~2{6nrNPpw%s{odC+-w`S!_4>uhcn%L_t6 z1}hf8slnsX-_E*ivOJStf~8qQz7z0Nk1)~QzXp!37z7^pNFj8>e6 zhA0!?^5oRm*bFV6UL{5HPczD(lH4Kv8zi2x&4>&?YOo6tv+yGC{2>%^=tTB)Rp66V z(M7(ZRv&r~FGaR`yrGFbQkTv%}uRFZbA*B6XgTSN{;QInSE4d#vgTpvzIha5`5fV4Bb+5j72buh@)SdQ7BL zl9JmSm^OqdY@?Z-bCG5qYGTus`T%W1Cvj-;?M?2wYI$v&v9w5xcs6V8>9m1()I5B& zfHot}G*t?2Ch7Rv#dLkb56C=vNvFFN-Y7-p``XSLOc&D|0q<)ltv5GnesJ72U)P;^ zSHq!UJ71;4q+_SeiMi;Uc0tC{QJrY3eM?I-n^1$TI!vc}SpH#;>hxtbC%yg<2dV5{ z?8$;n#G4P{pYIXvYE;km6#u{*x-W&H`jsex*6pK9$ktw^3wqB+z!c`9o3Q=e$vxgW z^)BX#6&>;-lLTwWlE_EpJ=H@0OHtb~B3XzklTcV^tcY2oaa`?miIpAQ@QeVLcK)OK zrzyjWHeL9(f@uyN(~CsdV~bg@fP9H7V7qlioG5(ztWo~QC%eFMw~69xEAJ`17n4r6YZA9! zu;=MH;R}}y%-UD}?N<^Hn|GZpVGbz7E0E9rw+1GbEi3uFcuPU(U6yzC;?PA&D?)rN zd2Wkn=hqGneXK3z0=^m@s?gyHKU^Y}DcQKvZ-%AC!*MsJ5vBDk-9G!|${W*BGoi`K zOFqDhjt_W!&5%gxT;Hpq@O$+YP`dt4^*?O?!LZ+S;AcV?AHk7RZ7-EKN_hN2M!@|n zHDGp+&PA>ZUl;2hW}ZF%vi7SnIxfVQJa^wWJl`(xmfJMPsN~(FToIg9fe*;c-Rus3{s4COhIscNs`q_y-l%RiYPt3X2M1Akk#9v^ z*(nI@*<#KbOG*WW%%M5|J$mqJG*`Rm;WKxpF>Rxb0yYy4y?YTB;2$7#r_UIAgL>&7 z#Fd~Tt2qQn5?ogRH2H%R0p>$4l@6apyX$E|_&qIsO2$t3$>|-d3|vAX|A7&psGTJU zS4Y#Le4Wd+K|^z+cE!fw>+3D$3e|~`X()0sX((}=18pAFKCZMHm02i0_8WO$K9cp^ z{->@~&*F&b^oH*eOw4jdt~#_bAjY^#ph`>9<^*dUD;rvnflvKJ!7h`ixmM^?efc0rC)UhNDFCYbL0K z4>UfI=7y{)wX7d)^RM}WLXq!4XE>!WIO~E6ux77-pR;%^<&uen!S;Ict86u%d{%PL zStMNa-fI8(PXPkD&HF#65Fm#YB-|s7M0G0kzNsFZ5M!!ECJsWO`a9uASp`({uUoazhcqJCk#;PtG#M08PvbHZrRMdCP{%B9rD)g*E-v(_ zHe!`vhS`hi{rw6lIg+8p&`ahxegEmeFpN@#JUVplB4fS9_4P)&UyZ)Hp^fZ)1s9f`Tkqon7Q{< zK%wNzdcqZuw=npgr?3rGW6&trcjI1v)Lps-UcgeMCx3GRa=Se#nsJOG!O-K8-?}lx zGk@(v-m`PGc3J2XX*%wfVX0wTq`4eQ)FH8_cw}2x$&xAg-U-+lQZYqDB!A_J+FqX` zXrPBuNvAXeIgRSaSk-JG9s9neJ%G(8Y2R#!y&GMsi^K(dXL+BaT)6zKX-k{YU}cUt z&Xhsqq)fCp`@^H%uqRMSU8>q{nq!3pTcP%?_jd<7!-`{|fjhp=^rIC+DK0o(q#9Ke z=Vk+`$ATZ4r_tB9cKfJ~ggIhJi59Eb7!&8}PLo3h8Vin>*q>^-J>D%E*SFn4%TFLJ zZ*WhHe7!nn5vF$0S6Yng;-P}@EYYVIPYmPBsmpGX*MRrh))=oH9+IZEvBAjkQ$L^!uWR5Ou zz|D1~z!qf>>0?rI)=Hp*;AgS#7R=thF?tPSB2f9igDykEkh}V(lS(tz?vSP4uihBt7>5STt?M!_Nn9DIJ> zUJ)R7sJCAXZ1L3N#7y5-7O0%x>H5iW$lxcUEi2Qw<9BCB?=!@Rgn$g?{TG(4Gb$ZQ zL#MNOu0~cS)@as8F2Q%38?ONR|A^?!McfkVTW4bDO9$6nQf7zJ$1n~ziG5;`qY<*^ zSIpN?yupw@Pfwys0svyt8qH4b3O1}g1Cn{KgO#R;0ql!|YG7Q{JcajTo+7tpoIgRH>KiA_S*@DhqqgqgLy|Ki=mBT=vPX>Jp3u-Kmy&zpE9U+O05y zNT9qaJu&{+? zm?W2+Hpcy?gfH*icZFT^er@XfSIK8U2^xlp>T%4$w7*<6665jwf}bn*o=njPd~b}3Tu;j(Dr`PV&f z_XC|SO3U^yBDd0C2O?##JrREJvoOkpt6^AKz+($IurRb6RP!L*4n6bSK6%NHX1Kr=2eh(TTvJLu|^*tI_)P)KE=<@>ab@Op5*a@v_vMqAka?)k>oGgc5Vb6rfGFmjsl#MU>PDc$NmP zfXJ1ExjcfWCq;Mz+}U4axRo4`(;B+{V+ht;X4x{F=y8OSQF?@u#sm>dU->>GpY^nM z`kZm(|s$*w$J3A~;{1EbNS%(W_}Dzc!{JRuv-zk-G*a z7PWm$URRJD7U}+Uh;oKSw}@lC=|tH)gRH5-XLWJE?!}bBkoc%yd$dg_aao`HD1$I} z_2=82>S*)!eO-ejVRUBc4qU@`%n}}#N0S&T&?<9@5}YZsW)YEEf4a4Y5L3yR$;>Az>Z4LbhSe! zEv%-G_`Zpm|MupON#Xxv5nO%L>O|R{tTpuoovHnr1U3SlKB)6f} z%GBI%O9zwRyPf|J1^>cm6f9wEl^FUD$xih$T#oNp>&|)F4`vqidIYv+?$fBFrBrw7 zbFgTlf66qu0xm=I#SU5_zkgO)s*`In(20CZv?4z92JB&E;~e{;!9njh7MwI&TOT&+ z6sKvWu3NnglhFFCVwuR*fVRWw5J#eKD-%xi#RmfTo57r$TKWbf^7<^*8Ri+Yk&QuP z%j53G&yIvZsR~VvXtQVeX@9oOV#9<&WIIdm4=aE+Z|^%pQ47nqZV}LInaO3?aRr#W ziM*w>KHjJ7n-f_e@xzHL^SU|q8zP| zIk6j3#}MhAxINX0nq1EX^6IKV|8IAa3?#5!*HIFFNMTS?pETPSfNToN)D_o46ZsPi^Pm`w?IN8x#nOgJB zamiOrdwJtEv!-G7D}n_HS`s?Y`5g(z=k*MBMAf;N8QghX4!cQRZAPE`s5u?Ola;X0 zymaZ3W6Bh|wU%XcZdIu;Qv|ILA5VO7S@pqd%f)hiq2piiXzJH*`QICihEl#wyMK{qAr1RvSL29{eWjiJD5JxI5iptMn4*X;skr zSsLh)yDPhC`bzIMrnEXke7-f?n;`CE(b|qW6}38#d{l>czUu16ujkVau0hqhQi1~0 z#)f@C8tHB28#L;ee95FsTu->!CHwh}E9pNb7x6C+ptkX92jr-_`jHQaTQ zyry=2@PbyXcA(=+lVn?jYit8L=`}*Ojx#HDy-tb$154REXJ=Wvot98_d88IJHYXtJ zdThm#X>L}C)^Wpa~EPOU*9XBC2@iHG_Ef| zBIXKs(+uv;zYZc{v2wKFSp%h(WX8fQTnc0N4_@`~EN5Kfc!57R~1`|MocZ~?TU00@-pK6fvqw!rD=n1aqCu>af_v%0*Pcb$hUkd>qS^u0>C>p&DRF1BC8SLthFYG4;p@P(e(8i^?fQkIk{Y6Y8#>xqmgE{^s z`a_lMgFZ80Oy57EKLl47ZQKJDP%r*R1o-|YV{c47fYVfP1m7P2FvEjOe*s)2NA-(A zgIoH-nLB^pI$)dL1A~jVm1A8f1eC^GsvYbnYlG{`A05W;kShPI_^1LQ>DQq z-$mSih0u?a37+L|P5%07E6qSof$5Uze&phVJLMHuHjwSN6i}$qqQ-&gVa8+4-b$jday`g z;+a|FeG>VJ!qHWkaAi`N7aLd4LfG}}Z9%Y=!^eK^>z!3>2? zitDT8;s33`ctdMjExodL9Xc3^sl&Zm7}Rfs&Krryor&n3agGy7SarLI;0XHZ%(>Mc zffeJdEwGIJ`FKl40a zfGEN3Ko_NskE>!7m{C%n#k?z{9(E`n{)2-+_u*>gyjVSkd-=D{c1!_vEwh9vyL6N7@j21QJZJ()X`#@pxPTw|7P%J&30nc;|nrA3vVy z70_EYo}Pvtw&v}Ie0xbh(@vSQLQgZa4 z4!jY5{VlFg>1U((bWHK#o2ufxe>@(O2+I~`R1BlBQ!ou>lg4WkW1dLmTq+ZJ|EUU; z5Qn9Nhl`DC?8-0>Vj@@t8pNMhO$Ns3m->O}be}#3+i6N0;OVU`4}A?hv*sU%+M7geK(Faa_)6jhhy2Z z)?&3#$~U%&st|(ABPWrAr2cuMX`Y@ih_mK&bU_V(L({UltgjklBoSO@?nG_&ybL;L zG4ePbQ475&<)g%n;OZG>Qhex}?7&-=7}9zjj>NU6;*K!mdq_0V9gl7AzyCrOzo}a% zu3ZuONj;2*vHU>geFYER;lV@}^AO=%Afi(fJlj*oVt`fOV{JyLJC9g!E-@VYW>5Ew zLcy;m<;Nz3zVm&2uju9j^(pC!V%aK|M>eX(^A!y-_@f~YlHHQU4E3p4W40<)<_{R% zDw9s)jFW-v0W2Q?#nNcj$-OyzH@lIkpA-15K%I?zv>O+CHh%`SJ6FeFs zbgG87hCM$=LCA-G-6`YKvO@w%zMkB)5v_y^#2T@__%|AS2JwW1+0iN}S=JTrC+4|q z+LC47C8MhTz>K;JKxi9hp-Lbjd{6JK zNsKNiV|q{gX=max(HeI2ggw1cM|g!FGZKnL{i>L~JO4x7A1z^-Mh_%drW4U+>M~n5}HpW9*SO85p`MgiBqcrt$bd zlcIV5DY!$xQ`TQkMEC>dHz3dOXLrZ+3YMDV2Orbz3wZ4bhGW!T5MEN26rlQ*b4sUU zbjn~Wei1CeaB^rYgq9#%Q7&Xx%6PT*A>O_J!3TA+(){Oh;%`lUvA*Zik6~rOudB_) z;ZYwVsX)hC5W;(IPY|y(>Fc-^G!y;s1(1*d+lm71jf2N6x!Ux`))Kg^_IK%ht%-Gz z&#l;~fGS_fV*hbViUZl>)O!uXqN_1GyixA2J-c2=@ieTwU`*{8r!VIVDONPL!q@bL z#7v%tcrYfv!lB5IQmMe`G4#LVRh>C5KK8_v+`&n!>1F!2+ z&$>}@z!5a8x;VWv5uG3AS^tQ21{)JoJ-vOS?1ZxBhuf2edA0>JPw7+!ta~D=8yxTY z@CgnaQqtz_56~(6(OJ`}zP~@Qiw^SYN+hPpxn-yfBf`kJvkJb1&@)BK8W`E<%?QP~ z4V_ad#Axlm^l)DPoUadWqAv}$xulpc8p~KD?3l(!O7eA-s$bd&PdUHau>2c~V(uip zgQP0b6yJK!+}cA>wJO8N_%W+j{~acX|ES=2yACHE>+0+-jXX(T{fac}wq)k>s07YC z!d$OH+ggc&PcvI^Ax)+iXsKenqLClfOWwEaZ@nQz>oAFM`AR1kX^I)jB7`q?+T|%s zS+{`G&4&L-obzy}iLbZT>)!i>3SteR{QdqriI(S;$}6cptRtu9nZ3N1TGv9p<=zrI)g`EZ$+s{4vU^gChj`4~2HTadNUd0b5tYM7npaO9hG z27S+9I-U*!#FZNsGdCZ{FL-ovYxhpAR4=Ts`;m6!ZP-$ACR>rH90(wH6u%3{XRwuu zV?QjCOGtz6xZ$Ndf;lC3B2$e_qZ!XH2_m+$zhW}7!Xttj?sP1WHq?X@5spr-M|ICE z;JwXBLKsyNAZLHrTsF<~4so@?At4ACn~a>Kewa$Ih5B8u5C07MkE4%r=?_em=+PR6 z_H1!qBa0Z1gtv5eq?)1nYcjrB)O{t!Kzu-r8+uN$oAic!=#7eygvW))wr;8N7k5He zZoAbfyY5RW?vIhZ4G(UIxx2FQZSj(1^&>y#kx0cHGWY*ajCLS{yKs7%{{&$kV0!so z$0cZAe>AbU|6;}{rj~5Uk~{d#$Zw=J2eVqcbe+7V_fCBn7_b>0`pb$gDBaaSHTTSnZAf-lIPgkfOER5; zq43fCYLxa3HTE0t+k~l3$X)o9a5iD4l$_eU%psB#XlShw{@lD7*ltMzPN%B`L{0+t&Qc$LhDYPr{|RVUePX z3AL`zkC~o!y&F;F{h#Z7BOBL*vi@48Sz;TEn# literal 0 HcmV?d00001 diff --git a/public/images/emails/digestheader.png b/public/images/emails/digestheader.png deleted file mode 100644 index 44ff4dd2039266c424e719dda9f7f44af1bed6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8359 zcmdsdc{p3$7j7bkn6;)*st6q@VxE1dk{TPcnrfCRO3YN!8om}q)LdFc)mUTAk{W9+ zl~RhRn&+BQihKNi_j&Gf@BQokdmnk6ID45p9JSKn(wY#RFCJ0oO$oTg@4e<9BXFZf52ox#`0%4;-pd;WGb{PZ; zkOF~L9YG-F3=oLh_f^wfRiJ^^NniIC=0pKaEA_qG}NJ+qhn+fy1~)T$p!)m z#2{~Jngvg8OozR6bq!hC*$R^|C#A2Jw1Jsr^%TB9q4EjuznEmWI<-g+V!L7NDbKR# z5n^JQE^hdN22o3VZ-c>YjKSDK2JC4ZkL;sY?_rZL>U%c-aCkMZsF3Ww)HjV6D<9`* z929?Cd0;-SUN^jOY+cHQu^S2rBq_O{4ehoaM`+^V$p6<5>M27A_Z8&eweE}{`mCpH zswc&5;Zev@@mFkR&;JqJ%93@ykdbv7E2zK!D_#CRuC zaO17X_RII{6c0SSt{f)paCS7#1A|?ON(xd!3j&LYnhISlE~5P8CM<8ik#+}`w61Vt zs@{KC?Qna&W_Yp{wRqkHDuZ7UOz6vomnzX|R6gJtrZO63J>z9GAAKb&zHW3p3ll}D@0%7+4`)^VV;m`J%^JRq%xhv6gtKnpA;)CB6 zx-wkYY-}P(1EQK0q>1`QOGnpuI1|>m)piWy;X&Bey^sX6dQa9~-%=jCl_lYrocliV z0%fO#aYV_Q?l0FiBUa`yNjh+2va3hq^ikVRf{#hL1+!)O{39}fN;`!6?c!)WcrBc4 zWDBp$Y~>B6-}aq}*7N6dcIi*M*{iE@G}8X9{2sla;@@fB5+VUaU{*~ILZHAW^OAEW zD!;~9)5?7Sm3?l8dcHWqX*4Y5hN;&_o}CU4AZ!yLXN(k8&!t;`^sr0VoPvI7P>fhk zwi}aGMF2_Y=;+AkPl&_781+Zc89n89Brm?@ zfuz|G(+PhU#zm3UEhg9ELBsgm%FB@3$45uu_f7Lls16|n-6n~P{!EsMU;^Z?23j9P znMk*J3f6C&sP~x_!&>qk7HbnB#Mj_#V9%sz9N8#R+e<`EJ#J<-yQ>G{B}5Gnfiaww z$pTfnb4OL~xhs*MScIF}mAI{J1j+?J=A?jnqD%c{Z}E;krte4{t7fu7%dTOYar(nm zGFMzT!id9oBdreuk9cCHi64?#5b6ZaucAQ5w?M~R3RFJA8+>{pVHbm`7h4j61JR5% zrs8~>IyQOUOf#B##Qn?eU)hH&b7(wf`8bCt>Z@mhrZe)h%(pRYviP>y!gx0<+j)GI zZ6&<)Oj8*-<111}4@u)SZ#)o`D=k7U*_;TxL094@;{eoGbK*Wwom~j#ShqoLdlffE`i+$gTs9F{ZK%9Wp*P~rx3M5hv-g>Pe_Qkj>NNRS-lLh+x23|$awsM zrxp%Lo9uivhnCxBCzcawV3o4E0PG9z6jopBZlI+UD%l52l!@X5@SDXAo*gmF&N1S3 zD!~5Q-?U9d*8lutNLGH65oCwvKMzV2Eex8X`r);eE=+fjg5g(WpDVp<{CC$cWgXUD89E8hlSsNMXf>~F)&__f>>>V8Z z-tJ(nc{ug4rGNB04S9n&jx}Dei+{c zBb^%1S7a#nI^oE7=Kwi+QaV-2533yerUk`dFl-EMBiFSIIR39W& z7%M1^`@Pcs&Numxr4Truva?j%G6fyci8*Tt0CVC3<%9@i7+u8CJBA-^kt8(xfg{`3 zaf2*6gm5GoeFHaK4wl(|KKU@T>yC3VRWmjcyh-=52R0?-!UM2?kZZm#RK&;H&9839 z5q-evixE=F`RP@?WLx;4 z6%^-cN246ae72bf`YY>ucP4uIRV#I{bNo(6xvGH&5$~4A=D3!}5P3W%MS?dqHP~py ze=%ohIi3_LyJz9OXY}nNc_D;5Pw6`75{^K1BZS*jl2+W4i%N>~K1TX}NtLnI=s*`H zxN?#&aYd)VlCh+*9Nud32`jP^?PXtV-kCHc=7sOUfR}*)JZMc_Qa>Fyh18d??OQ#q z;1)vS7tJFh&sJ5oT6WWM4&cXWn28|7KMoEKGYhWm=Zxq-?M-uYa~hD-ixlc@9kLJ3 z5*%#-wLYg)FJn!PuYvoK+`=c9MqgNbT}pYU0Yc)(q$Q|N*@9hbf~wA$RB^H`^$!}% zg576ZSmn#O6+4m$QaO4G+rKN}B*A3W*R_!DU=$Qouc?p6+|bAM|Nfu12Nh-qnrHSU znwpxJtnmfxsaTp2ZUn#_7T%iO*h#BziB{Qcc#0}^`3z7G4oI5c*O8G=DlM)#50qZvaEn`Z|%>Sw*V0m>r{Ols%jBe@ked)%<{E?W-|-|~Yavt)p9 z+5Ttg^{`#gbXVQD{R3cNIW^#BcVW7H-|_6(<8Niw+IV;}ral0P&w2sYXI>~Nt@v5d zy!rEIoTLORD{Ih9@O(l@IvhD#2Bbe;YCdiB{Y&y*yyll}j8 zdih&|%(o8C6`n5DyLl~&*qv}mA7C~FMFir}vcuWF!{mH6j5EC==$q|J@$?Lfswl4Xh?P#@kEAs3(BwZ9aYJKhpojTJG zD%+$WM9FKv#)0gay?4?{zEV5zXKS^VUl8xmufEx%xw1xFT*y#$wj>nfo-1BF8- zK(@@{#b!6Uj<*PBOR+IA_Ai5S`i!8sk&zKOAggFk)%!#SLGSB3IJ_1FHZmzo+VN9W z5{)m6g5G#KG&J6GTgzH9d?mwz$qIDF?W@!G&5~*c@|X6D=lP*|p2lcZ*Qlt1)u3isv`bvA zfKU#JVL1G`(@+};N75~_KTz{L9Bzh@riI9dxYv2Tl0TB*bunqGJP#*pp8@0F*!CnN zfD|-XaBq!cx57A+hei~ACV*9dB!Y~W>@wiRt#vNMC(eS5CwGbIi-D_T~i4kdS?eFR7Hah8o zT~FuMljv)Y5b$2GB z7GE%0=#Y8Iq=GO_`vKLq-FQUx!E>?D8>xMshp)xC;{MKas~fxPUVTK%UjT|X)ahfV zFEoHyBu_N{>(WaD7aKRR3q`zCzA{O|qo+&bu&h*q0$?Uij@vxa|CkygOW^=_aZjbpa~Kj~Zy1)Y~DlK2uRhDYNbPm1UVE-W=szV^pC0 ztiTv|J3NEbPLd`k;>H*35@k(k#a$O0d;?T`6?{!+FyX) z>~bgQ&TZS5SkBx&OjSVL;JmcEUX;d$8*+M+ueg-m_pxHHu^C2@B&xjMl`-kVgY~V~ zAg2rss#{uFmb{eqi7N|Rk+(Q_s26hm@rfhkMD zyZc0xDDcE}#MfW{nOpUmF8xX`v*AH9g~C(VRgcITkN)V0HEtfQ@h<)<;u`x$JF0H! z;WJsQ6H(7E_^ju^wAUd7+8;?lf?uC^2|bW(j?Wd*cjK%L+?wvk;czifYeDLmnAkt7 z>4bq*eaXV2qMnc~v}fHC8Z^W5*WDJcY1oG?R4NVlP$81@B{%X$@pTRc+v-rcQi%qv zVu~CLO&c4dC?%B?^hZ+hg<5ma&M$Uj-~Na7@86TdFN#%h7^-M5C@ z-Ie$m4AfTPVf|dn%F1s0{@NWK%p`s-z$5-%7n>#5H8 z0aYW*OoN2pe^ulw%LqxUu4D^VVjgRKvPW~goh)2)+IXAM@~hnbp+-Lr0x47Van+8= z^lLOIrsRiwM%*qTMY(x3MzdYxa!@R4BE2X|<_mh;dYQsFN~1$+r=_KZ2?+Rn9-k@$ z5?!=N0sD_jMy0AD+E6A|=3Rxu8QqY(LGwBDkd~uw+18O8abHEcsQ6S>KeGmHii*nE zI+tm7Le-|@f_FF{TpPQrQ68wujJ^p3utK1CJIZ?X>eq;_K%q@J>RRn)+GpTo5XT^zi*OH08pS(U`WgaL}WG`UuhZ+2tQ z;}UP77L-pZJfnxOo0DR+C>T}CIN~U2AQ)xZW<{G-6Bpcszqb+m+rqHNHXUCvdfE-> zPA3nin^Fmv7zYx%Ek$?jf85=Q=~{;S7-CW{s&L z8D1%z)U70$ms>0q1rJ)OM3>A1@?Nvne1h$mxz`)DSy^K($KY*f*z51z{wHC@@rk4+ z%j6KArnqExqvOKbnlInK_m(h9{#;DB)Cg2908kc1JO=mP;@aArxnXS=DOW0+PD$5w z*@=LZkpUpW&%F5dN4^ZlO1vzYDS2JT@u5#1{nCt4&S$?>utLwgmlo@r7_nNJG`ZSg$XZOT#*md%6xvmvZ__X{^yZ8H4PD^=w zl>q+G*UUB;rwhn1hH80300jGxWv~Xb3y8+=4R_Jq<~Q=|M+CT##hLV zuQ_Gh4*oY=Th$sdRX~7UiPoD{KI8Pr6(Nq}W_zRr~$flW?{4Sd4>VeQV3T=V0T9?>ut|GkcmIw_pUPp}K8>ObJlZNP;5i zRI`ILtpU9f)vX0Jh)+aF%UY%1pZjC;{9MzrQwgek+`+u-7g@xHiv+bj;hz0ieVq)F zf__=gDfK)T+@AJPV5H(+ZZGNyrZsS@W6A-HhmX$%U2><&Y9RmBjaPxu^mT76=mB&A zY~kOYo55Vp1Be=Q`}7X0h$! zbFmLDo<7FfbY*tUfft+yyk;`SDu5b5))>I%hjgY-FA?##oKsj||HctP{}J;3KI_byPPhUMJu)a}o^P3_bTzK@b$H^0m7 zTIeRU-$jc8UHU#PyR;KMp>Jy&HP^! z=l|qB{j%2-E-Z`FKK?rz&18W;Xs}gncWo_%H;}q}F}*F+pMFq%nicT!c~{fr{4DKwlY~F^o-aE+EX_;Ufs#ebKq$4h zw~4L{F51Z+_%Q)lU{n6Bu7<-I{z%u3bn8t~4RJwVKZ?)&%59+~N%6bl6XvPaZbTF$ zGm$&Q7~bb_ajq#f$F{X)zIHYxfSma1X!SYU8(ZkD@IXCl>GR!U04qN)N|a6QMZOa) zl18fG{&9Dwi+-ywaA&s*zzy^AC!fc0Hxo6G8S~qA@s%EPR5J(f#vh&bEeti{7ti6q zYY?9dpmBE~x0Pd2(F}$YiQ_`t&4g2@GbAsb%T&B3P@EQ&gTepOw>ZQ_hCH>vJ4w9% zg7wkT%;VVib+?SnEjvic?srw2q7QT4VIBRxLcvtm4RR9!+s?r;E zaYiA!O#>6${8a_1pZl+?BGKMJcO(Y`Zpx=Mv(D1~ds3b&sV}v2@@F}seKc33jNoR+ z9_S~ufXej!F=JSxma7F06c^v=6sE~Qx6NV;8i6BgC=^9pWt1d~SXLCa^;hL)!yFWG zO*Q!joa*IpNWYn zDWj6t2AV7!%UV?WKK38g*zc!^Zj924M*Hh*&Y@>Z7#ZBN9s1l$us2rXmyf;jK(Q?R zaL=^Tn+1HZ$^ub@oLtvc^`i^7b#JdqA-Q7Jgd$x|8E@68zcSjilNgKPR z1qGNa`@N?s(}5~AcMUI!7U2!5_iVXTb8>y;#^;kK6M))VkP46*B8+tL@T-P8&pIc2 ziykv-zw`IC4Mxe-`x|RCAMU%4makt+5BVM->4rRfn|AN7Iob@stHkYP>(Rk-NkY{o zxYXp@mzsiOnyZJ1&iCxRfBlnncuEI z{&bHI^`GP@+WO6fh&61taE6@m!jU&S0m#p_2q96WQjXVy1c{%Q6`K$Ci`GuZ?gH>{ z_27)-I$eHV0z?EQjEhuUT%D0*`%fK4tJc-4gpw^@uiv{D2%_bV_BkdO* za|ljKaa@7?$3H#^>wa%6A`JOg3W=plF1%$N%Kmz4R)~7$ryD!ncAHzc(66x~GolU9 z1p4^-YgppTeb+|;!DUQp(b+D?bo%iXzA2W1Azj6#Nr&3No9T9sLvq&4xSZk*38NwL z$uq9~Rv(=X{5h_QaRz!%b^rS1G7~Gf0Ej?x$ux}Iqa!29K|EQw-d^PGnAq&c?<;L3 zYJ7KoS`*YVGBOnF&DRUL?gPiMcdyOwp;J>S>_Ly3T4Z_7W4aLi^nc@O92P$jk|$q* z^-&$XmoG1Fe|j3v#EdX6KOfgyv&M@j$Igzn{5GeS{3UaJL*Qjx@tlF7VU^FJ_rd1O zAZ22L@rhZLRY6$qMSH+`F^dX}LpLo4c6H2b`U686Zzkjyp0{sojAJTt8}iX-x^H6n z+IBwUm2<_kJ-H+H&uI{$zvlR0!LGu{xf&%{Y_Th$-Iu^Gj%0S7-JD*Zs)>codwy7F z5;V!oAZM1}14Ppc`sp_xG|sh)AATN~4>HZn@Hi^HR@exnUo;dbbz);Cn!^-&nGVQ| zf>P@0L%BIB=Q47%6JksI^Vsj1+&#smh8A5o>IT=!we+QjgdLc$b6uX@xR+@&5I@nd zVOAz7b$R*u6hDCX#Ihh%RSk@NeDnjVEOP3fnDcBUD>)Ey3T#{f#U*#s5N!ZtI_5l^ za=*RL$<{$?qGFsev~(*g8-vGe(sI7rQo6LU($*JRt;GFCXv9`t#mbEV9KpaqN?jR! zc<13Du%d!yrRJidqHZVti0+gMSuYw09cz`pPoyZgv?hPxxoayXAaJ0+k6yT=qk>%V z@$d{>rRKWqxG7EmUeb$TbgVEg_c5-@&VH`I1tcwnP`D|ja1$YGhLBfAC@IS*-jtG6 zmXi7@oaOVs89elH@pKFMUj~SC0~uLmS?T{8tb(%V0Rx`%8BBfLFhTeITtS*HK2EMz fkPq*>yP{n0yM#RIbv^&@0T5Eh=vIZ6 - + From 15c8693a23f8af5b47f820a5883e1e7631f2fa0d Mon Sep 17 00:00:00 2001 From: Andrew Rodrigues Date: Mon, 27 Nov 2017 15:16:54 -0500 Subject: [PATCH 67/81] up persona --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 3465b30c08..eae0536028 100644 --- a/install/package.json +++ b/install/package.json @@ -69,7 +69,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.1.6", + "nodebb-theme-persona": "7.2.0", "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.1", "nodebb-widget-essentials": "4.0.1", @@ -137,4 +137,4 @@ "url": "https://github.com/barisusakli" } ] - } \ No newline at end of file + } From dbdc05404daeac7021b60f22f7c18588ca126cfd Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Mon, 27 Nov 2017 13:44:30 -0700 Subject: [PATCH 68/81] Use console.log instead of process.stdout.write (#6123) * Use console.log instead of process.stdout.write * Don't break the installer --- install/databases.js | 3 +- install/web.js | 11 ++--- src/cli/index.js | 23 +++++----- src/cli/manage.js | 21 +++++----- src/cli/reset.js | 25 +++++------ src/cli/running.js | 51 ++++++++++++---------- src/cli/setup.js | 18 ++++---- src/cli/upgrade-plugins.js | 22 +++++----- src/cli/upgrade.js | 86 ++++++++++++++++++-------------------- src/events.js | 4 +- src/install.js | 20 ++++----- src/plugins.js | 6 +-- src/upgrade.js | 16 +++---- 13 files changed, 153 insertions(+), 153 deletions(-) diff --git a/install/databases.js b/install/databases.js index b55fa8ad0c..430a40e04d 100644 --- a/install/databases.js +++ b/install/databases.js @@ -12,8 +12,7 @@ var questions = { module.exports = function (config, callback) { async.waterfall([ function (next) { - process.stdout.write('\n'); - winston.info('Now configuring ' + config.database + ' database:'); + winston.info('\nNow configuring ' + config.database + ' database:'); getDatabaseConfig(config, next); }, function (databaseConfig, next) { diff --git a/install/web.js b/install/web.js index 730c8130c4..92dcdb17d3 100644 --- a/install/web.js +++ b/install/web.js @@ -5,6 +5,7 @@ var express = require('express'); var bodyParser = require('body-parser'); var fs = require('fs'); var path = require('path'); +var childProcess = require('child_process'); var less = require('less'); var async = require('async'); var uglify = require('uglify-js'); @@ -127,15 +128,15 @@ function launch(req, res) { res.json({}); server.close(); - var child = require('child_process').spawn('node', ['loader.js'], { + var child = childProcess.spawn('node', ['loader.js'], { detached: true, stdio: ['ignore', 'ignore', 'ignore'], }); - process.stdout.write('\nStarting NodeBB\n'); - process.stdout.write(' "./nodebb stop" to stop the NodeBB server\n'); - process.stdout.write(' "./nodebb log" to view server output\n'); - process.stdout.write(' "./nodebb restart" to restart NodeBB\n'); + console.log('\nStarting NodeBB'); + console.log(' "./nodebb stop" to stop the NodeBB server'); + console.log(' "./nodebb log" to view server output'); + console.log(' "./nodebb restart" to restart NodeBB'); var filesToDelete = [ 'installer.css', diff --git a/src/cli/index.js b/src/cli/index.js index 5a1ed820e0..da2d4dfc71 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -12,15 +12,15 @@ try { fs.readFileSync(path.join(dirname, 'node_modules/async/package.json')); } catch (e) { if (e.code === 'ENOENT') { - process.stdout.write('Dependencies not yet installed.\n'); - process.stdout.write('Installing them now...\n\n'); + console.warn('Dependencies not yet installed.'); + console.log('Installing them now...\n'); packageInstall.updatePackageFile(); packageInstall.preserveExtraneousPlugins(); packageInstall.npmInstallProduction(); require('colors'); - process.stdout.write('OK'.green + '\n'.reset); + console.log('OK'.green + '\n'.reset); } else { throw e; } @@ -182,7 +182,7 @@ resetCommand return options[x]; }); if (!valid) { - process.stdout.write('\n No valid options passed in, so nothing was reset.\n'.red); + console.warn('\n No valid options passed in, so nothing was reset.'.red); resetCommand.help(); } @@ -206,13 +206,12 @@ program .option('-s, --schema', 'Update NodeBB data store schema', false) .option('-b, --build', 'Rebuild assets', false) .on('--help', function () { - process.stdout.write( - '\n' + - 'When running particular upgrade scripts, options are ignored.\n' + - 'By default all options are enabled. Passing any options disables that default.\n' + - 'Only package and dependency updates: ' + './nodebb upgrade -mi\n'.yellow + - 'Only database update: ' + './nodebb upgrade -d\n\n'.yellow - ); + console.log('\n' + [ + 'When running particular upgrade scripts, options are ignored.', + 'By default all options are enabled. Passing any options disables that default.', + 'Only package and dependency updates: ' + './nodebb upgrade -mi'.yellow, + 'Only database update: ' + './nodebb upgrade -d'.yellow, + ].join('\n')); }) .action(function (scripts, options) { require('./upgrade').upgrade(scripts.length ? scripts : true, options); @@ -229,7 +228,7 @@ program if (err) { throw err; } - process.stdout.write('OK\n'.green); + console.log('OK'.green); process.exit(); }); }); diff --git a/src/cli/manage.js b/src/cli/manage.js index 393c3f0753..14f30a4749 100644 --- a/src/cli/manage.js +++ b/src/cli/manage.js @@ -24,11 +24,11 @@ function buildTargets() { }).map(function (tuple) { return ' ' + _.padEnd('"' + tuple[0] + '"', length + 2).magenta + ' | ' + tuple[1]; }).join('\n'); - process.stdout.write( + console.log( '\n\n Build targets:\n' + ('\n ' + _.padEnd('Target', length + 2) + ' | Aliases').green + '\n ------------------------------------------------------\n'.blue + - output + '\n\n' + output + '\n' ); } @@ -100,24 +100,23 @@ function listEvents() { } function info() { + console.log(''); async.waterfall([ function (next) { var version = require('../../package.json').version; - process.stdout.write('\n version: ' + version); + console.log(' version: ' + version); - process.stdout.write('\n Node ver: ' + process.version); + console.log(' Node ver: ' + process.version); next(); }, function (next) { - process.stdout.write('\n git hash: '); - childProcess.execSync('git rev-parse HEAD', { - stdio: 'inherit', - }); + var hash = childProcess.execSync('git rev-parse HEAD'); + console.log(' git hash: ' + hash); next(); }, function (next) { var config = require('../../config.json'); - process.stdout.write('\n database: ' + config.database); + console.log(' database: ' + config.database); next(); }, db.init, @@ -125,8 +124,8 @@ function info() { db.info(db.client, next); }, function (info, next) { - process.stdout.write('\n version: ' + info.version); - process.stdout.write('\n engine: ' + info.storageEngine); + console.log(' version: ' + info.version); + console.log(' engine: ' + info.storageEngine); next(); }, ], function (err) { diff --git a/src/cli/reset.js b/src/cli/reset.js index 85831d366d..bb0d110478 100644 --- a/src/cli/reset.js +++ b/src/cli/reset.js @@ -54,18 +54,19 @@ exports.reset = function (options, callback) { .map(function (x) { return map[x]; }); if (!tasks.length) { - process.stdout.write('\nNodeBB Reset\n'.bold); - process.stdout.write('No arguments passed in, so nothing was reset.\n\n'.yellow); - process.stdout.write('Use ./nodebb reset ' + '{-t|-p|-w|-s|-a}\n'.red); - process.stdout.write(' -t\tthemes\n'); - process.stdout.write(' -p\tplugins\n'); - process.stdout.write(' -w\twidgets\n'); - process.stdout.write(' -s\tsettings\n'); - process.stdout.write(' -a\tall of the above\n'); - - process.stdout.write('\nPlugin and theme reset flags (-p & -t) can take a single argument\n'); - process.stdout.write(' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona\n'); - process.stdout.write(' Prefix is optional, e.g. ./nodebb reset -p markdown, ./nodebb reset -t persona\n'); + console.log([ + 'No arguments passed in, so nothing was reset.\n'.yellow, + 'Use ./nodebb reset ' + '{-t|-p|-w|-s|-a}'.red, + ' -t\tthemes', + ' -p\tplugins', + ' -w\twidgets', + ' -s\tsettings', + ' -a\tall of the above', + '', + 'Plugin and theme reset flags (-p & -t) can take a single argument', + ' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona', + ' Prefix is optional, e.g. ./nodebb reset -p markdown, ./nodebb reset -t persona', + ].join('\n')); process.exit(0); } diff --git a/src/cli/running.js b/src/cli/running.js index edd9627ee8..b637e40f35 100644 --- a/src/cli/running.js +++ b/src/cli/running.js @@ -38,21 +38,23 @@ function start(options) { return; } if (options.log) { - process.stdout.write('\nStarting NodeBB with logging output\n'.bold); - process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); - - process.stdout.write('\nThe NodeBB process will continue to run in the background'); - process.stdout.write('\nUse "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write('\n\n'.reset); + console.log('\n' + [ + 'Starting NodeBB with logging output'.bold, + 'Hit '.red + 'Ctrl-C '.bold + 'to exit'.red, + 'The NodeBB process will continue to run in the background', + 'Use "' + './nodebb stop'.yellow + '" to stop the NodeBB server', + ].join('\n')); } else if (!options.silent) { - process.stdout.write('\nStarting NodeBB\n'.bold); - process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n'); - process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset); + console.log('\n' + [ + 'Starting NodeBB'.bold, + ' "' + './nodebb stop'.yellow + '" to stop the NodeBB server', + ' "' + './nodebb log'.yellow + '" to view server output', + ' "' + './nodebb help'.yellow + '" for more commands\n'.reset, + ].join('\n')); } // Spawn a new NodeBB process - fork(paths.loader, process.argv.slice(3), { + var child = fork(paths.loader, process.argv.slice(3), { env: process.env, cwd: dirname, }); @@ -62,15 +64,17 @@ function start(options) { stdio: 'inherit', }); } + + return child; } function stop() { getRunningPid(function (err, pid) { if (!err) { process.kill(pid, 'SIGTERM'); - process.stdout.write('Stopping NodeBB. Goodbye!\n'); + console.log('Stopping NodeBB. Goodbye!'); } else { - process.stdout.write('NodeBB is already stopped.\n'); + console.log('NodeBB is already stopped.'); } }); } @@ -78,13 +82,13 @@ function stop() { function restart(options) { getRunningPid(function (err, pid) { if (!err) { - process.stdout.write('\nRestarting NodeBB\n'.bold); + console.log('\nRestarting NodeBB'.bold); process.kill(pid, 'SIGTERM'); options.silent = true; start(options); } else { - process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.\n'); + console.warn('NodeBB could not be restarted, as a running instance could not be found.'); } }); } @@ -92,20 +96,21 @@ function restart(options) { function status() { getRunningPid(function (err, pid) { if (!err) { - process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan); - process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); - process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n'); - process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); + console.log('\n' + [ + 'NodeBB Running '.bold + ('(pid ' + pid.toString() + ')').cyan, + '\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server', + '\t"' + './nodebb log'.yellow + '" to view server output', + '\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n', + ].join('\n')); } else { - process.stdout.write('\nNodeBB is not running\n'.bold); - process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'.reset); + console.log('\nNodeBB is not running'.bold); + console.log('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n'.reset); } }); } function log() { - process.stdout.write('\nHit '.red + 'Ctrl-C '.bold + 'to exit'.red); - process.stdout.write('\n\n'.reset); + console.log('\nHit '.red + 'Ctrl-C '.bold + 'to exit\n'.red + '\n'.reset); childProcess.spawn('tail', ['-F', './logs/output.log'], { cwd: dirname, stdio: 'inherit', diff --git a/src/cli/setup.js b/src/cli/setup.js index f10e7def9b..541dd98fec 100644 --- a/src/cli/setup.js +++ b/src/cli/setup.js @@ -12,9 +12,9 @@ function setup() { winston.info('NodeBB Setup Triggered via Command Line'); - 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'); + console.log('\nWelcome to NodeBB!'); + console.log('\nThis looks like a new installation, so you\'ll have to answer a few questions about your environment before we can proceed.'); + console.log('Press enter to accept the default setting (shown in brackets).'); async.series([ install.setup, @@ -30,19 +30,19 @@ function setup() { separator += '='; } } - process.stdout.write('\n' + separator + '\n\n'); + console.log('\n' + separator + '\n'); if (err) { winston.error('There was a problem completing NodeBB setup', err); throw err; } else { if (data.hasOwnProperty('password')) { - process.stdout.write('An administrative user was automatically created for you:\n'); - process.stdout.write(' Username: ' + data.username + '\n'); - process.stdout.write(' Password: ' + data.password + '\n'); - process.stdout.write('\n'); + console.log('An administrative user was automatically created for you:'); + console.log(' Username: ' + data.username + ''); + console.log(' Password: ' + data.password + ''); + console.log(''); } - process.stdout.write('NodeBB Setup Completed. Run \'./nodebb start\' to manually start your NodeBB server.\n'); + console.log('NodeBB Setup Completed. Run "./nodebb start" to manually start your NodeBB server.'); // If I am a child process, notify the parent of the returned data before exiting (useful for notifying // hosts of auto-generated username/password during headless setups) diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js index db04d5cc35..4011546fd3 100644 --- a/src/cli/upgrade-plugins.js +++ b/src/cli/upgrade-plugins.js @@ -105,7 +105,7 @@ function getCurrentVersion(callback) { function checkPlugins(standalone, callback) { if (standalone) { - process.stdout.write('Checking installed plugins and themes for updates... '); + console.log('Checking installed plugins and themes for updates... '); } async.waterfall([ @@ -117,7 +117,7 @@ function checkPlugins(standalone, callback) { var toCheck = Object.keys(payload.plugins); if (!toCheck.length) { - process.stdout.write('OK'.green + '\n'.reset); + console.log('OK'.green + ''.reset); return next(null, []); // no extraneous plugins installed } @@ -127,10 +127,10 @@ function checkPlugins(standalone, callback) { json: true, }, function (err, res, body) { if (err) { - process.stdout.write('error'.red + '\n'.reset); + console.log('error'.red + ''.reset); return next(err); } - process.stdout.write('OK'.green + '\n'.reset); + console.log('OK'.green + ''.reset); if (!Array.isArray(body) && toCheck.length === 1) { body = [body]; @@ -167,19 +167,19 @@ function upgradePlugins(callback) { checkPlugins(standalone, function (err, found) { if (err) { - process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); + console.log('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability'.reset); return callback(err); } if (found && found.length) { - process.stdout.write('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:\n'); + console.log('\nA total of ' + String(found.length).bold + ' package(s) can be upgraded:'); found.forEach(function (suggestObj) { - process.stdout.write(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); + console.log(' * '.yellow + suggestObj.name.reset + ' (' + suggestObj.current.yellow + ' -> '.reset + suggestObj.suggested.green + ')\n'.reset); }); - process.stdout.write('\n'); + console.log(''); } else { if (standalone) { - process.stdout.write('\nAll packages up-to-date!'.green + '\n'.reset); + console.log('\nAll packages up-to-date!'.green + ''.reset); } return callback(); } @@ -198,7 +198,7 @@ function upgradePlugins(callback) { } if (['y', 'Y', 'yes', 'YES'].indexOf(result.upgrade) !== -1) { - process.stdout.write('\nUpgrading packages...'); + console.log('\nUpgrading packages...'); var args = ['i']; found.forEach(function (suggestObj) { args.push(suggestObj.name + '@' + suggestObj.suggested); @@ -206,7 +206,7 @@ function upgradePlugins(callback) { cproc.execFile((process.platform === 'win32') ? 'npm.cmd' : 'npm', args, { stdio: 'ignore' }, callback); } else { - process.stdout.write('\nPackage upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".\n'.reset); + console.log('Package upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade-plugins'.green + '".'.reset); callback(); } }); diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js index b2255707f4..179970192b 100644 --- a/src/cli/upgrade.js +++ b/src/cli/upgrade.js @@ -11,64 +11,60 @@ var meta = require('../meta'); var upgradePlugins = require('./upgrade-plugins').upgradePlugins; var steps = { - package: function (next) { - process.stdout.write('Updating package.json file with defaults... \n'.yellow); - packageInstall.updatePackageFile(); - packageInstall.preserveExtraneousPlugins(); - process.stdout.write('OK\n'.green); - next(); + package: { + message: 'Updating package.json file with defaults...', + handler: function (next) { + packageInstall.updatePackageFile(); + packageInstall.preserveExtraneousPlugins(); + next(); + }, }, - install: function (next) { - process.stdout.write('Bringing base dependencies up to date... \n'.yellow); - packageInstall.npmInstallProduction(); - process.stdout.write('OK\n'.green); - next(); + install: { + message: 'Bringing base dependencies up to date...', + handler: function (next) { + packageInstall.npmInstallProduction(); + next(); + }, }, - plugins: function (next) { - process.stdout.write('Checking installed plugins for updates... \n'.yellow); - async.series([ - db.init, - upgradePlugins, - function (next) { - process.stdout.write('OK\n'.green); - next(); - }, - ], next); + plugins: { + message: 'Checking installed plugins for updates...', + handler: function (next) { + async.series([ + db.init, + upgradePlugins, + ], next); + }, }, - schema: function (next) { - process.stdout.write('Updating NodeBB data store schema...\n'.yellow); - async.series([ - db.init, - upgrade.run, - function (next) { - process.stdout.write('OK\n'.green); - next(); - }, - ], next); + schema: { + message: 'Updating NodeBB data store schema...', + handler: function (next) { + async.series([ + db.init, + upgrade.run, + ], next); + }, }, - build: function (next) { - process.stdout.write('Rebuilding assets...\n'.yellow); - async.series([ - build.buildAll, - function (next) { - process.stdout.write('OK\n'.green); - next(); - }, - ], next); + build: { + message: 'Rebuilding assets...', + handler: build.buildAll, }, }; function runSteps(tasks) { tasks = tasks.map(function (key, i) { return function (next) { - process.stdout.write(((i + 1) + '. ').bold); - return steps[key](next); + console.log(((i + 1) + '. ').bold + steps[key].message.yellow); + return steps[key].handler(function (err) { + if (err) { return next(err); } + console.log(' OK'.green); + next(); + }); }; }); async.series(tasks, function (err) { if (err) { - process.stdout.write('Error occurred during upgrade'); + console.error('Error occurred during upgrade'); throw err; } @@ -77,14 +73,14 @@ function runSteps(tasks) { var columns = process.stdout.columns; var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; - process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset); + console.log('\n' + spaces + message.green.bold + '\n'.reset); process.exit(); }); } function runUpgrade(upgrades, options) { - process.stdout.write('\nUpdating NodeBB...\n'.cyan); + console.log('\nUpdating NodeBB...'.cyan); // disable mongo timeouts during upgrade nconf.set('mongo:options:socketTimeoutMS', 0); diff --git a/src/events.js b/src/events.js index 65a2c36ad8..c19a948579 100644 --- a/src/events.js +++ b/src/events.js @@ -141,7 +141,7 @@ events.deleteAll = function (callback) { }; events.output = function () { - process.stdout.write('\nDisplaying last ten administrative events...\n'.bold); + console.log('\nDisplaying last ten administrative events...'.bold); events.getEvents(0, 9, function (err, events) { if (err) { winston.error('Error fetching events', err); @@ -149,7 +149,7 @@ events.output = function () { } events.forEach(function (event) { - process.stdout.write(' * ' + String(event.timestampISO).green + ' ' + String(event.type).yellow + (event.text ? ' ' + event.text : '') + ' (uid: '.reset + (event.uid ? event.uid : 0) + ')\n'); + console.log(' * ' + String(event.timestampISO).green + ' ' + String(event.type).yellow + (event.text ? ' ' + event.text : '') + ' (uid: '.reset + (event.uid ? event.uid : 0) + ')'); }); process.exit(0); diff --git a/src/install.js b/src/install.js index fecf86b379..2a3fa7d9db 100644 --- a/src/install.js +++ b/src/install.js @@ -174,7 +174,7 @@ function completeConfigSetup(config, next) { } function setupDefaultConfigs(next) { - process.stdout.write('Populating database with default configs, if not already set...\n'); + console.log('Populating database with default configs, if not already set...'); var meta = require('./meta'); var defaults = require(path.join(__dirname, '../', 'install/data/defaults.json')); @@ -192,11 +192,11 @@ function enableDefaultTheme(next) { meta.configs.get('theme:id', function (err, id) { if (err || id) { - process.stdout.write('Previous theme detected, skipping enabling default theme\n'); + console.log('Previous theme detected, skipping enabling default theme'); return next(err); } var defaultTheme = nconf.get('defaultTheme') || 'nodebb-theme-persona'; - process.stdout.write('Enabling default theme: ' + defaultTheme + '\n'); + console.log('Enabling default theme: ' + defaultTheme); meta.themes.set({ type: 'local', id: defaultTheme, @@ -211,7 +211,7 @@ function createAdministrator(next) { return next(err); } if (memberCount > 0) { - process.stdout.write('Administrator found, skipping Admin setup\n'); + console.log('Administrator found, skipping Admin setup'); next(); } else { createAdmin(next); @@ -315,7 +315,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'); + console.log('Password was not provided during automated setup, generating one...'); password = utils.generateUUID().slice(0, 8); } @@ -365,11 +365,11 @@ function createCategories(next) { } if (Array.isArray(categoryData) && categoryData.length) { - process.stdout.write('Categories OK. Found ' + categoryData.length + ' categories.\n'); + console.log('Categories OK. Found ' + categoryData.length + ' categories.'); return next(); } - process.stdout.write('No categories found, populating instance with default categories\n'); + console.log('No categories found, populating instance with default categories'); fs.readFile(path.join(__dirname, '../', 'install/data/categories.json'), 'utf8', function (err, default_categories) { if (err) { @@ -416,7 +416,7 @@ function createWelcomePost(next) { var numTopics = results[1]; if (!parseInt(numTopics, 10)) { - process.stdout.write('Creating welcome post!\n'); + console.log('Creating welcome post!'); Topics.post({ uid: 1, cid: 2, @@ -430,7 +430,7 @@ function createWelcomePost(next) { } function enableDefaultPlugins(next) { - process.stdout.write('Enabling default plugins\n'); + console.log('Enabling default plugins'); var defaultEnabled = [ 'nodebb-plugin-composer-default', @@ -546,7 +546,7 @@ install.save = function (server_conf, callback) { return callback(err); } - process.stdout.write('Configuration Saved OK\n'); + console.log('Configuration Saved OK'); nconf.file({ file: path.join(__dirname, '..', 'config.json'), diff --git a/src/plugins.js b/src/plugins.js index cc15650357..ac9d6c18e8 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -97,12 +97,12 @@ Plugins.reload = function (callback) { function (next) { // If some plugins are incompatible, throw the warning here if (Plugins.versionWarning.length && nconf.get('isPrimary') === 'true') { - process.stdout.write('\n'); + console.log(''); winston.warn('[plugins/load] The following plugins may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing. In the event of an unresponsive NodeBB caused by this plugin, run `./nodebb reset -p PLUGINNAME` to disable it.'); for (var x = 0, numPlugins = Plugins.versionWarning.length; x < numPlugins; x += 1) { - process.stdout.write(' * '.yellow + Plugins.versionWarning[x] + '\n'); + console.log(' * '.yellow + Plugins.versionWarning[x]); } - process.stdout.write('\n'); + console.log(''); } Object.keys(Plugins.loadedHooks).forEach(function (hook) { diff --git a/src/upgrade.js b/src/upgrade.js index 5c9cd6ea2d..a0ceb5b7df 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -91,7 +91,7 @@ Upgrade.check = function (callback) { }; Upgrade.run = function (callback) { - process.stdout.write('\nParsing upgrade scripts... '); + console.log('\nParsing upgrade scripts... '); var queue = []; var skipped = 0; @@ -120,7 +120,7 @@ Upgrade.run = function (callback) { }; Upgrade.runParticular = function (names, callback) { - process.stdout.write('\nParsing upgrade scripts... '); + console.log('\nParsing upgrade scripts... '); async.waterfall([ async.apply(file.walk, path.join(__dirname, './upgrades')), @@ -135,7 +135,7 @@ Upgrade.runParticular = function (names, callback) { }; Upgrade.process = function (files, skipCount, callback) { - process.stdout.write('OK'.green + ' | '.reset + String(files.length).cyan + ' script(s) found'.cyan + (skipCount > 0 ? ', '.cyan + String(skipCount).cyan + ' skipped'.cyan : '') + '\n'.reset); + console.log('OK'.green + ' | '.reset + String(files.length).cyan + ' script(s) found'.cyan + (skipCount > 0 ? ', '.cyan + String(skipCount).cyan + ' skipped'.cyan : '')); async.waterfall([ function (next) { @@ -157,14 +157,14 @@ Upgrade.process = function (files, skipCount, callback) { date: date, }; - process.stdout.write(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '...\n'); + console.log(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '...'); // For backwards compatibility, cross-reference with schemaDate (if found). If a script's date is older, skip it if ((!results.schemaDate && !results.schemaLogCount) || (scriptExport.timestamp <= results.schemaDate && semver.lt(version, '1.5.0'))) { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); readline.moveCursor(process.stdout, 0, -1); - process.stdout.write(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '... ' + 'skipped\n'.grey); + console.log(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '... ' + 'skipped'.grey); db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js'), next); return; } @@ -174,14 +174,14 @@ Upgrade.process = function (files, skipCount, callback) { progress: progress, })(function (err) { if (err) { - process.stdout.write('error\n'.red); + console.error('Error occurred'); return next(err); } readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); readline.moveCursor(process.stdout, 0, -1); - process.stdout.write(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '... ' + 'OK\n'.green); + console.log(' → '.white + String('[' + [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/') + '] ').gray + String(scriptExport.name).reset + '... ' + 'OK'.green); // Record success in schemaLog db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js'), next); @@ -189,7 +189,7 @@ Upgrade.process = function (files, skipCount, callback) { }, next); }, function (next) { - process.stdout.write('Upgrade complete!\n\n'.green); + console.log('Upgrade complete!\n'.green); setImmediate(next); }, ], callback); From 76cfcc039ad327270db6776fe9de5c828e770b34 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 28 Nov 2017 09:25:49 +0000 Subject: [PATCH 69/81] Latest translations and fallbacks --- public/language/fa-IR/error.json | 2 +- public/language/fa-IR/unread.json | 2 +- public/language/fa-IR/user.json | 4 ++-- .../language/fr/admin/manage/post-queue.json | 2 +- public/language/fr/admin/menu.json | 2 +- .../fr/admin/settings/pagination.json | 4 ++-- public/language/fr/error.json | 6 +++--- public/language/fr/flags.json | 10 +++++----- public/language/fr/language.json | 2 +- public/language/fr/pages.json | 2 +- public/language/fr/unread.json | 4 ++-- public/language/fr/user.json | 20 +++++++++---------- 12 files changed, 30 insertions(+), 30 deletions(-) diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 2a36ceaa96..ca2528b554 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -109,7 +109,7 @@ "chat-disabled": "سیستم گفتمان غیرفعال شده است", "too-many-messages": "شما پیامهای خیلی زیادی فرستاده اید، لطفا مدتی صبر نمایید", "invalid-chat-message": "پیام نامعتبر", - "chat-message-too-long": "پیام های چت نمی توانند بیشتر از 1 درصد کاراکتر ها باشند.", + "chat-message-too-long": "پیام های چت نمی توانند بیشتر از 1% کاراکتر باشند.", "cant-edit-chat-message": "شما اجازه ی ویرایش این پیام را ندارید", "cant-remove-last-user": "شما نمی توانید آخرین کاربر را حذف کنید", "cant-delete-chat-message": "شما اجازه حذف این پیام را ندارید.", diff --git a/public/language/fa-IR/unread.json b/public/language/fa-IR/unread.json index 227305d240..6dbfa319f1 100644 --- a/public/language/fa-IR/unread.json +++ b/public/language/fa-IR/unread.json @@ -11,5 +11,5 @@ "new-topics": "موضوع های جدید", "watched-topics": "موضوع های پیگیری شده", "unreplied-topics": "موضوع های بدون پاسخ", - "multiple-categories-selected": "Multiple Selected" + "multiple-categories-selected": "انتخاب چندگانه" } \ No newline at end of file diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 58273e0c09..ae8014ee56 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -50,7 +50,7 @@ "upload_new_picture_from_url": "بارگذاری تصویر جدید از نشانی وب", "current_password": "کلمه عبور کنونی", "change_password": "تغیر کلمه عبور", - "change_password_error": "کلمه عبورٔ نامعتبر!", + "change_password_error": "کلمه عبور نامعتبر!", "change_password_error_wrong_current": "این کلمه عبورٔ شما نادرست است.", "change_password_error_length": "کلمه عبور خیلی کوتاه است!", "change_password_error_match": "کلمه عبور‌ها باید یکسان باشند.", @@ -94,7 +94,7 @@ "paginate_description": "صفحه بندی و نمایش موضوع ها و پست‌ها به جای نمایش بر اساس اسکرول موس", "topics_per_page": "شمار موضوع ها در هر برگه", "posts_per_page": "شمار پست‌ها در هر برگه", - "max_items_per_page": "حداکثر 1 درصد", + "max_items_per_page": "حداکثر %1", "notification_sounds": "پخش صدا زمانی که یک اطلاعیه دریافت میکنید", "notifications_and_sounds": "آگاه‌سازی‌ها و صدا‌ها", "incoming-message-sound": "صدای پیام دریافتی", diff --git a/public/language/fr/admin/manage/post-queue.json b/public/language/fr/admin/manage/post-queue.json index ed8f9b71d1..5abf4cd55b 100644 --- a/public/language/fr/admin/manage/post-queue.json +++ b/public/language/fr/admin/manage/post-queue.json @@ -7,5 +7,5 @@ "content": "Contenu", "posted": "Posté", "reply-to": "Répondre à \"%1\"", - "content-editable": "You can click on individual content to edit before posting." + "content-editable": "Vous pouvez cliquer sur le contenu pour le modifier avant de le poster." } \ No newline at end of file diff --git a/public/language/fr/admin/menu.json b/public/language/fr/admin/menu.json index 07a2473bc5..22179e2010 100644 --- a/public/language/fr/admin/menu.json +++ b/public/language/fr/admin/menu.json @@ -65,7 +65,7 @@ "logout": "Déconnexion ", "view-forum": "Voir le forum", - "search.placeholder": "Search for settings", + "search.placeholder": "Rechercher dans les réglages", "search.no-results": "Aucun résultat…", "search.search-forum": "Rechercher dans le forum", "search.keep-typing": "Continuez de taper pour afficher les résultats…", diff --git a/public/language/fr/admin/settings/pagination.json b/public/language/fr/admin/settings/pagination.json index 455694e84f..e675776234 100644 --- a/public/language/fr/admin/settings/pagination.json +++ b/public/language/fr/admin/settings/pagination.json @@ -3,9 +3,9 @@ "enable": "Utiliser la pagination des sujets et messages au lieu du défilement infini", "topics": "Pagination des sujets", "posts-per-page": "Messages par page", - "max-posts-per-page": "Maximum posts per page", + "max-posts-per-page": "Messages maximum par page", "categories": "Pagination des categories", "topics-per-page": "Sujets par page", - "max-topics-per-page": "Maximum topics per page", + "max-topics-per-page": "Sujets maximum par page", "initial-num-load": "Nombre initial de sujets à charger dans Non lus, Récents et Populaires" } \ No newline at end of file diff --git a/public/language/fr/error.json b/public/language/fr/error.json index bf27c00d0f..81077980e2 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -11,7 +11,7 @@ "invalid-uid": "ID utilisateur invalide", "invalid-username": "Nom d'utilisateur invalide", "invalid-email": "Email invalide", - "invalid-title": "Invalid title", + "invalid-title": "Titre invalide", "invalid-user-data": "Données utilisateur invalides", "invalid-password": "Mot de passe invalide", "invalid-login-credentials": "Certificat d'identification invalide", @@ -81,7 +81,7 @@ "cant-ban-other-admins": "Vous ne pouvez pas bannir les autres administrateurs !", "cant-remove-last-admin": "Vous seul êtes administrateur. Ajouter un autre utilisateur en tant qu'administrateur avant de vous en retirer.", "cant-delete-admin": "Veuillez retirer les droits d'administration de ce compte avant de tenter de le supprimer.", - "invalid-image": "Invalid image", + "invalid-image": "Image invalide", "invalid-image-type": "Type d'image invalide. Les types autorisés sont: %1", "invalid-image-extension": "Extension d'image invalide", "invalid-file-type": "Type de fichier non valide. Les types autorisés sont : %1", @@ -119,7 +119,7 @@ "not-enough-reputation-to-downvote": "Vous n'avez pas une réputation assez élevée pour noter négativement ce message", "not-enough-reputation-to-flag": "Vous n'avez pas une réputation assez élevée pour signaler ce message", "already-flagged": "Vous avez déjà signalé ce message", - "self-vote": "You cannot vote on your own post", + "self-vote": "Vous ne pouvez pas voter sur votre propre message", "reload-failed": "NodeBB a rencontré un problème lors du rechargement : \"% 1\" . NodeBB continuera de fonctionner côté client, même si vous devez annuler ce que vous avez fait juste avant de recharger .", "registration-error": "Erreur d'enregistrement", "parse-error": "Une erreur est survenue en analysant la réponse du serveur", diff --git a/public/language/fr/flags.json b/public/language/fr/flags.json index 0631354adf..92f11b8fd9 100644 --- a/public/language/fr/flags.json +++ b/public/language/fr/flags.json @@ -51,14 +51,14 @@ "note-added": "Note ajoutée", "modal-title": "Signaler un contenu inapproprié", - "modal-body": "Veuillez spécifier votre raison de signaler %1 %2 pour une révision. Vous pouvez utiliser un des boutons de report rapide si c'est plus approprié", + "modal-body": "Veuillez spécifier votre signalement %1 %2 pour une révision. Vous pouvez utiliser un des boutons de demande si c'est plus approprié", "modal-reason-spam": "Spam", "modal-reason-offensive": "Choquant", - "modal-reason-other": "Other (specify below)", + "modal-reason-other": "Autre (précisez ci-dessous)", "modal-reason-custom": "Motif du signalement...", "modal-submit": "Soumettre le signalement", "modal-submit-success": "Le contenu a été soumis pour examen.", - "modal-submit-confirm": "Confirm Submission", - "modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?", - "modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined." + "modal-submit-confirm": "Confirmer l'envoi", + "modal-submit-confirm-text": "Vous avez déjà spécifié un signalement. Êtes-vous sûr de vouloir soumettre une demande ?", + "modal-submit-confirm-text-help": "La soumission d'une demande écrase tous les signalements définis." } \ No newline at end of file diff --git a/public/language/fr/language.json b/public/language/fr/language.json index 0aaf9508de..21ce190574 100644 --- a/public/language/fr/language.json +++ b/public/language/fr/language.json @@ -1,5 +1,5 @@ { - "name": "Français", + "name": "French", "code": "fr", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 50967383a6..e3f20da517 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -44,7 +44,7 @@ "account/bookmarks": "Marques-pages de %1", "account/settings": "Paramètres d'utilisateur", "account/watched": "Sujets auxquels %1 est abonné", - "account/ignored": "Topics ignored by %1", + "account/ignored": "Sujets ignorés par %1", "account/upvoted": "Messages pour lesquels %1 a voté", "account/downvoted": "Messages contre lesquels %1 a voté", "account/best": "Meilleurs messages postés par %1", diff --git a/public/language/fr/unread.json b/public/language/fr/unread.json index ba4fe50469..dcd6303e98 100644 --- a/public/language/fr/unread.json +++ b/public/language/fr/unread.json @@ -10,6 +10,6 @@ "all-topics": "Tous les sujets", "new-topics": "Nouveau sujet", "watched-topics": "Abonnements", - "unreplied-topics": "Unreplied Topics", - "multiple-categories-selected": "Multiple Selected" + "unreplied-topics": "Sujets sans réponses", + "multiple-categories-selected": "Sélection multiple" } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 6dc0fb85d2..a5e84f9a27 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -25,7 +25,7 @@ "reputation": "Réputation", "bookmarks": "Marque-pages", "watched": "Abonnements", - "ignored": "Ignored", + "ignored": "Ignorés", "followers": "Abonnés", "following": "Abonnements", "aboutme": "À propos de moi", @@ -85,7 +85,7 @@ "has_no_posts": "Cet utilisateur n'a encore rien posté.", "has_no_topics": "Cet utilisateur n'a encore créé aucun sujet.", "has_no_watched_topics": "Cet utilisateur ne s'est encore abonné à aucun sujet.", - "has_no_ignored_topics": "This user hasn't ignored any topics yet.", + "has_no_ignored_topics": "Cet utilisateur n'a encore ignoré aucun sujet.", "has_no_upvoted_posts": "Cet utilisateur n'a voté pour aucun message", "has_no_downvoted_posts": "Cet utilisateur n'a voté contre aucun message", "has_no_voted_posts": "Personne n'a voté pour des messages de cet utilisateur", @@ -101,11 +101,11 @@ "outgoing-message-sound": "Son pour les messages sortants", "notification-sound": "Son de notification", "no-sound": "Pas de son", - "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq": "Fréquence de notification des votes positif", + "upvote-notif-freq.all": "Tout les votes positif", + "upvote-notif-freq.everyTen": "Le top 10 des votes positif", + "upvote-notif-freq.logarithmic": "Les 10, 100, 1000...", + "upvote-notif-freq.disabled": "Désactivé", "browsing": "Paramètres de navigation", "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet", "enable_topic_searching": "Activer la recherche dans les sujets", @@ -126,9 +126,9 @@ "sso.title": "Services d'authentification unique", "sso.associated": "Associé avec", "sso.not-associated": "Cliquez ici pour associer", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", + "sso.dissociate": "Dissocier", + "sso.dissociate-confirm-title": "Confirmer la dissociation", + "sso.dissociate-confirm": "Êtes-vous sûr de vouloir dissocier votre compte de %1 ?", "info.latest-flags": "Derniers signalements", "info.no-flags": "Aucun signalement trouvé", "info.ban-history": "Historique de bannissement récent", From a849a772bf8924181013bbd8f566a79321c0ab45 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 28 Nov 2017 09:10:47 -0700 Subject: [PATCH 70/81] Use emoji v2 instead of emoji-extended (#5800) --- install/package.json | 4 ++-- src/install.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install/package.json b/install/package.json index eae0536028..f1e925a203 100644 --- a/install/package.json +++ b/install/package.json @@ -61,8 +61,8 @@ "nconf": "^0.8.5", "nodebb-plugin-composer-default": "6.0.6", "nodebb-plugin-dbsearch": "2.0.9", - "nodebb-plugin-emoji-extended": "1.1.1", - "nodebb-plugin-emoji-one": "1.2.1", + "nodebb-plugin-emoji": "2.0.1", + "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.2.0", "nodebb-plugin-mentions": "2.2.2", "nodebb-plugin-soundpack-default": "1.0.0", diff --git a/src/install.js b/src/install.js index 2a3fa7d9db..89b3d3fa49 100644 --- a/src/install.js +++ b/src/install.js @@ -439,8 +439,8 @@ function enableDefaultPlugins(next) { 'nodebb-widget-essentials', 'nodebb-rewards-essentials', 'nodebb-plugin-soundpack-default', - 'nodebb-plugin-emoji-extended', - 'nodebb-plugin-emoji-one', + 'nodebb-plugin-emoji', + 'nodebb-plugin-emoji-android', ]; var customDefaults = nconf.get('defaultplugins') || nconf.get('defaultPlugins'); From e83813c531053ab15c0b4fb8379c773e5bb28282 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 28 Nov 2017 11:48:31 -0500 Subject: [PATCH 71/81] Emailer tests for Digest.getSubscribers (#6130) * added additional tests for Digest.getSubscribers * added another test and tweaked existing digest list building tests --- test/user.js | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/test/user.js b/test/user.js index 8a5c3136de..0135c339b2 100644 --- a/test/user.js +++ b/test/user.js @@ -1081,6 +1081,87 @@ describe('User', function () { }); }); + describe('Digest.getSubscribers', function (done) { + var uidIndex = {}; + + before(function (done) { + var testUsers = ['daysub', 'offsub', 'nullsub', 'weeksub']; + async.each(testUsers, function (username, next) { + async.waterfall([ + async.apply(User.create, { username: username, email: username + '@example.com' }), + function (uid, next) { + if (username === 'nullsub') { + return setImmediate(next); + } + + uidIndex[username] = uid; + + var sub = username.slice(0, -3); + async.parallel([ + async.apply(User.updateDigestSetting, uid, sub), + async.apply(User.setSetting, uid, 'dailyDigestFreq', sub), + ], next); + }, + ], next); + }, done); + }); + + it('should accurately build digest list given ACP default "null" (not set)', function (done) { + User.digest.getSubscribers('day', function (err, subs) { + assert.ifError(err); + assert.strictEqual(subs.length, 1); + + done(); + }); + }); + + it('should accurately build digest list given ACP default "day"', function (done) { + async.series([ + async.apply(meta.configs.set, 'dailyDigestFreq', 'day'), + function (next) { + User.digest.getSubscribers('day', function (err, subs) { + assert.ifError(err); + assert.strictEqual(subs.includes(uidIndex.daysub.toString()), true); // daysub does get emailed + assert.strictEqual(subs.includes(uidIndex.weeksub.toString()), false); // weeksub does not get emailed + assert.strictEqual(subs.includes(uidIndex.offsub.toString()), false); // offsub doesn't get emailed + + next(); + }); + }, + ], done); + }); + + it('should accurately build digest list given ACP default "week"', function (done) { + async.series([ + async.apply(meta.configs.set, 'dailyDigestFreq', 'week'), + function (next) { + User.digest.getSubscribers('week', function (err, subs) { + assert.ifError(err); + assert.strictEqual(subs.includes(uidIndex.weeksub.toString()), true); // weeksub gets emailed + assert.strictEqual(subs.includes(uidIndex.daysub.toString()), false); // daysub gets emailed + assert.strictEqual(subs.includes(uidIndex.offsub.toString()), false); // offsub does not get emailed + + next(); + }); + }, + ], done); + }); + + it('should accurately build digest list given ACP default "off"', function (done) { + async.series([ + async.apply(meta.configs.set, 'dailyDigestFreq', 'off'), + function (next) { + User.digest.getSubscribers('day', function (err, subs) { + assert.ifError(err); + assert.strictEqual(subs.length, 1); + + next(); + }); + }, + ], done); + }); + }); + describe('digests', function () { var uid; before(function (done) { From 522198574c801a946cefefcd5739157cb20cb5ea Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Tue, 28 Nov 2017 12:42:26 -0500 Subject: [PATCH 72/81] closes #6090 --- src/plugins.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/plugins.js b/src/plugins.js index ac9d6c18e8..653edee5fe 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -119,10 +119,6 @@ Plugins.reload = function (callback) { Plugins.reloadRoutes = function (callback) { var router = express.Router(); - // var ensureLoggedIn = require('connect-ensure-login'); - - // router.all('(/api/admin|/api/admin/*?)', middleware.isAdmin); - // router.all('(/admin|/admin/*?)', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.isAdmin); router.hotswapId = 'plugins'; router.render = function () { @@ -219,7 +215,7 @@ Plugins.list = function (matching, callback) { }, function (err, res, body) { if (err) { winston.error('Error parsing plugins', err); - return callback(err); + return Plugins.normalise([], callback); } Plugins.normalise(body, callback); From c1f91f337724a602447998fbeb08ac3a5bc8334b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 28 Nov 2017 13:18:40 -0500 Subject: [PATCH 73/81] bumped plugin-emoji @pitaj --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f1e925a203..4c56635dfb 100644 --- a/install/package.json +++ b/install/package.json @@ -61,7 +61,7 @@ "nconf": "^0.8.5", "nodebb-plugin-composer-default": "6.0.6", "nodebb-plugin-dbsearch": "2.0.9", - "nodebb-plugin-emoji": "2.0.1", + "nodebb-plugin-emoji": "2.0.4", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.2.0", "nodebb-plugin-mentions": "2.2.2", From 1ceb4ec795d78be209b5664c3aaf925d49523222 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Tue, 28 Nov 2017 13:44:21 -0500 Subject: [PATCH 74/81] up persona --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 4c56635dfb..c3b5efad65 100644 --- a/install/package.json +++ b/install/package.json @@ -69,7 +69,7 @@ "nodebb-plugin-spam-be-gone": "0.5.1", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "5.0.0", - "nodebb-theme-persona": "7.2.0", + "nodebb-theme-persona": "7.2.1", "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.1", "nodebb-widget-essentials": "4.0.1", From d9c38c7e4fa713fe746f1a5cd461eee4f8c35cac Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Tue, 28 Nov 2017 14:20:16 -0500 Subject: [PATCH 75/81] closes #6132 --- src/controllers/index.js | 2 +- test/controllers.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 1861422db9..5539cae729 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -286,7 +286,7 @@ Controllers.outgoing = function (req, res, next) { var allowedProtocols = ['http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal']; var parsed = require('url').parse(url); - if (!url || !allowedProtocols.includes(parsed.protocol.slice(0, -1))) { + if (!url || !parsed.protocol || !allowedProtocols.includes(parsed.protocol.slice(0, -1))) { return next(); } diff --git a/test/controllers.js b/test/controllers.js index 6293f60e2f..81d08e5572 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -352,6 +352,15 @@ describe('Controllers', function () { }); }); + it('should 404 on /outgoing with invalid url', function (done) { + request(nconf.get('url') + '/outgoing?url=derp', function (err, res, body) { + assert.ifError(err); + assert.equal(res.statusCode, 404); + assert(body); + done(); + }); + }); + it('should load /tos', function (done) { meta.config.termsOfUse = 'please accept our tos'; request(nconf.get('url') + '/tos', function (err, res, body) { From 29bb51623520ad3c1752665775d62eb0e222cb38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 28 Nov 2017 15:07:32 -0500 Subject: [PATCH 76/81] up emoji --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c3b5efad65..97f4f77166 100644 --- a/install/package.json +++ b/install/package.json @@ -61,7 +61,7 @@ "nconf": "^0.8.5", "nodebb-plugin-composer-default": "6.0.6", "nodebb-plugin-dbsearch": "2.0.9", - "nodebb-plugin-emoji": "2.0.4", + "nodebb-plugin-emoji": "2.0.5", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.2.0", "nodebb-plugin-mentions": "2.2.2", From f036eb18a4aba390e5c6e683922fe30d8115bbe3 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Tue, 28 Nov 2017 15:42:27 -0500 Subject: [PATCH 77/81] closes #5936 --- src/socket.io/admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 7e0eb64d98..628bbd97da 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -232,7 +232,7 @@ SocketAdmin.email.test = function (socket, data, callback) { switch (data.template) { case 'digest': userDigest.execute({ - interval: 'day', + interval: 'alltime', subscribers: [socket.uid], }, callback); break; From 9f5f769f4a971a1e89e7bb5b15539fcec5fd239e Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 29 Nov 2017 09:25:43 +0000 Subject: [PATCH 78/81] Latest translations and fallbacks --- .../ar/admin/appearance/customise.json | 6 +- public/language/ar/admin/menu.json | 2 +- .../ar/admin/settings/notifications.json | 3 +- public/language/ar/admin/settings/post.json | 1 + public/language/ar/admin/settings/user.json | 2 + public/language/ar/email.json | 1 + public/language/ar/notifications.json | 17 +++++- .../bg/admin/appearance/customise.json | 6 +- public/language/bg/admin/menu.json | 2 +- .../bg/admin/settings/notifications.json | 3 +- public/language/bg/admin/settings/post.json | 1 + public/language/bg/admin/settings/user.json | 2 + public/language/bg/email.json | 1 + public/language/bg/notifications.json | 17 +++++- .../bn/admin/appearance/customise.json | 6 +- public/language/bn/admin/menu.json | 2 +- .../bn/admin/settings/notifications.json | 3 +- public/language/bn/admin/settings/post.json | 1 + public/language/bn/admin/settings/user.json | 2 + public/language/bn/email.json | 1 + public/language/bn/notifications.json | 17 +++++- .../cs/admin/appearance/customise.json | 6 +- public/language/cs/admin/menu.json | 2 +- .../cs/admin/settings/notifications.json | 3 +- public/language/cs/admin/settings/post.json | 1 + public/language/cs/admin/settings/user.json | 2 + public/language/cs/email.json | 1 + public/language/cs/notifications.json | 17 +++++- .../da/admin/appearance/customise.json | 6 +- public/language/da/admin/menu.json | 2 +- .../da/admin/settings/notifications.json | 3 +- public/language/da/admin/settings/post.json | 1 + public/language/da/admin/settings/user.json | 2 + public/language/da/email.json | 1 + public/language/da/notifications.json | 17 +++++- .../de/admin/appearance/customise.json | 6 +- public/language/de/admin/menu.json | 2 +- .../de/admin/settings/notifications.json | 3 +- public/language/de/admin/settings/post.json | 1 + public/language/de/admin/settings/user.json | 2 + public/language/de/email.json | 1 + public/language/de/notifications.json | 17 +++++- .../el/admin/appearance/customise.json | 6 +- public/language/el/admin/menu.json | 2 +- .../el/admin/settings/notifications.json | 3 +- public/language/el/admin/settings/post.json | 1 + public/language/el/admin/settings/user.json | 2 + public/language/el/email.json | 1 + public/language/el/notifications.json | 17 +++++- .../en-US/admin/appearance/customise.json | 6 +- public/language/en-US/admin/menu.json | 2 +- .../en-US/admin/settings/notifications.json | 3 +- .../language/en-US/admin/settings/post.json | 1 + .../language/en-US/admin/settings/user.json | 2 + public/language/en-US/email.json | 1 + public/language/en-US/notifications.json | 17 +++++- .../admin/appearance/customise.json | 6 +- public/language/en-x-pirate/admin/menu.json | 2 +- .../admin/settings/notifications.json | 3 +- .../en-x-pirate/admin/settings/post.json | 1 + .../en-x-pirate/admin/settings/user.json | 2 + public/language/en-x-pirate/email.json | 1 + .../language/en-x-pirate/notifications.json | 17 +++++- .../es/admin/appearance/customise.json | 6 +- public/language/es/admin/menu.json | 2 +- .../es/admin/settings/notifications.json | 3 +- public/language/es/admin/settings/post.json | 1 + public/language/es/admin/settings/user.json | 2 + public/language/es/email.json | 1 + public/language/es/notifications.json | 17 +++++- .../et/admin/appearance/customise.json | 6 +- public/language/et/admin/menu.json | 2 +- .../et/admin/settings/notifications.json | 3 +- public/language/et/admin/settings/post.json | 1 + public/language/et/admin/settings/user.json | 2 + public/language/et/email.json | 1 + public/language/et/notifications.json | 17 +++++- .../fa-IR/admin/appearance/customise.json | 6 +- .../language/fa-IR/admin/extend/plugins.json | 56 +++++++++---------- .../fa-IR/admin/general/languages.json | 6 +- public/language/fa-IR/admin/menu.json | 36 ++++++------ .../language/fa-IR/admin/settings/chat.json | 6 +- .../fa-IR/admin/settings/notifications.json | 3 +- .../language/fa-IR/admin/settings/post.json | 1 + .../fa-IR/admin/settings/uploads.json | 12 ++-- .../language/fa-IR/admin/settings/user.json | 2 + public/language/fa-IR/email.json | 1 + public/language/fa-IR/error.json | 2 +- public/language/fa-IR/notifications.json | 17 +++++- .../fi/admin/appearance/customise.json | 6 +- public/language/fi/admin/menu.json | 2 +- .../fi/admin/settings/notifications.json | 3 +- public/language/fi/admin/settings/post.json | 1 + public/language/fi/admin/settings/user.json | 2 + public/language/fi/email.json | 1 + public/language/fi/notifications.json | 17 +++++- .../fr/admin/appearance/customise.json | 6 +- public/language/fr/admin/menu.json | 2 +- .../fr/admin/settings/notifications.json | 3 +- public/language/fr/admin/settings/post.json | 1 + public/language/fr/admin/settings/user.json | 2 + public/language/fr/email.json | 1 + public/language/fr/notifications.json | 17 +++++- .../gl/admin/appearance/customise.json | 6 +- public/language/gl/admin/menu.json | 2 +- .../gl/admin/settings/notifications.json | 3 +- public/language/gl/admin/settings/post.json | 1 + public/language/gl/admin/settings/user.json | 2 + public/language/gl/email.json | 1 + public/language/gl/notifications.json | 17 +++++- .../he/admin/appearance/customise.json | 6 +- public/language/he/admin/menu.json | 2 +- .../he/admin/settings/notifications.json | 3 +- public/language/he/admin/settings/post.json | 1 + public/language/he/admin/settings/user.json | 2 + public/language/he/email.json | 1 + public/language/he/notifications.json | 17 +++++- .../hr/admin/appearance/customise.json | 6 +- public/language/hr/admin/menu.json | 2 +- .../hr/admin/settings/notifications.json | 3 +- public/language/hr/admin/settings/post.json | 1 + public/language/hr/admin/settings/user.json | 2 + public/language/hr/email.json | 1 + public/language/hr/notifications.json | 17 +++++- .../hu/admin/appearance/customise.json | 6 +- public/language/hu/admin/menu.json | 2 +- .../hu/admin/settings/notifications.json | 3 +- public/language/hu/admin/settings/post.json | 1 + public/language/hu/admin/settings/user.json | 2 + public/language/hu/email.json | 1 + public/language/hu/notifications.json | 17 +++++- .../id/admin/appearance/customise.json | 6 +- public/language/id/admin/menu.json | 2 +- .../id/admin/settings/notifications.json | 3 +- public/language/id/admin/settings/post.json | 1 + public/language/id/admin/settings/user.json | 2 + public/language/id/email.json | 1 + public/language/id/notifications.json | 17 +++++- .../it/admin/appearance/customise.json | 6 +- public/language/it/admin/menu.json | 2 +- .../it/admin/settings/notifications.json | 3 +- public/language/it/admin/settings/post.json | 1 + public/language/it/admin/settings/user.json | 2 + public/language/it/email.json | 1 + public/language/it/notifications.json | 17 +++++- .../ja/admin/appearance/customise.json | 6 +- public/language/ja/admin/menu.json | 2 +- .../ja/admin/settings/notifications.json | 3 +- public/language/ja/admin/settings/post.json | 1 + public/language/ja/admin/settings/user.json | 2 + public/language/ja/email.json | 1 + public/language/ja/notifications.json | 17 +++++- .../ko/admin/appearance/customise.json | 6 +- public/language/ko/admin/menu.json | 2 +- .../ko/admin/settings/notifications.json | 3 +- public/language/ko/admin/settings/post.json | 1 + public/language/ko/admin/settings/user.json | 2 + public/language/ko/email.json | 1 + public/language/ko/notifications.json | 17 +++++- .../lt/admin/appearance/customise.json | 6 +- public/language/lt/admin/menu.json | 2 +- .../lt/admin/settings/notifications.json | 3 +- public/language/lt/admin/settings/post.json | 1 + public/language/lt/admin/settings/user.json | 2 + public/language/lt/email.json | 1 + public/language/lt/notifications.json | 17 +++++- .../ms/admin/appearance/customise.json | 6 +- public/language/ms/admin/menu.json | 2 +- .../ms/admin/settings/notifications.json | 3 +- public/language/ms/admin/settings/post.json | 1 + public/language/ms/admin/settings/user.json | 2 + public/language/ms/email.json | 1 + public/language/ms/notifications.json | 17 +++++- .../nb/admin/appearance/customise.json | 6 +- public/language/nb/admin/menu.json | 2 +- .../nb/admin/settings/notifications.json | 3 +- public/language/nb/admin/settings/post.json | 1 + public/language/nb/admin/settings/user.json | 2 + public/language/nb/email.json | 1 + public/language/nb/notifications.json | 17 +++++- .../nl/admin/appearance/customise.json | 6 +- public/language/nl/admin/menu.json | 2 +- .../nl/admin/settings/notifications.json | 3 +- public/language/nl/admin/settings/post.json | 1 + public/language/nl/admin/settings/user.json | 2 + public/language/nl/email.json | 1 + public/language/nl/notifications.json | 17 +++++- .../pl/admin/appearance/customise.json | 6 +- public/language/pl/admin/menu.json | 2 +- .../pl/admin/settings/notifications.json | 3 +- public/language/pl/admin/settings/post.json | 1 + public/language/pl/admin/settings/user.json | 2 + public/language/pl/email.json | 1 + public/language/pl/notifications.json | 17 +++++- .../pt-BR/admin/appearance/customise.json | 6 +- public/language/pt-BR/admin/menu.json | 2 +- .../pt-BR/admin/settings/notifications.json | 3 +- .../language/pt-BR/admin/settings/post.json | 1 + .../language/pt-BR/admin/settings/user.json | 2 + public/language/pt-BR/email.json | 1 + public/language/pt-BR/notifications.json | 17 +++++- .../pt-PT/admin/appearance/customise.json | 6 +- public/language/pt-PT/admin/menu.json | 2 +- .../pt-PT/admin/settings/notifications.json | 3 +- .../language/pt-PT/admin/settings/post.json | 1 + .../language/pt-PT/admin/settings/user.json | 2 + public/language/pt-PT/email.json | 1 + public/language/pt-PT/notifications.json | 17 +++++- .../ro/admin/appearance/customise.json | 6 +- public/language/ro/admin/menu.json | 2 +- .../ro/admin/settings/notifications.json | 3 +- public/language/ro/admin/settings/post.json | 1 + public/language/ro/admin/settings/user.json | 2 + public/language/ro/email.json | 1 + public/language/ro/notifications.json | 17 +++++- .../ru/admin/appearance/customise.json | 6 +- public/language/ru/admin/menu.json | 2 +- .../ru/admin/settings/notifications.json | 3 +- public/language/ru/admin/settings/post.json | 1 + public/language/ru/admin/settings/user.json | 2 + public/language/ru/email.json | 1 + public/language/ru/notifications.json | 17 +++++- .../rw/admin/appearance/customise.json | 6 +- public/language/rw/admin/menu.json | 2 +- .../rw/admin/settings/notifications.json | 3 +- public/language/rw/admin/settings/post.json | 1 + public/language/rw/admin/settings/user.json | 2 + public/language/rw/email.json | 1 + public/language/rw/notifications.json | 17 +++++- .../sc/admin/appearance/customise.json | 6 +- public/language/sc/admin/menu.json | 2 +- .../sc/admin/settings/notifications.json | 3 +- public/language/sc/admin/settings/post.json | 1 + public/language/sc/admin/settings/user.json | 2 + public/language/sc/email.json | 1 + public/language/sc/notifications.json | 17 +++++- .../sk/admin/appearance/customise.json | 6 +- public/language/sk/admin/menu.json | 2 +- .../sk/admin/settings/notifications.json | 3 +- public/language/sk/admin/settings/post.json | 1 + public/language/sk/admin/settings/user.json | 2 + public/language/sk/email.json | 1 + public/language/sk/notifications.json | 17 +++++- .../sl/admin/appearance/customise.json | 6 +- public/language/sl/admin/menu.json | 2 +- .../sl/admin/settings/notifications.json | 3 +- public/language/sl/admin/settings/post.json | 1 + public/language/sl/admin/settings/user.json | 2 + public/language/sl/email.json | 1 + public/language/sl/notifications.json | 17 +++++- .../sr/admin/appearance/customise.json | 6 +- public/language/sr/admin/menu.json | 2 +- .../sr/admin/settings/notifications.json | 3 +- public/language/sr/admin/settings/post.json | 1 + public/language/sr/admin/settings/user.json | 2 + public/language/sr/email.json | 1 + public/language/sr/error.json | 2 +- public/language/sr/notifications.json | 17 +++++- .../sv/admin/appearance/customise.json | 6 +- public/language/sv/admin/menu.json | 2 +- .../sv/admin/settings/notifications.json | 3 +- public/language/sv/admin/settings/post.json | 1 + public/language/sv/admin/settings/user.json | 2 + public/language/sv/email.json | 1 + public/language/sv/notifications.json | 17 +++++- .../th/admin/appearance/customise.json | 6 +- public/language/th/admin/menu.json | 2 +- .../th/admin/settings/notifications.json | 3 +- public/language/th/admin/settings/post.json | 1 + public/language/th/admin/settings/user.json | 2 + public/language/th/email.json | 1 + public/language/th/notifications.json | 17 +++++- .../tr/admin/appearance/customise.json | 6 +- public/language/tr/admin/menu.json | 2 +- .../tr/admin/settings/notifications.json | 3 +- public/language/tr/admin/settings/post.json | 1 + public/language/tr/admin/settings/user.json | 2 + public/language/tr/email.json | 1 + public/language/tr/notifications.json | 17 +++++- .../uk/admin/appearance/customise.json | 6 +- public/language/uk/admin/menu.json | 2 +- .../uk/admin/settings/notifications.json | 3 +- public/language/uk/admin/settings/post.json | 1 + public/language/uk/admin/settings/user.json | 2 + public/language/uk/email.json | 1 + public/language/uk/notifications.json | 17 +++++- .../vi/admin/appearance/customise.json | 6 +- public/language/vi/admin/menu.json | 2 +- .../vi/admin/settings/notifications.json | 3 +- public/language/vi/admin/settings/post.json | 1 + public/language/vi/admin/settings/user.json | 2 + public/language/vi/email.json | 1 + public/language/vi/notifications.json | 17 +++++- .../zh-CN/admin/appearance/customise.json | 6 +- public/language/zh-CN/admin/menu.json | 2 +- .../zh-CN/admin/settings/notifications.json | 3 +- .../language/zh-CN/admin/settings/post.json | 1 + .../language/zh-CN/admin/settings/user.json | 2 + public/language/zh-CN/email.json | 1 + public/language/zh-CN/notifications.json | 17 +++++- .../zh-TW/admin/appearance/customise.json | 6 +- public/language/zh-TW/admin/menu.json | 2 +- .../zh-TW/admin/settings/notifications.json | 3 +- .../language/zh-TW/admin/settings/post.json | 1 + .../language/zh-TW/admin/settings/user.json | 2 + public/language/zh-TW/email.json | 1 + public/language/zh-TW/notifications.json | 17 +++++- 307 files changed, 1263 insertions(+), 231 deletions(-) diff --git a/public/language/ar/admin/appearance/customise.json b/public/language/ar/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/ar/admin/appearance/customise.json +++ b/public/language/ar/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/ar/admin/menu.json b/public/language/ar/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/ar/admin/menu.json +++ b/public/language/ar/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/ar/admin/settings/notifications.json b/public/language/ar/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/ar/admin/settings/notifications.json +++ b/public/language/ar/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/ar/admin/settings/post.json b/public/language/ar/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/ar/admin/settings/post.json +++ b/public/language/ar/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/ar/admin/settings/user.json b/public/language/ar/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/ar/admin/settings/user.json +++ b/public/language/ar/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/ar/email.json b/public/language/ar/email.json index 8e0fba7424..9b5b49fd1b 100644 --- a/public/language/ar/email.json +++ b/public/language/ar/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.", "notif.post.cta": "انقر هنا لقراءة الموضوع بأكمله", "notif.post.unsub.info": "تم إشعارك بهذه المشاركة بناءً على الخيارات التي سبق وأن حددتها.", + "notif.cta": "Click here to go to forum", "test.text1": "هذه رسالة تجريبية للتأكد من صحة إعدادت الرسائل الإلكترونية في منتدى NodeBB خاصتك.", "unsub.cta": "انقر هنا لتغيير تلك الإعدادات", "banned.subject": "You have been banned from %1", diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 089a76e70c..9a934b2f3a 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -9,6 +9,7 @@ "continue_to": "استمر إلى %1", "return_to": "عودة إى %1", "new_notification": "تنبيه جديد", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "لديك تنبيهات غير مقروءة.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "تم التحقق من عنوان البريد الإلكتروني", "email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.", "email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.", - "email-confirm-sent": "تم إرسال بريد التفعيل." + "email-confirm-sent": "تم إرسال بريد التفعيل.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/bg/admin/appearance/customise.json b/public/language/bg/admin/appearance/customise.json index f052e4e5c9..5f6214b70e 100644 --- a/public/language/bg/admin/appearance/customise.json +++ b/public/language/bg/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Въведете своите собствени декларации за стилове, те ще бъдат приложени след всички останали стилове.", "custom-css.enable": "Включване на персонализиран CSS", + "custom-js": "Персонализиран код на Javascript", + "custom-js.description": "Въведете свой собствен код на javascript тук. Той ще бъде изпълнен след като страницата се зареди напълно.", + "custom-js.enable": "Включване на персонализирания код на Javascript", + "custom-header": "Персонализирана заглавна част", - "custom-header.description": "Въведете своя персонализиран код HTML тук (напр. JavaScript, елементи „meta“ и т.н.), те ще бъдат добавени към секцията <head> в кода на Вашия форум.", + "custom-header.description": "Въведете своя персонализиран код HTML тук (напр. елементи „meta“ и т.н.), те ще бъдат добавени към секцията <head> в кода на Вашия форум. Ползването на елементи „script“ е позволено, но непрепоръчително, тъй като за това можете да ползвате раздела Персонализиран код на Javascript.", "custom-header.enable": "Включване на персонализирана заглавна част", "custom-css.livereload": "Включване на моменталното презареждане", diff --git a/public/language/bg/admin/menu.json b/public/language/bg/admin/menu.json index cd521781a7..fe3d478f54 100644 --- a/public/language/bg/admin/menu.json +++ b/public/language/bg/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Външен вид", "appearance/themes": "Теми", "appearance/skins": "Облици", - "appearance/customise": "Персонализиран HTML и CSS", + "appearance/customise": "Персонализирано съдържание (HTML/JS/CSS)", "section-extend": "Разширяване", "extend/plugins": "Добавки", diff --git a/public/language/bg/admin/settings/notifications.json b/public/language/bg/admin/settings/notifications.json index f04ceb8bd7..d32a556040 100644 --- a/public/language/bg/admin/settings/notifications.json +++ b/public/language/bg/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Известия", "welcome-notification": "Приветствено известие", - "welcome-notification-link": "Връзка за приветственото известие" + "welcome-notification-link": "Връзка за приветственото известие", + "welcome-notification-uid": "Потр. ид. за приветственото известие" } \ No newline at end of file diff --git a/public/language/bg/admin/settings/post.json b/public/language/bg/admin/settings/post.json index 2d3276ffe4..8aadba3e52 100644 --- a/public/language/bg/admin/settings/post.json +++ b/public/language/bg/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Първо най-старите", "sorting.newest-to-oldest": "Първо най-новите", "sorting.most-votes": "Първо тези с най-много гласове", + "sorting.most-posts": "Първо тези с най-много публикации", "sorting.topic-default": "Подредба по подразбиране на темите", "restrictions": "Ограничения за публикуването", "restrictions.post-queue": "Включване на опашката за публикации", diff --git a/public/language/bg/admin/settings/user.json b/public/language/bg/admin/settings/user.json index c0e975323f..a43f032ac5 100644 --- a/public/language/bg/admin/settings/user.json +++ b/public/language/bg/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Теми", "disable-user-skins": "Потребителите да не могат да избират собствен облик", "account-protection": "Защита на акаунта", + "admin-relogin-duration": "Повторно вписване на администратора (в минути)", + "admin-relogin-duration-help": "След определено време достъпът до административния раздел ще изисква повторно вписване. Задайте 0, за да изключите това.", "login-attempts": "Брой опити за вписване на час", "login-attempts-help": "Ако опитите за вписване на потребител минат тази граница, акаунтът ще бъде заключен за определено време.", "lockout-duration": "Продължителност на заключването на акаунта (в минути)", diff --git a/public/language/bg/email.json b/public/language/bg/email.json index aaf94585fd..2c72baef8f 100644 --- a/public/language/bg/email.json +++ b/public/language/bg/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Това известие за разговор беше изпратено до Вас поради настройките Ви за абонаментите.", "notif.post.cta": "Натиснете тук, за да прочетете цялата тема", "notif.post.unsub.info": "Това известие за публикация беше изпратено до Вас поради настройките Ви за абонаментите.", + "notif.cta": "Натиснете тук, за да преминете към форума", "test.text1": "Това е пробно е-писмо, за да потвърдим, че изпращачът на е-поща е правилно настроен за Вашия NodeBB.", "unsub.cta": "Натиснете тук, за да промените тези настройки", "banned.subject": "Вие бяхте блокиран(а) от %1", diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index f3be5bab25..c260ce6f1b 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Продължаване към %1", "return_to": "Връщане към %1", "new_notification": "Ново известие", + "new_notification_from": "Имате ново известие от %1", "you_have_unread_notifications": "Имате непрочетени известия", "all": "Всички", "topics": "Теми", @@ -45,5 +46,19 @@ "email-confirmed": "Е-пощата беше потвърдена", "email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.", "email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.", - "email-confirm-sent": "Изпратено е е-писмо за потвърждение." + "email-confirm-sent": "Изпратено е е-писмо за потвърждение.", + "none": "Нищо", + "notification_only": "Само известие", + "email_only": "Само е-писмо", + "notification_and_email": "Известие и е-писмо", + "notificationType_upvote": "Когато някой гласува положително за Ваша публикация", + "notificationType_new-topic": "Когато някой, когото следвате, публикува тема", + "notificationType_new-reply": "Когато бъде публикуван нов отговор в тема, която следвате", + "notificationType_follow": "Когато някой започне да Ви следва", + "notificationType_new-chat": "Когато получите съобщение в разговор", + "notificationType_group-invite": "Когато получите покана за група", + "notificationType_new-register": "Когато някой бъде добавен в опашката за регистрация", + "notificationType_post-queue": "Когато бъде добавена нова публикация в опашката", + "notificationType_new-post-flag": "Когато публикация бъде докладвана", + "notificationType_new-user-flag": "Когато потребител бъде докладван" } \ No newline at end of file diff --git a/public/language/bn/admin/appearance/customise.json b/public/language/bn/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/bn/admin/appearance/customise.json +++ b/public/language/bn/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/bn/admin/menu.json b/public/language/bn/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/bn/admin/menu.json +++ b/public/language/bn/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/bn/admin/settings/notifications.json b/public/language/bn/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/bn/admin/settings/notifications.json +++ b/public/language/bn/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/bn/admin/settings/post.json b/public/language/bn/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/bn/admin/settings/post.json +++ b/public/language/bn/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/bn/admin/settings/user.json b/public/language/bn/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/bn/admin/settings/user.json +++ b/public/language/bn/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/bn/email.json b/public/language/bn/email.json index c4b24d267c..9d7b1cb1cc 100644 --- a/public/language/bn/email.json +++ b/public/language/bn/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "আপনার সাবস্ক্রীপশন সেটিংসের কারনে আপনার এই নোটিফিকেশন পাঠানো হয়েছে", "notif.post.cta": "পুরো বিষয়টি পড়তে এখানে ক্লিক করুন", "notif.post.unsub.info": "আপনার সাবস্ক্রিপশন সেটিংসের কারনে আপনার এই বার্তাটি পাঠানো হয়েছে", + "notif.cta": "Click here to go to forum", "test.text1": "আপনি সঠিকভাবে নোডবিবির জন্য মেইলার সেটাপ করেছেন কিনা নিশ্চিত করার জন্য এই টেষ্ট ইমেইল পাঠানো হয়েছে", "unsub.cta": "সেটিংসগুলো পরিবর্তন করতে এখানে ক্লিক করুন", "banned.subject": "You have been banned from %1", diff --git a/public/language/bn/notifications.json b/public/language/bn/notifications.json index 0ad1832165..b69faabc9b 100644 --- a/public/language/bn/notifications.json +++ b/public/language/bn/notifications.json @@ -9,6 +9,7 @@ "continue_to": "%1 তে আগান", "return_to": "%1 এ ফেরত যান", "new_notification": "নতুন বিজ্ঞপ্তি", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "আপনার অপঠিত বিজ্ঞপ্তি আছে।", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে", "email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।", "email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।", - "email-confirm-sent": "নিশ্চিতকরণ ইমেইল পাঠানো হয়েছে।" + "email-confirm-sent": "নিশ্চিতকরণ ইমেইল পাঠানো হয়েছে।", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/cs/admin/appearance/customise.json b/public/language/cs/admin/appearance/customise.json index 03ee9c5652..c22a869f80 100644 --- a/public/language/cs/admin/appearance/customise.json +++ b/public/language/cs/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Zadejte vlastní deklarace CSS, které budou použity na všechny ostatních styly.", "custom-css.enable": "Povolit uživatelské CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Uživatelská hlavička", - "custom-header.description": "Zadejte zde uživatelské HTML (např.: javascript, meta značky, atp.), které bude přiřazeno k <head> části značek vašeho fóra.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Povolit uživatelskou hlavičku", "custom-css.livereload": "Povolit aktuální znovu načtení", diff --git a/public/language/cs/admin/menu.json b/public/language/cs/admin/menu.json index edc5afd806..8b9812e514 100644 --- a/public/language/cs/admin/menu.json +++ b/public/language/cs/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Vzhled", "appearance/themes": "Motivy", "appearance/skins": "Vzhledy", - "appearance/customise": "Uživatelské HTML a CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Rozšířit", "extend/plugins": "Rozšíření", diff --git a/public/language/cs/admin/settings/notifications.json b/public/language/cs/admin/settings/notifications.json index 15a5c2415b..fd95917606 100644 --- a/public/language/cs/admin/settings/notifications.json +++ b/public/language/cs/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Oznámení", "welcome-notification": "Uvítání", - "welcome-notification-link": "Odkaz na uvítání" + "welcome-notification-link": "Odkaz na uvítání", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/cs/admin/settings/post.json b/public/language/cs/admin/settings/post.json index c12559df24..67d297b33b 100644 --- a/public/language/cs/admin/settings/post.json +++ b/public/language/cs/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Od nejstarších po nejnovější", "sorting.newest-to-oldest": "Od nejnovějších po nejstarší", "sorting.most-votes": "Dle hlasování", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Výchozí třídění tématu", "restrictions": "Omezení příspěvků", "restrictions.post-queue": "Povolit frontu pro příspěvky", diff --git a/public/language/cs/admin/settings/user.json b/public/language/cs/admin/settings/user.json index 39f74a5a48..2ad41f23cf 100644 --- a/public/language/cs/admin/settings/user.json +++ b/public/language/cs/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Motivy", "disable-user-skins": "Zabránit uživateli ve výběru vlastního vzhledu", "account-protection": "Ochrana účtu", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Počet pokusů o přihlášení za hodinu", "login-attempts-help": "Překročí-li pokusy o přihlášení uživatele/ů tuto hranici, účet bude uzamknut na určený čas", "lockout-duration": "Délka blokování účtu (v minutách)", diff --git a/public/language/cs/email.json b/public/language/cs/email.json index 0206bccb5a..1d1efa10e9 100644 --- a/public/language/cs/email.json +++ b/public/language/cs/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Toto upozornění na chat vám bylo odesláno na základě vašeho nastavení odběru.", "notif.post.cta": "Klikněte zde pro přečtené celého tématu", "notif.post.unsub.info": "Toto upozornění na příspěvek vám bylo odesláno na základě vašeho nastavení odběru.", + "notif.cta": "Click here to go to forum", "test.text1": "Tento testovací e-mail slouží k ověření, že je e-mailer správně nastaven pro práci s NodeBB.", "unsub.cta": "Chcete-li změnit tyto nastavení, klikněte zde.", "banned.subject": "Byl jste zablokován od %1", diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 9c6a90153d..8182ae3f47 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Pokračovat na %1", "return_to": "Vrátit se na %1", "new_notification": "Nové upozornění", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Máte nepřečtená upozornění.", "all": "Vše", "topics": "Témata", @@ -45,5 +46,19 @@ "email-confirmed": "E-mail potvrzen", "email-confirmed-message": "Děkujeme za ověření vaší e-mailové adresy. Váš účet je nyní aktivní.", "email-confirm-error-message": "Nastal problém s ověřením vaší e-mailové adresy. Kód je pravděpodobně neplatný nebo jeho platnost vypršela.", - "email-confirm-sent": "Ověřovací e-mail odeslán." + "email-confirm-sent": "Ověřovací e-mail odeslán.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/da/admin/appearance/customise.json b/public/language/da/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/da/admin/appearance/customise.json +++ b/public/language/da/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/da/admin/menu.json b/public/language/da/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/da/admin/menu.json +++ b/public/language/da/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/da/admin/settings/notifications.json b/public/language/da/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/da/admin/settings/notifications.json +++ b/public/language/da/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/da/admin/settings/post.json b/public/language/da/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/da/admin/settings/post.json +++ b/public/language/da/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/da/admin/settings/user.json b/public/language/da/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/da/admin/settings/user.json +++ b/public/language/da/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/da/email.json b/public/language/da/email.json index afd7577d19..b06a283c0f 100644 --- a/public/language/da/email.json +++ b/public/language/da/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Denne chat notifikation blev sendt til dig pga. indstillingerne i dit abonnement.", "notif.post.cta": "Klik her for a læse hele emnet", "notif.post.unsub.info": "Denne indlægs notifikation var sendt pga. dine abonnering indstillinger.", + "notif.cta": "Click here to go to forum", "test.text1": "Dette er en test email for at kontrollere, at den udgående email server er opsat korrekt i forhold til din NodeBB installation.", "unsub.cta": "Klik her for at ændre disse indstillinger", "banned.subject": "You have been banned from %1", diff --git a/public/language/da/notifications.json b/public/language/da/notifications.json index 7754539229..85d0276864 100644 --- a/public/language/da/notifications.json +++ b/public/language/da/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Fortsæt til %1", "return_to": "Returnere til %t", "new_notification": "Ny notifikation", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Du har ulæste notifikationer.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Email bekræftet", "email-confirmed-message": "Tak fordi du validerede din email. Din konto er nu fuldt ud aktiveret.", "email-confirm-error-message": "Der var et problem med valideringen af din emailadresse. Bekræftelses koden var muligvis forkert eller udløbet.", - "email-confirm-sent": "Bekræftelses email afsendt." + "email-confirm-sent": "Bekræftelses email afsendt.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/de/admin/appearance/customise.json b/public/language/de/admin/appearance/customise.json index 657fe93ea8..b3c9f4e1ba 100644 --- a/public/language/de/admin/appearance/customise.json +++ b/public/language/de/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Füge hier deine eigenen CSS-Eigenschaften ein, sie werden als letztes angewendet.", "custom-css.enable": "Benutzerdefiniertes CSS aktivieren", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Benutzerdefinierter Header", - "custom-header.description": "Füge hier dein benutzerdefiniertes HTML (z.B. Javascript, Meta Tags, usw.) ein, welches in den <head> Tag eingefügt werden soll.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Benutzerdefinierten Header aktivieren", "custom-css.livereload": "Live-Aktualisierung aktivieren", diff --git a/public/language/de/admin/menu.json b/public/language/de/admin/menu.json index 6184c1b671..32c4fa2797 100644 --- a/public/language/de/admin/menu.json +++ b/public/language/de/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Aussehen", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Benutzerdefiniertes HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Erweitert", "extend/plugins": "Plugins", diff --git a/public/language/de/admin/settings/notifications.json b/public/language/de/admin/settings/notifications.json index 3aab343267..6fda1fb5b0 100644 --- a/public/language/de/admin/settings/notifications.json +++ b/public/language/de/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Benachrichtigungen", "welcome-notification": "Wilkommensnachricht", - "welcome-notification-link": "Wilkommensnachricht-Link" + "welcome-notification-link": "Wilkommensnachricht-Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/de/admin/settings/post.json b/public/language/de/admin/settings/post.json index 686b33012b..b9076f8cee 100644 --- a/public/language/de/admin/settings/post.json +++ b/public/language/de/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Von Alt bis Neu", "sorting.newest-to-oldest": "Von Neu zu Alt", "sorting.most-votes": "Meiste Bewertungen", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Standardmäßige Themensortierung", "restrictions": "Posting beschränkungen", "restrictions.post-queue": "Beitragswarteschlange verwenden", diff --git a/public/language/de/admin/settings/user.json b/public/language/de/admin/settings/user.json index 13809851b8..6e2c89bbce 100644 --- a/public/language/de/admin/settings/user.json +++ b/public/language/de/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Verhindere das Benutzer eigene Skins verwenden", "account-protection": "Kontosicherheit", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login-Versuche pro Stunde", "login-attempts-help": "Wenn die loginversuche zu einem Account diese Schwelle überschreiten, wird dieser Account für eine festgelegte Zeit gesperrt", "lockout-duration": "Account Aussperrzeitraum (Minuten)", diff --git a/public/language/de/email.json b/public/language/de/email.json index b897966610..8e4368dd6c 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Diese Chat-Benachrichtigung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.", "notif.post.cta": "Hier klicken, um das gesamte Thema zu lesen", "notif.post.unsub.info": "Diese Mitteilung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.", + "notif.cta": "Click here to go to forum", "test.text1": "Dies ist eine Test-E-Mail, um zu überprüfen, ob der E-Mailer deines NodeBB korrekt eingestellt wurde.", "unsub.cta": "Klicke hier, um diese Einstellungen zu ändern", "banned.subject": "Du wurdest von %1 gebannt.", diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 3f29764fd0..481cee2149 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Fortfahren zu %1", "return_to": "Kehre zurück zu %1", "new_notification": "Neue Benachrichtigung", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Du hast ungelesene Benachrichtigungen.", "all": "Alle", "topics": "Themen", @@ -45,5 +46,19 @@ "email-confirmed": "E-Mail bestätigt", "email-confirmed-message": "Vielen Dank für Ihre E-Mail-Validierung. Ihr Konto ist nun vollständig aktiviert.", "email-confirm-error-message": "Es gab ein Problem bei der Validierung Ihrer E-Mail-Adresse. Möglicherweise ist der Code ungültig oder abgelaufen.", - "email-confirm-sent": "Bestätigungs-E-Mail gesendet." + "email-confirm-sent": "Bestätigungs-E-Mail gesendet.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/el/admin/appearance/customise.json b/public/language/el/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/el/admin/appearance/customise.json +++ b/public/language/el/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/el/admin/menu.json b/public/language/el/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/el/admin/menu.json +++ b/public/language/el/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/el/admin/settings/notifications.json b/public/language/el/admin/settings/notifications.json index 10009c6e08..e2d5967239 100644 --- a/public/language/el/admin/settings/notifications.json +++ b/public/language/el/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Ειδοποιήσεις", "welcome-notification": "Ειδοποίηση καλωσορίσματος", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/el/admin/settings/post.json b/public/language/el/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/el/admin/settings/post.json +++ b/public/language/el/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/el/admin/settings/user.json b/public/language/el/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/el/admin/settings/user.json +++ b/public/language/el/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/el/email.json b/public/language/el/email.json index 8cdc4b057d..c9b69997c2 100644 --- a/public/language/el/email.json +++ b/public/language/el/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Αυτή η ειδοποίηση για συνομιλία σου στάλθηκε λόγω των ρυθμίσεών σου. ", "notif.post.cta": "Click here to read the full topic", "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.cta": "Click here to go to forum", "test.text1": "Αυτό είναι ένα δοκιμαστικό email για να επιβεβαιώσουμε ότι ο emailer έχει στηθεί σωστά για το NodeBB.", "unsub.cta": "Κάνε κλικ εδώ για να αλλάξεις αυτές τις ρυθμίσεις", "banned.subject": "You have been banned from %1", diff --git a/public/language/el/notifications.json b/public/language/el/notifications.json index c59382c86c..5730d9c642 100644 --- a/public/language/el/notifications.json +++ b/public/language/el/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continue to %1", "return_to": "Return to %1", "new_notification": "New Notification", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "You have unread notifications.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "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": "Στάλθηκε email επιβεβαίωσης." + "email-confirm-sent": "Στάλθηκε email επιβεβαίωσης.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/en-US/admin/appearance/customise.json b/public/language/en-US/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/en-US/admin/appearance/customise.json +++ b/public/language/en-US/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/en-US/admin/menu.json b/public/language/en-US/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/en-US/admin/menu.json +++ b/public/language/en-US/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/en-US/admin/settings/notifications.json b/public/language/en-US/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/en-US/admin/settings/notifications.json +++ b/public/language/en-US/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/en-US/admin/settings/post.json b/public/language/en-US/admin/settings/post.json index f938a7e7d7..18283565b2 100644 --- a/public/language/en-US/admin/settings/post.json +++ b/public/language/en-US/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/en-US/admin/settings/user.json b/public/language/en-US/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/en-US/admin/settings/user.json +++ b/public/language/en-US/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/en-US/email.json b/public/language/en-US/email.json index c1e17018fa..164e70795e 100644 --- a/public/language/en-US/email.json +++ b/public/language/en-US/email.json @@ -30,6 +30,7 @@ "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.", + "notif.cta": "Click here to go to forum", "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", "banned.subject": "You have been banned from %1", diff --git a/public/language/en-US/notifications.json b/public/language/en-US/notifications.json index 8fb6665d1c..cbb80a396e 100644 --- a/public/language/en-US/notifications.json +++ b/public/language/en-US/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continue to %1", "return_to": "Return to %1", "new_notification": "New Notification", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "You have unread notifications.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "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-confirm-sent": "Confirmation email sent.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/appearance/customise.json b/public/language/en-x-pirate/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/en-x-pirate/admin/appearance/customise.json +++ b/public/language/en-x-pirate/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/en-x-pirate/admin/menu.json b/public/language/en-x-pirate/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/en-x-pirate/admin/menu.json +++ b/public/language/en-x-pirate/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/en-x-pirate/admin/settings/notifications.json b/public/language/en-x-pirate/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/en-x-pirate/admin/settings/notifications.json +++ b/public/language/en-x-pirate/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/settings/post.json b/public/language/en-x-pirate/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/en-x-pirate/admin/settings/post.json +++ b/public/language/en-x-pirate/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/en-x-pirate/admin/settings/user.json b/public/language/en-x-pirate/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/en-x-pirate/admin/settings/user.json +++ b/public/language/en-x-pirate/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/en-x-pirate/email.json b/public/language/en-x-pirate/email.json index d46ef9d972..6cbe176151 100644 --- a/public/language/en-x-pirate/email.json +++ b/public/language/en-x-pirate/email.json @@ -30,6 +30,7 @@ "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.", + "notif.cta": "Click here to go to forum", "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", "banned.subject": "You have been banned from %1", diff --git a/public/language/en-x-pirate/notifications.json b/public/language/en-x-pirate/notifications.json index e3641543d5..81473f4a92 100644 --- a/public/language/en-x-pirate/notifications.json +++ b/public/language/en-x-pirate/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continue to %1", "return_to": "Return to %1", "new_notification": "New Notification", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "You have unread notifications.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "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-confirm-sent": "Confirmation email sent.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/es/admin/appearance/customise.json b/public/language/es/admin/appearance/customise.json index ad8ae104a8..0f707eb156 100644 --- a/public/language/es/admin/appearance/customise.json +++ b/public/language/es/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Introduce tus propias declaraciones CSS aquí, las cuales serán aplicadas después de otros estilos.", "custom-css.enable": "Activar CSS personalizado", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Cabezera personalizada", - "custom-header.description": "Introduce HTML personalizado aquí (ej. JavaScript, Meta Etiquetas, etc.), el cual se adjuntará a la sección <head> del código de su foro.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Activar cabecera personalizada", "custom-css.livereload": "Activar Recargar en Vivo", diff --git a/public/language/es/admin/menu.json b/public/language/es/admin/menu.json index d4e0428127..092ff469e7 100644 --- a/public/language/es/admin/menu.json +++ b/public/language/es/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Apariencia", "appearance/themes": "Temas", "appearance/skins": "Pieles", - "appearance/customise": "HTML & CSS personalizado", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extender", "extend/plugins": "Extensiones", diff --git a/public/language/es/admin/settings/notifications.json b/public/language/es/admin/settings/notifications.json index 7cfd68f3d6..ab07a69717 100644 --- a/public/language/es/admin/settings/notifications.json +++ b/public/language/es/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notificaciones", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/es/admin/settings/post.json b/public/language/es/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/es/admin/settings/post.json +++ b/public/language/es/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/es/admin/settings/user.json b/public/language/es/admin/settings/user.json index 73e93f05d0..6147c898a3 100644 --- a/public/language/es/admin/settings/user.json +++ b/public/language/es/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/es/email.json b/public/language/es/email.json index 7eed5d4d2d..21168da991 100644 --- a/public/language/es/email.json +++ b/public/language/es/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Esta notificación de chat se te envió debido a tus ajustes de suscripción.", "notif.post.cta": "Cliquea aquí para leer la publicación completa", "notif.post.unsub.info": "La notificación de este mensaje se te ha enviado debido a tus ajustes de subscripción.", + "notif.cta": "Click here to go to forum", "test.text1": "Este es un email de prueba para verificar que el envío de email está ajustado correctamente para tu NodeBB", "unsub.cta": "Haz click aquí para modificar los ajustes.", "banned.subject": "Has sido baneado de %1", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 8d8ec31faf..b771224b29 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continuar a %1", "return_to": "Regresar a %1", "new_notification": "Nueva notificación", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Tienes notificaciones sin leer.", "all": "Todo", "topics": "Temas", @@ -45,5 +46,19 @@ "email-confirmed": "Correo electrónico confirmado", "email-confirmed-message": "Gracias por validar tu correo electrónico. Tu cuenta ya está completamente activa.", "email-confirm-error-message": "Hubo un problema al validar tu cuenta de correo electrónico. Quizá el código era erróneo o expiró...", - "email-confirm-sent": "Correo de confirmación enviado." + "email-confirm-sent": "Correo de confirmación enviado.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/et/admin/appearance/customise.json b/public/language/et/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/et/admin/appearance/customise.json +++ b/public/language/et/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/et/admin/menu.json b/public/language/et/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/et/admin/menu.json +++ b/public/language/et/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/et/admin/settings/notifications.json b/public/language/et/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/et/admin/settings/notifications.json +++ b/public/language/et/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/et/admin/settings/post.json b/public/language/et/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/et/admin/settings/post.json +++ b/public/language/et/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/et/admin/settings/user.json b/public/language/et/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/et/admin/settings/user.json +++ b/public/language/et/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/et/email.json b/public/language/et/email.json index 38d3a3bb82..a51f25e36e 100644 --- a/public/language/et/email.json +++ b/public/language/et/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "See chat teavitus on saadetud teile tellimuse seadistuse tõttu.", "notif.post.cta": "Vajuta siia, et lugeda teemat täies mahus", "notif.post.unsub.info": "See postituse teavitus on saadetud teile tellimuse seadistuse tõttu.", + "notif.cta": "Click here to go to forum", "test.text1": "See on test e-mail kinnitamaks, et emailer on korrektselt seadistatud sinu NodeBB jaoks.", "unsub.cta": "Vajuta siia, et muuta neid seadeid", "banned.subject": "You have been banned from %1", diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 87d23584ed..fb06480814 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Jätka %1", "return_to": "Pöördu tagasi %1", "new_notification": "Uus teade", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Sul ei ole lugemata teateid.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Emaili aadress kinnitatud", "email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja on nüüd täielikult aktiveeritud.", "email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.", - "email-confirm-sent": "Kinnituskiri on saadetud." + "email-confirm-sent": "Kinnituskiri on saadetud.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/appearance/customise.json b/public/language/fa-IR/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/fa-IR/admin/appearance/customise.json +++ b/public/language/fa-IR/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/fa-IR/admin/extend/plugins.json b/public/language/fa-IR/admin/extend/plugins.json index 16bc9f33ae..7515f72590 100644 --- a/public/language/fa-IR/admin/extend/plugins.json +++ b/public/language/fa-IR/admin/extend/plugins.json @@ -1,14 +1,14 @@ { - "installed": "نصب شده", - "active": "فعال", - "inactive": "غیرفعال", + "installed": "Installed", + "active": "Active", + "inactive": "Inactive", "out-of-date": "Out of Date", - "none-found": "هیچ پلاگینی یافت نشد.", + "none-found": "No plugins found.", "none-active": "No Active Plugins", - "find-plugins": "پیدا کردن پلاگین ها", + "find-plugins": "Find Plugins", - "plugin-search": "جستجوی پلاگین", - "plugin-search-placeholder": "جستجو برای پلاگین", + "plugin-search": "Plugin Search", + "plugin-search-placeholder": "Search for plugin...", "reorder-plugins": "Re-order Plugins", "order-active": "Order Active Plugins", "dev-interested": "Interested in writing plugins for NodeBB?", @@ -17,35 +17,35 @@ "order.description": "Certain plugins work ideally when they are initialised before/after other plugins.", "order.explanation": "Plugins load in the order specified here, from top to bottom", - "plugin-item.themes": "پوسته", - "plugin-item.deactivate": "غیر فعال کردن", - "plugin-item.activate": "فعال کردن", - "plugin-item.install": "نصب کردن", - "plugin-item.uninstall": "حذف کردن", - "plugin-item.settings": "تنظیمات", - "plugin-item.installed": "نصب شده", - "plugin-item.latest": "آخرین", - "plugin-item.upgrade": "ارتقاء", - "plugin-item.more-info": "برای اطلاعات بیشتر:", - "plugin-item.unknown": "ناشناخته", + "plugin-item.themes": "Themes", + "plugin-item.deactivate": "Deactivate", + "plugin-item.activate": "Activate", + "plugin-item.install": "Install", + "plugin-item.uninstall": "Uninstall", + "plugin-item.settings": "Settings", + "plugin-item.installed": "Installed", + "plugin-item.latest": "Latest", + "plugin-item.upgrade": "Upgrade", + "plugin-item.more-info": "For more information:", + "plugin-item.unknown": "Unknown", "plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.", - "alert.enabled": "پلاگین فعال شد", - "alert.disabled": "پلاگین غیرفعال شد", - "alert.upgraded": "پلاگین ارتقاء یافت", - "alert.installed": "پلاگین نصب شد", - "alert.uninstalled": "پلاگین حذف شد", + "alert.enabled": "Plugin Enabled", + "alert.disabled": "Plugin Disabled", + "alert.upgraded": "Plugin Upgraded", + "alert.installed": "Plugin Installed", + "alert.uninstalled": "Plugin Uninstalled", "alert.activate-success": "Please restart your NodeBB to fully activate this plugin", - "alert.deactivate-success": "پلاگین با موفقیت غیر فعال شد", + "alert.deactivate-success": "Plugin successfully deactivated", "alert.upgrade-success": "Please reload your NodeBB to fully upgrade this plugin", - "alert.install-success": "پلاگین با موفقیت نصب شد، لطفا پلاگین را فعال کنید", - "alert.uninstall-success": "پلاگین با موفقیت غیرفعال و حذف شده است", + "alert.install-success": "Plugin successfully installed, please activate the plugin.", + "alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.", "alert.suggest-error": "

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (%1): %2
", "alert.package-manager-unreachable": "

NodeBB could not reach the package manager, an upgrade is not suggested at this time.

", "alert.incompatible": "

Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.

", "alert.possibly-incompatible": "

No Compatibility Information Found

This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.

In the event that NodeBB cannot boot properly:

$ ./nodebb reset plugin=\"%1\"

Continue installation of latest version of this plugin?

", - "license.title": "اطلاعات مجوز پلاگین ", + "license.title": "Plugin License Information", "license.intro": "The plugin %1 is licensed under the %2. Please read and understand the license terms prior to activating this plugin.", - "license.cta": "آیا می خواهید پلاگین را فعال کنید؟" + "license.cta": "Do you wish to continue with activating this plugin?" } diff --git a/public/language/fa-IR/admin/general/languages.json b/public/language/fa-IR/admin/general/languages.json index bd1b49274d..bdd57849b3 100644 --- a/public/language/fa-IR/admin/general/languages.json +++ b/public/language/fa-IR/admin/general/languages.json @@ -1,6 +1,6 @@ { - "language-settings": "تنظیمات زبان", + "language-settings": "Language Settings", "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "زبان پیش فرض", - "auto-detect": "شناسایی خودکار تنظیمات زبان برای مهمانان" + "default-language": "Default Language", + "auto-detect": "Auto Detect Language Setting for Guests" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/menu.json b/public/language/fa-IR/admin/menu.json index 204d8e24a9..4c61f97103 100644 --- a/public/language/fa-IR/admin/menu.json +++ b/public/language/fa-IR/admin/menu.json @@ -1,10 +1,10 @@ { "section-general": "General", - "general/dashboard": "داشبورد", + "general/dashboard": "Dashboard", "general/homepage": "Home Page", "general/navigation": "Navigation", - "general/languages": "زبان ها", - "general/sounds": "صداها", + "general/languages": "Languages", + "general/sounds": "Sounds", "general/social": "Social", "section-manage": "Manage", @@ -13,12 +13,12 @@ "manage/users": "Users", "manage/registration": "Registration Queue", "manage/post-queue": "Post Queue", - "manage/groups": "گروه ها", - "manage/ip-blacklist": "لیست سیاه IP", + "manage/groups": "Groups", + "manage/ip-blacklist": "IP Blacklist", - "section-settings": "تنظیمات", + "section-settings": "Settings", "settings/general": "General", - "settings/reputation": "اعتبار", + "settings/reputation": "Reputation", "settings/email": "Email", "settings/user": "User", "settings/group": "Group", @@ -36,34 +36,34 @@ "settings.page-title": "%1 Settings", - "section-appearance": "ظاهر", - "appearance/themes": "پوسته ها", + "section-appearance": "Appearance", + "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", - "extend/plugins": "پلاگین ها", - "extend/widgets": "ویجت ها", - "extend/rewards": "پاداش ها", + "extend/plugins": "Plugins", + "extend/widgets": "Widgets", + "extend/rewards": "Rewards", "section-social-auth": "Social Authentication", - "section-plugins": "پلاگین ها", + "section-plugins": "Plugins\n", "extend/plugins.install": "Install Plugins", "section-advanced": "Advanced", "advanced/database": "Database", "advanced/events": "Events", "advanced/logs": "Logs", - "advanced/errors": "خطاها", + "advanced/errors": "Errors", "advanced/cache": "Cache", "development/logger": "Logger", "development/info": "Info", "reload-forum": "Reload Forum", - "restart-forum": "راه اندازی مجدد انجمن", - "logout": "خروج", - "view-forum": "مشاهده انجمن", + "restart-forum": "Restart Forum", + "logout": "Log out", + "view-forum": "View Forum", "search.placeholder": "Search for settings", "search.no-results": "No results...", diff --git a/public/language/fa-IR/admin/settings/chat.json b/public/language/fa-IR/admin/settings/chat.json index 6c827e42f5..0b22127341 100644 --- a/public/language/fa-IR/admin/settings/chat.json +++ b/public/language/fa-IR/admin/settings/chat.json @@ -1,7 +1,7 @@ { - "chat-settings": "تنظیمات گفتگو ها", - "disable": "غیرفعال کردن چت", - "disable-editing": "غیرفعال کردن ویرایش کردن / پاک کردن پیام های چت", + "chat-settings": "Chat Settings", + "disable": "Disable chat", + "disable-editing": "Disable chat message editing/deletion", "disable-editing-help": "Administrators and global moderators are exempt from this restriction", "max-length": "Maximum length of chat messages", "max-room-size": "Maximum number of users in chat rooms", diff --git a/public/language/fa-IR/admin/settings/notifications.json b/public/language/fa-IR/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/fa-IR/admin/settings/notifications.json +++ b/public/language/fa-IR/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/settings/post.json b/public/language/fa-IR/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/fa-IR/admin/settings/post.json +++ b/public/language/fa-IR/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/fa-IR/admin/settings/uploads.json b/public/language/fa-IR/admin/settings/uploads.json index 56161ea170..f7b860983a 100644 --- a/public/language/fa-IR/admin/settings/uploads.json +++ b/public/language/fa-IR/admin/settings/uploads.json @@ -1,6 +1,6 @@ { "posts": "پست‌ها", - "allow-files": "اجازه بارگذاری فایل های معمولی به کاربران", + "allow-files": "Allow users to upload regular files", "private": "Make uploaded files private", "max-image-width": "Resize images down to specified width (in pixels)", "max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", @@ -14,15 +14,15 @@ "allow-profile-image-uploads": "Allow users to upload profile images", "convert-profile-image-png": "Convert profile image uploads to PNG", "default-avatar": "Custom Default Avatar", - "upload": "بارگذاری", + "upload": "Upload", "profile-image-dimension": "Profile Image Dimension", "profile-image-dimension-help": "(in pixels, default: 128 pixels)", "max-profile-image-size": "Maximum Profile Image File Size", - "max-profile-image-size-help": "(برحسب kibibytes، پیش فرض : 256 KiB)", + "max-profile-image-size-help": "(in kibibytes, default: 256 KiB)", "max-cover-image-size": "Maximum Cover Image File Size", - "max-cover-image-size-help": "(برحسب kibibytes، پیش فرض : 2,048 KiB)", + "max-cover-image-size-help": "(in kibibytes, default: 2,048 KiB)", "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", - "profile-covers": "کاور های پروفایل", - "default-covers": "عکس های کاور پیش فرض", + "profile-covers": "Profile Covers", + "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" } diff --git a/public/language/fa-IR/admin/settings/user.json b/public/language/fa-IR/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/fa-IR/admin/settings/user.json +++ b/public/language/fa-IR/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/fa-IR/email.json b/public/language/fa-IR/email.json index b040de56ee..e878af6684 100644 --- a/public/language/fa-IR/email.json +++ b/public/language/fa-IR/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "این اطلاعیه ی چتیی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", "notif.post.cta": "برای مشاهده کامل موضوع اینجا کلیک کنید", "notif.post.unsub.info": "این اطلاعیه ی پستی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", + "notif.cta": "Click here to go to forum", "test.text1": "این یک ایمیل امتحانی جهت تایید اینکه فرستنده ایمیل برای انجمن NodeBB شما به درستی تنظیم و نصب شده است", "unsub.cta": "برای ویرایش آن تنظیمات اینجا کلیک کنید", "banned.subject": "You have been banned from %1", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index ca2528b554..b3ed9bf571 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -109,7 +109,7 @@ "chat-disabled": "سیستم گفتمان غیرفعال شده است", "too-many-messages": "شما پیامهای خیلی زیادی فرستاده اید، لطفا مدتی صبر نمایید", "invalid-chat-message": "پیام نامعتبر", - "chat-message-too-long": "پیام های چت نمی توانند بیشتر از 1% کاراکتر باشند.", + "chat-message-too-long": "پیام های چت نمی توانند بیشتر از %1 کاراکتر باشند.", "cant-edit-chat-message": "شما اجازه ی ویرایش این پیام را ندارید", "cant-remove-last-user": "شما نمی توانید آخرین کاربر را حذف کنید", "cant-delete-chat-message": "شما اجازه حذف این پیام را ندارید.", diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index 6e4bb7dbd2..7fc91aa517 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -9,6 +9,7 @@ "continue_to": "ادامه به %1", "return_to": "بازگشت به %1", "new_notification": "آگاه‌سازی‌ تازه", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "شما آگاه‌سازی‌‌های نخوانده دارید.", "all": "همه", "topics": "موضوع ها", @@ -45,5 +46,19 @@ "email-confirmed": "ایمیل تایید شد", "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", "email-confirm-error-message": "خطایی در تایید آدرس ایمیل شما پیش آمده است. ممکن است کد نا‌معتبر و یا منقضی شده باشد.", - "email-confirm-sent": "ایمیل تایید ارسال شد." + "email-confirm-sent": "ایمیل تایید ارسال شد.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/fi/admin/appearance/customise.json b/public/language/fi/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/fi/admin/appearance/customise.json +++ b/public/language/fi/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/fi/admin/menu.json b/public/language/fi/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/fi/admin/menu.json +++ b/public/language/fi/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/fi/admin/settings/notifications.json b/public/language/fi/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/fi/admin/settings/notifications.json +++ b/public/language/fi/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/fi/admin/settings/post.json b/public/language/fi/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/fi/admin/settings/post.json +++ b/public/language/fi/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/fi/admin/settings/user.json b/public/language/fi/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/fi/admin/settings/user.json +++ b/public/language/fi/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/fi/email.json b/public/language/fi/email.json index 33ba62f68d..ec849a5639 100644 --- a/public/language/fi/email.json +++ b/public/language/fi/email.json @@ -30,6 +30,7 @@ "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.", + "notif.cta": "Click here to go to forum", "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", "banned.subject": "You have been banned from %1", diff --git a/public/language/fi/notifications.json b/public/language/fi/notifications.json index c2ffeb4f82..561076543d 100644 --- a/public/language/fi/notifications.json +++ b/public/language/fi/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continue to %1", "return_to": "Return to %1", "new_notification": "Uusi ilmoitus", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Sinulla on lukemattomia ilmoituksia.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Sähköpostiosoite vahvistettu", "email-confirmed-message": "Kiitos sähköpostiosoitteesi vahvistamisesta. Käyttäjätilisi on nyt täysin aktivoitu.", "email-confirm-error-message": "Ongelma sähköpostiosoitteen vahvistamisessa. Ehkäpä koodi oli virheellinen tai vanhentunut.", - "email-confirm-sent": "Vahvistussähköposti lähetetty." + "email-confirm-sent": "Vahvistussähköposti lähetetty.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/fr/admin/appearance/customise.json b/public/language/fr/admin/appearance/customise.json index e867039801..ada04f6546 100644 --- a/public/language/fr/admin/appearance/customise.json +++ b/public/language/fr/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Entrez vos propres déclarations de CSS ici, elles seront appliquées après tous les autres styles.", "custom-css.enable": "Activer les CSS personnalisés", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "En-tête personnalisé", - "custom-header.description": "Entrez votre code HTML ici (ex. Javascripts, Méta tags, etc…), qui seront ajoutés à la section <head> du code de votre forum.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Activer les en-têtes personnalisés", "custom-css.livereload": "Activer le rechargement en direct", diff --git a/public/language/fr/admin/menu.json b/public/language/fr/admin/menu.json index 22179e2010..8ab65fd51d 100644 --- a/public/language/fr/admin/menu.json +++ b/public/language/fr/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Apparence", "appearance/themes": "Thèmes", "appearance/skins": "Skins", - "appearance/customise": "HTML et CSS personnalisés", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extensions", "extend/plugins": "Plugins", diff --git a/public/language/fr/admin/settings/notifications.json b/public/language/fr/admin/settings/notifications.json index 8363491294..b679458498 100644 --- a/public/language/fr/admin/settings/notifications.json +++ b/public/language/fr/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Notification de bienvenue", - "welcome-notification-link": "Lien de notification de bienvenue" + "welcome-notification-link": "Lien de notification de bienvenue", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/post.json b/public/language/fr/admin/settings/post.json index 3371e5b6d4..978f696168 100644 --- a/public/language/fr/admin/settings/post.json +++ b/public/language/fr/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Du plus ancien au plus récent", "sorting.newest-to-oldest": "Du plus récent au plus ancien", "sorting.most-votes": "Avec le plus de votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Tri des sujets par défaut", "restrictions": "Restrictions d'envoi", "restrictions.post-queue": "Activer la file d'attente des messages", diff --git a/public/language/fr/admin/settings/user.json b/public/language/fr/admin/settings/user.json index aeb9c7e9e6..9f6c78ea9b 100644 --- a/public/language/fr/admin/settings/user.json +++ b/public/language/fr/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Thèmes", "disable-user-skins": "Empêcher les utilisateurs de choisir un skin personnalisé", "account-protection": "Protection du compte", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Tentatives de connexions par heure", "login-attempts-help": "Si le nombre de tentatives de connexion à un compte dépasse ce seuil, le compte sera bloqué pour une durée pré-configurée", "lockout-duration": "Durée du blocage (minutes)", diff --git a/public/language/fr/email.json b/public/language/fr/email.json index cd244af52f..3e3c9c8976 100644 --- a/public/language/fr/email.json +++ b/public/language/fr/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Cette notification de chat a été envoyé en raison de vos paramètres d'abonnement.", "notif.post.cta": "Cliquer ici pour lire le sujet complet", "notif.post.unsub.info": "La notification de ce message vous a été envoyé en raison de vos paramètres d'abonnement.", + "notif.cta": "Click here to go to forum", "test.text1": "Ceci est un e-mail de test pour vérifier que l'e-mailer est correctement configuré pour NodeBB.", "unsub.cta": "Cliquez ici pour modifier ces paramètres", "banned.subject": "Vous avez été banni de %1", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index 4d34dd3593..79be0264ba 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continuer vers %1", "return_to": "Revenir à %1", "new_notification": "Nouvelle notification", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Vous avez des notifications non-lues", "all": "Tout", "topics": "Sujets", @@ -45,5 +46,19 @@ "email-confirmed": "Email vérifié", "email-confirmed-message": "Merci pour la validation de votre adresse email. Votre compte est désormais activé.", "email-confirm-error-message": "Il y a un un problème dans la vérification de votre adresse email. Le code est peut être invalide ou a expiré.", - "email-confirm-sent": "Email de vérification envoyé." + "email-confirm-sent": "Email de vérification envoyé.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/gl/admin/appearance/customise.json b/public/language/gl/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/gl/admin/appearance/customise.json +++ b/public/language/gl/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/gl/admin/menu.json b/public/language/gl/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/gl/admin/menu.json +++ b/public/language/gl/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/gl/admin/settings/notifications.json b/public/language/gl/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/gl/admin/settings/notifications.json +++ b/public/language/gl/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/gl/admin/settings/post.json b/public/language/gl/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/gl/admin/settings/post.json +++ b/public/language/gl/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/gl/admin/settings/user.json b/public/language/gl/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/gl/admin/settings/user.json +++ b/public/language/gl/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/gl/email.json b/public/language/gl/email.json index 0aee60f82d..dc00e2c996 100644 --- a/public/language/gl/email.json +++ b/public/language/gl/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Esta notificación de charla foiche enviada polas túas opcións de subscrición.", "notif.post.cta": "Pica aquí para leer todos os temas", "notif.post.unsub.info": "Esta notificación de mensaxe foiche enviada polas túas opcións de subscrición.", + "notif.cta": "Click here to go to forum", "test.text1": "Esta é unha mensaxe de proba para verificar que o envío de correo está configurado correctamente para o seu NodeBB.", "unsub.cta": "Pica aquí para cambiar os axustes", "banned.subject": "You have been banned from %1", diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 0c4b8aab72..f5e6f5bfbc 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continuar a %1", "return_to": "Volver a %1", "new_notification": "Nova Notificación", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Tes notificacións non lidas", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Correo confirmado", "email-confirmed-message": "Grazas por validar o teu correo. A túa conta agora está activada.", "email-confirm-error-message": "Houbo un problema validando o teu correo. Poida que o código fose inválido ou expirase. ", - "email-confirm-sent": "Correo de confirmación enviado." + "email-confirm-sent": "Correo de confirmación enviado.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/he/admin/appearance/customise.json b/public/language/he/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/he/admin/appearance/customise.json +++ b/public/language/he/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/he/admin/menu.json b/public/language/he/admin/menu.json index 311666c5f7..cde4e9a506 100644 --- a/public/language/he/admin/menu.json +++ b/public/language/he/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/he/admin/settings/notifications.json b/public/language/he/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/he/admin/settings/notifications.json +++ b/public/language/he/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/he/admin/settings/post.json b/public/language/he/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/he/admin/settings/post.json +++ b/public/language/he/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/he/admin/settings/user.json b/public/language/he/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/he/admin/settings/user.json +++ b/public/language/he/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/he/email.json b/public/language/he/email.json index 1495b88c48..79ddc36f99 100644 --- a/public/language/he/email.json +++ b/public/language/he/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "התראה הצ'אט הזו נשלחה אליך על-פי הגדרות החשבון שלך.", "notif.post.cta": "לחץ כאן בשביל לקרוא את כל הנושא", "notif.post.unsub.info": "התראת הפוסט הזו נשלחה אליך על-פי הגדרות החשבון שלך.", + "notif.cta": "Click here to go to forum", "test.text1": "זהו אימייל ניסיון על מנת לוודא שהגדרות המייל בוצעו כהלכה בהגדרות NodeBB.", "unsub.cta": "לחץ כאן לשנות הגדרות אלו", "banned.subject": "הורחקת מ %1", diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index 1cab5188ab..0634c4b13d 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -9,6 +9,7 @@ "continue_to": "המשך ל %1", "return_to": "חזור ל %1", "new_notification": "התראה חדשה", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "יש לך התראות שלא נקראו.", "all": "הכל", "topics": "נושאים", @@ -45,5 +46,19 @@ "email-confirmed": "כתובת המייל אושרה", "email-confirmed-message": "תודה שאישרת את כתובת המייל שלך. החשבון שלך פעיל כעת.", "email-confirm-error-message": "אירעה שגיאה בעת אישור המייל שלך. ייתכן כי הקוד היה שגוי או פג תוקף.", - "email-confirm-sent": "מייל אישור נשלח." + "email-confirm-sent": "מייל אישור נשלח.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/hr/admin/appearance/customise.json b/public/language/hr/admin/appearance/customise.json index a283a153aa..ea5d0d5cc2 100644 --- a/public/language/hr/admin/appearance/customise.json +++ b/public/language/hr/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Unesi CSS deklaracije koje će biti upisane poslije svih stilova.", "custom-css.enable": "Omogući dodatni CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Uobičajno zaglavlje", - "custom-header.description": "Unesite Vaš HTML ovdje(npr. JavaScript Meta Tags itd.)koji će biti dodani <head> sekciji marže Vašeg foruma.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Omogući uobičajeno zaglavlje", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/hr/admin/menu.json b/public/language/hr/admin/menu.json index ae682e4f6b..2facf3eb41 100644 --- a/public/language/hr/admin/menu.json +++ b/public/language/hr/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Izgled", "appearance/themes": "Predlošci", "appearance/skins": "Izgled", - "appearance/customise": "Uobičajni HTML i CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Proširi", "extend/plugins": "Dodatci", diff --git a/public/language/hr/admin/settings/notifications.json b/public/language/hr/admin/settings/notifications.json index 1d1c969f34..d70a8007a4 100644 --- a/public/language/hr/admin/settings/notifications.json +++ b/public/language/hr/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Obavijesti", "welcome-notification": "Obavijest dobrodošlice", - "welcome-notification-link": "Poveznica objave dobrodošlice" + "welcome-notification-link": "Poveznica objave dobrodošlice", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/hr/admin/settings/post.json b/public/language/hr/admin/settings/post.json index 24906ac67e..340e076981 100644 --- a/public/language/hr/admin/settings/post.json +++ b/public/language/hr/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Starije prema Novijem", "sorting.newest-to-oldest": "Novije prema Starijem", "sorting.most-votes": "Najviše glasova", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Uobičajeno sortiranje tema", "restrictions": "Restrikcije objave", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/hr/admin/settings/user.json b/public/language/hr/admin/settings/user.json index a39e4b7472..442abf0ec3 100644 --- a/public/language/hr/admin/settings/user.json +++ b/public/language/hr/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Predlošci", "disable-user-skins": "Onemogući korisnicima odabir predloška", "account-protection": "Zaštita računa", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Pokušaji prijave po satu", "login-attempts-help": "U slučaju pokušaja prijave na račun user's u tolikoj količini da prelazi ovaj prag,račun će biti zaključan na pre-konfigurirano vrijeme", "lockout-duration": "Broj minuta u slučaju zaključavanja računa", diff --git a/public/language/hr/email.json b/public/language/hr/email.json index cdf26cd74f..87da70889b 100644 --- a/public/language/hr/email.json +++ b/public/language/hr/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Ova obavijest razgovora Vam je poslana na temelju vaših postavki pretplate.", "notif.post.cta": "Pročitaj temu", "notif.post.unsub.info": "Ova objava Vam je poslana na temelju vaših postavki pretplate.", + "notif.cta": "Click here to go to forum", "test.text1": "Ovo je test email za provjeru Vaše konfiguracije.", "unsub.cta": "Klikni ovdje za promjenu postavki", "banned.subject": "Blokirani se na %1", diff --git a/public/language/hr/notifications.json b/public/language/hr/notifications.json index a66e3f8b58..4e0c2d5ebf 100644 --- a/public/language/hr/notifications.json +++ b/public/language/hr/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Nastavite na %1", "return_to": "Vratite se na %1", "new_notification": "Nova obavijest", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Nepročitane obavijesti.", "all": "Sve", "topics": "Teme", @@ -45,5 +46,19 @@ "email-confirmed": "Email potvrđen", "email-confirmed-message": "Hvala na potvrdi emaila. Vaš račun je sada aktivan.", "email-confirm-error-message": "Nastao je problem pri potvrdi Vaše email adrese. Provjerite kod ili zatražite novi.", - "email-confirm-sent": "Provjera korisničkog emaila poslana." + "email-confirm-sent": "Provjera korisničkog emaila poslana.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/hu/admin/appearance/customise.json b/public/language/hu/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/hu/admin/appearance/customise.json +++ b/public/language/hu/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/hu/admin/menu.json b/public/language/hu/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/hu/admin/menu.json +++ b/public/language/hu/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/hu/admin/settings/notifications.json b/public/language/hu/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/hu/admin/settings/notifications.json +++ b/public/language/hu/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/hu/admin/settings/post.json b/public/language/hu/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/hu/admin/settings/post.json +++ b/public/language/hu/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/hu/admin/settings/user.json b/public/language/hu/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/hu/admin/settings/user.json +++ b/public/language/hu/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/hu/email.json b/public/language/hu/email.json index 2a4ce69b7d..e508d9cf61 100644 --- a/public/language/hu/email.json +++ b/public/language/hu/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Ez a chat-értesítés a feliratkozási beállításaid miatt lett kiküldve.", "notif.post.cta": "Kattints ide a teljes téma olvasásához", "notif.post.unsub.info": "Ez a hozzászólás-értesítés a feliratkozási beállításaid miatt lett kiküldve.", + "notif.cta": "Click here to go to forum", "test.text1": "Ez egy teszt levél, ami által ellenőrizzük, hogy a levelező helyesen lett beállítva a NodeBB-ben.", "unsub.cta": "Kattintson ide a beállítások módosításához", "banned.subject": "Ki lettél tiltva a(z) %1 oldalról", diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index e1d3677df0..8ab1d0843d 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -9,6 +9,7 @@ "continue_to": "%1 megnyitás", "return_to": "Vissza - %1", "new_notification": "Új értesítés", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Olvasatlan értesítéseid vannak.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "E-mail megerősítve", "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": "Megerősítő e-mail elküldve." + "email-confirm-sent": "Megerősítő e-mail elküldve.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/id/admin/appearance/customise.json b/public/language/id/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/id/admin/appearance/customise.json +++ b/public/language/id/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/id/admin/menu.json b/public/language/id/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/id/admin/menu.json +++ b/public/language/id/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/id/admin/settings/notifications.json b/public/language/id/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/id/admin/settings/notifications.json +++ b/public/language/id/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/id/admin/settings/post.json b/public/language/id/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/id/admin/settings/post.json +++ b/public/language/id/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/id/admin/settings/user.json b/public/language/id/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/id/admin/settings/user.json +++ b/public/language/id/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/id/email.json b/public/language/id/email.json index f8b4d249c5..a1336b1201 100644 --- a/public/language/id/email.json +++ b/public/language/id/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Sesuai pengaturan langganan anda, notifikasi obrolan ini dikirmkan kepada anda", "notif.post.cta": "Click here to read the full topic", "notif.post.unsub.info": "This post notification was sent to you due to your subscription settings.", + "notif.cta": "Click here to go to forum", "test.text1": "Ini hanya email percobaan untuk menverifkasi pengiriman email telah diatur oleh NodeBB secara benar", "unsub.cta": "Klik di sini untuk mengubah pengaturan-pengaturan tersebut.", "banned.subject": "You have been banned from %1", diff --git a/public/language/id/notifications.json b/public/language/id/notifications.json index 741909fd39..0ce32cb76d 100644 --- a/public/language/id/notifications.json +++ b/public/language/id/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Lanjut ke %1", "return_to": "Kembali ke %1", "new_notification": "Pemberitahuan Baru", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Kamu memiliki pemberitahuan yang belum dibaca.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Email telah Dikonfirmasi", "email-confirmed-message": "Terimakasih telah melakukan validasi email. Akunmu saat ini telah aktif sepenuhnya.", "email-confirm-error-message": "Terjadi masalah saat melakukan validasi emailmu. Mungkin terjadi kesalahan kode atau waktu habis.", - "email-confirm-sent": "Email konfirmasi telah dikirim." + "email-confirm-sent": "Email konfirmasi telah dikirim.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/it/admin/appearance/customise.json b/public/language/it/admin/appearance/customise.json index c5eb9568ef..b07dc4bf4f 100644 --- a/public/language/it/admin/appearance/customise.json +++ b/public/language/it/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Inserisci le tue dichiarazioni CSS qui, verranno applicate dopo tutti gli altri stili.", "custom-css.enable": "Abilita CSS Personalizzato", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Intestazione Personalizzata", - "custom-header.description": "Inserisci l' HTML personalizzato qui (es. JavaScript, Meta Tags, ecc.), verrà attaccato al codice <head> sezione del markup del tuo forum", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Abilita l'Intestazione Personalizzata", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/it/admin/menu.json b/public/language/it/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/it/admin/menu.json +++ b/public/language/it/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/it/admin/settings/notifications.json b/public/language/it/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/it/admin/settings/notifications.json +++ b/public/language/it/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/it/admin/settings/post.json b/public/language/it/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/it/admin/settings/post.json +++ b/public/language/it/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/it/admin/settings/user.json b/public/language/it/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/it/admin/settings/user.json +++ b/public/language/it/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/it/email.json b/public/language/it/email.json index 48dbc3fd50..afaa12e945 100644 --- a/public/language/it/email.json +++ b/public/language/it/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Questa notifica di chat ti è stata inviata perché l'hai scelta nelle impostazioni.", "notif.post.cta": "Clicca qui per leggere la discussione completa", "notif.post.unsub.info": "Questo post ti è stato notificato in base alle tue impostazioni di sottoscrizione.", + "notif.cta": "Click here to go to forum", "test.text1": "Questa è una email di test per verificare che il servizio di invio email è configurato correttamente sul tuo NodeBB.", "unsub.cta": "Clicca qui per modificare queste impostazioni", "banned.subject": "You have been banned from %1", diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index dcf4cb684b..df14a67067 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continua a %1", "return_to": "Ritorna a %1", "new_notification": "Nuova Notifica", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Hai notifiche non lette.", "all": "Tutte", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Email Confermata", "email-confirmed-message": "Grazie per aver validato la tua email. Il tuo account è ora completamente attivato.", "email-confirm-error-message": "C'è stato un problema nella validazione del tuo indirizzo email. Potrebbe essere il codice non valido o scaduto.", - "email-confirm-sent": "Email di conferma inviata." + "email-confirm-sent": "Email di conferma inviata.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/ja/admin/appearance/customise.json b/public/language/ja/admin/appearance/customise.json index 590a0ca57d..1cfa0dea9d 100644 --- a/public/language/ja/admin/appearance/customise.json +++ b/public/language/ja/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "あなたのCSS設定をこちらに追加すると他のすべてのスタイルの後に適用されます。", "custom-css.enable": "カスタムCSSを有効にする", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "カスタムヘッダー", - "custom-header.description": "カスタムしたHTMLを入力してください(例. JavaScript, メタタグなど)。これはフォーラムのマークアップの<head>に追加されます。", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "カスタムヘッダーを有効にする", "custom-css.livereload": "ライブリロードを有効にする", diff --git a/public/language/ja/admin/menu.json b/public/language/ja/admin/menu.json index d64271ea7d..10ffdac477 100644 --- a/public/language/ja/admin/menu.json +++ b/public/language/ja/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "外観", "appearance/themes": "テーマ", "appearance/skins": "スキン", - "appearance/customise": "カスタムHTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "拡張", "extend/plugins": "プラグイン", diff --git a/public/language/ja/admin/settings/notifications.json b/public/language/ja/admin/settings/notifications.json index bda17cd95b..d69a16d629 100644 --- a/public/language/ja/admin/settings/notifications.json +++ b/public/language/ja/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "通知", "welcome-notification": "ウェルカム通知", - "welcome-notification-link": "ウェルカム通知のリンク" + "welcome-notification-link": "ウェルカム通知のリンク", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/post.json b/public/language/ja/admin/settings/post.json index 556fe7efc0..60c1ca251b 100644 --- a/public/language/ja/admin/settings/post.json +++ b/public/language/ja/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "新しい順に", "sorting.newest-to-oldest": "新しいものから古いものへ", "sorting.most-votes": "最も多い評価", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "デフォルトのスレッドの並び順", "restrictions": "転記の制限", "restrictions.post-queue": "投稿キューを有効にする", diff --git a/public/language/ja/admin/settings/user.json b/public/language/ja/admin/settings/user.json index 648809c1f9..b8f3bc16f0 100644 --- a/public/language/ja/admin/settings/user.json +++ b/public/language/ja/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "テーマ", "disable-user-skins": "ユーザーがカスタムスキンを選択できないようにする", "account-protection": "アカウント保護", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "時間ごとのログイン試行", "login-attempts-help": "ユーザのアカウントへのログイン試行数がこの値を超える場合、そのアカウントは予め設定された時間だけロックされます。", "lockout-duration": "アカウントロックアウト期間(分)", diff --git a/public/language/ja/email.json b/public/language/ja/email.json index f42c51eb3b..73cacee888 100644 --- a/public/language/ja/email.json +++ b/public/language/ja/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "このチャットの通知はあなたの購読設定により送られました。", "notif.post.cta": "ここをクリックして全て読みます", "notif.post.unsub.info": "この投稿の通知はあなたの申し込み設定により送られました。", + "notif.cta": "Click here to go to forum", "test.text1": "このメールはNodeBBのメーラー(emailer)が正しく設定されているか確認をするためのメールです。", "unsub.cta": "ここをクリックして設定を変更する", "banned.subject": "%1さんからBANされました。", diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index 384e1d0342..a535562dcd 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -9,6 +9,7 @@ "continue_to": "%1へ行く", "return_to": "%1へ戻る", "new_notification": "新しい通知", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "未読の通知があります。", "all": "全て", "topics": "スレッド", @@ -45,5 +46,19 @@ "email-confirmed": "Eメールが確認されました", "email-confirmed-message": "メールアドレス検証をして頂き、ありがとうございます。あなたのアカウントは完全にアクティブになりました。", "email-confirm-error-message": "あなたのEメールアドレス検証に問題があります。コードが無効か、期限切れです。", - "email-confirm-sent": "確認メールが送信されました。" + "email-confirm-sent": "確認メールが送信されました。", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/ko/admin/appearance/customise.json b/public/language/ko/admin/appearance/customise.json index 37a5dc71a4..0c0b028b98 100644 --- a/public/language/ko/admin/appearance/customise.json +++ b/public/language/ko/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "사용자 정의 CSS를 이곳에 입력하세요. 이 스타일들은 맨 마지막에 적용됩니다.", "custom-css.enable": "사용자 정의 CSS 허용", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "사용자 정의 헤더", - "custom-header.description": "이곳에 사용자 정의 HTML을 입력하십시오 (예. JavaScript, Meta Tags, 등등). 당신의 포럼의 <head>1 섹션에 추가됩니다.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "사용자 정의 헤더 허용", "custom-css.livereload": "실시간 새로 고침 허용", diff --git a/public/language/ko/admin/menu.json b/public/language/ko/admin/menu.json index f83425652a..3dbb61f8f5 100644 --- a/public/language/ko/admin/menu.json +++ b/public/language/ko/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "스타일", "appearance/themes": "테마", "appearance/skins": "스킨", - "appearance/customise": "사용자 정의 HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "추가 기능", "extend/plugins": "플러그인", diff --git a/public/language/ko/admin/settings/notifications.json b/public/language/ko/admin/settings/notifications.json index 0b2bab42c5..4d08749154 100644 --- a/public/language/ko/admin/settings/notifications.json +++ b/public/language/ko/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "알림", "welcome-notification": "환영 알림", - "welcome-notification-link": "환영 알림 링크" + "welcome-notification-link": "환영 알림 링크", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/post.json b/public/language/ko/admin/settings/post.json index 92f395e335..001a8b7376 100644 --- a/public/language/ko/admin/settings/post.json +++ b/public/language/ko/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "오래된 순", "sorting.newest-to-oldest": "최신 순", "sorting.most-votes": "추천수 순으로 정렬", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "게시물 정렬기준 기본값", "restrictions": "글 작성 제약사항", "restrictions.post-queue": "게시 대기열 사용", diff --git a/public/language/ko/admin/settings/user.json b/public/language/ko/admin/settings/user.json index 78a9bac909..5b803b612e 100644 --- a/public/language/ko/admin/settings/user.json +++ b/public/language/ko/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "테마", "disable-user-skins": "일반 사용자가 스킨 지정 금지", "account-protection": "계정 보호", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "시간당 가능한 로그인 시도 횟수", "login-attempts-help": "사용자의 로그인 시도가 이 횟수제한을 초과하면 정해진 시간만큼 해당 계정이 잠깁니다.", "lockout-duration": "계정 잠금 기간 (분)", diff --git a/public/language/ko/email.json b/public/language/ko/email.json index 3a35e5d41b..e0d56d6fc9 100644 --- a/public/language/ko/email.json +++ b/public/language/ko/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "이 대화 알림은 사용자의 구독 설정에 따라 전송되었습니다.", "notif.post.cta": "이곳을 클릭하여 전체 내용 보기", "notif.post.unsub.info": "이 게시물 알림은 사용자의 구독 설정에 따라 전송되었습니다.", + "notif.cta": "Click here to go to forum", "test.text1": "이 시험용 메일은 NodeBB에 설정된 메일 송신자가 정상적으로 메일을 송신할 수 있는지 시험할 목적으로 발송되었습니다.", "unsub.cta": "설정을 변경하려면 여기를 클릭하세요.", "banned.subject": "귀하는 %1 로 부터 차단되었습니다.", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 0b8ecd1f8e..a6f3f77b1e 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -9,6 +9,7 @@ "continue_to": "%1 사이트로 이동", "return_to": "%1 사이트로 돌아가기", "new_notification": "새 알림", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "읽지 않은 알림이 있습니다.", "all": "모든 알림", "topics": "게시물", @@ -45,5 +46,19 @@ "email-confirmed": "이메일 인증 되었습니다", "email-confirmed-message": "이메일을 인증해주셔서 감사합니다. 계정이 완전히 활성화되었습니다.", "email-confirm-error-message": "이메일 주소를 인증하지 못했습니다. 코드가 올바르지 않거나 만료 되었을 수 있습니다.", - "email-confirm-sent": "확인 이메일이 발송되었습니다." + "email-confirm-sent": "확인 이메일이 발송되었습니다.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/lt/admin/appearance/customise.json b/public/language/lt/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/lt/admin/appearance/customise.json +++ b/public/language/lt/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/lt/admin/menu.json b/public/language/lt/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/lt/admin/menu.json +++ b/public/language/lt/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/lt/admin/settings/notifications.json b/public/language/lt/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/lt/admin/settings/notifications.json +++ b/public/language/lt/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/lt/admin/settings/post.json b/public/language/lt/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/lt/admin/settings/post.json +++ b/public/language/lt/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/lt/admin/settings/user.json b/public/language/lt/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/lt/admin/settings/user.json +++ b/public/language/lt/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/lt/email.json b/public/language/lt/email.json index 699f8cacd1..36e50d1fcc 100644 --- a/public/language/lt/email.json +++ b/public/language/lt/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Šios žinutės perpėjimas buvo išsiųstas į tavo prenumeratos nustatymus", "notif.post.cta": "Spauskite čia norėdami skaityti visą temą", "notif.post.unsub.info": "Šios žinutės perspėjimas buvo išsiųstas į tavo prenumeratos nustatymus", + "notif.cta": "Click here to go to forum", "test.text1": "Ši žinutė yra bandomoji kad įsitikint, kad vartotojas teisingai nustatė nustatymus tavo NodeBB", "unsub.cta": "Spauskite čia norėdami pakeisti šiuos nustatymus", "banned.subject": "You have been banned from %1", diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 6e8757cb8e..56a4698eeb 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Tęsti į %1", "return_to": "Grįžti į %1", "new_notification": "Naujas pranešimas", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Jūs turite neperskaitytų pranešimų.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "El. paštas patvirtintas", "email-confirmed-message": "Dėkojame už el. pašto patvirtinimą. Jūsų paskyra pilnai aktyvuota.", "email-confirm-error-message": "Įvyko klaida mėginant patvirtinti Jūsų el. pašto adresą. Galbūt kodas yra neteisingas, arba nebegalioajantis.", - "email-confirm-sent": "Patvirtinimo laiškas išsiųstas." + "email-confirm-sent": "Patvirtinimo laiškas išsiųstas.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/ms/admin/appearance/customise.json b/public/language/ms/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/ms/admin/appearance/customise.json +++ b/public/language/ms/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/ms/admin/menu.json b/public/language/ms/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/ms/admin/menu.json +++ b/public/language/ms/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/ms/admin/settings/notifications.json b/public/language/ms/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/ms/admin/settings/notifications.json +++ b/public/language/ms/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/ms/admin/settings/post.json b/public/language/ms/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/ms/admin/settings/post.json +++ b/public/language/ms/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/ms/admin/settings/user.json b/public/language/ms/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/ms/admin/settings/user.json +++ b/public/language/ms/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/ms/email.json b/public/language/ms/email.json index 804155fd84..36803dcd76 100644 --- a/public/language/ms/email.json +++ b/public/language/ms/email.json @@ -30,6 +30,7 @@ "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.", + "notif.cta": "Click here to go to forum", "test.text1": "Ini adalah percubaan email untuk mengesahkan emailer ditetap dengan betul di NodeBB.", "unsub.cta": "Klik sini untuk mengubah tetapan itu", "banned.subject": "You have been banned from %1", diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index db4c47191b..96280e297e 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Sambung ke %1", "return_to": "Kembali ke %1", "new_notification": "Pemberitahuan baru", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Ada pemberitahuan yang belum dibaca", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "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." + "email-confirm-sent": "Pengesahan emel telah dihantar.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/nb/admin/appearance/customise.json b/public/language/nb/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/nb/admin/appearance/customise.json +++ b/public/language/nb/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/nb/admin/menu.json b/public/language/nb/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/nb/admin/menu.json +++ b/public/language/nb/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/nb/admin/settings/notifications.json b/public/language/nb/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/nb/admin/settings/notifications.json +++ b/public/language/nb/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/nb/admin/settings/post.json b/public/language/nb/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/nb/admin/settings/post.json +++ b/public/language/nb/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/nb/admin/settings/user.json b/public/language/nb/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/nb/email.json b/public/language/nb/email.json index 916aa5880b..faee4c1592 100644 --- a/public/language/nb/email.json +++ b/public/language/nb/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Denne samtale-varselen ble sendt til deg basert på dine innstillinger for abonnering.", "notif.post.cta": "Trykk for å lese hele emnet", "notif.post.unsub.info": "Dette innleggsvarselet ble sendt til deg basert på dine innstillinger for abonnering.", + "notif.cta": "Click here to go to forum", "test.text1": "Dette er en test e-post for å verifisere at e-postsystemet i NodeBB fungerer som det skal.", "unsub.cta": "Klikk her for å endre disse innstillingene", "banned.subject": "You have been banned from %1", diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index d248bef66e..905f415d69 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Fortsett til %1", "return_to": "Gå tilbake til %1", "new_notification": "Nytt varsel", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Du har uleste varsler.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "E-post bekreftet", "email-confirmed-message": "Takk for at du har validert din e-post. Kontoen din er nå fullstendig aktivert.", "email-confirm-error-message": "Det oppsto et problem under valdiering av din e-post. Koden kan ha vært ugyldig eller ha utløpt.", - "email-confirm-sent": "Bekreftelsesepost sendt." + "email-confirm-sent": "Bekreftelsesepost sendt.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/nl/admin/appearance/customise.json b/public/language/nl/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/nl/admin/appearance/customise.json +++ b/public/language/nl/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/nl/admin/menu.json b/public/language/nl/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/nl/admin/menu.json +++ b/public/language/nl/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/nl/admin/settings/notifications.json b/public/language/nl/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/nl/admin/settings/notifications.json +++ b/public/language/nl/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/nl/admin/settings/post.json b/public/language/nl/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/nl/admin/settings/post.json +++ b/public/language/nl/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/nl/admin/settings/user.json b/public/language/nl/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/nl/admin/settings/user.json +++ b/public/language/nl/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/nl/email.json b/public/language/nl/email.json index fe218e778a..48f35a2c6f 100644 --- a/public/language/nl/email.json +++ b/public/language/nl/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Deze notificatie is verzonden vanwege de gebruikersinstellingen voor abonnementen.", "notif.post.cta": "Klik hier om het volledige bericht te lezen", "notif.post.unsub.info": "Deze notificatie is door ons verzonden vanwege gebruikersinstellingen voor abonnementen en berichten.", + "notif.cta": "Click here to go to forum", "test.text1": "Dit is een testbericht om te verifiëren dat NodeBB de e-mailberichtservice correct heeft opgezet.", "unsub.cta": "Klik hier om deze instellingen te wijzigen", "banned.subject": "U bent verbannen van %1", diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index 55e75afe74..c19dbaef83 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Door naar %1", "return_to": "Terug naar %1", "new_notification": "Nieuwe notificatie", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Je hebt nieuwe notificaties.", "all": "Alles", "topics": "Onderwerpen", @@ -45,5 +46,19 @@ "email-confirmed": "E-mailadres bevestigd", "email-confirmed-message": "Bedankt voor het bevestigen van je e-mailadres. Je account is nu volledig geactiveerd.", "email-confirm-error-message": "Er was een probleem met het bevestigen van dit e-mailadres. Misschien is de code niet goed ingevoerd of was de beschikbare tijd inmiddels verstreken.", - "email-confirm-sent": "Bevestigingsmail verstuurd." + "email-confirm-sent": "Bevestigingsmail verstuurd.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/pl/admin/appearance/customise.json b/public/language/pl/admin/appearance/customise.json index a9f299498d..116fde835f 100644 --- a/public/language/pl/admin/appearance/customise.json +++ b/public/language/pl/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Wprowadź tu własne deklaracje CSS, będą one zastosowane po wszystkich innych stylach.", "custom-css.enable": "Włącz własne style CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Własny nagłówek", - "custom-header.description": "Wpisz tutaj kod HTML (JavaScript, tagi <meta>) który ma być dołączony do sekcji <head> w szablonie forum.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Włącz własny nagłówek", "custom-css.livereload": "Włącz dynamiczne przeładowanie", diff --git a/public/language/pl/admin/menu.json b/public/language/pl/admin/menu.json index e5830c32ce..dd9a0a33bf 100644 --- a/public/language/pl/admin/menu.json +++ b/public/language/pl/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Wygląd", "appearance/themes": "Motywy", "appearance/skins": "Skórki", - "appearance/customise": "Niestandardowy HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Rozszerzenia", "extend/plugins": "Wtyczki", diff --git a/public/language/pl/admin/settings/notifications.json b/public/language/pl/admin/settings/notifications.json index 9f00578b0f..9396577d28 100644 --- a/public/language/pl/admin/settings/notifications.json +++ b/public/language/pl/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Powiadomienia", "welcome-notification": "Powiadomienie na przywitanie", - "welcome-notification-link": "Odnośnik powiadomienia powitalnego" + "welcome-notification-link": "Odnośnik powiadomienia powitalnego", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/pl/admin/settings/post.json b/public/language/pl/admin/settings/post.json index 26279641c9..41a53c1882 100644 --- a/public/language/pl/admin/settings/post.json +++ b/public/language/pl/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Najstarsze do najnowszych", "sorting.newest-to-oldest": "Najnowsze do najstarszych", "sorting.most-votes": "Najwięcej głosów", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Domyślne sortowanie tematów", "restrictions": "Ograniczenia pisania", "restrictions.post-queue": "Włącz kolejkę postów", diff --git a/public/language/pl/admin/settings/user.json b/public/language/pl/admin/settings/user.json index 84b6a42ab8..d1c5e7f713 100644 --- a/public/language/pl/admin/settings/user.json +++ b/public/language/pl/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Motywy", "disable-user-skins": "Nie zezwalaj użytkownikom na wybranie niestandardowej skórki", "account-protection": "Ochrona konta", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Maksymalna liczba prób logowania na godzinę", "login-attempts-help": "Jeśli liczba prób logowania na konto użytkownika przekroczy ten próg, to konto zostanie zablokowane na zdefiniowany wcześniej czas", "lockout-duration": "Czas trwania blokady konta (minuty)", diff --git a/public/language/pl/email.json b/public/language/pl/email.json index b01b748ed6..fd0b9b8125 100644 --- a/public/language/pl/email.json +++ b/public/language/pl/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "To powiadomienie o czacie zostało Ci wysłane zgodnie z ustawieniami twojego konta.", "notif.post.cta": "Kliknij tutaj, aby przeczytać cały temat.", "notif.post.unsub.info": "To powiadomienie o poście zostało Ci wysłane zgodnie z ustawieniami twojego konta.", + "notif.cta": "Click here to go to forum", "test.text1": "To jest e-mail testowy, aby sprawdzić, czy poprawnie skonfigurowałeś e-mailer w swoim NodeBB.", "unsub.cta": "Kliknij tutaj, aby zmienić te ustawienia", "banned.subject": "Zostałeś zbanowany na %1", diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 594ad62bb4..c29984664d 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Kontynuuj do %1", "return_to": "Wróć do %1", "new_notification": "Nowe powiadomienie", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Masz nieprzeczytane powiadomienia.", "all": "Wszystko", "topics": "Tematy", @@ -45,5 +46,19 @@ "email-confirmed": "E-mail potwierdzony", "email-confirmed-message": "Dziękujemy za potwierdzenie maila. Twoje konto zostało aktywowane.", "email-confirm-error-message": "Wystąpił problem przy aktywacji - kod jest błędny lub przestarzały", - "email-confirm-sent": "E-mail potwierdzający wysłany." + "email-confirm-sent": "E-mail potwierdzający wysłany.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/appearance/customise.json b/public/language/pt-BR/admin/appearance/customise.json index b03e02e9f3..df52770144 100644 --- a/public/language/pt-BR/admin/appearance/customise.json +++ b/public/language/pt-BR/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Entre com as suas próprias declarações de CSS aqui, as quais serão aplicadas após todos os outros estilos.", "custom-css.enable": "Habilitar CSS Personalizado", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Cabeçalho Personalizado", - "custom-header.description": "Adicione HTML pessoal aqui (ex. JavaScript, Meta Tags, Tags, etc), os quais serão acrescentados ao final da seção <head> do markup do seu fórum.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Ligar o Cabeçalho Personalizado", "custom-css.livereload": "Habilitar Recarregamento Automático", diff --git a/public/language/pt-BR/admin/menu.json b/public/language/pt-BR/admin/menu.json index 81972b21d6..fe4800c8f5 100644 --- a/public/language/pt-BR/admin/menu.json +++ b/public/language/pt-BR/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Aparência", "appearance/themes": "Temas", "appearance/skins": "Skins", - "appearance/customise": "HTML & CSS Personalizados", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extenda", "extend/plugins": "Plugins", diff --git a/public/language/pt-BR/admin/settings/notifications.json b/public/language/pt-BR/admin/settings/notifications.json index 7366f6c350..9f2a9a9fac 100644 --- a/public/language/pt-BR/admin/settings/notifications.json +++ b/public/language/pt-BR/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notificações", "welcome-notification": "Notificação de Boas-vindas", - "welcome-notification-link": "Link da Notificação de Boas-vindas" + "welcome-notification-link": "Link da Notificação de Boas-vindas", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/post.json b/public/language/pt-BR/admin/settings/post.json index 550e2fce12..eb0db578ba 100644 --- a/public/language/pt-BR/admin/settings/post.json +++ b/public/language/pt-BR/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Da Mais Antigo para Mais Recente", "sorting.newest-to-oldest": "Mais recente para mais Antigo", "sorting.most-votes": "Mais Votos", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Ordenação Padrão de Tópicos", "restrictions": "Restições de Postagem", "restrictions.post-queue": "Ligar enfileiramento de posts", diff --git a/public/language/pt-BR/admin/settings/user.json b/public/language/pt-BR/admin/settings/user.json index bb4d776376..c695659f1b 100644 --- a/public/language/pt-BR/admin/settings/user.json +++ b/public/language/pt-BR/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Temas", "disable-user-skins": "Impedir usuários de escolherem um skin personalizado", "account-protection": "Proteção de Conta", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Tentativas de login por hora", "login-attempts-help": "Se tentativas de login na conta de um usuário ultrapassar este limite, aquela conta será trancada por um período de tempo pré-configurado", "lockout-duration": "Duração de Trancamento de Conta (minutos)", diff --git a/public/language/pt-BR/email.json b/public/language/pt-BR/email.json index b70c27d5c2..a2e2128d03 100644 --- a/public/language/pt-BR/email.json +++ b/public/language/pt-BR/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Esta notificação de chat foi enviada a você devido às suas configurações de assinatura.", "notif.post.cta": "Clique aqui para ler o tópico completo", "notif.post.unsub.info": "Esta notificação de postagem foi enviada para você devido as suas configurações de assinatura.", + "notif.cta": "Click here to go to forum", "test.text1": "Este é um e-mail de teste, para verificar que o enviador de emails está corretamente configurado no seu NodeBB.", "unsub.cta": "Clique aqui para alterar estas configurações", "banned.subject": "Você foi banido de %1", diff --git a/public/language/pt-BR/notifications.json b/public/language/pt-BR/notifications.json index 555c8639aa..0eb34b27e5 100644 --- a/public/language/pt-BR/notifications.json +++ b/public/language/pt-BR/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continuar para %1", "return_to": "Voltar para %1", "new_notification": "Nova Notificação", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Você possui notificações não lidas.", "all": "Tudo", "topics": "Tópicos", @@ -45,5 +46,19 @@ "email-confirmed": "Email Confirmado", "email-confirmed-message": "Obrigado por validar o seu email. Agora sua conta está plenamente ativada.", "email-confirm-error-message": "Houve um problema ao validar o seu endereço de email. Talvez o código era invalido ou tenha expirado.", - "email-confirm-sent": "Email de confirmação enviado." + "email-confirm-sent": "Email de confirmação enviado.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/appearance/customise.json b/public/language/pt-PT/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/pt-PT/admin/appearance/customise.json +++ b/public/language/pt-PT/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/pt-PT/admin/menu.json b/public/language/pt-PT/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/pt-PT/admin/menu.json +++ b/public/language/pt-PT/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/pt-PT/admin/settings/notifications.json b/public/language/pt-PT/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/pt-PT/admin/settings/notifications.json +++ b/public/language/pt-PT/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/settings/post.json b/public/language/pt-PT/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/pt-PT/admin/settings/post.json +++ b/public/language/pt-PT/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/pt-PT/admin/settings/user.json b/public/language/pt-PT/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/pt-PT/admin/settings/user.json +++ b/public/language/pt-PT/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/pt-PT/email.json b/public/language/pt-PT/email.json index deddc31cb2..c4fe9fe43e 100644 --- a/public/language/pt-PT/email.json +++ b/public/language/pt-PT/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Esta notificação de chat foi enviada devido às suas definições de subscrição", "notif.post.cta": "Clique aqui para ler o tópico completo", "notif.post.unsub.info": "Esta notificação foi envidada devido às tuas definições de subscrição.", + "notif.cta": "Click here to go to forum", "test.text1": "Este é um e-mail de teste para verificar que o emailer está configurado corretamente para o teu NodeBB.", "unsub.cta": "Clica aqui para alterares essas definições", "banned.subject": "You have been banned from %1", diff --git a/public/language/pt-PT/notifications.json b/public/language/pt-PT/notifications.json index a10b22ccbb..fb63eb9a7a 100644 --- a/public/language/pt-PT/notifications.json +++ b/public/language/pt-PT/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continuar para %1", "return_to": "Voltar a %1", "new_notification": "Nova notificação", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Tens notificações por ler.", "all": "Tudo", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "E-mail confirmado", "email-confirmed-message": "Obrigado por validares o teu endereço de e-mai.. A tua conta está agora totalmente ativa.", "email-confirm-error-message": "Ocorreu um problema a validar o teu endereço de e-mail. Talvez o código fosse inválido ou tenha expirado.", - "email-confirm-sent": "E-mail de confirmação enviado." + "email-confirm-sent": "E-mail de confirmação enviado.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/ro/admin/appearance/customise.json b/public/language/ro/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/ro/admin/appearance/customise.json +++ b/public/language/ro/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/ro/admin/menu.json b/public/language/ro/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/ro/admin/menu.json +++ b/public/language/ro/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/ro/admin/settings/notifications.json b/public/language/ro/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/ro/admin/settings/notifications.json +++ b/public/language/ro/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/ro/admin/settings/post.json b/public/language/ro/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/ro/admin/settings/post.json +++ b/public/language/ro/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/ro/admin/settings/user.json b/public/language/ro/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/ro/admin/settings/user.json +++ b/public/language/ro/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/ro/email.json b/public/language/ro/email.json index 1fa8e4f2a8..4be51619f6 100644 --- a/public/language/ro/email.json +++ b/public/language/ro/email.json @@ -30,6 +30,7 @@ "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.", + "notif.cta": "Click here to go to forum", "test.text1": "Acesta este un email de test pentru a verica dacă mailul este setat corect pentru NodeBB-ul tău.", "unsub.cta": "Apasă aici pentru a modifica acele setări", "banned.subject": "You have been banned from %1", diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index 00ed32f237..7945f3ce74 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continuă la %1", "return_to": "Întoarce-te la %1", "new_notification": "Notificare Nouă", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Ai notificări necitite.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Email confirmat", "email-confirmed-message": "Îți mulțumim pentru validarea emailului. Contul tău este acuma activat.", "email-confirm-error-message": "A fost o problemă cu activarea adresei tale de email. Poate codul de activare a fost invalid sau expirat.", - "email-confirm-sent": "Un email de confirmare a fost trimis." + "email-confirm-sent": "Un email de confirmare a fost trimis.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/ru/admin/appearance/customise.json b/public/language/ru/admin/appearance/customise.json index 56bfbb64cb..4ae01c2012 100644 --- a/public/language/ru/admin/appearance/customise.json +++ b/public/language/ru/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Введите свои собственные данные CSS здесь, которые будут применяться после всех других стилей.", "custom-css.enable": "Включить пользовательский CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Пользовательский Заголовок", - "custom-header.description": "Введите HTML код здесь (например, JavaScript, метатеги и т. Д.), для добавления в раздел & lt; head & gt; разметки вашего форума.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Включить Пользовательский заголовок", "custom-css.livereload": "Включить автоматическую перезагрузку страниц", diff --git a/public/language/ru/admin/menu.json b/public/language/ru/admin/menu.json index 200bdaa3b7..0178029256 100644 --- a/public/language/ru/admin/menu.json +++ b/public/language/ru/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Вид", "appearance/themes": "Темы", "appearance/skins": "Скины", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Расширения", "extend/plugins": "Плагины", diff --git a/public/language/ru/admin/settings/notifications.json b/public/language/ru/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/ru/admin/settings/notifications.json +++ b/public/language/ru/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/post.json b/public/language/ru/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/ru/admin/settings/post.json +++ b/public/language/ru/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/ru/admin/settings/user.json b/public/language/ru/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/ru/admin/settings/user.json +++ b/public/language/ru/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/ru/email.json b/public/language/ru/email.json index d791e5a61f..dc9b87f26a 100644 --- a/public/language/ru/email.json +++ b/public/language/ru/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Вы получили это уведомление в соответствии с настройками своей подписки на новости сайта.", "notif.post.cta": "Нажмите для просмотра всей темы.", "notif.post.unsub.info": "Вы получили это уведомление согласно вашим настройкам подписки.", + "notif.cta": "Click here to go to forum", "test.text1": "Это тестовое сообщение для проверки почтового сервиса.", "unsub.cta": "Изменить настройки", "banned.subject": "You have been banned from %1", diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index 828bab978f..a4c9b74119 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Перейти на %1", "return_to": "Вернуться к %1", "new_notification": "Новое уведомление", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "У вас есть непрочитанные уведомления.", "all": "Все", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Электронная почта подтверждена", "email-confirmed-message": "Спасибо за подтверждение адреса электронной почты. Ваша учётная запись активирована. Добро пожаловать на наш сайт!", "email-confirm-error-message": "Ошибка проверки адреса электронной почты. Возможно, введён неправильно код подтверждения, либо у него истёк срок действия.", - "email-confirm-sent": "Письмо с проверочным кодом отправлено на ваш электронный адрес" + "email-confirm-sent": "Письмо с проверочным кодом отправлено на ваш электронный адрес", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/rw/admin/appearance/customise.json b/public/language/rw/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/rw/admin/appearance/customise.json +++ b/public/language/rw/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/rw/admin/menu.json b/public/language/rw/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/rw/admin/menu.json +++ b/public/language/rw/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/rw/admin/settings/notifications.json b/public/language/rw/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/rw/admin/settings/notifications.json +++ b/public/language/rw/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/rw/admin/settings/post.json b/public/language/rw/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/rw/admin/settings/post.json +++ b/public/language/rw/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/rw/admin/settings/user.json b/public/language/rw/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/rw/admin/settings/user.json +++ b/public/language/rw/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/rw/email.json b/public/language/rw/email.json index aca6b1b8e1..fbeed00691 100644 --- a/public/language/rw/email.json +++ b/public/language/rw/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Iri tangazo rijyanye n'ubutumwa bwo mu gikari waryohererejwe kubera ko wabihisemo mu byo uzajya umenyeshwa", "notif.post.cta": "Kanda hano kugirango usome inkuru yose", "notif.post.unsub.info": "Iri tangazo rijyanye n'ibyashyizwe ku rubuga waryohererejwe kubera ko wabihisemo mu byo uzajya umenyeshwa", + "notif.cta": "Click here to go to forum", "test.text1": "Iyi message ni igerageza kugirango harebwe niba emailer ya NodeBB yarateguwe neza", "unsub.cta": "Kanda hano kugirango uhindure uko bizajya bigenda", "banned.subject": "You have been banned from %1", diff --git a/public/language/rw/notifications.json b/public/language/rw/notifications.json index 2d919d07cf..f26d109d5c 100644 --- a/public/language/rw/notifications.json +++ b/public/language/rw/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Komereza kuri %1", "return_to": "Subira kuri %1", "new_notification": "Itangazo Rishya", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Ufite amatangazo utarasoma. ", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Email Yemejwe", "email-confirmed-message": "Urakoze kugaragaza ko email yawe ikora. Ubu ngubu konte yawe irakora nta kabuza. ", "email-confirm-error-message": "Havutse ikibazo mu gushaka kumenya niba email yawe ikora. Ushobora kuba wakoresheje kode itari yo cyangwa se yarengeje igihe. ", - "email-confirm-sent": "Hoherejwe email yo kubyemeza." + "email-confirm-sent": "Hoherejwe email yo kubyemeza.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/sc/admin/appearance/customise.json b/public/language/sc/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/sc/admin/appearance/customise.json +++ b/public/language/sc/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/sc/admin/menu.json b/public/language/sc/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/sc/admin/menu.json +++ b/public/language/sc/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/sc/admin/settings/notifications.json b/public/language/sc/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/sc/admin/settings/notifications.json +++ b/public/language/sc/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/sc/admin/settings/post.json b/public/language/sc/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/sc/admin/settings/post.json +++ b/public/language/sc/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/sc/admin/settings/user.json b/public/language/sc/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/sc/admin/settings/user.json +++ b/public/language/sc/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/sc/email.json b/public/language/sc/email.json index c1e17018fa..164e70795e 100644 --- a/public/language/sc/email.json +++ b/public/language/sc/email.json @@ -30,6 +30,7 @@ "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.", + "notif.cta": "Click here to go to forum", "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", "banned.subject": "You have been banned from %1", diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index 91ea21d51c..90685c70d5 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Continue to %1", "return_to": "Return to %1", "new_notification": "New Notification", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "You have unread notifications.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "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-confirm-sent": "Confirmation email sent.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/sk/admin/appearance/customise.json b/public/language/sk/admin/appearance/customise.json index 1cf04a6c75..645165e105 100644 --- a/public/language/sk/admin/appearance/customise.json +++ b/public/language/sk/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Zadajte svoje vlastné deklarácie CSS, ktoré budú použité po všetkých ostatných štýloch.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/sk/admin/menu.json b/public/language/sk/admin/menu.json index 64648aedc7..d612ad497a 100644 --- a/public/language/sk/admin/menu.json +++ b/public/language/sk/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/sk/admin/settings/notifications.json b/public/language/sk/admin/settings/notifications.json index 5154979af9..96fcb7ed90 100644 --- a/public/language/sk/admin/settings/notifications.json +++ b/public/language/sk/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Oznámenia", "welcome-notification": "Uvítacie upozornenie", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/sk/admin/settings/post.json b/public/language/sk/admin/settings/post.json index 72aac7dba0..4cff3ca723 100644 --- a/public/language/sk/admin/settings/post.json +++ b/public/language/sk/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Najviac hlasov", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/sk/admin/settings/user.json b/public/language/sk/admin/settings/user.json index d3bdd791e8..369bbf7e8a 100644 --- a/public/language/sk/admin/settings/user.json +++ b/public/language/sk/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/sk/email.json b/public/language/sk/email.json index 8b665092ea..7460b8d408 100644 --- a/public/language/sk/email.json +++ b/public/language/sk/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Túto správu konverzácie ste prijali na základe Vašich nastavení odoberania.", "notif.post.cta": "Kliknite sem pre zobrazenie celej diskusie", "notif.post.unsub.info": "Toto oznámenie o príspevkoch ste prijali na základe Vašich nastavení účtu.", + "notif.cta": "Click here to go to forum", "test.text1": "Toto je skúšobný e-mail na overenie funkčnosti e-mailovej aplikácie Vášho NodeBB fóra.", "unsub.cta": "Kliknite sem pre zmenu týchto nastavení", "banned.subject": "Boli ste zablokovaný používateľom %1", diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index 9836ea6dce..651d15b910 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Pokračujte k %1", "return_to": "Návrat do %1", "new_notification": "Nové oznámenie", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Máte neprečítané oznámenia", "all": "Všetko", "topics": "Témy", @@ -45,5 +46,19 @@ "email-confirmed": "E-mail bol potvrdený", "email-confirmed-message": "Ďakujeme za potvrdenie Vášho e-mailu. Účet je plne aktivovaný.", "email-confirm-error-message": "Vyskytla sa chyba pri overení Vašej e-mailovej adresy. ", - "email-confirm-sent": "Potvrdzovací e-mail bol odoslaný." + "email-confirm-sent": "Potvrdzovací e-mail bol odoslaný.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/sl/admin/appearance/customise.json b/public/language/sl/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/sl/admin/appearance/customise.json +++ b/public/language/sl/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/sl/admin/menu.json b/public/language/sl/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/sl/admin/menu.json +++ b/public/language/sl/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/sl/admin/settings/notifications.json b/public/language/sl/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/sl/admin/settings/notifications.json +++ b/public/language/sl/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/sl/admin/settings/post.json b/public/language/sl/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/sl/admin/settings/post.json +++ b/public/language/sl/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/sl/admin/settings/user.json b/public/language/sl/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/sl/admin/settings/user.json +++ b/public/language/sl/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/sl/email.json b/public/language/sl/email.json index 7934ff9bfb..7cffd285a8 100644 --- a/public/language/sl/email.json +++ b/public/language/sl/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Obvestilo o klepetu vam je bilo poslano zaradi nastavitev vaše naročnine.", "notif.post.cta": "Kliknite tu, če želite prebrati celotno temo.", "notif.post.unsub.info": "Obvestilo o objavi vam je bilo poslano zaradi nastavitev vaše naročnine.", + "notif.cta": "Click here to go to forum", "test.text1": "To je testno elektronsko sporočilo za preverjanje pravilnosti nastavitev podsistema za pošiljanje NodeBB poštnih sporočil.", "unsub.cta": "Kliknite tu za spremembo nastavitev.", "banned.subject": "You have been banned from %1", diff --git a/public/language/sl/notifications.json b/public/language/sl/notifications.json index 0a69652eaf..06cf6ebcd1 100644 --- a/public/language/sl/notifications.json +++ b/public/language/sl/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Nadaljujte na %1.", "return_to": "Vrnite se na %1.", "new_notification": "Novo obvestilo", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Imate neprebrana obvestila.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "E-poštni naslov potrjen", "email-confirmed-message": "Hvala, da ste potrdili svoj e-naslov. Račun je sedaj aktiviran.", "email-confirm-error-message": "Prišlo je do napake pri preverjanju vašega e-poštnega naslova. Morda je bila koda napačna ali pa je potekla.", - "email-confirm-sent": "Potrditveno e-sporočilo je poslano." + "email-confirm-sent": "Potrditveno e-sporočilo je poslano.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/sr/admin/appearance/customise.json b/public/language/sr/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/sr/admin/appearance/customise.json +++ b/public/language/sr/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/sr/admin/menu.json b/public/language/sr/admin/menu.json index 56e84faf21..f715b7a83b 100644 --- a/public/language/sr/admin/menu.json +++ b/public/language/sr/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Izgled", "appearance/themes": "Teme", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Proširiti", "extend/plugins": "Plaginovi", diff --git a/public/language/sr/admin/settings/notifications.json b/public/language/sr/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/sr/admin/settings/notifications.json +++ b/public/language/sr/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/sr/admin/settings/post.json b/public/language/sr/admin/settings/post.json index 8a7a3630c3..859fcae17c 100644 --- a/public/language/sr/admin/settings/post.json +++ b/public/language/sr/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Od starijih ka novijim", "sorting.newest-to-oldest": "Od novijih ka starijim", "sorting.most-votes": "Najviše glasova", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Uobičajeno sortiranje tema", "restrictions": "Restrikcije postavljanja", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/sr/admin/settings/user.json b/public/language/sr/admin/settings/user.json index 99a15e7c09..17e529bd4d 100644 --- a/public/language/sr/admin/settings/user.json +++ b/public/language/sr/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Teme", "disable-user-skins": "Onemogući korisnike da izaberu određenu temu", "account-protection": "Začtita naloga", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Dozvoljeno logovanje po satu", "login-attempts-help": "Ako broj logovanja prema user's predje određenu granicu, taj nalog može biti zaključan na određeno prekonfigurisano vreme", "lockout-duration": "Trajanje dok se nalog ne otključa (minuta)", diff --git a/public/language/sr/email.json b/public/language/sr/email.json index c69628cbbf..ad73a44e1d 100644 --- a/public/language/sr/email.json +++ b/public/language/sr/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Ова обавештење о ћаскању вам је послато услед вашег подешавања претплате.", "notif.post.cta": "Кликните овде за приказ целе теме", "notif.post.unsub.info": "Ово обавештење вам је послато услед вашег подешавања претплате.", + "notif.cta": "Click here to go to forum", "test.text1": "Ово је пробно е-писмо за проверу исправности поставки е-поштара у NodeBB.", "unsub.cta": "Кликните овде да измените та подешавања", "banned.subject": "Забрањени сте на %1", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index d313aa88a6..8e6573715a 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -119,7 +119,7 @@ "not-enough-reputation-to-downvote": "Немате довољно велики углед да бисте негативно гласали за ову поруку", "not-enough-reputation-to-flag": "Немате довољно велики углед да бисте означили заставицом ову поруку", "already-flagged": "Већ сте означили заставицом ову поруку", - "self-vote": "You cannot vote on your own post", + "self-vote": "Не можете гласати за своју поруку", "reload-failed": "NodeBB је наишао на проблем док се поново учитавао: \"%1\". NodeBB ће наставити да опслужује постојећа клијентска средства , иако би требало да опозовете оно што сте урадили пре поновног учитавања.", "registration-error": "Грешка при регистрацији", "parse-error": "Нешто је кренуло погрешно приликом анализе одговора сервера", diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index 18421b0857..90d1578a0f 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Продужи на %1", "return_to": "Врати се на %1", "new_notification": "Ново обавештење", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Имате непрочитана обавештења.", "all": "Све", "topics": "Теме", @@ -45,5 +46,19 @@ "email-confirmed": "Е-пошта је потврђена.", "email-confirmed-message": "Хвала на овери ваше е-поште. Ваш налог је сада у потпуности активан.", "email-confirm-error-message": "Дошло је до проблема са овером ваше е-поште. Можда је код неисправан или је истекао.", - "email-confirm-sent": "Е-пошта за потврду је послата." + "email-confirm-sent": "Е-пошта за потврду је послата.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/sv/admin/appearance/customise.json b/public/language/sv/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/sv/admin/appearance/customise.json +++ b/public/language/sv/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/sv/admin/menu.json b/public/language/sv/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/sv/admin/menu.json +++ b/public/language/sv/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/sv/admin/settings/notifications.json b/public/language/sv/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/sv/admin/settings/notifications.json +++ b/public/language/sv/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/sv/admin/settings/post.json b/public/language/sv/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/sv/admin/settings/post.json +++ b/public/language/sv/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/sv/admin/settings/user.json b/public/language/sv/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/sv/admin/settings/user.json +++ b/public/language/sv/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/sv/email.json b/public/language/sv/email.json index db54326e29..4e1b61ab40 100644 --- a/public/language/sv/email.json +++ b/public/language/sv/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Denna notifikation skickades till dig på grund av dina inställningar för prenumerationer.", "notif.post.cta": "Klicka här för att läsa hela ämnet", "notif.post.unsub.info": "Det här meddelandet fick du på grund av dina inställningar för prenumeration. ", + "notif.cta": "Click here to go to forum", "test.text1": "\nDet här är ett testmeddelande som verifierar att e-posten är korrekt installerad för din NodeBB. ", "unsub.cta": "Klicka här för att ändra inställningarna", "banned.subject": "You have been banned from %1", diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index ea14561dc9..46d77ab13f 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Fortsätt till %1", "return_to": "Återgå till %1", "new_notification": "Ny notis", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Du har olästa notiser.", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "E-post bekräftad", "email-confirmed-message": "Tack för att du bekräftat din e-postadress. Ditt konto är nu fullt ut aktiverat.", "email-confirm-error-message": "Det uppstod ett problem med bekräftelsen av din e-postadress. Kanske var koden felaktig eller ogiltig.", - "email-confirm-sent": "Bekräftelsemeddelande skickat." + "email-confirm-sent": "Bekräftelsemeddelande skickat.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/th/admin/appearance/customise.json b/public/language/th/admin/appearance/customise.json index e377c7781a..2f715a9bfc 100644 --- a/public/language/th/admin/appearance/customise.json +++ b/public/language/th/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "ใส่ CSS ของคุณที่นี่, มันจะถูกนำไปใช้ต่อจากสไตล์อื่นๆ", "custom-css.enable": "เปิดการปรับแต่ง CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "ปรับแต่งส่วนหัว", - "custom-header.description": "ใส่การปรับแต่ง HTML ที่นี่ (เช่น JavaScript, Meta Tags หรืออื่นๆ) , มันจะถูกเพิ่มใน <head>ของส่วนฟอรั่มของคุณ", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "เปิดการปรับแต่งส่วนหัว", "custom-css.livereload": "เปิดการบังคับให้มีผลในทันที", diff --git a/public/language/th/admin/menu.json b/public/language/th/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/th/admin/menu.json +++ b/public/language/th/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/th/admin/settings/notifications.json b/public/language/th/admin/settings/notifications.json index e5193fc159..c2f5b8b9b9 100644 --- a/public/language/th/admin/settings/notifications.json +++ b/public/language/th/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "การแจ้งเตือน", "welcome-notification": "การยินดีต้อนรับแจ้งเตือน", - "welcome-notification-link": "ลิงค์การยินดีต้อนรับแจ้งเตือน" + "welcome-notification-link": "ลิงค์การยินดีต้อนรับแจ้งเตือน", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/th/admin/settings/post.json b/public/language/th/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/th/admin/settings/post.json +++ b/public/language/th/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/th/admin/settings/user.json b/public/language/th/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/th/admin/settings/user.json +++ b/public/language/th/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/th/email.json b/public/language/th/email.json index 16b41971a7..54080a872b 100644 --- a/public/language/th/email.json +++ b/public/language/th/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "การแจ้งเตือนแชทนี้ถูกส่งไปหาคุณเนื่องจากการตั้งค่าสมาชิกของคุณ", "notif.post.cta": "คลิกที่นี่เพื่ออ่านกระทู้ฉบับเต็ม", "notif.post.unsub.info": "การแจ้งเตือนกระทู้นี้ถูกส่งไปยังคุณเนื่องการตั้งค่าสมาชิกของคุณ", + "notif.cta": "Click here to go to forum", "test.text1": "นี่คืออีเมลทดสอบเพื่อยืนยันว่าระบบอีเมลมีการตั้งค่าที่ถูกต้องสำหรับ NodeBB ของคุณ", "unsub.cta": "กดตรงนี้เพื่อเปลี่ยนแปลงการตั้งค่า", "banned.subject": "คุณถูกแบนจาก %1 แล้ว", diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index d40f9af8ef..727c91dbe0 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -9,6 +9,7 @@ "continue_to": "ดำเนินการต่อไปยัง %1", "return_to": "กลับสู่ %1", "new_notification": "ข้อความเตือนใหม่", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "คุณมีคำเตือนที่ยังไม่ได้อ่าน", "all": "ทั้งหมด", "topics": "กระทู้", @@ -45,5 +46,19 @@ "email-confirmed": "Email ได้รับการยืนยันแล้ว", "email-confirmed-message": "ขอบคุณที่ยืนยัน Email ของคุณ บัญชีของคุณสามารถใช้งานได้แล้ว", "email-confirm-error-message": "มีปัญหาในการยืนยัน Email ของคุณ บางทีรหัสไม่ถูกต้องหรือหมดอายุแล้ว", - "email-confirm-sent": "Email เพื่อยืนยันได้ส่งไปแล้ว" + "email-confirm-sent": "Email เพื่อยืนยันได้ส่งไปแล้ว", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/tr/admin/appearance/customise.json b/public/language/tr/admin/appearance/customise.json index e5450f0c7d..ae428da7f4 100644 --- a/public/language/tr/admin/appearance/customise.json +++ b/public/language/tr/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Özel CSS kodlarınızı bu alana girin.", "custom-css.enable": "Özel CSS Etkinleştir", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Özel Header", - "custom-header.description": "Forumunuzun biçimlendirmesini sağlayacak <head> bölümüne eklenecek özel HTML'yi (ör. JavaScript, Meta Etiketler vb.) Girin.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Özel Header'ı Etkinleştir", "custom-css.livereload": "Canlı Yenilemeyi Etkinleştir", diff --git a/public/language/tr/admin/menu.json b/public/language/tr/admin/menu.json index c6f2a706a5..d4bc661658 100644 --- a/public/language/tr/admin/menu.json +++ b/public/language/tr/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Görünüm", "appearance/themes": "Temalar", "appearance/skins": "Deriler", - "appearance/customise": "Özel HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Genişletme", "extend/plugins": "Eklentiler", diff --git a/public/language/tr/admin/settings/notifications.json b/public/language/tr/admin/settings/notifications.json index 4718dab68f..9c7badb194 100644 --- a/public/language/tr/admin/settings/notifications.json +++ b/public/language/tr/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Bildirimler", "welcome-notification": "Hoş Geldin Bildirimi", - "welcome-notification-link": "Hoş Geldin Bildirimi Bağlantısı" + "welcome-notification-link": "Hoş Geldin Bildirimi Bağlantısı", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/post.json b/public/language/tr/admin/settings/post.json index adf92b6e9a..9df8eaba0c 100644 --- a/public/language/tr/admin/settings/post.json +++ b/public/language/tr/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "En Eskiden En Yeniye", "sorting.newest-to-oldest": "En Yeniden En Eskiye", "sorting.most-votes": "En Çok Oylanan", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Varsayılan Konu Sıralaması", "restrictions": "İleti Kısıtlamaları", "restrictions.post-queue": "İleti kuyruğunu etkinleştir", diff --git a/public/language/tr/admin/settings/user.json b/public/language/tr/admin/settings/user.json index 315f82bf4a..610de51ebf 100644 --- a/public/language/tr/admin/settings/user.json +++ b/public/language/tr/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Temalar", "disable-user-skins": "Kullanıcıların özel bir deri seçmesini engelle", "account-protection": "Hesap Koruma", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Saatlik giriş deneme sayısı", "login-attempts-help": "Bir kullanıcının hesabına giriş denemesi bu sınırı aşarsa, bu hesap önceden belirlenmiş olan bir süre için kilitlenir.", "lockout-duration": "Hesap Kilitleme Süresi (dakika)", diff --git a/public/language/tr/email.json b/public/language/tr/email.json index e1007b3b1a..71077d5cc7 100644 --- a/public/language/tr/email.json +++ b/public/language/tr/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Bu bildirim şectiğiniz ayarlar yüzünden gönderildi.", "notif.post.cta": "Konunun tamamını okumak için buraya tıklayın", "notif.post.unsub.info": "Bu yazı bildirimi size abonelik ayarlarınız nedeni ile gönderilmiştir.", + "notif.cta": "Click here to go to forum", "test.text1": "Bu ileti NodeBB e-posta ayarlarınızın doğru çalışıp çalışmadığını kontrol etmek için gönderildi.", "unsub.cta": "Buraya tıklayarak ayarlarınızı değiştirebilirsiniz.", "banned.subject": "%1 'den yasaklandınız", diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index e60e3a55b8..5cb4e12e66 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Devam et", "return_to": "Geri dön.", "new_notification": "Yeni bildirim", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Okunmamış bildirimleriniz var.", "all": "Hepsi", "topics": "Başlıklar", @@ -45,5 +46,19 @@ "email-confirmed": "E-posta onaylandı", "email-confirmed-message": "E-postanızı onaylandığınız için teşekkürler. Hesabınız tamamen aktif edildi.", "email-confirm-error-message": "E-posta adresinizi onaylarken bir hata oluştu. Kodunuz geçersiz ya da eski olabilir.", - "email-confirm-sent": "Onay e-postası gönderildi." + "email-confirm-sent": "Onay e-postası gönderildi.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/uk/admin/appearance/customise.json b/public/language/uk/admin/appearance/customise.json index 0caddb1faa..20528f77e9 100644 --- a/public/language/uk/admin/appearance/customise.json +++ b/public/language/uk/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Уведіть власні CSS правила, що будуть примінені після всіх інших стилів.", "custom-css.enable": "Увімкнути користувацькі CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Користувацький заголовок", - "custom-header.description": "Уведіть власний HTML (JavaScript, мета теги, тощо), що буде додано до секції <head> вашого форуму.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Увімкнути користувацький заголовок", "custom-css.livereload": "Увімкнути Автоматичне Оновлення", diff --git a/public/language/uk/admin/menu.json b/public/language/uk/admin/menu.json index 7c5599d12d..108b4a991f 100644 --- a/public/language/uk/admin/menu.json +++ b/public/language/uk/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Зовнішній вигляд", "appearance/themes": "Теми", "appearance/skins": "Стилі", - "appearance/customise": "Користувацькі HTML та CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Розширити", "extend/plugins": "Плагіни", diff --git a/public/language/uk/admin/settings/notifications.json b/public/language/uk/admin/settings/notifications.json index 68634d4721..3a5f9976d1 100644 --- a/public/language/uk/admin/settings/notifications.json +++ b/public/language/uk/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Сповіщення", "welcome-notification": "Сповіщення \"Ласкаво просимо\"", - "welcome-notification-link": "Посилання для сповіщення \"Ласкаво просимо\"" + "welcome-notification-link": "Посилання для сповіщення \"Ласкаво просимо\"", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/uk/admin/settings/post.json b/public/language/uk/admin/settings/post.json index 99e2817cbc..74434de937 100644 --- a/public/language/uk/admin/settings/post.json +++ b/public/language/uk/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Старі > Нові", "sorting.newest-to-oldest": "Нові > Старі", "sorting.most-votes": "Кількість голосів", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Типове сортування тем", "restrictions": "Обмеження постингу", "restrictions.post-queue": "Увімкнути чергу постів", diff --git a/public/language/uk/admin/settings/user.json b/public/language/uk/admin/settings/user.json index d2f7f3f515..9bae26eb89 100644 --- a/public/language/uk/admin/settings/user.json +++ b/public/language/uk/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Теми", "disable-user-skins": "Заборонити користувачам обирати стиль сайту", "account-protection": "Захист акаунту", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Кількість спроб входу за годину", "login-attempts-help": "Якщо кількість спроб входу в акаунт користувача перевищить цей ліміт, акаунт буде заблоковано на задану кількість часу", "lockout-duration": "Тривалість блокування акаунту (хвилин)", diff --git a/public/language/uk/email.json b/public/language/uk/email.json index eddbf7c236..9d44cf9f7f 100644 --- a/public/language/uk/email.json +++ b/public/language/uk/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Це повідомлення чату було вислано вам, згідно ваших налаштувань підписки", "notif.post.cta": "Натисніть тут, щоб повністю прочитати статтю", "notif.post.unsub.info": "Це поштове повідомлення було вислано вам, згідно ваших налаштувань підписки", + "notif.cta": "Click here to go to forum", "test.text1": "Це пробний лист для верифікації поштової служби. Всі налаштування вірні для NodeBB.", "unsub.cta": "Натисніть тут, щоб змінити ці налаштування", "banned.subject": "Ви були забанені на %1", diff --git a/public/language/uk/notifications.json b/public/language/uk/notifications.json index 858485d685..e7b2f9099b 100644 --- a/public/language/uk/notifications.json +++ b/public/language/uk/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Перейти до %1", "return_to": "Повернутись до %1", "new_notification": "Нове сповіщення", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "У вас немає непрочитаних сповіщень", "all": "Всі", "topics": "Теми", @@ -45,5 +46,19 @@ "email-confirmed": "Електронну пошту підтверджено", "email-confirmed-message": "Дякуємо за підтвердження електронної пошти. Ваш акаунт тепер повністю активовано.", "email-confirm-error-message": "При перевірці вашої електронної пошти сталася проблема. Можливо код був недійсним або простроченим.", - "email-confirm-sent": "Підтвердження по електронній пошті було надіслано." + "email-confirm-sent": "Підтвердження по електронній пошті було надіслано.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/vi/admin/appearance/customise.json b/public/language/vi/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/vi/admin/appearance/customise.json +++ b/public/language/vi/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/vi/admin/menu.json b/public/language/vi/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/vi/admin/menu.json +++ b/public/language/vi/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/vi/admin/settings/notifications.json b/public/language/vi/admin/settings/notifications.json index 4eff7f341a..da6c9680a3 100644 --- a/public/language/vi/admin/settings/notifications.json +++ b/public/language/vi/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "Notifications", "welcome-notification": "Welcome Notification", - "welcome-notification-link": "Welcome Notification Link" + "welcome-notification-link": "Welcome Notification Link", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/vi/admin/settings/post.json b/public/language/vi/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/vi/admin/settings/post.json +++ b/public/language/vi/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/vi/admin/settings/user.json b/public/language/vi/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/vi/admin/settings/user.json +++ b/public/language/vi/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/vi/email.json b/public/language/vi/email.json index 9cab607e01..5199f136a5 100644 --- a/public/language/vi/email.json +++ b/public/language/vi/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "Thông báo tin nhắn này được gửi tới dựa theo cài đặt theo dõi của bạn.", "notif.post.cta": "Nhấn vào đây để đọc toàn bộ chủ đề", "notif.post.unsub.info": "Thông báo bài viết này được gửi cho bạn dựa tên thiết lập nhận thông báo của bạn", + "notif.cta": "Click here to go to forum", "test.text1": "Đây là email kiểm tra xem chức năng gửi mail trên hệ thống NodeBB của bạn có hoạt động tốt hay không.", "unsub.cta": "Nhấn vào đây để thay đổi cài đặt.", "banned.subject": "You have been banned from %1", diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index 74e6ae5753..1f3e674954 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -9,6 +9,7 @@ "continue_to": "Tiếp tục tới %1", "return_to": "Quay lại %1", "new_notification": "Thông báo mới", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "Bạn có thông báo chưa đọc", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "Đã xác nhận email", "email-confirmed-message": "Cảm ơn bạn đã xác nhận địa chỉ email của bạn. Tài khoản của bạn đã được kích hoạt đầy đủ.", "email-confirm-error-message": "Đã có lỗi khi xác nhận địa chỉ email. Có thể đoạn mã không đúng hoặc đã hết hạn.", - "email-confirm-sent": "Email xác nhận đã gửi." + "email-confirm-sent": "Email xác nhận đã gửi.", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/appearance/customise.json b/public/language/zh-CN/admin/appearance/customise.json index cc9050e9e0..9af0d05332 100644 --- a/public/language/zh-CN/admin/appearance/customise.json +++ b/public/language/zh-CN/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "在这里输入自定义 CSS 变量声明,它们将被添加在样式中。", "custom-css.enable": "启用自定义 CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "自定义 Header", - "custom-header.description": "请输入自定义的 HTML 代码 (如 JavaScript,Meta Tags 等),这些代码会被添加到论坛的 <head> 部分。", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "启用自定义 Header", "custom-css.livereload": "启用实时重载", diff --git a/public/language/zh-CN/admin/menu.json b/public/language/zh-CN/admin/menu.json index 24e95dc2a8..9bef46edcd 100644 --- a/public/language/zh-CN/admin/menu.json +++ b/public/language/zh-CN/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "界面", "appearance/themes": "主题", "appearance/skins": "皮肤", - "appearance/customise": "自定义 HTML&CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "扩展", "extend/plugins": "插件", diff --git a/public/language/zh-CN/admin/settings/notifications.json b/public/language/zh-CN/admin/settings/notifications.json index fdda86bfaf..693a8e9dc9 100644 --- a/public/language/zh-CN/admin/settings/notifications.json +++ b/public/language/zh-CN/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "通知", "welcome-notification": "欢迎通知", - "welcome-notification-link": "欢迎通知链接" + "welcome-notification-link": "欢迎通知链接", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/post.json b/public/language/zh-CN/admin/settings/post.json index 6fd9894103..348469863b 100644 --- a/public/language/zh-CN/admin/settings/post.json +++ b/public/language/zh-CN/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "从旧到新", "sorting.newest-to-oldest": "从新到旧", "sorting.most-votes": "最多投票", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "默认主题排序", "restrictions": "发帖限制", "restrictions.post-queue": "启用发布队列", diff --git a/public/language/zh-CN/admin/settings/user.json b/public/language/zh-CN/admin/settings/user.json index 37915f486e..22fd387633 100644 --- a/public/language/zh-CN/admin/settings/user.json +++ b/public/language/zh-CN/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "主题", "disable-user-skins": "阻止用户选择自定义皮肤", "account-protection": "帐号保护", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "每小时尝试登录次数", "login-attempts-help": "如果用户的尝试登录次数超过此界限,该帐号将会被被锁定预设的时间。", "lockout-duration": "帐户锁定时间(分钟)", diff --git a/public/language/zh-CN/email.json b/public/language/zh-CN/email.json index 75ff03cf23..3f577b3bca 100644 --- a/public/language/zh-CN/email.json +++ b/public/language/zh-CN/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "根据您的订阅设置,为您发送此聊天提醒。", "notif.post.cta": "点击这里阅读全主题。", "notif.post.unsub.info": "根据您的订阅设置,为您发送此回帖提醒。", + "notif.cta": "Click here to go to forum", "test.text1": "这是一封测试邮件,用来验证 NodeBB 的邮件配置是否设置正确。", "unsub.cta": "点击这里修改这些设置", "banned.subject": "您已被封禁从 %1", diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index 85366895e9..3d42b29421 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -9,6 +9,7 @@ "continue_to": "继续前往 %1", "return_to": "返回 %1", "new_notification": "新通知", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "您有未读的通知。", "all": "所有", "topics": "主题", @@ -45,5 +46,19 @@ "email-confirmed": "电子邮箱已确认", "email-confirmed-message": "感谢您验证您的电子邮箱。您的帐户现已完全激活。", "email-confirm-error-message": "验证的您电子邮箱地址时出现了问题。可能是因为验证码无效或已过期。", - "email-confirm-sent": "确认邮件已发送。" + "email-confirm-sent": "确认邮件已发送。", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/appearance/customise.json b/public/language/zh-TW/admin/appearance/customise.json index 5095f7a937..a1220ec96d 100644 --- a/public/language/zh-TW/admin/appearance/customise.json +++ b/public/language/zh-TW/admin/appearance/customise.json @@ -3,8 +3,12 @@ "custom-css.description": "Enter your own CSS declarations here, which will be applied after all other styles.", "custom-css.enable": "Enable Custom CSS", + "custom-js": "Custom Javascript", + "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", + "custom-js.enable": "Enable Custom Javascript", + "custom-header": "Custom Header", - "custom-header.description": "Enter custom HTML here (ex. JavaScript, Meta Tags, etc.), which will be appended to the <head> section of your forum's markup.", + "custom-header.description": "Enter custom HTML here (ex. Meta Tags, etc.), which will be appended to the <head> section of your forum's markup. Script tags are allowed, but are discouraged, as the Custom Javascript tab is available.", "custom-header.enable": "Enable Custom Header", "custom-css.livereload": "Enable Live Reload", diff --git a/public/language/zh-TW/admin/menu.json b/public/language/zh-TW/admin/menu.json index d42af99bce..2b836ed0f7 100644 --- a/public/language/zh-TW/admin/menu.json +++ b/public/language/zh-TW/admin/menu.json @@ -39,7 +39,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", "appearance/skins": "Skins", - "appearance/customise": "Custom HTML & CSS", + "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", "extend/plugins": "Plugins", diff --git a/public/language/zh-TW/admin/settings/notifications.json b/public/language/zh-TW/admin/settings/notifications.json index 6d4a1e4771..ad5bf1c7d0 100644 --- a/public/language/zh-TW/admin/settings/notifications.json +++ b/public/language/zh-TW/admin/settings/notifications.json @@ -1,5 +1,6 @@ { "notifications": "告示", "welcome-notification": "歡迎告示", - "welcome-notification-link": "歡迎告示連結" + "welcome-notification-link": "歡迎告示連結", + "welcome-notification-uid": "Welcome Notification User (UID)" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/post.json b/public/language/zh-TW/admin/settings/post.json index a789025597..7cef2f34a0 100644 --- a/public/language/zh-TW/admin/settings/post.json +++ b/public/language/zh-TW/admin/settings/post.json @@ -4,6 +4,7 @@ "sorting.oldest-to-newest": "Oldest to Newest", "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", + "sorting.most-posts": "Most Posts", "sorting.topic-default": "Default Topic Sorting", "restrictions": "Posting Restrictions", "restrictions.post-queue": "Enable post queue", diff --git a/public/language/zh-TW/admin/settings/user.json b/public/language/zh-TW/admin/settings/user.json index a8bc2b176e..cbdd4ee91c 100644 --- a/public/language/zh-TW/admin/settings/user.json +++ b/public/language/zh-TW/admin/settings/user.json @@ -19,6 +19,8 @@ "themes": "Themes", "disable-user-skins": "Prevent users from choosing a custom skin", "account-protection": "Account Protection", + "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", "lockout-duration": "Account Lockout Duration (minutes)", diff --git a/public/language/zh-TW/email.json b/public/language/zh-TW/email.json index 3e95aee620..2f4a651286 100644 --- a/public/language/zh-TW/email.json +++ b/public/language/zh-TW/email.json @@ -30,6 +30,7 @@ "notif.chat.unsub.info": "本聊天通知按你的訂閱設置發送給你。", "notif.post.cta": "點擊此處來閱讀完整主題", "notif.post.unsub.info": "本張貼通知按你的訂閱設置發送給你。", + "notif.cta": "Click here to go to forum", "test.text1": "這是一個測試電子郵件,用於確認你的NodeBB郵件功能是否設置正確。", "unsub.cta": "點擊此處來更改這些設置", "banned.subject": "You have been banned from %1", diff --git a/public/language/zh-TW/notifications.json b/public/language/zh-TW/notifications.json index 7d8351c56e..17f11f3358 100644 --- a/public/language/zh-TW/notifications.json +++ b/public/language/zh-TW/notifications.json @@ -9,6 +9,7 @@ "continue_to": "繼續前往 %1", "return_to": "返回 %1", "new_notification": "新訊息通知", + "new_notification_from": "You have a new Notification from %1", "you_have_unread_notifications": "你有未讀的通知。", "all": "All", "topics": "Topics", @@ -45,5 +46,19 @@ "email-confirmed": "已確認電子郵件", "email-confirmed-message": "感謝你驗證電子郵件。你的帳戶現已完整的啟動。", "email-confirm-error-message": "驗證你的電子郵件地址時發生問題。也許是啟動碼無效或是已過期。", - "email-confirm-sent": "已發送確認電子郵件。" + "email-confirm-sent": "已發送確認電子郵件。", + "none": "None", + "notification_only": "Notification Only", + "email_only": "Email Only", + "notification_and_email": "Notification & Email", + "notificationType_upvote": "When someone upvotes your post", + "notificationType_new-topic": "When someone you follow posts a topic", + "notificationType_new-reply": "When a new reply is posted in a topic you are watching", + "notificationType_follow": "When someone starts following you", + "notificationType_new-chat": "When you receive a chat message", + "notificationType_group-invite": "When you receive a group invite", + "notificationType_new-register": "When someone gets added to registration queue", + "notificationType_post-queue": "When a new post is queued", + "notificationType_new-post-flag": "When a post is flagged", + "notificationType_new-user-flag": "When a user is flagged" } \ No newline at end of file From b6391472382764ea8d0c926e63886313127f1fa5 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 29 Nov 2017 11:18:04 -0500 Subject: [PATCH 79/81] Updated issue template with instructions ... to warn against public disclosure of security vulnerabilities. --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 3fc954feb4..d025ff3ff5 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -2,6 +2,7 @@ == Github Issues are for bug reports and feature requests only == == Please visit https://community.nodebb.org for other support == == Found a security exploit? Please email us at security@nodebb.org instead for immediate attention == + == → DO NOT SUBMIT VULNERABILITIES TO THE PUBLIC BUG TRACKER == --> From b19310049d9c2e55f88b05a25fafff3e7752e6cf Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Wed, 29 Nov 2017 11:46:30 -0500 Subject: [PATCH 80/81] closes #6136 --- src/socket.io/modules.js | 22 ++++++++++++++++++---- test/messaging.js | 29 +++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 172d91e60f..e277c5c5e7 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -21,17 +21,31 @@ SocketModules.settings = {}; /* Chat */ SocketModules.chats.getRaw = function (socket, data, callback) { - if (!data || !data.hasOwnProperty('mid') || !data.hasOwnProperty('roomId')) { + if (!data || !data.hasOwnProperty('mid')) { return callback(new Error('[[error:invalid-data]]')); } async.waterfall([ function (next) { - Messaging.isUserInRoom(socket.uid, data.roomId, next); + Messaging.getMessageField(data.mid, 'roomId', next); }, - function (inRoom, next) { - if (!inRoom) { + function (roomId, next) { + async.parallel({ + isAdmin: function (next) { + user.isAdministrator(socket.uid, next); + }, + hasMessage: function (next) { + db.isSortedSetMember('uid:' + socket.uid + ':chat:room:' + roomId + ':mids', data.mid, next); + }, + inRoom: function (next) { + Messaging.isUserInRoom(socket.uid, roomId, next); + }, + }, next); + }, + function (results, next) { + if (!results.isAdmin && (!results.inRoom || !results.hasMessage)) { return next(new Error('[[error:not-allowed]]')); } + Messaging.getMessageField(data.mid, 'content', next); }, ], callback); diff --git a/test/messaging.js b/test/messaging.js index 29d381658b..0253fbf6b0 100644 --- a/test/messaging.js +++ b/test/messaging.js @@ -243,7 +243,7 @@ describe('Messaging Library', function () { assert.equal(messageData.content, 'first chat message'); assert(messageData.fromUser); assert(messageData.roomId, roomId); - socketModules.chats.getRaw({ uid: fooUid }, { roomId: roomId, mid: messageData.mid }, function (err, raw) { + socketModules.chats.getRaw({ uid: fooUid }, { mid: messageData.mid }, function (err, raw) { assert.ifError(err); assert.equal(raw, 'first chat message'); setTimeout(done, 300); @@ -275,13 +275,30 @@ describe('Messaging Library', function () { }); }); - it('should return not in room error', function (done) { - socketModules.chats.getRaw({ uid: 0 }, { roomId: roomId, mid: 1 }, function (err) { - assert.equal(err.message, '[[error:not-allowed]]'); - done(); + it('should return not allowed error if mid is not in room', function (done) { + var myRoomId; + User.create({ username: 'dummy' }, function (err, uid) { + assert.ifError(err); + socketModules.chats.newRoom({ uid: bazUid }, { touid: uid }, function (err, _roomId) { + myRoomId = _roomId; + assert.ifError(err); + assert(myRoomId); + socketModules.chats.getRaw({ uid: bazUid }, { mid: 1 }, function (err) { + assert.equal(err.message, '[[error:not-allowed]]'); + socketModules.chats.send({ uid: bazUid }, { roomId: myRoomId, message: 'admin will see this' }, function (err, message) { + assert.ifError(err); + socketModules.chats.getRaw({ uid: fooUid }, { mid: message.mid }, function (err, raw) { + assert.ifError(err); + assert.equal(raw, 'admin will see this'); + done(); + }); + }); + }); + }); }); }); + it('should notify offline users of message', function (done) { Messaging.notificationSendDelay = 100; @@ -507,7 +524,7 @@ describe('Messaging Library', function () { it('should edit message', function (done) { socketModules.chats.edit({ uid: fooUid }, { mid: mid, roomId: roomId, message: 'message edited' }, function (err) { assert.ifError(err); - socketModules.chats.getRaw({ uid: fooUid }, { roomId: roomId, mid: mid }, function (err, raw) { + socketModules.chats.getRaw({ uid: fooUid }, { mid: mid }, function (err, raw) { assert.ifError(err); assert.equal(raw, 'message edited'); done(); From a19537dc25e406a98048a561f45b3b321c9d3509 Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Wed, 29 Nov 2017 14:04:45 -0500 Subject: [PATCH 81/81] closes #6137 --- install/data/defaults.json | 3 ++- src/flags.js | 4 ++-- src/privileges/posts.js | 2 +- test/controllers-admin.js | 7 ++++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 79fbcf07f4..9e08416ce6 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -37,5 +37,6 @@ "unreadCutoff": 2, "bookmarkThreshold": 5, "topicsPerList": 20, - "autoDetectLang": 1 + "autoDetectLang": 1, + "privileges:flag": 0 } diff --git a/src/flags.js b/src/flags.js index 093757251b..4118cf8fb2 100644 --- a/src/flags.js +++ b/src/flags.js @@ -241,7 +241,7 @@ Flags.validate = function (payload, callback) { return callback(err); } - var minimumReputation = utils.isNumber(meta.config['privileges:flag']) ? parseInt(meta.config['privileges:flag'], 10) : 1; + var minimumReputation = utils.isNumber(meta.config['privileges:flag']) ? parseInt(meta.config['privileges:flag'], 10) : 0; // Check if reporter meets rep threshold (or can edit the target post, in which case threshold does not apply) if (!editable.flag && parseInt(data.reporter.reputation, 10) < minimumReputation) { return callback(new Error('[[error:not-enough-reputation-to-flag]]')); @@ -257,7 +257,7 @@ Flags.validate = function (payload, callback) { return callback(err); } - var minimumReputation = utils.isNumber(meta.config['privileges:flag']) ? parseInt(meta.config['privileges:flag'], 10) : 1; + var minimumReputation = utils.isNumber(meta.config['privileges:flag']) ? parseInt(meta.config['privileges:flag'], 10) : 0; // Check if reporter meets rep threshold (or can edit the target user, in which case threshold does not apply) if (!editable && parseInt(data.reporter.reputation, 10) < minimumReputation) { return callback(new Error('[[error:not-enough-reputation-to-flag]]')); diff --git a/src/privileges/posts.js b/src/privileges/posts.js index f2bfe38428..b157fa798b 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -200,7 +200,7 @@ module.exports = function (privileges) { }, next); }, function (results, next) { - var minimumReputation = utils.isNumber(meta.config['privileges:flag']) ? parseInt(meta.config['privileges:flag'], 10) : 1; + var minimumReputation = utils.isNumber(meta.config['privileges:flag']) ? parseInt(meta.config['privileges:flag'], 10) : 0; var canFlag = results.isAdminOrMod || parseInt(results.userReputation, 10) >= minimumReputation; next(null, { flag: canFlag }); }, diff --git a/test/controllers-admin.js b/test/controllers-admin.js index 4a82ceb50c..74cb521bc1 100644 --- a/test/controllers-admin.js +++ b/test/controllers-admin.js @@ -11,6 +11,7 @@ var topics = require('../src/topics'); var user = require('../src/user'); var groups = require('../src/groups'); var helpers = require('./helpers'); +var meta = require('../src/meta'); describe('Admin Controllers', function () { var tid; @@ -491,7 +492,6 @@ describe('Admin Controllers', function () { }); it('should load /recent in maintenance mode', function (done) { - var meta = require('../src/meta'); meta.config.maintenanceMode = 1; request(nconf.get('url') + '/api/recent', { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); @@ -554,15 +554,16 @@ describe('Admin Controllers', function () { it('should error with not enough reputation to flag', function (done) { var socketFlags = require('../src/socket.io/flags'); - + var oldValue = meta.config['privileges:flag']; + meta.config['privileges:flag'] = 1000; socketFlags.create({ uid: regularUid }, { id: pid, type: 'post', reason: 'spam' }, function (err) { assert.equal(err.message, '[[error:not-enough-reputation-to-flag]]'); + meta.config['privileges:flag'] = oldValue; done(); }); }); it('should return flag details', function (done) { - var meta = require('../src/meta'); var socketFlags = require('../src/socket.io/flags'); var oldValue = meta.config['privileges:flag']; meta.config['privileges:flag'] = 0;