From efb7d688f04d3ea97b7a7576a04bd22328d2b6d0 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 11 Nov 2020 22:51:06 +0000 Subject: [PATCH 01/67] chore: update changelog for v1.15.1 --- CHANGELOG.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b080e7f51d..0d640b817f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,74 @@ +#### v1.15.1 (2020-11-11) + +##### Chores + +* incrementing version number - v1.15.1-beta.0 (e033da8a) +* fallback l10n for admin-settings-api (8368c25b) +* **deps:** + * update dependency eslint to v7.13.0 (bcbc0854) + * update dependency eslint-config-airbnb-base to v14.2.1 (d227fe9f) + * update commitlint monorepo to v11 (90bcfa6d) + +##### New Features + +* #8864, add action:events.log (9c5c32d4) +* show db info side by side (62c0454c) +* add language keys for admin-settings-api (d32e4e02) +* #8824, cache refactor (#8851) (f1f9b225) +* move mkdirp to beforeBuild so it doesnt get called twice (6255874e) +* group exists API call in write api (d2631922) +* user exist route in write api (1446cec7) +* new shorthand route /api/v3/users/bySlug/:userslug (60e1e99b) +* allow passwords with length > 73 characters (#8818) (512f6de6) +* #8821, allow guest topic views (9e3eb5d4) + +##### Bug Fixes + +* #8869, dont escape category title,description twice (567c5f20) +* refresh flags list on bulk action success (769aba0a) +* test breakage from f300c933a50263039a57811f8cc716df39a138b0 (ee4d90f6) +* remove some unnecessary jquery wrappers (9f7902ef) +* send back jquery object to keep backwards compat (978f1ee0) +* use header/footer cache in prod (a0164b1c) +* add missing maxAge to cache (05a92885) +* clear header-cache after each suite (3f5f38dd) +* show msg on fail (255cf43e) +* spec (fe63c6ae) +* guest header/footer cache (2e446392) +* #8846, possible fix (74951f59) +* winston error message (16d03975) +* permanent redirect on user api redirect shorthand (6b196a20) +* user exist route needs no authentication (f2bb42c0) +* #8840, don't crash if /compose route is called with no query params (c61dee4b) +* XSS in event:banned messaging modal (f68bce86) +* #8838, fix chat dropdown timestamps (78ee8332) +* #8836, truncate fullname (76cd5b0f) +* #8827, do not require admin:users privilege to ban users (891a1ea2) +* **deps:** + * update dependency nodebb-plugin-mentions to v2.13.4 (1460a7a8) + * update dependency diff to v5 (72d1b3cd) + * update dependency nodebb-theme-persona to v10.2.67 (#8847) (e250c3f1) + * update dependency json2csv to v5.0.4 (#8865) (ba7b23ac) + * update dependency postcss to v8.1.7 (#8866) (2946bb16) + * update dependency nodebb-theme-slick to v1.2.40 (#8863) (20f4fe08) + * update dependency nodebb-plugin-mentions to v2.13.3 (#8862) (c18f4491) + * update dependency benchpressjs to v2.1.0 (14ba6383) + * update dependency benchpressjs to v2.0.9 (381a32ab) + * update dependency mongodb to v3.6.3 (#8841) (7e273e77) + * update dependency nodebb-theme-persona to v10.2.66 (#8839) (00f90cd9) + * update dependency nodebb-plugin-mentions to v2.13.2 (#8835) (064c99cd) + * update dependency postcss to v8.1.6 (e0cf9740) + * update dependency @nodebb/socket.io-adapter-mongo to v3.1.1 (#8831) (40eb658b) + * update dependency @nodebb/mubsub to v1.7.1 (#8830) (7b8a5567) + * update dependency postcss to v8.1.5 (9f5ef9d0) +* **#8828:** web install templates now compiled (#8832) (de5a21f1) +* **acp:** max-height for plugin menu list (eec630f1) + +##### Refactors + +* move session revocation route to write api (f300c933) +* change Benchpress.parse to .render (#8856) (e128264b) + #### v1.15.0 (2020-11-04) ##### Breaking Changes From a2468b84b4f82b7cbff7b253ca381d4617ef4e4b Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 11 Nov 2020 22:51:05 +0000 Subject: [PATCH 02/67] chore: incrementing version number - v1.15.1 (cherry picked from commit 2790a3a3fe23e314844759744b5037d8cc66a2b4) Signed-off-by: Misty (Bot) --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f4f96961a6..9c372ee3fa 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.15.1-beta.0", + "version": "1.15.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From dc9668e417930740c5601684f4d289f69faa5a45 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 11 Nov 2020 19:53:59 -0500 Subject: [PATCH 03/67] fix: pass length to messaging checkContent hook --- src/messaging/create.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/messaging/create.js b/src/messaging/create.js index 1f8a3b48f0..2d6a10b8e8 100644 --- a/src/messaging/create.js +++ b/src/messaging/create.js @@ -22,12 +22,13 @@ module.exports = function (Messaging) { } const maximumChatMessageLength = meta.config.maximumChatMessageLength || 1000; - const data = await plugins.fireHook('filter:messaging.checkContent', { content: content }); - content = String(data.content).trim(); + content = String(content).trim(); + let length = String(content.length).trim(); + ({ content, length } = await plugins.fireHook('filter:messaging.checkContent', { content, length })); if (!content) { throw new Error('[[error:invalid-chat-message]]'); } - if (content.length > maximumChatMessageLength) { + if (length > maximumChatMessageLength) { throw new Error('[[error:chat-message-too-long, ' + maximumChatMessageLength + ']]'); } }; From 319cfeaa1c12e0b85f3bb39bffa86991c60a9442 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 12 Nov 2020 14:32:49 -0500 Subject: [PATCH 04/67] test: updated test name to be more specific --- test/api.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/api.js b/test/api.js index 2b105d96d0..8f98c503bc 100644 --- a/test/api.js +++ b/test/api.js @@ -21,7 +21,7 @@ const flags = require('../src/flags'); const messaging = require('../src/messaging'); const utils = require('../src/utils'); -describe('Read API', async () => { +describe('API', async () => { let readApi = false; let writeApi = false; const readApiPath = path.resolve(__dirname, '../public/openapi/read.yaml'); @@ -32,6 +32,7 @@ describe('Read API', async () => { const unauthenticatedRoutes = ['/api/login', '/api/register']; // Everything else will be called with the admin user const mocks = { + head: {}, get: {}, post: {}, put: {}, @@ -200,7 +201,7 @@ describe('Read API', async () => { url = nconf.get('url') + (prefix || '') + testPath; }); - it('may contain a request body with application/json type if POST/PUT/DELETE', () => { + it('should contain a valid request body (if present) with application/json type if POST/PUT/DELETE', () => { if (['post', 'put', 'delete'].includes(method) && context[method].hasOwnProperty('requestBody')) { assert(context[method].requestBody); assert(context[method].requestBody.content); From 97842c43d38ead14625a7e32d0ec9e06ce375f0a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 12 Nov 2020 15:52:33 -0500 Subject: [PATCH 05/67] test: new api test to ensure each path's parameters are defined in context --- .../openapi/write/admin/settings/setting.yaml | 7 ------- test/api.js | 19 +++++++++++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/public/openapi/write/admin/settings/setting.yaml b/public/openapi/write/admin/settings/setting.yaml index dcd85aed56..009f478b81 100644 --- a/public/openapi/write/admin/settings/setting.yaml +++ b/public/openapi/write/admin/settings/setting.yaml @@ -11,13 +11,6 @@ put: required: true description: backend id of the setting to update example: maximumRelatedTopics - - in: path - name: value - schema: - type: string - required: true - description: the value of the new setting - example: 2 requestBody: required: true content: diff --git a/test/api.js b/test/api.js index 8f98c503bc..5e145abc83 100644 --- a/test/api.js +++ b/test/api.js @@ -83,7 +83,7 @@ describe('API', async () => { tokens: [{ token: mocks.delete['/users/{uid}/tokens/{token}'][1].example, uid: 1, - description: 'for testing of token deletion rotue', + description: 'for testing of token deletion route', timestamp: Date.now(), }], }); @@ -172,8 +172,17 @@ describe('API', async () => { return; } - it('should have examples when parameters are present', () => { + it('should have each path parameter defined in its context', () => { method = _method; + if (!context[method].parameters) { + return; + } + + const names = (path.match(/{[\w\-_]+}?/g) || []).map(match => match.slice(1, -1)); + assert(context[method].parameters.map(param => (param.in === 'path' ? param.name : null)).filter(Boolean).every(name => names.includes(name)), `${method.toUpperCase()} ${path} has parameter(s) in path that are not defined in schema`); + }); + + it('should have examples when parameters are present', () => { let parameters = context[method].parameters; let testPath = path; @@ -255,9 +264,11 @@ describe('API', async () => { }); it('should successfully re-login if needed', async () => { - const reloginPaths = ['/users/{uid}/password']; - if (method === 'put' && reloginPaths.includes(path)) { + const reloginPaths = ['PUT /users/{uid}/password', 'DELETE /users/{uid}/sessions/{uuid}']; + if (reloginPaths.includes(`${method.toUpperCase()} ${path}`)) { jar = await helpers.loginUser('admin', '123456'); + const sessionUUIDs = await db.getObject('uid:1:sessionUUID:sessionId'); + mocks.delete['/users/{uid}/sessions/{uuid}'][1].example = Object.keys(sessionUUIDs).pop(); // Retrieve CSRF token using cookie, to test Write API const config = await request({ From bcccb331db35efa1b003ac1521988e4184752dfa Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 12 Nov 2020 15:53:15 -0500 Subject: [PATCH 06/67] docs: openapi schema for user/group exist check, session deletion --- public/openapi/write.yaml | 2 ++ public/openapi/write/groups/slug.yaml | 17 ++++++++++ public/openapi/write/users/uid.yaml | 17 ++++++++++ .../write/users/uid/sessions/uuid.yaml | 31 +++++++++++++++++++ src/routes/write/groups.js | 2 +- test/api.js | 14 ++++++++- 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 public/openapi/write/users/uid/sessions/uuid.yaml diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 35fed4b3fe..c3396ea4ad 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -42,6 +42,8 @@ paths: $ref: 'write/users/uid/ban.yaml' /users/{uid}/tokens/{token}: $ref: 'write/users/uid/tokens/token.yaml' + /users/{uid}/sessions/{uuid}: + $ref: 'write/users/uid/sessions/uuid.yaml' /categories/: $ref: 'write/categories.yaml' /groups/: diff --git a/public/openapi/write/groups/slug.yaml b/public/openapi/write/groups/slug.yaml index eb867a6897..28077e290c 100644 --- a/public/openapi/write/groups/slug.yaml +++ b/public/openapi/write/groups/slug.yaml @@ -1,3 +1,20 @@ +head: + tags: + - groups + summary: check if a group exists + parameters: + - in: path + name: slug + schema: + type: string + required: true + description: group slug (that also acts as its identifier) to check + example: my-test-group + responses: + '200': + description: group found + '404': + description: group not found delete: tags: - groups diff --git a/public/openapi/write/users/uid.yaml b/public/openapi/write/users/uid.yaml index f615c105a8..1e2878364a 100644 --- a/public/openapi/write/users/uid.yaml +++ b/public/openapi/write/users/uid.yaml @@ -1,3 +1,20 @@ +head: + tags: + - users + summary: check if a user exists + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to check + example: 3 + responses: + '200': + description: user found + '404': + description: user not found delete: tags: - users diff --git a/public/openapi/write/users/uid/sessions/uuid.yaml b/public/openapi/write/users/uid/sessions/uuid.yaml new file mode 100644 index 0000000000..4b01dee1e0 --- /dev/null +++ b/public/openapi/write/users/uid/sessions/uuid.yaml @@ -0,0 +1,31 @@ +delete: + tags: + - users + summary: revoke a user session + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user's session + example: 3 + - in: path + name: uuid + schema: + type: string + required: true + description: uuid of the user's session + example: 7c1a66b3-90e1-41f4-9f74-2b2edaebf917 + responses: + '200': + description: user session revoked + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object \ No newline at end of file diff --git a/src/routes/write/groups.js b/src/routes/write/groups.js index 1f78447170..64af35bf70 100644 --- a/src/routes/write/groups.js +++ b/src/routes/write/groups.js @@ -10,8 +10,8 @@ const setupApiRoute = routeHelpers.setupApiRoute; module.exports = function () { const middlewares = [middleware.authenticate]; - setupApiRoute(router, 'head', '/:slug', [middleware.assert.group], controllers.write.groups.exists); setupApiRoute(router, 'post', '/', [...middlewares, middleware.checkRequired.bind(null, ['name'])], controllers.write.groups.create); + setupApiRoute(router, 'head', '/:slug', [middleware.assert.group], controllers.write.groups.exists); setupApiRoute(router, 'delete', '/:slug', [...middlewares, middleware.assert.group], controllers.write.groups.delete); setupApiRoute(router, 'put', '/:slug/membership/:uid', [...middlewares, middleware.assert.group], controllers.write.groups.join); setupApiRoute(router, 'delete', '/:slug/membership/:uid', [...middlewares, middleware.assert.group], controllers.write.groups.leave); diff --git a/test/api.js b/test/api.js index 5e145abc83..fd7a8fc6bd 100644 --- a/test/api.js +++ b/test/api.js @@ -49,6 +49,18 @@ describe('API', async () => { example: utils.generateUUID(), }, ], + '/users/{uid}/sessions/{uuid}': [ + { + in: 'path', + name: 'uid', + example: 1, + }, + { + in: 'path', + name: 'uuid', + example: '', // to be defined below... + }, + ], }, }; @@ -120,7 +132,7 @@ describe('API', async () => { await socketUser.exportPosts({ uid: adminUid }, { uid: adminUid }); await socketUser.exportUploads({ uid: adminUid }, { uid: adminUid }); // wait for export child process to complete - await wait(5000); + // await wait(5000); // Attach a search hook so /api/search is enabled plugins.registerHook('core', { From b3e00489c84a8797ad2bca21ce37c010f94ecfd8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 12 Nov 2020 15:57:36 -0500 Subject: [PATCH 07/67] fix: add back test timeout for exports --- test/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api.js b/test/api.js index fd7a8fc6bd..a4ac532666 100644 --- a/test/api.js +++ b/test/api.js @@ -132,7 +132,7 @@ describe('API', async () => { await socketUser.exportPosts({ uid: adminUid }, { uid: adminUid }); await socketUser.exportUploads({ uid: adminUid }, { uid: adminUid }); // wait for export child process to complete - // await wait(5000); + await wait(5000); // Attach a search hook so /api/search is enabled plugins.registerHook('core', { From 04f4429f72dc6ad021e56a21973416b5b56ec1bb Mon Sep 17 00:00:00 2001 From: Opliko <25460763+oplik0@users.noreply.github.com> Date: Fri, 13 Nov 2020 04:23:07 +0100 Subject: [PATCH 08/67] Resolve #7514 - optional timer for registration queue (#8796) * feat: #7514 Optional timer for registration queue * feat: show minutes in average time * fix: don't show total number of minutes * feat: implement requested changes * fix: just store minutes instead of milliseconds * feat: set default values --- install/data/defaults.json | 2 + .../language/en-GB/admin/settings/user.json | 3 ++ public/language/en-GB/register.json | 53 ++++++++++--------- src/controllers/authentication.js | 10 +++- src/user/approval.js | 22 +++++++- src/views/admin/settings/user.tpl | 13 +++++ 6 files changed, 75 insertions(+), 28 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 9cb646a2f8..b6d4fa1907 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -136,6 +136,8 @@ "necroThreshold": 7, "categoryWatchState": "watching", "submitPluginUsage": 1, + "showAverageApprovalTime": true, + "autoApproveTime": 0, "maxUserSessions": 10, "useCompression": 0 } \ No newline at end of file diff --git a/public/language/en-GB/admin/settings/user.json b/public/language/en-GB/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/en-GB/admin/settings/user.json +++ b/public/language/en-GB/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/en-GB/register.json b/public/language/en-GB/register.json index 461295ef5f..c6136b9d0a 100644 --- a/public/language/en-GB/register.json +++ b/public/language/en-GB/register.json @@ -1,27 +1,28 @@ { - "register": "Register", - "cancel_registration": "Cancel Registration", - "help.email": "By default, your email will be hidden from the public.", - "help.username_restrictions": "A unique username between %1 and %2 characters. Others can mention you with @username.", - "help.minimum_password_length": "Your password's length must be at least %1 characters.", - "email_address": "Email Address", - "email_address_placeholder": "Enter Email Address", - "username": "Username", - "username_placeholder": "Enter Username", - "password": "Password", - "password_placeholder": "Enter Password", - "confirm_password": "Confirm Password", - "confirm_password_placeholder": "Confirm Password", - "register_now_button": "Register Now", - "alternative_registration": "Alternative Registration", - "terms_of_use": "Terms of Use", - "agree_to_terms_of_use": "I agree to the Terms of Use", - "terms_of_use_error": "You must agree to the Terms of Use", - "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", - "interstitial.intro": "We require some additional information before we can create your account.", - "interstitial.errors-found": "We could not complete your registration:", - - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." -} \ No newline at end of file + "register": "Register", + "cancel_registration": "Cancel Registration", + "help.email": "By default, your email will be hidden from the public.", + "help.username_restrictions": "A unique username between %1 and %2 characters. Others can mention you with @username.", + "help.minimum_password_length": "Your password's length must be at least %1 characters.", + "email_address": "Email Address", + "email_address_placeholder": "Enter Email Address", + "username": "Username", + "username_placeholder": "Enter Username", + "password": "Password", + "password_placeholder": "Enter Password", + "confirm_password": "Confirm Password", + "confirm_password_placeholder": "Confirm Password", + "register_now_button": "Register Now", + "alternative_registration": "Alternative Registration", + "terms_of_use": "Terms of Use", + "agree_to_terms_of_use": "I agree to the Terms of Use", + "terms_of_use_error": "You must agree to the Terms of Use", + "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", + "interstitial.intro": "We require some additional information before we can create your account.", + "interstitial.errors-found": "We could not complete your registration:", + "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", + "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", + "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails." +} diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 2b59a835a0..7836f8fe17 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -118,7 +118,15 @@ authenticationController.register = async function (req, res) { async function addToApprovalQueue(req, userData) { userData.ip = req.ip; await user.addToApprovalQueue(userData); - return { message: '[[register:registration-added-to-queue]]' }; + let message = '[[register:registration-added-to-queue]]'; + if (meta.config.showAverageApprovalTime) { + const average_time = await db.getObjectField('registration:queue:approval:times', 'average'); + message += ` [[register:registration-queue-average-time, ${Math.floor(average_time / 60)}, ${average_time % 60}]]`; + } + if (meta.config.autoApproveTime > 0) { + message += ` [[register:registration-queue-auto-approve-time, ${meta.config.autoApproveTime}]]`; + } + return { message: message }; } authenticationController.registerComplete = function (req, res, next) { diff --git a/src/user/approval.js b/src/user/approval.js index 797ef9045f..2476da5cb1 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -1,6 +1,7 @@ 'use strict'; const validator = require('validator'); +const cronJob = require('cron').CronJob; const db = require('../database'); const meta = require('../meta'); @@ -12,6 +13,10 @@ const slugify = require('../slugify'); const plugins = require('../plugins'); module.exports = function (User) { + new cronJob('0 * * * * *', function () { + User.autoApprove(); + }, null, true); + User.addToApprovalQueue = async function (userData) { userData.username = userData.username.trim(); userData.userslug = slugify(userData.username); @@ -59,7 +64,7 @@ module.exports = function (User) { if (!userData) { throw new Error('[[error:invalid-data]]'); } - + const creation_time = await db.sortedSetScore('registration:queue', username); const uid = await User.create(userData); await User.setUserField(uid, 'password', userData.hashedPassword); await removeFromQueue(username); @@ -71,6 +76,9 @@ module.exports = function (User) { template: 'registration_accepted', uid: uid, }); + const total = await db.incrObjectField('registration:queue:approval:times', 'totalTime', Math.floor((Date.now() - creation_time) / 60000)); + const counter = await db.incrObjectField('registration:queue:approval:times', 'counter', 1); + await db.setObjectField('registration:queue:approval:times', 'average', total / counter); return uid; }; @@ -140,4 +148,16 @@ module.exports = function (User) { const uids = await User.getUidsFromSet('ip:' + user.ip + ':uid', 0, -1); user.ipMatch = await User.getUsersFields(uids, ['uid', 'username', 'picture']); } + + User.autoApprove = async function () { + if (meta.config.autoApproveTime <= 0) { + return; + } + const users = await db.getSortedSetRevRangeWithScores('registration:queue', 0, -1); + const now = Date.now(); + for (const user of users.filter(user => now - user.score >= meta.config.autoApproveTime * 3600000)) { + // eslint-disable-next-line no-await-in-loop + await User.acceptRegistration(user.value); + } + }; }; diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index 45edc8f5a5..c6f0db9062 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -186,6 +186,19 @@ [[admin/settings/user:registration-approval-type.help, {config.relative_path}]]

+
+ + +

+ [[admin/settings/user:registration-queue-auto-approve-time-help]] +

+
+
+ +
From 51b7eca1194e29e41dac3ec1ae3d375670105843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 12 Nov 2020 22:23:50 -0500 Subject: [PATCH 09/67] fix: run every hour, dont show message if average_time is 0 --- src/controllers/authentication.js | 4 +++- src/user/approval.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 7836f8fe17..2bf8f59d2f 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -121,7 +121,9 @@ async function addToApprovalQueue(req, userData) { let message = '[[register:registration-added-to-queue]]'; if (meta.config.showAverageApprovalTime) { const average_time = await db.getObjectField('registration:queue:approval:times', 'average'); - message += ` [[register:registration-queue-average-time, ${Math.floor(average_time / 60)}, ${average_time % 60}]]`; + if (average_time > 0) { + message += ` [[register:registration-queue-average-time, ${Math.floor(average_time / 60)}, ${average_time % 60}]]`; + } } if (meta.config.autoApproveTime > 0) { message += ` [[register:registration-queue-auto-approve-time, ${meta.config.autoApproveTime}]]`; diff --git a/src/user/approval.js b/src/user/approval.js index 2476da5cb1..0a2c200d7c 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -13,7 +13,7 @@ const slugify = require('../slugify'); const plugins = require('../plugins'); module.exports = function (User) { - new cronJob('0 * * * * *', function () { + new cronJob('0 * * * *', function () { User.autoApprove(); }, null, true); From daf2e73c2919f899438f8da2331143d1e2a5bebb Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 13 Nov 2020 09:08:52 +0000 Subject: [PATCH 10/67] Latest translations and fallbacks --- public/language/ar/admin/settings/user.json | 3 +++ public/language/ar/register.json | 2 ++ public/language/bg/admin/settings/user.json | 3 +++ public/language/bg/register.json | 2 ++ public/language/bn/admin/settings/user.json | 3 +++ public/language/bn/register.json | 2 ++ public/language/cs/admin/settings/user.json | 3 +++ public/language/cs/register.json | 2 ++ public/language/da/admin/settings/user.json | 3 +++ public/language/da/register.json | 2 ++ public/language/de/admin/settings/user.json | 3 +++ public/language/de/register.json | 2 ++ public/language/el/admin/settings/user.json | 3 +++ public/language/el/register.json | 2 ++ public/language/en-US/admin/settings/user.json | 3 +++ public/language/en-US/register.json | 2 ++ public/language/en-x-pirate/admin/settings/user.json | 3 +++ public/language/en-x-pirate/register.json | 2 ++ public/language/es/admin/settings/user.json | 3 +++ public/language/es/register.json | 2 ++ public/language/et/admin/settings/user.json | 3 +++ public/language/et/register.json | 2 ++ public/language/fa-IR/admin/settings/user.json | 3 +++ public/language/fa-IR/register.json | 2 ++ public/language/fi/admin/settings/user.json | 3 +++ public/language/fi/register.json | 2 ++ public/language/fr/admin/settings/user.json | 3 +++ public/language/fr/register.json | 2 ++ public/language/gl/admin/settings/user.json | 3 +++ public/language/gl/register.json | 2 ++ public/language/he/admin/settings/user.json | 3 +++ public/language/he/register.json | 2 ++ public/language/hr/admin/settings/user.json | 3 +++ public/language/hr/register.json | 2 ++ public/language/hu/admin/settings/user.json | 3 +++ public/language/hu/register.json | 2 ++ public/language/id/admin/settings/user.json | 3 +++ public/language/id/register.json | 2 ++ public/language/it/admin/settings/user.json | 3 +++ public/language/it/register.json | 2 ++ public/language/ja/admin/settings/user.json | 3 +++ public/language/ja/register.json | 2 ++ public/language/ko/admin/settings/user.json | 3 +++ public/language/ko/register.json | 2 ++ public/language/lt/admin/settings/user.json | 3 +++ public/language/lt/register.json | 2 ++ public/language/lv/admin/settings/user.json | 3 +++ public/language/lv/register.json | 2 ++ public/language/ms/admin/settings/user.json | 3 +++ public/language/ms/register.json | 2 ++ public/language/nb/admin/settings/user.json | 3 +++ public/language/nb/register.json | 2 ++ public/language/nl/admin/settings/user.json | 3 +++ public/language/nl/register.json | 2 ++ public/language/pl/admin/settings/user.json | 3 +++ public/language/pl/register.json | 2 ++ public/language/pt-BR/admin/settings/user.json | 3 +++ public/language/pt-BR/register.json | 2 ++ public/language/pt-PT/admin/settings/user.json | 3 +++ public/language/pt-PT/register.json | 2 ++ public/language/ro/admin/settings/user.json | 3 +++ public/language/ro/register.json | 2 ++ public/language/ru/admin/settings/user.json | 3 +++ public/language/ru/register.json | 2 ++ public/language/rw/admin/settings/user.json | 3 +++ public/language/rw/register.json | 2 ++ public/language/sc/admin/settings/user.json | 3 +++ public/language/sc/register.json | 2 ++ public/language/sk/admin/settings/user.json | 3 +++ public/language/sk/register.json | 2 ++ public/language/sl/admin/settings/user.json | 3 +++ public/language/sl/register.json | 2 ++ public/language/sr/admin/settings/user.json | 3 +++ public/language/sr/register.json | 2 ++ public/language/sv/admin/settings/user.json | 3 +++ public/language/sv/register.json | 2 ++ public/language/th/admin/settings/user.json | 3 +++ public/language/th/register.json | 2 ++ public/language/tr/admin/settings/user.json | 3 +++ public/language/tr/register.json | 2 ++ public/language/uk/admin/settings/user.json | 3 +++ public/language/uk/register.json | 2 ++ public/language/vi/admin/settings/user.json | 3 +++ public/language/vi/register.json | 2 ++ public/language/zh-CN/admin/settings/user.json | 3 +++ public/language/zh-CN/register.json | 2 ++ public/language/zh-TW/admin/settings/user.json | 3 +++ public/language/zh-TW/register.json | 2 ++ 88 files changed, 220 insertions(+) diff --git a/public/language/ar/admin/settings/user.json b/public/language/ar/admin/settings/user.json index b433a32fd2..039da8127d 100644 --- a/public/language/ar/admin/settings/user.json +++ b/public/language/ar/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "لا يوجد تسجيل", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "الحد الأقصى للدعوات لكل عضو", "max-invites": "الحد الأقصى للدعوات لكل عضو", "max-invites-help": "0 لعدم تحديد قيود، الإدارة تحصل على دعوات لامحدودة
هذا الخيار يعمل فقط عند تحديد خيار \"بالدعوات فقط\"", diff --git a/public/language/ar/register.json b/public/language/ar/register.json index 7ff3762781..a28ddf9668 100644 --- a/public/language/ar/register.json +++ b/public/language/ar/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "أوافق على شروط الاستخدام", "terms_of_use_error": "يجب عليك الموافقة على شروط الاستخدام", "registration-added-to-queue": "تمت إضافتك في قائمة الإنتضار. ستتلقى رسالة إلكترونية عند الموافقة على تسجيلك من قبل الإدارة.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "نحتاج إلى بعض المعلومات الإضافية قبل أن نتمكن من إنشاء حسابك.", "interstitial.errors-found": "تعذر علينا إتمام عملية التسجيل:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/bg/admin/settings/user.json b/public/language/bg/admin/settings/user.json index a07cfcdee4..6b2a38b3e8 100644 --- a/public/language/bg/admin/settings/user.json +++ b/public/language/bg/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Без регистриране", "registration-type.help": "Обикновена — Потребителите могат да се регистрират от страницата /register.
\nСамо с покана — Потребителите могат да поканят други от страницата с потребителите.
\nСамо с покана от администратор — Само администратори могат да канят други от страницата с потребителите и от страниците за управление на потребителите.
\nБез регистриране — Потребителите не се регистрират.
", "registration-approval-type.help": "Обикновена — Потребителите се регистрират на момента.
\nОдобрена от администратор — Потребителските регистрации се поставят в опашка за одобрение, която администраторите преглеждат.
\nОдобрена от администратор по IP адрес — Новите потребители се регистрират по обикновения начин, а онези, от чиито IP адрес вече са се регистрирали други акаунти, се нуждаят от одобрението на администратор.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Максимален брой покани на потребител", "max-invites": "Максимален брой покани на потребител", "max-invites-help": "0 = няма ограничение. Администраторите могат да разпращат неограничен брой покани.
Тази стойност се използва, само ако е избран режимът „Само с покана“.", diff --git a/public/language/bg/register.json b/public/language/bg/register.json index f18e04cb9a..4b02d32ed1 100644 --- a/public/language/bg/register.json +++ b/public/language/bg/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Съгласен съм с условията за ползване", "terms_of_use_error": "Трябва да се съгласите с условията за ползване", "registration-added-to-queue": "Вашата регистрация беше добавена в опашката за одобрение. Ще получите е-писмо, когато тя бъде одобрена от администратор.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Нуждаем се от малко допълнителна информация, преди да можем да създадем акаунта Ви.", "interstitial.errors-found": "Не можем да завършим Вашата регистрация:", "gdpr_agree_data": "Съгласявам се това личната ми информация да се съхранява и обработва от този уеб сайт.", diff --git a/public/language/bn/admin/settings/user.json b/public/language/bn/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/bn/admin/settings/user.json +++ b/public/language/bn/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/bn/register.json b/public/language/bn/register.json index 75e8cd31b7..c116f1a313 100644 --- a/public/language/bn/register.json +++ b/public/language/bn/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "আমি নিয়মাবলী মেনে চলতে সম্মতি জানালাম", "terms_of_use_error": "আপনাকে অবশ্যই ব্যাবহার নীতিমালায় সম্মত হতে হবে।", "registration-added-to-queue": "আপনার নিবন্ধনটি এ্যাপ্লুভাল তালিকায় যুক্ত হয়েছে। একজন এডমিনিস্ট্রেটর কর্তৃক নিবন্ধন গৃহীত হলে আপনি একটি মেইল পাবেন। ", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "আপনার একাউন্ট তৈরীর পূর্বে আমাদের আরো কিছু বাড়তি তথ্য জানা প্রয়োজন।", "interstitial.errors-found": "আপনার নিবন্ধনটি সম্পূর্ণ করা সম্ভব হয় নি।", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/cs/admin/settings/user.json b/public/language/cs/admin/settings/user.json index 198c69b296..c429e25611 100644 --- a/public/language/cs/admin/settings/user.json +++ b/public/language/cs/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Bez registrace", "registration-type.help": "Normální - uživatel se může registrovat ze stránky Registrace
\nJen pro pozvané - uživatel může pozvat jiné ze stránkyUživatelé.
♥\nJen pro pozvané správcem - jen správci mohou pozvat jiné ze stránky Uživateléa ze stránky admin/manage/users.
\nBez registrace - žádná registrace uživatelů.
•", "registration-approval-type.help": "Normální - uživatel se může hned registrovat.
\nSchválení správcem - uživatelská registrace je zařazena do fronty pro schválení správcem.
\nSchválení správcem dle IP - pro nové uživatele stav Normální, Schválení správcem pro adresy IP, které již mají účet.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximální počet pozvání na uživatele", "max-invites": "Maximální počet pozvání na uživatele", "max-invites-help": "0 pro neomezené. Správci mají neomezeně pozvánek
Použitelné jen pro „Jen pozvané\"", diff --git a/public/language/cs/register.json b/public/language/cs/register.json index 2175d64a13..e979d71181 100644 --- a/public/language/cs/register.json +++ b/public/language/cs/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Souhlasím s Podmínkami", "terms_of_use_error": "Musíte souhlasit s podmínkami.", "registration-added-to-queue": "Vaše registrace byla přidána do fronty. Obdržíte e-mail až ji správce schválí.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Před vytvořením účtu vyžadujeme některé dodatečné informace.", "interstitial.errors-found": "Nebylo možné dokončit vaší registraci:", "gdpr_agree_data": "Dávám souhlas se sběrem a zpracováním mých osobních údajů na této webové stránce.", diff --git a/public/language/da/admin/settings/user.json b/public/language/da/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/da/admin/settings/user.json +++ b/public/language/da/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/da/register.json b/public/language/da/register.json index 720d580301..efa248d279 100644 --- a/public/language/da/register.json +++ b/public/language/da/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Jeg acceptere betingelserne for brug", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Din registrering er blevet tilføjet til godkendelses køen. Du vil mostage en email når du er blevet accepteret af en administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/de/admin/settings/user.json b/public/language/de/admin/settings/user.json index a359e28796..e28dfe02e3 100644 --- a/public/language/de/admin/settings/user.json +++ b/public/language/de/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Keine Registrierung", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximale Einladungen pro Benutzer", "max-invites": "Maximale Einladungen pro Benutzer", "max-invites-help": "0 für keine Beschränkung. Admins haben keine beschränkung.
Nur praktikabel für \"Nur Einladungen\".", diff --git a/public/language/de/register.json b/public/language/de/register.json index 6e11f0b7a4..bb70e93c89 100644 --- a/public/language/de/register.json +++ b/public/language/de/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Ich stimme den Nutzungsbedingungen zu", "terms_of_use_error": "Du musst den Nutzungsbedingungen zustimmen", "registration-added-to-queue": "Deine Registration wurde abgeschickt. Du wirst eine E-Mail erhalten, sobald sie von einem Administrator akzeptiert wird.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Wir benötigen ein wenig mehr Informationen bevor wir dein Konto erstellen können.", "interstitial.errors-found": "Wir konnten deinen Registrierungsvorgang nicht abschließen:", "gdpr_agree_data": "Ich stimme der Sammlung und Verarbeitung meiner Persönlichen Daten auf dieser Website zu.", diff --git a/public/language/el/admin/settings/user.json b/public/language/el/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/el/admin/settings/user.json +++ b/public/language/el/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/el/register.json b/public/language/el/register.json index e855390b71..9d0d16364b 100644 --- a/public/language/el/register.json +++ b/public/language/el/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Συμφωνώ με τους Όρους Χρήσης", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/en-US/admin/settings/user.json b/public/language/en-US/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/en-US/admin/settings/user.json +++ b/public/language/en-US/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/en-US/register.json b/public/language/en-US/register.json index 3919985750..0de0ff19c9 100644 --- a/public/language/en-US/register.json +++ b/public/language/en-US/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "I agree to the Terms of Use", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/en-x-pirate/admin/settings/user.json b/public/language/en-x-pirate/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/en-x-pirate/admin/settings/user.json +++ b/public/language/en-x-pirate/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/en-x-pirate/register.json b/public/language/en-x-pirate/register.json index 474b308078..4758b0bb2f 100644 --- a/public/language/en-x-pirate/register.json +++ b/public/language/en-x-pirate/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "I agree to the Terms of Use", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/es/admin/settings/user.json b/public/language/es/admin/settings/user.json index d6f491fc78..6d83d02e35 100644 --- a/public/language/es/admin/settings/user.json +++ b/public/language/es/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Sin Registro", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Máximo de Invitaciones por Usuario", "max-invites": "Máximo de Invitaciones por Usuario", "max-invites-help": "0 para no tener restricciones. Los administradores tienen derecho invitaciones infinitas
Solo aplicable a \"Solo con Invitación\"", diff --git a/public/language/es/register.json b/public/language/es/register.json index 00cf39d22a..cf48df7fb5 100644 --- a/public/language/es/register.json +++ b/public/language/es/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Acepto los Términos y Condiciones de uso", "terms_of_use_error": "Debes aceptar los términos de uso", "registration-added-to-queue": "Tu registro se ha añadido a la cola de aprobación,. Recibirás un correo cuando este sea aceptado por un administrador. ", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Se requiere de información adicional antes de crear tu cuenta.", "interstitial.errors-found": "No pudimos completar tu registro:", "gdpr_agree_data": "Consiento la recolección y el procesamiento de mi información personal en este sitio web", diff --git a/public/language/et/admin/settings/user.json b/public/language/et/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/et/admin/settings/user.json +++ b/public/language/et/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/et/register.json b/public/language/et/register.json index 0b7f075e3d..fd7251067a 100644 --- a/public/language/et/register.json +++ b/public/language/et/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Nõustun foorumi reeglitega", "terms_of_use_error": "Sa pead nõustuma Tingimustega", "registration-added-to-queue": "Teie registreerimine vaadatakse üle. Te saate e-kirja kui administraator on aktsepteerinud registreermimise.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Enne kasutaja loomist on meil vaja lisainfot.", "interstitial.errors-found": "Meil ei õnnestunud registreerimist lõpule viia:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/fa-IR/admin/settings/user.json b/public/language/fa-IR/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/fa-IR/admin/settings/user.json +++ b/public/language/fa-IR/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/fa-IR/register.json b/public/language/fa-IR/register.json index 5c5eb963d2..7d73efbb3c 100644 --- a/public/language/fa-IR/register.json +++ b/public/language/fa-IR/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "با شرایط استفاده موافقم", "terms_of_use_error": "شما باید با شرایط انجمن موافقت کنید", "registration-added-to-queue": "ثبت نام شما به صف تایید اضافه شد. وقتی توسط یک مدیر تایید شد شما ایمیلی دریافت خواهید کرد.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "ما نیاز به برخی اطلاعات اضافی شما قبل از ایجاد شناسه کاربری داریم.", "interstitial.errors-found": "شما نمی‌توانید ثبت نام خود را تکمیل کنید:", "gdpr_agree_data": "من با جمع آوری و پرداز اطلاعات شخصی در این وبسایت موافقم.", diff --git a/public/language/fi/admin/settings/user.json b/public/language/fi/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/fi/admin/settings/user.json +++ b/public/language/fi/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/fi/register.json b/public/language/fi/register.json index 4b68b0ad6f..5df5aa7a5d 100644 --- a/public/language/fi/register.json +++ b/public/language/fi/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Hyväksyn käyttöehdot", "terms_of_use_error": "Sinun täytyy hyväksyä sopimusehdot", "registration-added-to-queue": "Rekisteröintisi on lisätty listalle odottamaan hyväksyntää. Saat ilmoituksen sähköpostiisi, kun ylläpitäjä on hyväksynyt rekisteröitymisesin.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Sivusto vaatii lisätietoja ennenkuin voi luoda tunnuksen.", "interstitial.errors-found": "Rekisteröitymisesi keskeytyi", "gdpr_agree_data": "Annan hyväksyntäni henkilökohtaisten tietojen keräämiseen ja prosessointiin tälle verkkosivulle.", diff --git a/public/language/fr/admin/settings/user.json b/public/language/fr/admin/settings/user.json index a14b5e2093..ff5bc099ae 100644 --- a/public/language/fr/admin/settings/user.json +++ b/public/language/fr/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Pas d'inscription", "registration-type.help": "Normal - Les utilisateurs peuvent s'inscrire à partir de la page d'inscription.
\nInvitation uniquement - Les utilisateurs peuvent inviter d'autres personnes à partir de la page des utilisateurs.
\nInvitation administrateur uniquement - Seuls les administrateurs peuvent inviter d'autres personnes à partir des pages des utilisateurs et des pages d'administration.
\nAucune inscription - Aucune inscription d'utilisateur.
", "registration-approval-type.help": "Normal - Les utilisateurs sont enregistrés immédiatement.
\nApprobation de l'administrateur - Les inscriptions des utilisateurs sont placées dans une file d'attente d'approbation pour les administrateurs.
\nApprobation par adresses IP pour les nouveaux utilisateurs, Approbation de l'administrateur pour les adresses IP ayant déjà un compte.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Nombre maximum d'invitations par utilisateur", "max-invites": "Nombre maximum d'invitations par utilisateur", "max-invites-help": "0 pour supprimer cette restriction. Les admins n'ont aucune restriction
Valable uniquement pour \"Uniquement sur invitation\"", diff --git a/public/language/fr/register.json b/public/language/fr/register.json index ed3b0a05e9..53b57f1b6b 100644 --- a/public/language/fr/register.json +++ b/public/language/fr/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "J'accepte les conditions générales d'utilisation", "terms_of_use_error": "Vous devez accepter les conditions générales d'utilisation", "registration-added-to-queue": "Votre inscription a été ajoutée à la liste d'approbation. Vous recevrez un email quand celle-ci sera acceptée par un administrateur.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Nous avons besoin de quelques informations supplémentaires avant de pouvoir créer votre compte.", "interstitial.errors-found": "Nous n'avons pas pu compléter votre inscription :", "gdpr_agree_data": "J'accepte la collecte et le traitement de mes données personnelles sur ce site.", diff --git a/public/language/gl/admin/settings/user.json b/public/language/gl/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/gl/admin/settings/user.json +++ b/public/language/gl/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/gl/register.json b/public/language/gl/register.json index 058dceced1..427c2f1e16 100644 --- a/public/language/gl/register.json +++ b/public/language/gl/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Acepto os Termos e Condicións de Uso", "terms_of_use_error": "Debes acepta-los termos de uso", "registration-added-to-queue": "O teu rexistro foi engadido á cola de aprobación. Recibirás un correo electrónico cando sexa aceptado por un administrador.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Requírese información adicional antes de crea-la túa conta", "interstitial.errors-found": "Non puidemos completa-lo teu rexistro:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/he/admin/settings/user.json b/public/language/he/admin/settings/user.json index 0bda70ec12..b1f8a416ef 100644 --- a/public/language/he/admin/settings/user.json +++ b/public/language/he/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "בטל הרשמה", "registration-type.help": "רגיל - משתמשים יכולים להירשם על ידי שימוש בדף /register.
\nהזמנה בלבד - משתמשים אחרים יכולים להזמין משתמשים מדף המשתמש.
\nהזמנת מנהל בלבד - רק מנהלים יכולים להזמין משתמשים אחרים מדף
המשתמש ודף ההנהלת משתמשים.
\nבטל הרשמה - לא ניתן להירשם.
ד", "registration-approval-type.help": "רגיל - משתמשים נרשמים באופן מיידי.
\nאישור מנהל - משתמשים אשר נרשמו מוכנים לתוך רשימת אישור למנהלים.
\nאישור מנהל לכתובות IP - רגיל למשתמשים חדשים, אישור מנהל לכתובות IP אשר כבר מקושר אליהם חשבון.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "מרב ההזמנות למשתמש", "max-invites": "מרב ההזמנות למשתמש", "max-invites-help": "0 בשביל לבטל הגבלה. מנהלים מקבלים אינסוף הזמנות
תקף רק ל-\"הזמנה בלבד\"", diff --git a/public/language/he/register.json b/public/language/he/register.json index d6c9331a51..5e66599e67 100644 --- a/public/language/he/register.json +++ b/public/language/he/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "אני מסכים לתנאי השימוש", "terms_of_use_error": "אתה מוכרח להסכים לתנאי השימוש", "registration-added-to-queue": "הבקשה שלך להרשמה נשלחה. תקבל בקרוב מייל אישור לכתובת האימייל שהכנסת כשמנהל יאשר את הבקשה.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "אנו דורשים מידע נוסף לפני שנוכל ליצור עבורך את החשבון.", "interstitial.errors-found": "לא הצלחנו להשלים את הרישום שלך:", "gdpr_agree_data": "אני מסכים שפורום זה יאגור ויעבד את נתוני האישיים", diff --git a/public/language/hr/admin/settings/user.json b/public/language/hr/admin/settings/user.json index def91bd53a..04b6be8075 100644 --- a/public/language/hr/admin/settings/user.json +++ b/public/language/hr/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Bez registracije", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maksimalan broj pozivnica po korisniku", "max-invites": "Maksimalan broj pozivnica po korisniku", "max-invites-help": "0 bez restrikcija. Administrator ima neograničeno pozivnica
Primjenjivo samo za \"poziv na forum\"", diff --git a/public/language/hr/register.json b/public/language/hr/register.json index f9cb4d9790..95119842f8 100644 --- a/public/language/hr/register.json +++ b/public/language/hr/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Prihvaćam uvjete korištenja", "terms_of_use_error": "Morate prihvatiti uvjete korištenja", "registration-added-to-queue": "Vaša registracija je dodana u listu zahtjeva za registraciju. Biti ćete obaviješteni kad Vas administrator prihvati.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Treba nam još par dodatnih informacija prije nego kreirate novi račun.", "interstitial.errors-found": "Nismo uspijeli dovršiti registraciju:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/hu/admin/settings/user.json b/public/language/hu/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/hu/admin/settings/user.json +++ b/public/language/hu/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/hu/register.json b/public/language/hu/register.json index 6e7e8d782f..f71cff91ff 100644 --- a/public/language/hu/register.json +++ b/public/language/hu/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Elfogadom a Használati feltételeket", "terms_of_use_error": "El kell fogadnod a Használati feltételeket", "registration-added-to-queue": "A regisztráció jóváhagyásra vár. Kapni fogsz egy e-mailt, amint az adminisztrátor elfogadja.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Szükségünk van még további információkra a profilod létrehozásához.", "interstitial.errors-found": "Nem tudtuk teljesíteni a regisztrációd:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/id/admin/settings/user.json b/public/language/id/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/id/admin/settings/user.json +++ b/public/language/id/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/id/register.json b/public/language/id/register.json index 6ba5f4ee42..dd764a505e 100644 --- a/public/language/id/register.json +++ b/public/language/id/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Saya menyetujui Aturan Penggunaan", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Pendaftaranmu telah ditambahkan dalam daftar persetujuan. Kamu akan menerima email ketika pendaftaranmu disetujui oleh administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/it/admin/settings/user.json b/public/language/it/admin/settings/user.json index 49118ffffc..0125b07722 100644 --- a/public/language/it/admin/settings/user.json +++ b/public/language/it/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Niente registrazione", "registration-type.help": "Normale: gli utenti possono registrarsi dalla pagina/di registrazione.
\nSolo invito: gli utenti possono invitare altri dalla pagina utenti.
\nSolo su invito amministratore: solo gli amministratori possono invitare altri utenti edalle pagine amministratore/gestione/utenti.
\nNessuna registrazione - Nessuna registrazione dell'utente.
", "registration-approval-type.help": "Normale: gli utenti vengono registrati immediatamente.
\nApprovazione amministratore - Le registrazioni degli utenti vengono inserite in una coda di approvazione per amministratori.
\nApprovazione amministratore per IP - Normale per i nuovi utenti, Approvazione amministratore per indirizzi IP che dispongono già di un account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Numero massimo di inviti per Utente", "max-invites": "Numero massimo di inviti per Utente", "max-invites-help": "0 per nessuna restrizione. Gli amministratori ricevono infiniti inviti
Applicabile solo per \"Solo invito\"", diff --git a/public/language/it/register.json b/public/language/it/register.json index b16b6a2758..ca01f1867f 100644 --- a/public/language/it/register.json +++ b/public/language/it/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Accetto i Termini di Utilizzo", "terms_of_use_error": "Devi accettare i Termini d'Utilizzo", "registration-added-to-queue": "La tua registrazione è stata aggiunta alla coda di approvazione. Riceverai un'email quando sarà accettata da un amministratore.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Abbiamo bisogno di alcune informazioni aggiuntive prima di poter creare il tuo account.", "interstitial.errors-found": "Non abbiamo potuto completare la tua registrazione:", "gdpr_agree_data": "Acconsento alla raccolta e al trattamento dei miei dati personali su questo sito web.", diff --git a/public/language/ja/admin/settings/user.json b/public/language/ja/admin/settings/user.json index 9bd19b6e31..c835e07850 100644 --- a/public/language/ja/admin/settings/user.json +++ b/public/language/ja/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "登録なし", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "ユーザーごとの最大招待数", "max-invites": "ユーザーごとの最大招待数", "max-invites-help": "無制限の場合は0です。管理者は無限の招待を受ける
「招待のみ」にのみ適用されます", diff --git a/public/language/ja/register.json b/public/language/ja/register.json index cf89f8d830..68cd186748 100644 --- a/public/language/ja/register.json +++ b/public/language/ja/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "利用規約に同意する", "terms_of_use_error": "あなたは利用規約に同意する必要があります", "registration-added-to-queue": "あなたの登録申請は承認キューに追加されました。管理者によって受け入れられた時に、メールを受信します。", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "私たちは、あなたのアカウント作成においていくつかの情報をお訪ねします。", "interstitial.errors-found": "私達はあなたの登録を完了できませんでした:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/ko/admin/settings/user.json b/public/language/ko/admin/settings/user.json index 0c5ea1b415..ff16182854 100644 --- a/public/language/ko/admin/settings/user.json +++ b/public/language/ko/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "신규 가입 불가", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "최대 가능한 초대 수", "max-invites": "최대 가능한 초대 수", "max-invites-help": "아무런 제한을 두지 않으려면 0. 관리자는 초대 수 에 제한이 없습니다.
\"사용자 초대\" 설정에서만 반영됩니다.", diff --git a/public/language/ko/register.json b/public/language/ko/register.json index dd3f7534ad..a69924499f 100644 --- a/public/language/ko/register.json +++ b/public/language/ko/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "이용약관에 동의합니다.", "terms_of_use_error": "이용약관에 동의하셔야 합니다.", "registration-added-to-queue": "회원가입이 요청되었습니다. 관리자의 승인 후 메일이 발송됩니다.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "계정을 생성하기 전 추가 정보가 더 필요합니다.", "interstitial.errors-found": "회원가입을 완료하지 못했습니다.", "gdpr_agree_data": "나는 이 웹 사이트에서 개인 정보를 수집하고 처리하는데 동의합니다.", diff --git a/public/language/lt/admin/settings/user.json b/public/language/lt/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/lt/admin/settings/user.json +++ b/public/language/lt/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/lt/register.json b/public/language/lt/register.json index 161dc565ff..62fc8ce8ce 100644 --- a/public/language/lt/register.json +++ b/public/language/lt/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Aš sutinku su vartojimo sąlygomis", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Jūsų registracijos prašymas buvo pridėtas į laukiančiųjų sąrašą. Jūs gausite el.paštu laišką kada administratorius patvirtins jus", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/lv/admin/settings/user.json b/public/language/lv/admin/settings/user.json index 854269611a..349ccca807 100644 --- a/public/language/lv/admin/settings/user.json +++ b/public/language/lv/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Nav", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maksimālais uzaicinājumu skaits katram lietotājam", "max-invites": "Maksimālais uzaicinājumu skaits katram lietotājam", "max-invites-help": "Ievadīt 0, lai nebūtu ierobežots. Administratori var vienmēr uzaicināt jaunus lietotājus.
Attiecas tikai uz \"Tikai ar ielūgumu\"", diff --git a/public/language/lv/register.json b/public/language/lv/register.json index 5981b05554..db70ac919a 100644 --- a/public/language/lv/register.json +++ b/public/language/lv/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Es piekrītu lietošanas noteikumiem", "terms_of_use_error": "Tev ir jāpiekrīt lietošanas noteikumiem", "registration-added-to-queue": "Tavs reģistrācijas pieteikums ir ievietots reģistrācijas rindā. Tu saņemsi e-pastu, kad administrators to apstiprinās.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Pirms varam izveidot Tavu kontu, mums ir nepieciešama papildu informācija.", "interstitial.errors-found": "Mēs nevarējām pabeigt Tavu reģistrāciju:", "gdpr_agree_data": "Es piekrītu manas personas informācijas vākšanai un apstrādei šajā vietnē.", diff --git a/public/language/ms/admin/settings/user.json b/public/language/ms/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/ms/admin/settings/user.json +++ b/public/language/ms/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/ms/register.json b/public/language/ms/register.json index cad27aa71a..f44395f0a3 100644 --- a/public/language/ms/register.json +++ b/public/language/ms/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Saya bersetuju dengan Terma Penggunaan", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Pendaftaran anda sedang dimasukkan ke barisan pengesahan. Anda akan menerima emel setelah diterima oleh pentadbir.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/nb/admin/settings/user.json b/public/language/nb/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/nb/register.json b/public/language/nb/register.json index 668d051098..fc0e5518e3 100644 --- a/public/language/nb/register.json +++ b/public/language/nb/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Jeg godtar vilkårene for bruk", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Din registrering har blitt lagt til i godkjenningskøen. Du vil motta en e-post når denne blir akseptert av en administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/nl/admin/settings/user.json b/public/language/nl/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/nl/admin/settings/user.json +++ b/public/language/nl/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/nl/register.json b/public/language/nl/register.json index 43a790a4d6..71a2bc0db5 100644 --- a/public/language/nl/register.json +++ b/public/language/nl/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Ik ga akkoord met de gebruiksvoorwaarden", "terms_of_use_error": "Je moet akkoord gaan met de service voorwaarden.", "registration-added-to-queue": "Het registratieverzoek is toegevoegd aan de wachtrij. Een bericht wordt naar het opgegeven emailadres gestuurd wanneer de registratie is goedgekeurd.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Je hebben meer informatie van je nodig voordat we je account kunnen aanmaken.", "interstitial.errors-found": "Je konden jouw registratie niet afronden.", "gdpr_agree_data": "Ik geef toestemming voor het verzamelen en verwerken van mijn persoonlijke informatie op deze website.", diff --git a/public/language/pl/admin/settings/user.json b/public/language/pl/admin/settings/user.json index e36fb72d5a..27d165d748 100644 --- a/public/language/pl/admin/settings/user.json +++ b/public/language/pl/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Brak rejestracji", "registration-type.help": "Standardowa - Użytkownicy mogą się rejestrować na stronie /register.
\nTylko zaproszenia - Użytkownicy mogą zapraszać innych poprzez stronę users.
\nTylko zaproszenia administratora - Tylko administratorzy mogą zapraszać innych poprzez stronę users oraz admin/manage/users.
\nBrak rejestracji - Brak rejestracji użytkowników.
", "registration-approval-type.help": "Normalny - użytkownicy są rejestrowani natychmiast.
\nZatwierdzenie administratora - rejestracje użytkowników są umieszczane w kolejce zatwierdzania dla administratorów.
\n Kolejka zatwierdzania dla IPs - Normalne dla nowych użytkowników, kolejka zatwierdzania dla adresów IP, które już mają konto.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maksymalnie liczba zaproszeń na użytkownika", "max-invites": "Maksymalnie liczba zaproszeń na użytkownika", "max-invites-help": "0 dla braku ograniczeń. Administratorzy otrzymują nieskończoną liczbę zaproszeń
Aplikowane tylko dla \"Tylko zaproszeni\"", diff --git a/public/language/pl/register.json b/public/language/pl/register.json index 26e505026d..fad5540645 100644 --- a/public/language/pl/register.json +++ b/public/language/pl/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Zgadzam się na powyższe warunki", "terms_of_use_error": "Musisz zaakceptować warunki korzystania z serwisu", "registration-added-to-queue": "Twoja rejestracja została dodana do kolejki oczekujących na akceptację. Otrzymasz e-mail, kiedy zostanie zatwierdzona przez administratora.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Do utworzenia Twojego konta potrzebne są dodatkowe informacje.", "interstitial.errors-found": "Nie mogliśmy ukończyć procesu rejestracji:", "gdpr_agree_data": "Wyrażam zgodę na zbieranie i przetwarzanie moich danych przez tę stronę.", diff --git a/public/language/pt-BR/admin/settings/user.json b/public/language/pt-BR/admin/settings/user.json index 0f68d83c52..3e086e64cd 100644 --- a/public/language/pt-BR/admin/settings/user.json +++ b/public/language/pt-BR/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Desativar registros", "registration-type.help": "Normal - Usuários podem se registrar pela página /register.
\nApenas Convite - Usuários podem convidar outros da página usuários.
\nApenas Convite do Administrador - Apenas administradores podem convidar das páginas de usuários e administração/administrar/usuários .
\nSem registro - Sem registro de usuários.
", "registration-approval-type.help": "Normal - Usuários são registrados imediatamente.
\nAprovação do Admin - Registros de usuários são colocados em uma fila de aprovação por administradores.
\nAprovação do Admin por IPs - Normal para novos usuários, Aprovação do Admin por endereços IPs que já têm uma conta.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Máximo de Convites por Usuário", "max-invites": "Máximo de Convites por Usuário", "max-invites-help": "0 para nenhuma restrição. Administradores têm convites infinitos.
Apenas aplicável para \"Apenas por Convite\".", diff --git a/public/language/pt-BR/register.json b/public/language/pt-BR/register.json index 6363ee283a..40609f5cea 100644 --- a/public/language/pt-BR/register.json +++ b/public/language/pt-BR/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Eu concordo com os Termos de Uso", "terms_of_use_error": "Você deve concordar com os Termos de Uso", "registration-added-to-queue": "O seu cadastro foi adicionado à fila de aprovação. Você receberá um email quando ele for aceito por um administrador.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Precisamos de algumas informações adicionais antes de podermos criar sua conta.", "interstitial.errors-found": "Não foi possível concluir o seu cadastro:", "gdpr_agree_data": "Eu concordo com a coleta e o processamento de minhas informações pessoais neste site.", diff --git a/public/language/pt-PT/admin/settings/user.json b/public/language/pt-PT/admin/settings/user.json index a380cc51d3..d6740f6b3c 100644 --- a/public/language/pt-PT/admin/settings/user.json +++ b/public/language/pt-PT/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Sem registo", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Máximo de Convites por Utilizador", "max-invites": "Máximo de Convites por Utilizador", "max-invites-help": "Usa 0 para nenhuma restrição. Administradores têm convites infinitos.
Apenas aplicável quando selecionado \"Apenas por Convite\"", diff --git a/public/language/pt-PT/register.json b/public/language/pt-PT/register.json index d751416bb0..6ee0d02945 100644 --- a/public/language/pt-PT/register.json +++ b/public/language/pt-PT/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Eu aceito os Termos de Utilização", "terms_of_use_error": "Deves aceitar os Termos de Utilização", "registration-added-to-queue": "O teu registo foi adicionado à fila de aprovação. Receberás um e-mail quando fores aceite por um administrador.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Requeremos informação adicional antes de criarmos a tua conta.", "interstitial.errors-found": "Não pudemos completar o teu registro:", "gdpr_agree_data": "Autorizo a recolha e o processamento das minhas informações pessoais neste website.", diff --git a/public/language/ro/admin/settings/user.json b/public/language/ro/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/ro/admin/settings/user.json +++ b/public/language/ro/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/ro/register.json b/public/language/ro/register.json index ca1ed4eac4..d7ed0050ed 100644 --- a/public/language/ro/register.json +++ b/public/language/ro/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Sunt de acord cu termenii de utilizare", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/ru/admin/settings/user.json b/public/language/ru/admin/settings/user.json index 5fb984be8c..00f31c0d11 100644 --- a/public/language/ru/admin/settings/user.json +++ b/public/language/ru/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Регистрация отключена", "registration-type.help": "Обычный – пользователи могут регистрироваться без ограничений.
\nТолько по приглашениям – существующие пользователи могут приглашать других участников
\nТолько по приглашению администратора – только администратор может приглашать пользователей на странице Пользователи или в панели администратора.
\nРегистрация отключена – пользователи не могут регистрироваться.
", "registration-approval-type.help": "Обычный – регистрация подтверждается автоматически.
\nПодтверждается администратором – заявки на регистрацию помещаются в очередь на одобрение.
\nПодтверждается администратором для известных IP-адресов – новые пользователи регистрируются как обычно, но если заявка поступает с такого же IP, как у существующего пользователя, требуется подтверждение администратора.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Макс. приглашений у пользователя", "max-invites": "Макс. приглашений у пользователя", "max-invites-help": "0 – без ограничений. Администраторы в любом случае могут приглашать бесконечно
Эта настройка действует только в режиме регистрации только по приглашениям.", diff --git a/public/language/ru/register.json b/public/language/ru/register.json index 8e8d3c0ea7..c929e75b68 100644 --- a/public/language/ru/register.json +++ b/public/language/ru/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Я соглашаюсь с условиями", "terms_of_use_error": "Для регистрации на нашем сайте необходимо согласиться с условиями", "registration-added-to-queue": "Ваша регистрация была добавлена в очередь на утверждение. Вы получите уведомление по электронной почте, когда она будет одобрена администратором.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Нам потребуется дополнительная информация, прежде чем мы сможем создать вашу учётную запись.", "interstitial.errors-found": "Мы не смогли завершить регистрацию:", "gdpr_agree_data": "Я соглашаюсь на сбор и обработку моей личной информации на этом веб-сайте.", diff --git a/public/language/rw/admin/settings/user.json b/public/language/rw/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/rw/admin/settings/user.json +++ b/public/language/rw/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/rw/register.json b/public/language/rw/register.json index f8c4d9aaa8..70a7f949f6 100644 --- a/public/language/rw/register.json +++ b/public/language/rw/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Nzakurikiza Amategeko n'Amabwiriza", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Icyifuzo cy'iyandikwa ryawe cyakiriwe ariko gitegereje isuzuma. Uzabimenyeshwa biciye muri email niba ubuyobozi bwakwemereye kwandikwa. ", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/sc/admin/settings/user.json b/public/language/sc/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/sc/admin/settings/user.json +++ b/public/language/sc/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/sc/register.json b/public/language/sc/register.json index ace93cd271..aae9890c96 100644 --- a/public/language/sc/register.json +++ b/public/language/sc/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "So de acòrdiu cun is Tèrmines de Impreu", "terms_of_use_error": "You must agree to the Terms of Use", "registration-added-to-queue": "Your registration has been added to the approval queue. You will receive an email when it is accepted by an administrator.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "We require some additional information before we can create your account.", "interstitial.errors-found": "We could not complete your registration:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/sk/admin/settings/user.json b/public/language/sk/admin/settings/user.json index 5450ec2d0d..f385d63e1d 100644 --- a/public/language/sk/admin/settings/user.json +++ b/public/language/sk/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Bez registrácie", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximálny počet pozvánok na používateľa", "max-invites": "Maximálny počet pozvánok na používateľa", "max-invites-help": "0 pre neobmedzené. Správcovia majú neobmedzene pozvánky
Použiteľné iba pre „Iba pozvané“", diff --git a/public/language/sk/register.json b/public/language/sk/register.json index 037360252c..69d7e7c682 100644 --- a/public/language/sk/register.json +++ b/public/language/sk/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Súhlasím s podmienkami používania", "terms_of_use_error": "Musíte súhlasiť s podmienkami použitia", "registration-added-to-queue": "Vaša registrácia bola pridaná do fronty na schválenie. Obdržíte e-mail, keď Vaša registrácia bude prijatá správcom.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Pred vytvorením účtu požadujeme nejaké dodatočné informácie.", "interstitial.errors-found": "Nepodarilo sa nám dokončiť Vašu registráciu:", "gdpr_agree_data": "Dávam súhlas so zberom a spracovaním mojich osobných údajov na tejto webovej stránke.", diff --git a/public/language/sl/admin/settings/user.json b/public/language/sl/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/sl/admin/settings/user.json +++ b/public/language/sl/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/sl/register.json b/public/language/sl/register.json index f0d67e5400..d4e73e470b 100644 --- a/public/language/sl/register.json +++ b/public/language/sl/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Strinjam se s pogoji uporabe.", "terms_of_use_error": "S pogoji uporabe se morate strinjati.", "registration-added-to-queue": "Registracija uporabniškega profila poteka. Ob potrditvi skrbnika boste v svoj e-poštni predal prejeli sporočilo.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Preden ustvarimo vaš račun, potrebujemo nekaj dodatnih informacij.", "interstitial.errors-found": "Vaše registracije ne moremo dokončati:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/sr/admin/settings/user.json b/public/language/sr/admin/settings/user.json index f6f4be69d3..c82278042d 100644 --- a/public/language/sr/admin/settings/user.json +++ b/public/language/sr/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Nema registracije", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maksimum poziva po korisniku.", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 za bez restrikcija. Administratori dobijaju bezgranično pozivnica
Samo određeni za \"Samo pozivnica\"", diff --git a/public/language/sr/register.json b/public/language/sr/register.json index e02ca02353..3097047e98 100644 --- a/public/language/sr/register.json +++ b/public/language/sr/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Слажем се са условима коришћења", "terms_of_use_error": "Морате се сложити са условима коришћења", "registration-added-to-queue": "Ваша регистрација је додата у ред одобравања. Добићете е-пошту када администратор прихвати вашу регистрацију.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Захтевамо неке додатне информације пре него што отворимо ваш налог.", "interstitial.errors-found": "Нисмо могли комплетирати вашу регистрацију:", "gdpr_agree_data": "Пристајем на прикупљање и обраду мојих личних података на овој веб страници.", diff --git a/public/language/sv/admin/settings/user.json b/public/language/sv/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/sv/admin/settings/user.json +++ b/public/language/sv/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/sv/register.json b/public/language/sv/register.json index 1bca6a1d27..081513e301 100644 --- a/public/language/sv/register.json +++ b/public/language/sv/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Jag godkänner användarvillkoren", "terms_of_use_error": "Du måste godkänna användarvillkoren", "registration-added-to-queue": "Din registrering har lagts till i kön. Du kommer att få ett mail när den accepteras av en administratör.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Vi behöver ytterligare information innan vi kan skapa ditt konto.", "interstitial.errors-found": "Vi kunde inte slutföra din registrering:", "gdpr_agree_data": "Jag ger detta forum mitt medgivande att samla in och behandla min personliga information.", diff --git a/public/language/th/admin/settings/user.json b/public/language/th/admin/settings/user.json index 9933184b3b..df281c730a 100644 --- a/public/language/th/admin/settings/user.json +++ b/public/language/th/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/th/register.json b/public/language/th/register.json index 16058d7f7e..7aad308962 100644 --- a/public/language/th/register.json +++ b/public/language/th/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "ยอมรับข้อตกลงในการใช้งาน", "terms_of_use_error": "คุณต้องยอมรับเงื่อนไขการใช้งานก่อน", "registration-added-to-queue": "การสมัครใช้งานของถูกเพิ่มเข้าไปยังระบบเพิ่อรอการอนุมัติแล้ว คุณจะได้รับอีเมล์เมื่อการสมัครใช้งานของคุณถูกยอมรับโดยผู้ดูแลระบบหรือแอดมิน", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "เราต้องการข้อมูลบางอย่างเพิ่มเติมก่อนที่เราจะสร้างบัญชีให้คุณ", "interstitial.errors-found": "เราไม่สามารถทำให้การสมัครสมาชิกของคุณสำเร็จได้:", "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", diff --git a/public/language/tr/admin/settings/user.json b/public/language/tr/admin/settings/user.json index 3fc9d65a9c..8d2725c6d1 100644 --- a/public/language/tr/admin/settings/user.json +++ b/public/language/tr/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Kayıt yok", "registration-type.help": "Normal - Kullanıcılar, kayıt sayfasından kayıt olabililrler
\nDavetiye İle - Kullanıcılar, başkalarını users sayfasından davet edebilirler.
\nYönetici Davetiyesi İle - Sadece yöneticiler başkalarını users sayfasından ve admin/manage/users sayfasından davet edebilir.
\nKayıt Yok - Yeni üye kaydı kapalı
", "registration-approval-type.help": "Normal - Kullanıcılar hemen kaydolur.
\nYönetici Onayı - Kullanıcı kayıtları, yöneticiler tarafından onaylansın diyeapproval queue sırasına konulur.
\nIP için Yönetici Onayı - Yeni Kullanıcılar için Normal Üyelik; hali hazırda kayıtlı olan IP adresleri için Yönetici Onayı
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Kullanıcı Başına Maksimum Davetiye", "max-invites": "Kullanıcı Başına Maksimum Davetiye", "max-invites-help": "Kısıtlama olmaması için 0. Yöneticiler sınırsız davetiyeye sahiptir
\"Yalnızca Davet\" seçeneği için geçerlidir", diff --git a/public/language/tr/register.json b/public/language/tr/register.json index a032e83a39..6d2abcb98c 100644 --- a/public/language/tr/register.json +++ b/public/language/tr/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Kullanım Şartlarını Kabul Ediyorum", "terms_of_use_error": "Kullanım Şartlarını Kabul Etmeniz Gerekiyor", "registration-added-to-queue": "Kayıt olma isteğiniz kabul listesine eklenmiştir. Yönetici tarafından kabul edildiğinizde e-posta alacaksınız.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Hesabınızı yaratmadan önce bazı ekstra bilgiler gerekiyor.", "interstitial.errors-found": "Kaydınız tamamlanamadı:", "gdpr_agree_data": "Bu web sitesinde kişisel bilgilerimin toplanmasını ve işlenmesini kabul ediyorum.", diff --git a/public/language/uk/admin/settings/user.json b/public/language/uk/admin/settings/user.json index a4d69987fd..83c7b7c00c 100644 --- a/public/language/uk/admin/settings/user.json +++ b/public/language/uk/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "Без реєстрації", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Кількість запрошень на користувача", "max-invites": "Кількість запрошень на користувача", "max-invites-help": "0 — без обмежень. Адміни отримуют необмежену кількість.
Працює лише з типом реєстрації \"По запрошенню\".", diff --git a/public/language/uk/register.json b/public/language/uk/register.json index 14a7b4e355..7f2b443c1d 100644 --- a/public/language/uk/register.json +++ b/public/language/uk/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Я погоджуюсь з Умовами користування", "terms_of_use_error": "Ви маєте погодитись з Умовами користування", "registration-added-to-queue": "Ваша реєстрація була додана в чергу затвердження. Ви отримаєте листа на електронну пошту, коли адміністратор її підтвердить.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Нам потрібна додаткова інформація, перш ніж ми створимо ваш обліковий запис.", "interstitial.errors-found": "Нам не вдалося вас зареєструвати:", "gdpr_agree_data": "Я надаю згоду на збір та обробку моїх особистих даних на цьому веб-сайті.", diff --git a/public/language/vi/admin/settings/user.json b/public/language/vi/admin/settings/user.json index b94dc98870..88f00aefc8 100644 --- a/public/language/vi/admin/settings/user.json +++ b/public/language/vi/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "No registration", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", diff --git a/public/language/vi/register.json b/public/language/vi/register.json index 67bbb6e0e0..9413ed9a4e 100644 --- a/public/language/vi/register.json +++ b/public/language/vi/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "Tôi đồng ý với các điều khoản sử dụng", "terms_of_use_error": "Bạn phải đồng ý với các điều khoản sử dụng", "registration-added-to-queue": "Yêu cầu đăng ký của bạn đang chờ được chấp thuận. Bạn sẽ nhận được email khi tài khoản của bạn đã được chấp thuận bởi quản trị viên.", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "Chúng tôi cần thêm một số thông tin trước khi bạn có thể tạo tài khoản.", "interstitial.errors-found": "Chúng tôi không thể hoàn thành đăng ký của bạn:", "gdpr_agree_data": "Tôi đồng ý với việc thu thập và xử lý thông tin cá nhân của tôi trên trang web này.", diff --git a/public/language/zh-CN/admin/settings/user.json b/public/language/zh-CN/admin/settings/user.json index 018ee60036..0accebb62b 100644 --- a/public/language/zh-CN/admin/settings/user.json +++ b/public/language/zh-CN/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "禁止注册", "registration-type.help": "通常 - 用户可以通过 /register页面注册
\n管理员批准 - 用户注册请求会被放入 请求队列待管理员批准。
\n邀请制 - 用户可以通过 用户 页面邀请其它用户。\n管理员邀请制 - 只有管理员可以通过 用户admin/manage/users 页面邀请其它用户。
\n无注册 - 不开放用户注册。
", "registration-approval-type.help": "通常 - 用户可以通过/register页面注册
\n管理员批准 - 用户注册请求会被放入 请求队列 待管理员批准。
\n管理员批准 IP地址 - 新用户不受影响,已存在账号的IP地址注册需要管理员批准。
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "每个用户最大邀请数", "max-invites": "每个用户最大邀请数", "max-invites-help": "无限制填 0 。管理员没有邀请限制
仅在邀请制时可用", diff --git a/public/language/zh-CN/register.json b/public/language/zh-CN/register.json index e3a048661a..45d711f669 100644 --- a/public/language/zh-CN/register.json +++ b/public/language/zh-CN/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "我同意使用条款", "terms_of_use_error": "您必须同意使用条款", "registration-added-to-queue": "您的注册正在等待批准。一旦通过,管理员会发送邮件通知您。", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "在创建您的账户前我们需要一些额外信息。", "interstitial.errors-found": "我们无法完成您的注册:", "gdpr_agree_data": "我同意此网站对我个人信息的收集与处理。", diff --git a/public/language/zh-TW/admin/settings/user.json b/public/language/zh-TW/admin/settings/user.json index 173d7f6e5d..bc25b20dde 100644 --- a/public/language/zh-TW/admin/settings/user.json +++ b/public/language/zh-TW/admin/settings/user.json @@ -43,6 +43,9 @@ "registration-type.disabled": "停用註冊", "registration-type.help": "一般 - 使用者可以通過 /register頁面註冊
\n管理員批准 - 使用者註冊請求會被放入 請求佇列待管理員批准。
\n邀請制 - 使用者可以通過 使用者 頁面邀請其他使用者。\n管理員邀請制 - 只有管理員可以通過 使用者admin/manage/users 頁面邀請其他使用者。
\n停用註冊 - 不開放用戶註冊。
", "registration-approval-type.help": "通常 - 用戶可以通過/register頁面註冊
\n管理員批准 - 用戶註冊請求會被放入 請求隊列 待管理員批准。
\n管理員批准 IP地址 - 新用戶不受影響,已存在賬號的IP地址註冊需要管理員批准。
", + "registration-queue-auto-approve-time": "Automatic Approval Time", + "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-queue-show-average-time": "Show users average time it takes to approve a new user", "registration.max-invites": "每個使用者最大邀請數", "max-invites": "每個使用者最大邀請數", "max-invites-help": "無限制填 0 。管理員沒有邀請限制
僅在邀請制時可用", diff --git a/public/language/zh-TW/register.json b/public/language/zh-TW/register.json index 67d7cd198e..7e1aa8da12 100644 --- a/public/language/zh-TW/register.json +++ b/public/language/zh-TW/register.json @@ -18,6 +18,8 @@ "agree_to_terms_of_use": "我同意使用條款", "terms_of_use_error": "您必須同意使用條款", "registration-added-to-queue": "您的註冊正在等待批准。一旦通過,管理員會發送郵件通知您。", + "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", + "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", "interstitial.intro": "在建立您的帳戶前我們需要一些額外資訊。", "interstitial.errors-found": "我們無法完成您的註冊:", "gdpr_agree_data": "我同意此網站對我個人資料的收集與處理。", From 5f5f0edb8103b53e58c3ac14faff59a2d6b6ae59 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 13 Nov 2020 12:23:40 +0000 Subject: [PATCH 11/67] chore(deps): update dependency smtp-server to v3.8.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 9c372ee3fa..e7d0619356 100644 --- a/install/package.json +++ b/install/package.json @@ -168,7 +168,7 @@ "mocha": "8.2.1", "mocha-lcov-reporter": "1.3.0", "nyc": "15.1.0", - "smtp-server": "3.7.0" + "smtp-server": "3.8.0" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" From eab27f237fdc2520f9cfc687fee0dfdd3fb9a046 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Nov 2020 11:34:14 -0500 Subject: [PATCH 12/67] fix(deps): update dependency nodebb-plugin-spam-be-gone to v0.7.4 (#8874) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e7d0619356..024017dc85 100644 --- a/install/package.json +++ b/install/package.json @@ -100,7 +100,7 @@ "nodebb-plugin-markdown": "8.12.1", "nodebb-plugin-mentions": "2.13.4", "nodebb-plugin-soundpack-default": "1.0.0", - "nodebb-plugin-spam-be-gone": "0.7.3", + "nodebb-plugin-spam-be-gone": "0.7.4", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", "nodebb-theme-persona": "10.2.67", From 48e8252099b977aa9b35d448a0ed9d927ff05ab6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Nov 2020 13:13:24 -0500 Subject: [PATCH 13/67] fix(deps): update dependency nodebb-plugin-spam-be-gone to v0.7.5 (#8876) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 024017dc85..f47293960c 100644 --- a/install/package.json +++ b/install/package.json @@ -100,7 +100,7 @@ "nodebb-plugin-markdown": "8.12.1", "nodebb-plugin-mentions": "2.13.4", "nodebb-plugin-soundpack-default": "1.0.0", - "nodebb-plugin-spam-be-gone": "0.7.4", + "nodebb-plugin-spam-be-gone": "0.7.5", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", "nodebb-theme-persona": "10.2.67", From 45922faebc9d3d213fa78ec41df6ed61c83a2e6c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Nov 2020 14:02:18 -0500 Subject: [PATCH 14/67] fix(deps): update dependency nodebb-plugin-spam-be-gone to v0.7.6 (#8877) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f47293960c..85f85a2218 100644 --- a/install/package.json +++ b/install/package.json @@ -100,7 +100,7 @@ "nodebb-plugin-markdown": "8.12.1", "nodebb-plugin-mentions": "2.13.4", "nodebb-plugin-soundpack-default": "1.0.0", - "nodebb-plugin-spam-be-gone": "0.7.5", + "nodebb-plugin-spam-be-gone": "0.7.6", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", "nodebb-theme-persona": "10.2.67", From 8518404e226994994073feb5ad806bcb93b7ae1b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 13 Nov 2020 14:15:37 -0500 Subject: [PATCH 15/67] feat: allow groups to specify which cids to show member posts from (#8875) * feat: allow groups to specify which cids to show member posts from * docs: fix tests for openapi * fix: test breakage caused by improper conditional * feat: server-side checking of memberPostCids for validity * feat: admin panel template update to select categories to include * refactor: privilege helpers.isUserAllowedTo ... to helpers.isAllowedTo, allowing group names to be passed in --- public/language/en-GB/groups.json | 2 + .../components/schemas/GroupObject.yaml | 38 +++++++++++- public/openapi/read/admin/manage/groups.yaml | 5 ++ public/openapi/read/groups.yaml | 5 ++ public/openapi/write/groups.yaml | 5 ++ public/src/admin/manage/group.js | 1 + src/groups/data.js | 1 + src/groups/index.js | 8 ++- src/groups/posts.js | 5 ++ src/groups/update.js | 12 +++- src/plugins/hooks.js | 2 +- src/privileges/admin.js | 4 +- src/privileges/categories.js | 8 +-- src/privileges/global.js | 4 +- src/privileges/helpers.js | 62 +++++++++++++++---- src/privileges/posts.js | 10 +-- src/privileges/topics.js | 4 +- src/privileges/users.js | 2 +- src/views/admin/manage/group.tpl | 16 +++++ 19 files changed, 159 insertions(+), 35 deletions(-) diff --git a/public/language/en-GB/groups.json b/public/language/en-GB/groups.json index d165c4a71b..0256067933 100644 --- a/public/language/en-GB/groups.json +++ b/public/language/en-GB/groups.json @@ -40,6 +40,8 @@ "details.member_count": "Member Count", "details.creation_date": "Creation Date", "details.description": "Description", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/openapi/components/schemas/GroupObject.yaml b/public/openapi/components/schemas/GroupObject.yaml index e9802cdf7e..dbef43abc3 100644 --- a/public/openapi/components/schemas/GroupObject.yaml +++ b/public/openapi/components/schemas/GroupObject.yaml @@ -42,6 +42,11 @@ GroupFullObject: textColor: type: string description: A six-character hexadecimal colour code + memberPostCids: + type: array + items: + type: number + example: [1, 2, 3] icon: type: string description: A FontAwesome icon string @@ -56,6 +61,32 @@ GroupFullObject: type: string descriptionParsed: type: string + categories: + type: array + items: + type: object + properties: + cid: + type: number + description: A category identifier + name: + type: string + level: + type: string + icon: + type: string + parentCid: + type: number + description: The category identifier for the category that is the immediate + ancestor of the current category + color: + type: string + bgColor: + type: string + selected: + type: boolean + imageClass: + type: string members: type: array items: @@ -130,4 +161,9 @@ GroupDataObject: type: string description: "`createtime` rendered as an ISO 8601 format" cover:position: - type: string \ No newline at end of file + type: string + memberPostCids: + type: array + items: + type: number + example: [1, 2, 3] \ No newline at end of file diff --git a/public/openapi/read/admin/manage/groups.yaml b/public/openapi/read/admin/manage/groups.yaml index 649147348c..7b7ae1db46 100644 --- a/public/openapi/read/admin/manage/groups.yaml +++ b/public/openapi/read/admin/manage/groups.yaml @@ -64,6 +64,11 @@ get: type: string ownerUid: type: number + memberPostCids: + type: array + items: + type: number + example: [1, 2, 3] required: - name - description diff --git a/public/openapi/read/groups.yaml b/public/openapi/read/groups.yaml index 90a8c31d1d..a73b29864f 100644 --- a/public/openapi/read/groups.yaml +++ b/public/openapi/read/groups.yaml @@ -58,6 +58,11 @@ get: type: string cover:position: type: string + memberPostCids: + type: array + items: + type: number + example: [1, 2, 3] members: type: array items: diff --git a/public/openapi/write/groups.yaml b/public/openapi/write/groups.yaml index 8ae4d703f8..8d325c758e 100644 --- a/public/openapi/write/groups.yaml +++ b/public/openapi/write/groups.yaml @@ -37,6 +37,11 @@ post: enum: [0, 1] createtime: type: number + memberPostCids: + type: array + items: + type: number + example: [1, 2, 3] required: - name responses: diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index 0d2ff00403..a64a8d88c5 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -80,6 +80,7 @@ define('admin/manage/group', [ userTitleEnabled: $('#group-userTitleEnabled').is(':checked'), private: $('#group-private').is(':checked'), hidden: $('#group-hidden').is(':checked'), + memberPostCids: $('#memberPostCids').val(), disableJoinRequests: $('#group-disableJoinRequests').is(':checked'), disableLeave: $('#group-disableLeave').is(':checked'), }, diff --git a/src/groups/data.js b/src/groups/data.js index c866902b4c..6747fc0078 100644 --- a/src/groups/data.js +++ b/src/groups/data.js @@ -75,6 +75,7 @@ function modifyGroup(group, fields) { group.icon = validator.escape(String(group.icon || '')); group.createtimeISO = utils.toISOString(group.createtime); group.private = ([null, undefined].includes(group.private)) ? 1 : group.private; + group.memberPostCids = (group.memberPostCids || '').split(',').map(cid => parseInt(cid, 10)).filter(Boolean); group['cover:thumb:url'] = group['cover:thumb:url'] || group['cover:url']; diff --git a/src/groups/index.js b/src/groups/index.js index 4140e558f9..732f415e6b 100644 --- a/src/groups/index.js +++ b/src/groups/index.js @@ -1,6 +1,7 @@ 'use strict'; const user = require('../user'); +const categories = require('../categories'); const db = require('../database'); const plugins = require('../plugins'); const slugify = require('../slugify'); @@ -119,9 +120,10 @@ Groups.get = async function (groupName, options) { stop = (parseInt(options.userListCount, 10) || 4) - 1; } - const [groupData, members, pending, invited, isMember, isPending, isInvited, isOwner] = await Promise.all([ + const [groupData, members, selectCategories, pending, invited, isMember, isPending, isInvited, isOwner] = await Promise.all([ Groups.getGroupData(groupName), Groups.getOwnersAndMembers(groupName, options.uid, 0, stop), + categories.buildForSelect(groupName, 'topics:read', []), Groups.getUsersFromSet('group:' + groupName + ':pending', ['username', 'userslug', 'picture']), Groups.getUsersFromSet('group:' + groupName + ':invited', ['username', 'userslug', 'picture']), Groups.isMember(options.uid, groupName), @@ -135,6 +137,10 @@ Groups.get = async function (groupName, options) { } const descriptionParsed = await plugins.fireHook('filter:parse.raw', groupData.description); groupData.descriptionParsed = descriptionParsed; + groupData.categories = selectCategories.map((category) => { + category.selected = groupData.memberPostCids.includes(category.cid); + return category; + }); groupData.members = members; groupData.membersNextStart = stop + 1; groupData.pending = pending.filter(Boolean); diff --git a/src/groups/posts.js b/src/groups/posts.js index a96cd9e217..465f060b4b 100644 --- a/src/groups/posts.js +++ b/src/groups/posts.js @@ -1,6 +1,7 @@ 'use strict'; const db = require('../database'); +const groups = require('.'); const privileges = require('../privileges'); const posts = require('../posts'); @@ -13,6 +14,10 @@ module.exports = function (Groups) { let groupNames = await Groups.getUserGroupMembership('groups:visible:createtime', [postData.uid]); groupNames = groupNames[0]; + // Only process those groups that have the cid in its memberPostCids setting (or no setting at all) + const groupsCids = await groups.getGroupsFields(groupNames, ['memberPostCids']); + groupNames = groupNames.filter((groupName, idx) => !groupsCids[idx].memberPostCids.length || groupsCids[idx].memberPostCids.includes(postData.cid)); + const keys = groupNames.map(groupName => 'group:' + groupName + ':member:pids'); await db.sortedSetsAdd(keys, postData.timestamp, postData.pid); await Promise.all(groupNames.map(name => truncateMemberPosts(name))); diff --git a/src/groups/update.js b/src/groups/update.js index eb477944c5..50027fc9bd 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -2,6 +2,7 @@ const winston = require('winston'); +const categories = require('../categories'); const plugins = require('../plugins'); const slugify = require('../slugify'); const db = require('../database'); @@ -18,11 +19,10 @@ module.exports = function (Groups) { throw new Error('[[error:no-group]]'); } - const result = await plugins.fireHook('filter:group.update', { + ({ values } = await plugins.fireHook('filter:group.update', { groupName: groupName, values: values, - }); - values = result.values; + })); const payload = { description: values.description || '', @@ -66,6 +66,12 @@ module.exports = function (Groups) { if (values.hasOwnProperty('hidden')) { await updateVisibility(groupName, values.hidden); } + + if (values.hasOwnProperty('memberPostCids')) { + const validCids = await categories.getCidsByPrivilege('categories:cid', groupName, 'topics:read'); + payload.memberPostCids = values.memberPostCids.filter(cid => validCids.includes(cid)).join(',') || ''; + } + await db.setObject('group:' + groupName, payload); await Groups.renameGroup(groupName, values.name); diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index 529cc8059d..6ce56fd988 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -6,7 +6,7 @@ const utils = require('../utils'); module.exports = function (Plugins) { Plugins.deprecatedHooks = { - + 'filter:privileges:isUserAllowedTo': 'filter:privileges:isAllowedTo', }; Plugins.internals = { diff --git a/src/privileges/admin.js b/src/privileges/admin.js index dc8ad7e343..305ea98fde 100644 --- a/src/privileges/admin.js +++ b/src/privileges/admin.js @@ -144,7 +144,7 @@ module.exports = function (privileges) { privileges.admin.get = async function (uid) { const [userPrivileges, isAdministrator] = await Promise.all([ - helpers.isUserAllowedTo(privileges.admin.userPrivilegeList, uid, 0), + helpers.isAllowedTo(privileges.admin.userPrivilegeList, uid, 0), user.isAdministrator(uid), ]); @@ -157,7 +157,7 @@ module.exports = function (privileges) { privileges.admin.can = async function (privilege, uid) { const [isUserAllowedTo, isAdministrator] = await Promise.all([ - helpers.isUserAllowedTo(privilege, uid, [0]), + helpers.isAllowedTo(privilege, uid, [0]), user.isAdministrator(uid), ]); return isAdministrator || isUserAllowedTo[0]; diff --git a/src/privileges/categories.js b/src/privileges/categories.js index d1c867e27e..b915f289da 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -46,7 +46,7 @@ module.exports = function (privileges) { const privs = ['topics:create', 'topics:read', 'topics:tag', 'read']; const [userPrivileges, isAdministrator, isModerator] = await Promise.all([ - helpers.isUserAllowedTo(privs, uid, cid), + helpers.isAllowedTo(privs, uid, cid), user.isAdministrator(uid), user.isModerator(uid, cid), ]); @@ -80,7 +80,7 @@ module.exports = function (privileges) { if (!cid) { return false; } - const results = await helpers.isUserAllowedTo(privilege, uid, Array.isArray(cid) ? cid : [cid]); + const results = await helpers.isAllowedTo(privilege, uid, Array.isArray(cid) ? cid : [cid]); if (Array.isArray(results) && results.length) { return Array.isArray(cid) ? results : results[0]; @@ -113,8 +113,8 @@ module.exports = function (privileges) { privileges.categories.getBase = async function (privilege, cids, uid) { return await utils.promiseParallel({ categories: categories.getCategoriesFields(cids, ['disabled']), - allowedTo: helpers.isUserAllowedTo(privilege, uid, cids), - view_deleted: helpers.isUserAllowedTo('posts:view_deleted', uid, cids), + allowedTo: helpers.isAllowedTo(privilege, uid, cids), + view_deleted: helpers.isAllowedTo('posts:view_deleted', uid, cids), isAdmin: user.isAdministrator(uid), }); }; diff --git a/src/privileges/global.js b/src/privileges/global.js index 7c1f3f7dcd..8a11e8a71a 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -75,7 +75,7 @@ module.exports = function (privileges) { privileges.global.get = async function (uid) { const [userPrivileges, isAdministrator] = await Promise.all([ - helpers.isUserAllowedTo(privileges.global.userPrivilegeList, uid, 0), + helpers.isAllowedTo(privileges.global.userPrivilegeList, uid, 0), user.isAdministrator(uid), ]); @@ -88,7 +88,7 @@ module.exports = function (privileges) { privileges.global.can = async function (privilege, uid) { const [isAdministrator, isUserAllowedTo] = await Promise.all([ user.isAdministrator(uid), - helpers.isUserAllowedTo(privilege, uid, [0]), + helpers.isAllowedTo(privilege, uid, [0]), ]); return isAdministrator || isUserAllowedTo[0]; }; diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js index 9d1fb78e61..01bd609ece 100644 --- a/src/privileges/helpers.js +++ b/src/privileges/helpers.js @@ -26,26 +26,45 @@ helpers.isUsersAllowedTo = async function (privilege, uids, cid) { return result.allowed; }; -helpers.isUserAllowedTo = async function (privilege, uid, cid) { +helpers.isAllowedTo = async function (privilege, uidOrGroupName, cid) { let allowed; if (Array.isArray(privilege) && !Array.isArray(cid)) { - allowed = await isUserAllowedToPrivileges(privilege, uid, cid); + allowed = await isAllowedToPrivileges(privilege, uidOrGroupName, cid); } else if (Array.isArray(cid) && !Array.isArray(privilege)) { - allowed = await isUserAllowedToCids(privilege, uid, cid); + allowed = await isAllowedToCids(privilege, uidOrGroupName, cid); } if (allowed) { - const result = await plugins.fireHook('filter:privileges:isUserAllowedTo', { allowed: allowed, privilege: privilege, uid: uid, cid: cid }); - return result.allowed; + ({ allowed } = await plugins.fireHook('filter:privileges:isUserAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid })); + ({ allowed } = await plugins.fireHook('filter:privileges:isAllowedTo', { allowed: allowed, privilege: privilege, uid: uidOrGroupName, cid: cid })); + return allowed; } throw new Error('[[error:invalid-data]]'); }; -async function isUserAllowedToCids(privilege, uid, cids) { +async function isAllowedToCids(privilege, uidOrGroupName, cids) { if (!privilege) { return cids.map(() => false); } - if (parseInt(uid, 10) <= 0) { - return await isSystemGroupAllowedToCids(privilege, uid, cids); + + // Group handling + if (isNaN(parseInt(uidOrGroupName, 10)) && (uidOrGroupName || '').length) { + const groupKeys = []; + cids.forEach(function (cid) { + groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); + }); + const sets = await Promise.all([ + groups.isMemberOfGroups(uidOrGroupName, groupKeys), + groups.isMemberOfGroups('registered-users', groupKeys), + ]); + return sets[0].reduce((memo, cur, idx) => { + memo.push(cur || sets[1][idx]); + return memo; + }, []); + } + + // User handling + if (parseInt(uidOrGroupName, 10) <= 0) { + return await isSystemGroupAllowedToCids(privilege, uidOrGroupName, cids); } const userKeys = []; @@ -55,12 +74,29 @@ async function isUserAllowedToCids(privilege, uid, cids) { groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); }); - return await checkIfAllowed(uid, userKeys, groupKeys); + return await checkIfAllowed(uidOrGroupName, userKeys, groupKeys); } -async function isUserAllowedToPrivileges(privileges, uid, cid) { - if (parseInt(uid, 10) <= 0) { - return await isSystemGroupAllowedToPrivileges(privileges, uid, cid); +async function isAllowedToPrivileges(privileges, uidOrGroupName, cid) { + // Group handling + if (isNaN(parseInt(uidOrGroupName, 10)) && (uidOrGroupName || '').length) { + const groupKeys = []; + privileges.forEach(function (privilege) { + groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); + }); + const sets = await Promise.all([ + groups.isMemberOfGroups(uidOrGroupName, groupKeys), + groups.isMemberOfGroups('registered-users', groupKeys), + ]); + return sets[0].reduce((memo, cur, idx) => { + memo.push(cur || sets[1][idx]); + return memo; + }, []); + } + + // User handling + if (parseInt(uidOrGroupName, 10) <= 0) { + return await isSystemGroupAllowedToPrivileges(privileges, uidOrGroupName, cid); } const userKeys = []; @@ -70,7 +106,7 @@ async function isUserAllowedToPrivileges(privileges, uid, cid) { groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); }); - return await checkIfAllowed(uid, userKeys, groupKeys); + return await checkIfAllowed(uidOrGroupName, userKeys, groupKeys); } async function checkIfAllowed(uid, userKeys, groupKeys) { diff --git a/src/privileges/posts.js b/src/privileges/posts.js index ac595c0c31..f1274b892e 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -25,11 +25,11 @@ module.exports = function (privileges) { isAdmin: user.isAdministrator(uid), isModerator: user.isModerator(uid, uniqueCids), isOwner: posts.isOwner(pids, uid), - 'topics:read': helpers.isUserAllowedTo('topics:read', uid, uniqueCids), - read: helpers.isUserAllowedTo('read', uid, uniqueCids), - 'posts:edit': helpers.isUserAllowedTo('posts:edit', uid, uniqueCids), - 'posts:history': helpers.isUserAllowedTo('posts:history', uid, uniqueCids), - 'posts:view_deleted': helpers.isUserAllowedTo('posts:view_deleted', uid, uniqueCids), + 'topics:read': helpers.isAllowedTo('topics:read', uid, uniqueCids), + read: helpers.isAllowedTo('read', uid, uniqueCids), + 'posts:edit': helpers.isAllowedTo('posts:edit', uid, uniqueCids), + 'posts:history': helpers.isAllowedTo('posts:history', uid, uniqueCids), + 'posts:view_deleted': helpers.isAllowedTo('posts:view_deleted', uid, uniqueCids), }); const isModerator = _.zipObject(uniqueCids, results.isModerator); diff --git a/src/privileges/topics.js b/src/privileges/topics.js index d4b34194ff..75a3e01fb3 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -23,7 +23,7 @@ module.exports = function (privileges) { ]; const topicData = await topics.getTopicFields(tid, ['cid', 'uid', 'locked', 'deleted']); const [userPrivileges, isAdministrator, isModerator, disabled] = await Promise.all([ - helpers.isUserAllowedTo(privs, uid, topicData.cid), + helpers.isAllowedTo(privs, uid, topicData.cid), user.isAdministrator(uid), user.isModerator(uid, topicData.cid), categories.getCategoryField(topicData.cid, 'disabled'), @@ -121,7 +121,7 @@ module.exports = function (privileges) { user.isModerator(uid, topicData.cid), user.isAdministrator(uid), topics.isOwner(tid, uid), - helpers.isUserAllowedTo('topics:delete', uid, [topicData.cid]), + helpers.isAllowedTo('topics:delete', uid, [topicData.cid]), ]); if (isAdministrator) { diff --git a/src/privileges/users.js b/src/privileges/users.js index 1cf9441aee..2f43ceca13 100644 --- a/src/privileges/users.js +++ b/src/privileges/users.js @@ -41,7 +41,7 @@ module.exports = function (privileges) { return await filterIsModerator(cids, uid, cids.map(() => true)); } const uniqueCids = _.uniq(cids); - const isAllowed = await helpers.isUserAllowedTo('moderate', uid, uniqueCids); + const isAllowed = await helpers.isAllowedTo('moderate', uid, uniqueCids); const cidToIsAllowed = _.zipObject(uniqueCids, isAllowed); const isModerator = cids.map(cid => cidToIsAllowed[cid]); diff --git a/src/views/admin/manage/group.tpl b/src/views/admin/manage/group.tpl index 382a26cf8e..282d864b06 100644 --- a/src/views/admin/manage/group.tpl +++ b/src/views/admin/manage/group.tpl @@ -95,6 +95,22 @@
+
+ +
+ + +

[[groups:details.member-post-cids-help]]

+
+ +
+
From fdab76f822422372cf9bebf898e81edc1a2bd57d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 13 Nov 2020 14:32:11 -0500 Subject: [PATCH 16/67] fix: #8872 missing admin/menu language key+fallback --- public/language/ar/admin/menu.json | 1 + public/language/bg/admin/menu.json | 1 + public/language/bn/admin/menu.json | 1 + public/language/cs/admin/menu.json | 1 + public/language/da/admin/menu.json | 1 + public/language/de/admin/menu.json | 1 + public/language/el/admin/menu.json | 1 + public/language/en-US/admin/menu.json | 1 + public/language/en-x-pirate/admin/menu.json | 1 + public/language/es/admin/menu.json | 1 + public/language/et/admin/menu.json | 1 + public/language/fa-IR/admin/menu.json | 1 + public/language/fi/admin/menu.json | 1 + public/language/fr/admin/menu.json | 1 + public/language/gl/admin/menu.json | 1 + public/language/he/admin/menu.json | 1 + public/language/hr/admin/menu.json | 1 + public/language/hu/admin/menu.json | 1 + public/language/id/admin/menu.json | 1 + public/language/it/admin/menu.json | 1 + public/language/ja/admin/menu.json | 1 + public/language/ko/admin/menu.json | 1 + public/language/lt/admin/menu.json | 1 + public/language/lv/admin/menu.json | 1 + public/language/ms/admin/menu.json | 1 + public/language/nb/admin/menu.json | 1 + public/language/nl/admin/menu.json | 1 + public/language/pl/admin/menu.json | 1 + public/language/pt-BR/admin/menu.json | 1 + public/language/pt-PT/admin/menu.json | 1 + public/language/ro/admin/menu.json | 1 + public/language/ru/admin/menu.json | 1 + public/language/rw/admin/menu.json | 1 + public/language/sc/admin/menu.json | 1 + public/language/sk/admin/menu.json | 1 + public/language/sl/admin/menu.json | 1 + public/language/sr/admin/menu.json | 1 + public/language/sv/admin/menu.json | 1 + public/language/th/admin/menu.json | 1 + public/language/tr/admin/menu.json | 1 + public/language/uk/admin/menu.json | 1 + public/language/vi/admin/menu.json | 1 + public/language/zh-CN/admin/menu.json | 1 + public/language/zh-TW/admin/menu.json | 1 + 44 files changed, 44 insertions(+) diff --git a/public/language/ar/admin/menu.json b/public/language/ar/admin/menu.json index a4935201fe..caccf3ca9e 100644 --- a/public/language/ar/admin/menu.json +++ b/public/language/ar/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "ترقيم الصفحات", "settings/tags": "الكلمات المفتاحية", "settings/notifications": "التنبيهات", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/bg/admin/menu.json b/public/language/bg/admin/menu.json index e56f50657f..9a254f3436 100644 --- a/public/language/bg/admin/menu.json +++ b/public/language/bg/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Странициране", "settings/tags": "Етикети", "settings/notifications": "Известия", + "settings/api": "API Access", "settings/sounds": "Звуци", "settings/social": "Обществени", "settings/cookies": "Бисквитки", diff --git a/public/language/bn/admin/menu.json b/public/language/bn/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/bn/admin/menu.json +++ b/public/language/bn/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/cs/admin/menu.json b/public/language/cs/admin/menu.json index 77803af507..9be66690ab 100644 --- a/public/language/cs/admin/menu.json +++ b/public/language/cs/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Stránkování", "settings/tags": "Značky", "settings/notifications": "Oznámení", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/da/admin/menu.json b/public/language/da/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/da/admin/menu.json +++ b/public/language/da/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/de/admin/menu.json b/public/language/de/admin/menu.json index 9997a0db6f..24b4a61dea 100644 --- a/public/language/de/admin/menu.json +++ b/public/language/de/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Seitennummerierung", "settings/tags": "Tags", "settings/notifications": "Benachrichtigungen", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/el/admin/menu.json b/public/language/el/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/el/admin/menu.json +++ b/public/language/el/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/en-US/admin/menu.json b/public/language/en-US/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/en-US/admin/menu.json +++ b/public/language/en-US/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/en-x-pirate/admin/menu.json b/public/language/en-x-pirate/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/en-x-pirate/admin/menu.json +++ b/public/language/en-x-pirate/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/es/admin/menu.json b/public/language/es/admin/menu.json index 353e99d25e..4cd3ae3061 100644 --- a/public/language/es/admin/menu.json +++ b/public/language/es/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Paginación", "settings/tags": "Etiquetas", "settings/notifications": "Notificaciones", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/et/admin/menu.json b/public/language/et/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/et/admin/menu.json +++ b/public/language/et/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/fa-IR/admin/menu.json b/public/language/fa-IR/admin/menu.json index fb1703f728..31a0e96151 100644 --- a/public/language/fa-IR/admin/menu.json +++ b/public/language/fa-IR/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "برچسب ها", "settings/notifications": "آگاه‌سازی‌ها", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "کوکی ها", diff --git a/public/language/fi/admin/menu.json b/public/language/fi/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/fi/admin/menu.json +++ b/public/language/fi/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/fr/admin/menu.json b/public/language/fr/admin/menu.json index 731e459916..2da97b086f 100644 --- a/public/language/fr/admin/menu.json +++ b/public/language/fr/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Mots-clés", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sons", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/gl/admin/menu.json b/public/language/gl/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/gl/admin/menu.json +++ b/public/language/gl/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/he/admin/menu.json b/public/language/he/admin/menu.json index e4dc2a4bee..6d6ce17c9d 100644 --- a/public/language/he/admin/menu.json +++ b/public/language/he/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "תגיות", "settings/notifications": "התראות", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "עוגיות", diff --git a/public/language/hr/admin/menu.json b/public/language/hr/admin/menu.json index 700d5b37bf..f29b1c5226 100644 --- a/public/language/hr/admin/menu.json +++ b/public/language/hr/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Numeriranje", "settings/tags": "Oznake", "settings/notifications": "Obavijesti", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Kolačići", diff --git a/public/language/hu/admin/menu.json b/public/language/hu/admin/menu.json index c09e3f0834..6f72e3c0f5 100644 --- a/public/language/hu/admin/menu.json +++ b/public/language/hu/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Lapszámozás", "settings/tags": "Címkék", "settings/notifications": "Értesítések", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Süti", diff --git a/public/language/id/admin/menu.json b/public/language/id/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/id/admin/menu.json +++ b/public/language/id/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/it/admin/menu.json b/public/language/it/admin/menu.json index 82d9e8cc10..752af02af1 100644 --- a/public/language/it/admin/menu.json +++ b/public/language/it/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Paginazione", "settings/tags": "Tabs", "settings/notifications": "Notifiche", + "settings/api": "API Access", "settings/sounds": "Suoni", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/ja/admin/menu.json b/public/language/ja/admin/menu.json index 4c214039b1..9e9be04577 100644 --- a/public/language/ja/admin/menu.json +++ b/public/language/ja/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "ページ", "settings/tags": "タグ", "settings/notifications": "通知", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "クッキー", diff --git a/public/language/ko/admin/menu.json b/public/language/ko/admin/menu.json index a1ed7c9a36..541713c905 100644 --- a/public/language/ko/admin/menu.json +++ b/public/language/ko/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "페이지 매기기", "settings/tags": "태그", "settings/notifications": "알림", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "쿠키", diff --git a/public/language/lt/admin/menu.json b/public/language/lt/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/lt/admin/menu.json +++ b/public/language/lt/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/lv/admin/menu.json b/public/language/lv/admin/menu.json index 74533a7428..9b210ee44e 100644 --- a/public/language/lv/admin/menu.json +++ b/public/language/lv/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Dalīšana pa lapām", "settings/tags": "Birkas", "settings/notifications": "Paziņojumi", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Sīkfaili", diff --git a/public/language/ms/admin/menu.json b/public/language/ms/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/ms/admin/menu.json +++ b/public/language/ms/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/nb/admin/menu.json b/public/language/nb/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/nb/admin/menu.json +++ b/public/language/nb/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/nl/admin/menu.json b/public/language/nl/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/nl/admin/menu.json +++ b/public/language/nl/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/pl/admin/menu.json b/public/language/pl/admin/menu.json index 656f1acb50..fffccdcf8a 100644 --- a/public/language/pl/admin/menu.json +++ b/public/language/pl/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Paginacja", "settings/tags": "Tagi", "settings/notifications": "Powiadomienia", + "settings/api": "API Access", "settings/sounds": "Dźwięki", "settings/social": "Społecznościowe", "settings/cookies": "Ciasteczka", diff --git a/public/language/pt-BR/admin/menu.json b/public/language/pt-BR/admin/menu.json index dce0ca5d23..d5f6d2ef73 100644 --- a/public/language/pt-BR/admin/menu.json +++ b/public/language/pt-BR/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Paginação", "settings/tags": "Tags", "settings/notifications": "Notificações", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/pt-PT/admin/menu.json b/public/language/pt-PT/admin/menu.json index c28a621759..f2eaa7e52a 100644 --- a/public/language/pt-PT/admin/menu.json +++ b/public/language/pt-PT/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Paginação", "settings/tags": "Marcadores", "settings/notifications": "Notificações", + "settings/api": "API Access", "settings/sounds": "Sons", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/ro/admin/menu.json b/public/language/ro/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/ro/admin/menu.json +++ b/public/language/ro/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/ru/admin/menu.json b/public/language/ru/admin/menu.json index f08ad053f2..afdb61a8ef 100644 --- a/public/language/ru/admin/menu.json +++ b/public/language/ru/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Пагинация", "settings/tags": "Метки", "settings/notifications": "Уведомления", + "settings/api": "API Access", "settings/sounds": "Звуки", "settings/social": "Шэринг", "settings/cookies": "Куки", diff --git a/public/language/rw/admin/menu.json b/public/language/rw/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/rw/admin/menu.json +++ b/public/language/rw/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/sc/admin/menu.json b/public/language/sc/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/sc/admin/menu.json +++ b/public/language/sc/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/sk/admin/menu.json b/public/language/sk/admin/menu.json index cd6f339da9..563c930e55 100644 --- a/public/language/sk/admin/menu.json +++ b/public/language/sk/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Stránkovanie", "settings/tags": "Značky", "settings/notifications": "Oznámenia", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Coockie", diff --git a/public/language/sl/admin/menu.json b/public/language/sl/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/sl/admin/menu.json +++ b/public/language/sl/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/sr/admin/menu.json b/public/language/sr/admin/menu.json index 31a2835ff5..ad7b1c27bf 100644 --- a/public/language/sr/admin/menu.json +++ b/public/language/sr/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifikacije", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/sv/admin/menu.json b/public/language/sv/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/sv/admin/menu.json +++ b/public/language/sv/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/th/admin/menu.json b/public/language/th/admin/menu.json index b6a38f0d0e..01cc355fa1 100644 --- a/public/language/th/admin/menu.json +++ b/public/language/th/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Tags", "settings/notifications": "Notifications", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/tr/admin/menu.json b/public/language/tr/admin/menu.json index b6c6293d40..7069833691 100644 --- a/public/language/tr/admin/menu.json +++ b/public/language/tr/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Sayfalama", "settings/tags": "Etiketler", "settings/notifications": "Bildirimler", + "settings/api": "API Access", "settings/sounds": "Sesler", "settings/social": "Sosyal", "settings/cookies": "Çerezler", diff --git a/public/language/uk/admin/menu.json b/public/language/uk/admin/menu.json index 768cc2cb5e..a35ee7b508 100644 --- a/public/language/uk/admin/menu.json +++ b/public/language/uk/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Пагінація", "settings/tags": "Теги", "settings/notifications": "Сповіщення", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Куки", diff --git a/public/language/vi/admin/menu.json b/public/language/vi/admin/menu.json index 98aa86175c..09ae2b4cdc 100644 --- a/public/language/vi/admin/menu.json +++ b/public/language/vi/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "Phân trang", "settings/tags": "Thẻ", "settings/notifications": "Thông báo", + "settings/api": "API Access", "settings/sounds": "Sounds", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/zh-CN/admin/menu.json b/public/language/zh-CN/admin/menu.json index f100672a6f..d5c8036246 100644 --- a/public/language/zh-CN/admin/menu.json +++ b/public/language/zh-CN/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "分页", "settings/tags": "话题", "settings/notifications": "通知", + "settings/api": "API Access", "settings/sounds": "铃声", "settings/social": "社交", "settings/cookies": "Cookies", diff --git a/public/language/zh-TW/admin/menu.json b/public/language/zh-TW/admin/menu.json index fcbdd90b07..2c823e4c85 100644 --- a/public/language/zh-TW/admin/menu.json +++ b/public/language/zh-TW/admin/menu.json @@ -31,6 +31,7 @@ "settings/pagination": "分頁", "settings/tags": "標籤", "settings/notifications": "通知", + "settings/api": "API Access", "settings/sounds": "聲音", "settings/social": "社交", "settings/cookies": "Cookies", From 8fbe83246009d39884fd64fd65f8ce83c44d7865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 13 Nov 2020 14:42:44 -0500 Subject: [PATCH 17/67] refactor: less dupe code --- src/privileges/helpers.js | 59 ++++++++++++--------------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js index 01bd609ece..cda8eca5b9 100644 --- a/src/privileges/helpers.js +++ b/src/privileges/helpers.js @@ -46,20 +46,11 @@ async function isAllowedToCids(privilege, uidOrGroupName, cids) { return cids.map(() => false); } + const groupKeys = cids.map(cid => 'cid:' + cid + ':privileges:groups:' + privilege); + // Group handling if (isNaN(parseInt(uidOrGroupName, 10)) && (uidOrGroupName || '').length) { - const groupKeys = []; - cids.forEach(function (cid) { - groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); - }); - const sets = await Promise.all([ - groups.isMemberOfGroups(uidOrGroupName, groupKeys), - groups.isMemberOfGroups('registered-users', groupKeys), - ]); - return sets[0].reduce((memo, cur, idx) => { - memo.push(cur || sets[1][idx]); - return memo; - }, []); + return await checkIfAllowedGroup(uidOrGroupName, groupKeys); } // User handling @@ -67,31 +58,15 @@ async function isAllowedToCids(privilege, uidOrGroupName, cids) { return await isSystemGroupAllowedToCids(privilege, uidOrGroupName, cids); } - const userKeys = []; - const groupKeys = []; - cids.forEach(function (cid) { - userKeys.push('cid:' + cid + ':privileges:' + privilege); - groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); - }); - - return await checkIfAllowed(uidOrGroupName, userKeys, groupKeys); + const userKeys = cids.map(cid => 'cid:' + cid + ':privileges:' + privilege); + return await checkIfAllowedUser(uidOrGroupName, userKeys, groupKeys); } async function isAllowedToPrivileges(privileges, uidOrGroupName, cid) { + const groupKeys = privileges.map(privilege => 'cid:' + cid + ':privileges:groups:' + privilege); // Group handling if (isNaN(parseInt(uidOrGroupName, 10)) && (uidOrGroupName || '').length) { - const groupKeys = []; - privileges.forEach(function (privilege) { - groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); - }); - const sets = await Promise.all([ - groups.isMemberOfGroups(uidOrGroupName, groupKeys), - groups.isMemberOfGroups('registered-users', groupKeys), - ]); - return sets[0].reduce((memo, cur, idx) => { - memo.push(cur || sets[1][idx]); - return memo; - }, []); + return await checkIfAllowedGroup(uidOrGroupName, groupKeys); } // User handling @@ -99,17 +74,11 @@ async function isAllowedToPrivileges(privileges, uidOrGroupName, cid) { return await isSystemGroupAllowedToPrivileges(privileges, uidOrGroupName, cid); } - const userKeys = []; - const groupKeys = []; - privileges.forEach(function (privilege) { - userKeys.push('cid:' + cid + ':privileges:' + privilege); - groupKeys.push('cid:' + cid + ':privileges:groups:' + privilege); - }); - - return await checkIfAllowed(uidOrGroupName, userKeys, groupKeys); + const userKeys = privileges.map(privilege => 'cid:' + cid + ':privileges:' + privilege); + return await checkIfAllowedUser(uidOrGroupName, userKeys, groupKeys); } -async function checkIfAllowed(uid, userKeys, groupKeys) { +async function checkIfAllowedUser(uid, userKeys, groupKeys) { const [hasUserPrivilege, hasGroupPrivilege] = await Promise.all([ groups.isMemberOfGroups(uid, userKeys), groups.isMemberOfGroupsList(uid, groupKeys), @@ -117,6 +86,14 @@ async function checkIfAllowed(uid, userKeys, groupKeys) { return userKeys.map((key, index) => hasUserPrivilege[index] || hasGroupPrivilege[index]); } +async function checkIfAllowedGroup(groupName, groupKeys) { + const sets = await Promise.all([ + groups.isMemberOfGroups(groupName, groupKeys), + groups.isMemberOfGroups('registered-users', groupKeys), + ]); + return groupKeys.map((key, index) => sets[0][index] || sets[1][index]); +} + async function isSystemGroupAllowedToCids(privilege, uid, cids) { const groupKeys = cids.map(cid => 'cid:' + cid + ':privileges:groups:' + privilege); return await groups.isMemberOfGroups(uidToSystemGroup[uid], groupKeys); From ec70329aed42fca09f0ea6e6c739095d75bdbcd0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 13 Nov 2020 19:18:46 +0000 Subject: [PATCH 18/67] fix(deps): update dependency nodebb-theme-persona to v10.2.68 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 85f85a2218..7793ceb504 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-spam-be-gone": "0.7.6", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", - "nodebb-theme-persona": "10.2.67", + "nodebb-theme-persona": "10.2.68", "nodebb-theme-slick": "1.2.40", "nodebb-theme-vanilla": "11.3.0", "nodebb-widget-essentials": "4.1.2", From bbfb276a836ed7094da6a4ec86fc46ed6cd1f0e3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 13 Nov 2020 20:31:21 +0000 Subject: [PATCH 19/67] fix(deps): update dependency nodebb-theme-slick to v1.3.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7793ceb504..c4558d760d 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", "nodebb-theme-persona": "10.2.68", - "nodebb-theme-slick": "1.2.40", + "nodebb-theme-slick": "1.3.1", "nodebb-theme-vanilla": "11.3.0", "nodebb-widget-essentials": "4.1.2", "nodemailer": "^6.4.6", From 85aaededaeced4b155744330a712a7c72e2c6e4f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Nov 2020 16:31:17 -0500 Subject: [PATCH 20/67] fix(deps): update dependency nodebb-theme-vanilla to v11.3.1 (#8878) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Renovate Bot Co-authored-by: Barış Soner Uşaklı --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c4558d760d..151200b897 100644 --- a/install/package.json +++ b/install/package.json @@ -105,7 +105,7 @@ "nodebb-theme-lavender": "5.0.14", "nodebb-theme-persona": "10.2.68", "nodebb-theme-slick": "1.3.1", - "nodebb-theme-vanilla": "11.3.0", + "nodebb-theme-vanilla": "11.3.1", "nodebb-widget-essentials": "4.1.2", "nodemailer": "^6.4.6", "nprogress": "0.2.0", From 7693ab90e20658613c1a52b14d00d3710594bb1c Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 14 Nov 2020 09:05:55 +0000 Subject: [PATCH 21/67] Latest translations and fallbacks --- public/language/ar/groups.json | 2 ++ public/language/bg/admin/settings/user.json | 6 +++--- public/language/bg/groups.json | 2 ++ public/language/bg/register.json | 4 ++-- public/language/bn/groups.json | 2 ++ public/language/cs/groups.json | 2 ++ public/language/da/groups.json | 2 ++ public/language/de/groups.json | 2 ++ public/language/el/groups.json | 2 ++ public/language/en-US/groups.json | 2 ++ public/language/en-x-pirate/groups.json | 2 ++ public/language/es/groups.json | 2 ++ public/language/et/groups.json | 2 ++ public/language/fa-IR/groups.json | 2 ++ public/language/fi/groups.json | 2 ++ public/language/fr/admin/menu.json | 2 +- public/language/fr/admin/settings/user.json | 6 +++--- public/language/fr/groups.json | 2 ++ public/language/fr/register.json | 4 ++-- public/language/gl/groups.json | 2 ++ public/language/he/groups.json | 2 ++ public/language/hr/groups.json | 2 ++ public/language/hu/groups.json | 2 ++ public/language/id/groups.json | 2 ++ public/language/it/groups.json | 2 ++ public/language/ja/groups.json | 2 ++ public/language/ko/groups.json | 2 ++ public/language/lt/groups.json | 2 ++ public/language/lv/groups.json | 2 ++ public/language/ms/groups.json | 2 ++ public/language/nb/groups.json | 2 ++ public/language/nl/groups.json | 2 ++ public/language/pl/groups.json | 2 ++ public/language/pt-BR/groups.json | 2 ++ public/language/pt-PT/groups.json | 2 ++ public/language/ro/groups.json | 2 ++ public/language/ru/groups.json | 2 ++ public/language/rw/groups.json | 2 ++ public/language/sc/groups.json | 2 ++ public/language/sk/groups.json | 2 ++ public/language/sl/groups.json | 2 ++ public/language/sr/groups.json | 2 ++ public/language/sv/groups.json | 2 ++ public/language/th/groups.json | 2 ++ public/language/tr/groups.json | 2 ++ public/language/uk/groups.json | 2 ++ public/language/vi/groups.json | 2 ++ public/language/zh-CN/groups.json | 2 ++ public/language/zh-TW/groups.json | 2 ++ 49 files changed, 99 insertions(+), 11 deletions(-) diff --git a/public/language/ar/groups.json b/public/language/ar/groups.json index 196a286de6..56af464733 100644 --- a/public/language/ar/groups.json +++ b/public/language/ar/groups.json @@ -35,6 +35,8 @@ "details.member_count": "عدد اﻷعضاء", "details.creation_date": "تاريخ الإنشاء", "details.description": "الوصف", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "معاينة الوسام", "details.change_icon": "تغيير الأيقونة", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/bg/admin/settings/user.json b/public/language/bg/admin/settings/user.json index 6b2a38b3e8..ed50f77025 100644 --- a/public/language/bg/admin/settings/user.json +++ b/public/language/bg/admin/settings/user.json @@ -43,9 +43,9 @@ "registration-type.disabled": "Без регистриране", "registration-type.help": "Обикновена — Потребителите могат да се регистрират от страницата /register.
\nСамо с покана — Потребителите могат да поканят други от страницата с потребителите.
\nСамо с покана от администратор — Само администратори могат да канят други от страницата с потребителите и от страниците за управление на потребителите.
\nБез регистриране — Потребителите не се регистрират.
", "registration-approval-type.help": "Обикновена — Потребителите се регистрират на момента.
\nОдобрена от администратор — Потребителските регистрации се поставят в опашка за одобрение, която администраторите преглеждат.
\nОдобрена от администратор по IP адрес — Новите потребители се регистрират по обикновения начин, а онези, от чиито IP адрес вече са се регистрирали други акаунти, се нуждаят от одобрението на администратор.
", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", - "registration-queue-show-average-time": "Show users average time it takes to approve a new user", + "registration-queue-auto-approve-time": "Време за автоматично одобрение", + "registration-queue-auto-approve-time-help": "Брой часове преди потребител да бъде одобрен автоматично. 0 = изключено.", + "registration-queue-show-average-time": "Средното време за одобрение на нов потребител да се показва на потребителите", "registration.max-invites": "Максимален брой покани на потребител", "max-invites": "Максимален брой покани на потребител", "max-invites-help": "0 = няма ограничение. Администраторите могат да разпращат неограничен брой покани.
Тази стойност се използва, само ако е избран режимът „Само с покана“.", diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index 9396cf52d6..6fca1b281d 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Брой на членовете", "details.creation_date": "Дата на създаване", "details.description": "Описание", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Преглед на емблемата", "details.change_icon": "Промяна на иконката", "details.change_label_colour": "Промяна на цвета на етикета", diff --git a/public/language/bg/register.json b/public/language/bg/register.json index 4b02d32ed1..a07179e345 100644 --- a/public/language/bg/register.json +++ b/public/language/bg/register.json @@ -18,8 +18,8 @@ "agree_to_terms_of_use": "Съгласен съм с условията за ползване", "terms_of_use_error": "Трябва да се съгласите с условията за ползване", "registration-added-to-queue": "Вашата регистрация беше добавена в опашката за одобрение. Ще получите е-писмо, когато тя бъде одобрена от администратор.", - "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", - "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", + "registration-queue-average-time": "Средното време за одобрение на нови членове е %1 часа и %2 минути.", + "registration-queue-auto-approve-time": "Членството Ви в този форум ще бъде напълно активирано след около %1 часа.", "interstitial.intro": "Нуждаем се от малко допълнителна информация, преди да можем да създадем акаунта Ви.", "interstitial.errors-found": "Не можем да завършим Вашата регистрация:", "gdpr_agree_data": "Съгласявам се това личната ми информация да се съхранява и обработва от този уеб сайт.", diff --git a/public/language/bn/groups.json b/public/language/bn/groups.json index 8adb5de82d..b8879ed8e5 100644 --- a/public/language/bn/groups.json +++ b/public/language/bn/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Member Count", "details.creation_date": "Creation Date", "details.description": "Description", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/cs/groups.json b/public/language/cs/groups.json index 3727178a46..96d6738c06 100644 --- a/public/language/cs/groups.json +++ b/public/language/cs/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Počet členů", "details.creation_date": "Datum vytvoření", "details.description": "Popis", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Náhled symbolu", "details.change_icon": "Změnit ikonu", "details.change_label_colour": "Změnit barvu popisu", diff --git a/public/language/da/groups.json b/public/language/da/groups.json index 9076effaff..e525e7824d 100644 --- a/public/language/da/groups.json +++ b/public/language/da/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Medlemsantal", "details.creation_date": "Oprettelsesdato", "details.description": "Beskrivelse", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Mærke forhåndsvisning", "details.change_icon": "Skift ikon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/de/groups.json b/public/language/de/groups.json index bf30c7f8ef..27a933979f 100644 --- a/public/language/de/groups.json +++ b/public/language/de/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Mitgliederanzahl", "details.creation_date": "Erstelldatum", "details.description": "Beschreibung", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Abzeichenvorschau", "details.change_icon": "Symbol ändern", "details.change_label_colour": "Label-Farbe ändern", diff --git a/public/language/el/groups.json b/public/language/el/groups.json index eaa90a3803..0953e444c4 100644 --- a/public/language/el/groups.json +++ b/public/language/el/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Member Count", "details.creation_date": "Ημερομηνία Δημιουργίας", "details.description": "Περιγραφή", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/en-US/groups.json b/public/language/en-US/groups.json index 132200d213..ff52b35c08 100644 --- a/public/language/en-US/groups.json +++ b/public/language/en-US/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Member Count", "details.creation_date": "Creation Date", "details.description": "Description", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/en-x-pirate/groups.json b/public/language/en-x-pirate/groups.json index 132200d213..ff52b35c08 100644 --- a/public/language/en-x-pirate/groups.json +++ b/public/language/en-x-pirate/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Member Count", "details.creation_date": "Creation Date", "details.description": "Description", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/es/groups.json b/public/language/es/groups.json index 1ae4aa37b4..6d5038583d 100644 --- a/public/language/es/groups.json +++ b/public/language/es/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Numero de Miembros", "details.creation_date": "Fecha de Creacion", "details.description": "Descripción", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Previsualización de Insignia", "details.change_icon": "Cambiar Icono", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/et/groups.json b/public/language/et/groups.json index 89a2efccf7..fe945ebd3b 100644 --- a/public/language/et/groups.json +++ b/public/language/et/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Liikmete arv", "details.creation_date": "Algatamise kuupäev", "details.description": "Kirjeldus", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Embleemi eelvaade", "details.change_icon": "Vaheta ikooni", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/fa-IR/groups.json b/public/language/fa-IR/groups.json index 9a16084135..6e50aeec20 100644 --- a/public/language/fa-IR/groups.json +++ b/public/language/fa-IR/groups.json @@ -35,6 +35,8 @@ "details.member_count": "تعداد اعضا", "details.creation_date": "زمان ساخته شدن", "details.description": "توضیحات", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "پیش نمایشِ نشان", "details.change_icon": "تغییر آیکن", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/fi/groups.json b/public/language/fi/groups.json index 8c2ce2daa2..434c7d726d 100644 --- a/public/language/fi/groups.json +++ b/public/language/fi/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Jäsenmäärä", "details.creation_date": "Luontipäivämäärä", "details.description": "Kuvaus", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Merkin esikatselu", "details.change_icon": "Vaihda kuvake", "details.change_label_colour": "Vaihda merkin väriä", diff --git a/public/language/fr/admin/menu.json b/public/language/fr/admin/menu.json index 2da97b086f..46b6823901 100644 --- a/public/language/fr/admin/menu.json +++ b/public/language/fr/admin/menu.json @@ -31,7 +31,7 @@ "settings/pagination": "Pagination", "settings/tags": "Mots-clés", "settings/notifications": "Notifications", - "settings/api": "API Access", + "settings/api": "Gestion API", "settings/sounds": "Sons", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/fr/admin/settings/user.json b/public/language/fr/admin/settings/user.json index ff5bc099ae..77c5633d06 100644 --- a/public/language/fr/admin/settings/user.json +++ b/public/language/fr/admin/settings/user.json @@ -43,9 +43,9 @@ "registration-type.disabled": "Pas d'inscription", "registration-type.help": "Normal - Les utilisateurs peuvent s'inscrire à partir de la page d'inscription.
\nInvitation uniquement - Les utilisateurs peuvent inviter d'autres personnes à partir de la page des utilisateurs.
\nInvitation administrateur uniquement - Seuls les administrateurs peuvent inviter d'autres personnes à partir des pages des utilisateurs et des pages d'administration.
\nAucune inscription - Aucune inscription d'utilisateur.
", "registration-approval-type.help": "Normal - Les utilisateurs sont enregistrés immédiatement.
\nApprobation de l'administrateur - Les inscriptions des utilisateurs sont placées dans une file d'attente d'approbation pour les administrateurs.
\nApprobation par adresses IP pour les nouveaux utilisateurs, Approbation de l'administrateur pour les adresses IP ayant déjà un compte.
", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", - "registration-queue-show-average-time": "Show users average time it takes to approve a new user", + "registration-queue-auto-approve-time": "Durée d'approbation automatique", + "registration-queue-auto-approve-time-help": "Heures avant l'approbation automatique de l'utilisateur. 0 pour désactiver.", + "registration-queue-show-average-time": "Afficher aux utilisateurs le temps moyen nécessaire d'approbation", "registration.max-invites": "Nombre maximum d'invitations par utilisateur", "max-invites": "Nombre maximum d'invitations par utilisateur", "max-invites-help": "0 pour supprimer cette restriction. Les admins n'ont aucune restriction
Valable uniquement pour \"Uniquement sur invitation\"", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index eb60438f41..fa62429380 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Nombre de membres", "details.creation_date": "Date de création", "details.description": "Description", + "details.member-post-cids": "Catégories ou seront affichés les articles", + "details.member-post-cids-help": "Note: si aucune catégorie n'est sélectionnée, toutes les catégories sont incluses. Utilisez ctrl et shift pour sélectionner plusieurs options.", "details.badge_preview": "Aperçu du badge", "details.change_icon": "Modifier l'icône", "details.change_label_colour": "Changer la couleur de l'étiquette", diff --git a/public/language/fr/register.json b/public/language/fr/register.json index 53b57f1b6b..efd862dbd2 100644 --- a/public/language/fr/register.json +++ b/public/language/fr/register.json @@ -18,8 +18,8 @@ "agree_to_terms_of_use": "J'accepte les conditions générales d'utilisation", "terms_of_use_error": "Vous devez accepter les conditions générales d'utilisation", "registration-added-to-queue": "Votre inscription a été ajoutée à la liste d'approbation. Vous recevrez un email quand celle-ci sera acceptée par un administrateur.", - "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", - "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", + "registration-queue-average-time": "Temps moyen d'approbation des adhésions est de %1 heures %2 minutes.", + "registration-queue-auto-approve-time": "Votre adhésion à ce forum sera entièrement activée dans un maximum de %1 heures.", "interstitial.intro": "Nous avons besoin de quelques informations supplémentaires avant de pouvoir créer votre compte.", "interstitial.errors-found": "Nous n'avons pas pu compléter votre inscription :", "gdpr_agree_data": "J'accepte la collecte et le traitement de mes données personnelles sur ce site.", diff --git a/public/language/gl/groups.json b/public/language/gl/groups.json index aa6636c3dc..5b1d941872 100644 --- a/public/language/gl/groups.json +++ b/public/language/gl/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Conta de Membros", "details.creation_date": "Data de Creación", "details.description": "Descripción", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Vista Previa da Insignia", "details.change_icon": "Cambiar Icona", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/he/groups.json b/public/language/he/groups.json index d5918ae1e5..b070cb04ed 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -35,6 +35,8 @@ "details.member_count": "כמות משתמשים", "details.creation_date": "תאריך יצירה", "details.description": "תיאור", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "תצוגה מקדימה של הסמל", "details.change_icon": "שנה אייקון", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/hr/groups.json b/public/language/hr/groups.json index a89cc05db7..6f1a2fde96 100644 --- a/public/language/hr/groups.json +++ b/public/language/hr/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Broj članova", "details.creation_date": "Kreirano", "details.description": "Opis", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Prikaz značke", "details.change_icon": "Promjeni ikonu", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/hu/groups.json b/public/language/hu/groups.json index e30a42d83a..51e903ec8f 100644 --- a/public/language/hu/groups.json +++ b/public/language/hu/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Tagok száma", "details.creation_date": "Létrehozás dátuma", "details.description": "Leírás", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Jelvény előnézet", "details.change_icon": "Ikon módosítása", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/id/groups.json b/public/language/id/groups.json index 7379239d68..920a7a76fc 100644 --- a/public/language/id/groups.json +++ b/public/language/id/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Member Count", "details.creation_date": "Creation Date", "details.description": "Description", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/it/groups.json b/public/language/it/groups.json index b06978ba90..8482ec1405 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Numero Membri", "details.creation_date": "Data Creazione", "details.description": "Descrizione", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Anteprima Badge", "details.change_icon": "Cambia Icona", "details.change_label_colour": "Cambia colore etichetta", diff --git a/public/language/ja/groups.json b/public/language/ja/groups.json index 83821e8072..fea566ad1b 100644 --- a/public/language/ja/groups.json +++ b/public/language/ja/groups.json @@ -35,6 +35,8 @@ "details.member_count": "メンバー数", "details.creation_date": "作成日", "details.description": "説明", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "バッジプレビュー", "details.change_icon": "アイコンを変更", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/ko/groups.json b/public/language/ko/groups.json index 654671f36b..21d56a4f98 100644 --- a/public/language/ko/groups.json +++ b/public/language/ko/groups.json @@ -35,6 +35,8 @@ "details.member_count": "구성원 수", "details.creation_date": "생성일", "details.description": "설명", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "배지 미리보기", "details.change_icon": "아이콘 변경", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/lt/groups.json b/public/language/lt/groups.json index e140b9b84b..b4d5092432 100644 --- a/public/language/lt/groups.json +++ b/public/language/lt/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Narių skaičiuotuvas", "details.creation_date": "Sukūrimo Data", "details.description": "Aprašymas", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Ženklelio Peržiūra", "details.change_icon": "Pakeisti paveikslėlį", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/lv/groups.json b/public/language/lv/groups.json index ff1cdeea83..62d2cd8009 100644 --- a/public/language/lv/groups.json +++ b/public/language/lv/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Pēc biedru skaita", "details.creation_date": "Pēc datuma", "details.description": "Apraksts", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Etiķetes priekšskats", "details.change_icon": "Mainīt ikonu", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/ms/groups.json b/public/language/ms/groups.json index 19d3a57428..ebdc913c22 100644 --- a/public/language/ms/groups.json +++ b/public/language/ms/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Kiraan Ahli", "details.creation_date": "Tarikh Dicipta", "details.description": "Penerangan", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Pra-lihat Lencana", "details.change_icon": "Tukar Ikon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/nb/groups.json b/public/language/nb/groups.json index 82a4af42bb..65fa516bc2 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Antall medlemmer", "details.creation_date": "Opprettelsesdato", "details.description": "Beskrivelse", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Forhåndsvisning av skilt", "details.change_icon": "Endre ikon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/nl/groups.json b/public/language/nl/groups.json index bcd206b0d7..8b4465899d 100644 --- a/public/language/nl/groups.json +++ b/public/language/nl/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Ledentelling", "details.creation_date": "Aangemaakt op", "details.description": "Beschrijving", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Voorbeeld", "details.change_icon": "Wijzig icoon", "details.change_label_colour": "Wijzig labelkleur", diff --git a/public/language/pl/groups.json b/public/language/pl/groups.json index e0569382ae..3f0b17db0e 100644 --- a/public/language/pl/groups.json +++ b/public/language/pl/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Liczba Członków", "details.creation_date": "Data Utworzenia", "details.description": "Opis", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Podgląd etykiety", "details.change_icon": "Zmień ikonę", "details.change_label_colour": "Zmień kolor etykiety", diff --git a/public/language/pt-BR/groups.json b/public/language/pt-BR/groups.json index 14bb379505..107ba7e215 100644 --- a/public/language/pt-BR/groups.json +++ b/public/language/pt-BR/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Número de Membros", "details.creation_date": "Data de Criação", "details.description": "Descrição", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Visualização do Distintivo", "details.change_icon": "Mudar Ícone", "details.change_label_colour": "Alterar Cor do Rótulo", diff --git a/public/language/pt-PT/groups.json b/public/language/pt-PT/groups.json index f506d2837e..77bfbdd44b 100644 --- a/public/language/pt-PT/groups.json +++ b/public/language/pt-PT/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Quantidade de membros", "details.creation_date": "Data de criação", "details.description": "Descrição", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Pré-visualização do crachá", "details.change_icon": "Alterar o Ícone", "details.change_label_colour": "Alterar Cor da Etiqueta", diff --git a/public/language/ro/groups.json b/public/language/ro/groups.json index 245c58160e..7f03bf06da 100644 --- a/public/language/ro/groups.json +++ b/public/language/ro/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Număr de membrii", "details.creation_date": "Data creării", "details.description": "Descriere", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Previzualizarea insignei", "details.change_icon": "Schimbă icoana", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/ru/groups.json b/public/language/ru/groups.json index e136d830c1..c7ac40be51 100644 --- a/public/language/ru/groups.json +++ b/public/language/ru/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Количество участников", "details.creation_date": "Дата создания", "details.description": "Описание", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Предпросмотр значка", "details.change_icon": "Сменить иконку", "details.change_label_colour": "Изменить цвет ярлыка", diff --git a/public/language/rw/groups.json b/public/language/rw/groups.json index cd3537025f..eec9571922 100644 --- a/public/language/rw/groups.json +++ b/public/language/rw/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Umubare w'Abagize Itsinda", "details.creation_date": "Igihe Ryaremewe", "details.description": "Ibiriranga", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Ibisobanuro ku Kirango", "details.change_icon": "Hindura Akarango", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/sc/groups.json b/public/language/sc/groups.json index 132200d213..ff52b35c08 100644 --- a/public/language/sc/groups.json +++ b/public/language/sc/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Member Count", "details.creation_date": "Creation Date", "details.description": "Description", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/sk/groups.json b/public/language/sk/groups.json index defc8cdad5..01e407c012 100644 --- a/public/language/sk/groups.json +++ b/public/language/sk/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Počet členov", "details.creation_date": "Dátum vytvorenia", "details.description": "Popis", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Náhľad odznaku", "details.change_icon": "Zmeniť ikonu", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/sl/groups.json b/public/language/sl/groups.json index 0e1291951d..c911313994 100644 --- a/public/language/sl/groups.json +++ b/public/language/sl/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Število članov", "details.creation_date": "Datum nastanka", "details.description": "Opis skupine", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Predogled značke", "details.change_icon": "Zamenjaj ikono", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/sr/groups.json b/public/language/sr/groups.json index b0dc8097cf..94698635ff 100644 --- a/public/language/sr/groups.json +++ b/public/language/sr/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Број чланова", "details.creation_date": "Датум настанка", "details.description": "Опис", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Приказ беџа", "details.change_icon": "Промени икону", "details.change_label_colour": "Промени боју ознаке", diff --git a/public/language/sv/groups.json b/public/language/sv/groups.json index ba34743a8e..338272ecc3 100644 --- a/public/language/sv/groups.json +++ b/public/language/sv/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Medlemsantal", "details.creation_date": "Skapardatum", "details.description": "Beskrivning", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Förhandsgranskning av märke", "details.change_icon": "Byt ikon", "details.change_label_colour": "Ändra etikettfärg", diff --git a/public/language/th/groups.json b/public/language/th/groups.json index 6488e3f794..4ebfe74b71 100644 --- a/public/language/th/groups.json +++ b/public/language/th/groups.json @@ -35,6 +35,8 @@ "details.member_count": "จำนวนสมาชิก", "details.creation_date": "สร้างวันที่", "details.description": "คำอธิบาย", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "สัญลักษณ์พรีวิว", "details.change_icon": "เปลี่ยนไอคอน", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 6e9c6e15be..89ec68c3fb 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Üye Sayısı", "details.creation_date": "Oluşturulma Tarihi", "details.description": "Tanımlama", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Rozet Önizlemesi", "details.change_icon": "İkonu Değiştir", "details.change_label_colour": "Etiket Rengini Değiştir", diff --git a/public/language/uk/groups.json b/public/language/uk/groups.json index 2254fbac27..9d6a75c26e 100644 --- a/public/language/uk/groups.json +++ b/public/language/uk/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Кількість учасників", "details.creation_date": "Дата створення", "details.description": "Опис", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Попередній перегляд бейджа", "details.change_icon": "Змінити іконку", "details.change_label_colour": "Змінити колір позначки", diff --git a/public/language/vi/groups.json b/public/language/vi/groups.json index 8e69824345..88f53aab9c 100644 --- a/public/language/vi/groups.json +++ b/public/language/vi/groups.json @@ -35,6 +35,8 @@ "details.member_count": "Số thành viên", "details.creation_date": "Ngày mở nhóm", "details.description": "Miêu tả", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "Xem thử huy hiệu", "details.change_icon": "Đổi icon", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/zh-CN/groups.json b/public/language/zh-CN/groups.json index 43d50b8d8b..393ad49d9f 100644 --- a/public/language/zh-CN/groups.json +++ b/public/language/zh-CN/groups.json @@ -35,6 +35,8 @@ "details.member_count": "群组成员数", "details.creation_date": "创建时间", "details.description": "描述", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "徽章预览", "details.change_icon": "更改图标", "details.change_label_colour": "更改标签颜色", diff --git a/public/language/zh-TW/groups.json b/public/language/zh-TW/groups.json index 9681dfeb14..d09a7d1739 100644 --- a/public/language/zh-TW/groups.json +++ b/public/language/zh-TW/groups.json @@ -35,6 +35,8 @@ "details.member_count": "群組成員數", "details.creation_date": "建立時間", "details.description": "描述", + "details.member-post-cids": "Categories to display posts from", + "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", "details.badge_preview": "徽章預覽", "details.change_icon": "更改圖示", "details.change_label_colour": "更改標籤顏色", From 29c2ca94f417c52d67fef97bb34111669ba911c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 14 Nov 2020 13:14:34 -0500 Subject: [PATCH 22/67] feat: add nodejs version to issue template --- .github/ISSUE_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9614d0ea21..166f0b20b1 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -9,6 +9,7 @@ - **NodeBB version:** - **NodeBB git hash:** +- **NodeJS version:** - **Installed NodeBB Plugins:** From f14e42d8bc81ba7511215c119c990f4bbb57d026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 14 Nov 2020 19:56:01 -0500 Subject: [PATCH 23/67] fix: #8883 --- src/controllers/helpers.js | 2 +- src/controllers/write/users.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index cf07d469cb..8bbe2ffe1a 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -144,7 +144,7 @@ helpers.notAllowed = async function (req, res, error) { }; helpers.redirect = function (res, url, permanent) { - if (res.locals.isAPI && !url.startsWith('/api/v3/')) { + if (res.locals.isAPI) { res.set('X-Redirect', encodeURI(url)).status(200).json(url); } else { res.redirect(permanent ? 308 : 307, relative_path + encodeURI(url)); diff --git a/src/controllers/write/users.js b/src/controllers/write/users.js index 61bfc8827e..72f10dbfb0 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -1,6 +1,7 @@ 'use strict'; const util = require('util'); +const nconf = require('nconf'); const db = require('../../database'); const api = require('../../api'); @@ -25,7 +26,7 @@ Users.redirectBySlug = async (req, res) => { if (uid) { const path = req.path.split('/').slice(3).join('/'); - helpers.redirect(res, `/api/v3/users/${uid}/${path}`, true); + res.redirect(308, nconf.get('relative_path') + encodeURI(`/api/v3/users/${uid}/${path}`)); } else { helpers.formatApiResponse(404, res); } From 5598130a920f0e5c67b9fdcfdc5beee6a505324c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 14 Nov 2020 20:18:47 -0500 Subject: [PATCH 24/67] refactor: async/await controllers/index.js --- src/controllers/index.js | 89 ++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 285ac8d78b..51e866a051 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -40,7 +40,7 @@ Controllers.composer = require('./composer'); Controllers.write = require('./write'); -Controllers.reset = function (req, res, next) { +Controllers.reset = async function (req, res) { if (meta.config['password:disableEdit']) { return helpers.notAllowed(req, res); } @@ -78,14 +78,9 @@ Controllers.reset = function (req, res, next) { if (req.session.reset_code) { // Validate and save to local variable before removing from session - user.reset.validate(req.session.reset_code, function (err, valid) { - if (err) { - return next(err); - } - - renderReset(req.session.reset_code, valid); - delete req.session.reset_code; - }); + const valid = await user.reset.validate(req.session.reset_code); + renderReset(req.session.reset_code, valid); + delete req.session.reset_code; } else { res.render('reset', { code: null, @@ -97,14 +92,14 @@ Controllers.reset = function (req, res, next) { } }; -Controllers.login = function (req, res, next) { - var data = { loginFormEntry: [] }; - var loginStrategies = require('../routes/authentication').getLoginStrategies(); - var registrationType = meta.config.registrationType || 'normal'; - var allowLoginWith = (meta.config.allowLoginWith || 'username-email'); - var returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url') + nconf.get('relative_path'), ''); +Controllers.login = async function (req, res) { + const data = { loginFormEntry: [] }; + const loginStrategies = require('../routes/authentication').getLoginStrategies(); + const registrationType = meta.config.registrationType || 'normal'; + const allowLoginWith = (meta.config.allowLoginWith || 'username-email'); + const returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url') + nconf.get('relative_path'), ''); - var errorText; + let errorText; if (req.query.error === 'csrf-invalid') { errorText = '[[error:csrf-invalid]]'; } else if (req.query.error) { @@ -126,33 +121,24 @@ Controllers.login = function (req, res, next) { data.title = '[[pages:login]]'; data.allowPasswordReset = !meta.config['password:disableEdit']; - privileges.global.canGroup('local:login', 'registered-users', function (err, hasLoginPrivilege) { - if (err) { - return next(err); - } + const hasLoginPrivilege = await privileges.global.canGroup('local:login', 'registered-users'); + data.allowLocalLogin = hasLoginPrivilege || parseInt(req.query.local, 10) === 1; - data.allowLocalLogin = hasLoginPrivilege || parseInt(req.query.local, 10) === 1; - if (!data.allowLocalLogin && !data.allowRegistration && data.alternate_logins && data.authentication.length === 1) { - if (res.locals.isAPI) { - return helpers.redirect(res, { - external: nconf.get('relative_path') + data.authentication[0].url, - }); - } - return res.redirect(nconf.get('relative_path') + data.authentication[0].url); - } - if (req.loggedIn) { - user.getUserFields(req.uid, ['username', 'email'], function (err, user) { - if (err) { - return next(err); - } - data.username = allowLoginWith === 'email' ? user.email : user.username; - data.alternate_logins = false; - res.render('login', data); + if (!data.allowLocalLogin && !data.allowRegistration && data.alternate_logins && data.authentication.length === 1) { + if (res.locals.isAPI) { + return helpers.redirect(res, { + external: nconf.get('relative_path') + data.authentication[0].url, }); - } else { - res.render('login', data); } - }); + return res.redirect(nconf.get('relative_path') + data.authentication[0].url); + } + + if (req.loggedIn) { + const userData = await user.getUserFields(req.uid, ['username', 'email']); + data.username = allowLoginWith === 'email' ? userData.email : userData.username; + data.alternate_logins = false; + } + res.render('login', data); }; Controllers.register = async function (req, res, next) { @@ -246,8 +232,8 @@ Controllers.robots = function (req, res) { } }; -Controllers.manifest = function (req, res, next) { - var manifest = { +Controllers.manifest = async function (req, res) { + const manifest = { name: meta.config.title || 'NodeBB', short_name: meta.config['title:short'] || meta.config.title || 'NodeBB', start_url: nconf.get('url'), @@ -312,18 +298,21 @@ Controllers.manifest = function (req, res, next) { }); } - plugins.fireHook('filter:manifest.build', { req: req, res: res, manifest: manifest }, function (err, data) { - if (err) { - return next(err); - } - res.status(200).json(data.manifest); + const data = await plugins.fireHook('filter:manifest.build', { + req: req, + res: res, + manifest: manifest, }); + res.status(200).json(data.manifest); }; Controllers.outgoing = function (req, res, next) { - var url = req.query.url || ''; - 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); + const url = req.query.url || ''; + const allowedProtocols = [ + 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', + 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', + ]; + const parsed = require('url').parse(url); if (!url || !parsed.protocol || !allowedProtocols.includes(parsed.protocol.slice(0, -1))) { return next(); From 03329408b743bd639741e1e10ee0bb0e0b79fe28 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 15 Nov 2020 09:06:46 +0000 Subject: [PATCH 25/67] Latest translations and fallbacks --- public/language/bg/admin/menu.json | 2 +- public/language/bg/groups.json | 4 ++-- public/language/it/admin/menu.json | 2 +- public/language/it/admin/settings/user.json | 6 +++--- public/language/it/error.json | 2 +- public/language/it/groups.json | 4 ++-- public/language/it/register.json | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/language/bg/admin/menu.json b/public/language/bg/admin/menu.json index 9a254f3436..76362c2c21 100644 --- a/public/language/bg/admin/menu.json +++ b/public/language/bg/admin/menu.json @@ -31,7 +31,7 @@ "settings/pagination": "Странициране", "settings/tags": "Етикети", "settings/notifications": "Известия", - "settings/api": "API Access", + "settings/api": "Достъп чрез ППИ", "settings/sounds": "Звуци", "settings/social": "Обществени", "settings/cookies": "Бисквитки", diff --git a/public/language/bg/groups.json b/public/language/bg/groups.json index 6fca1b281d..3aa1e669cf 100644 --- a/public/language/bg/groups.json +++ b/public/language/bg/groups.json @@ -35,8 +35,8 @@ "details.member_count": "Брой на членовете", "details.creation_date": "Дата на създаване", "details.description": "Описание", - "details.member-post-cids": "Categories to display posts from", - "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", + "details.member-post-cids": "Категории, от които да се показват публикации", + "details.member-post-cids-help": "Забележка: Ако не изберете нито една категория, ще се смята, че са включени всички категории. Използвайте CTRL и SHIFT, за да изберете няколко възможности.", "details.badge_preview": "Преглед на емблемата", "details.change_icon": "Промяна на иконката", "details.change_label_colour": "Промяна на цвета на етикета", diff --git a/public/language/it/admin/menu.json b/public/language/it/admin/menu.json index 752af02af1..0a87a19465 100644 --- a/public/language/it/admin/menu.json +++ b/public/language/it/admin/menu.json @@ -31,7 +31,7 @@ "settings/pagination": "Paginazione", "settings/tags": "Tabs", "settings/notifications": "Notifiche", - "settings/api": "API Access", + "settings/api": "Accesso API", "settings/sounds": "Suoni", "settings/social": "Social", "settings/cookies": "Cookies", diff --git a/public/language/it/admin/settings/user.json b/public/language/it/admin/settings/user.json index 0125b07722..b29dc030e6 100644 --- a/public/language/it/admin/settings/user.json +++ b/public/language/it/admin/settings/user.json @@ -43,9 +43,9 @@ "registration-type.disabled": "Niente registrazione", "registration-type.help": "Normale: gli utenti possono registrarsi dalla pagina/di registrazione.
\nSolo invito: gli utenti possono invitare altri dalla pagina utenti.
\nSolo su invito amministratore: solo gli amministratori possono invitare altri utenti edalle pagine amministratore/gestione/utenti.
\nNessuna registrazione - Nessuna registrazione dell'utente.
", "registration-approval-type.help": "Normale: gli utenti vengono registrati immediatamente.
\nApprovazione amministratore - Le registrazioni degli utenti vengono inserite in una coda di approvazione per amministratori.
\nApprovazione amministratore per IP - Normale per i nuovi utenti, Approvazione amministratore per indirizzi IP che dispongono già di un account.
", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", - "registration-queue-show-average-time": "Show users average time it takes to approve a new user", + "registration-queue-auto-approve-time": "Tempo di approvazione automatico", + "registration-queue-auto-approve-time-help": "Ore prima che l'utente venga approvato automaticamente. 0 per disabilitare.", + "registration-queue-show-average-time": "Mostra agli utenti il tempo medio necessario per approvare un nuovo utente", "registration.max-invites": "Numero massimo di inviti per Utente", "max-invites": "Numero massimo di inviti per Utente", "max-invites-help": "0 per nessuna restrizione. Gli amministratori ricevono infiniti inviti
Applicabile solo per \"Solo invito\"", diff --git a/public/language/it/error.json b/public/language/it/error.json index 10d8d3780d..724ae2806e 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -103,7 +103,7 @@ "group-not-member": "Non è membro di questo gruppo", "group-needs-owner": "Questo gruppo richiede almeno un proprietario.", "group-already-invited": "Questo utente è già stato invitato", - "group-already-requested": "La tua richiesta di partecipazione è già stata inviata", + "group-already-requested": "La tua richiesta di iscrizione è già stata inviata", "group-join-disabled": "Non sei in grado di iscriverti a questo gruppo in questo momento", "group-leave-disabled": "Non sei in grado di lasciare questo gruppo in questo momento.", "post-already-deleted": "Questo post è già stato eliminato", diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 8482ec1405..afa767294c 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -35,8 +35,8 @@ "details.member_count": "Numero Membri", "details.creation_date": "Data Creazione", "details.description": "Descrizione", - "details.member-post-cids": "Categories to display posts from", - "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", + "details.member-post-cids": "Categorie da cui visualizzare i post", + "details.member-post-cids-help": "Nota: Se non si seleziona alcuna categoria, tutte le categorie saranno incluse. Utilizza ctrl e shift per selezionare più opzioni.", "details.badge_preview": "Anteprima Badge", "details.change_icon": "Cambia Icona", "details.change_label_colour": "Cambia colore etichetta", diff --git a/public/language/it/register.json b/public/language/it/register.json index ca01f1867f..99dbb37a46 100644 --- a/public/language/it/register.json +++ b/public/language/it/register.json @@ -18,8 +18,8 @@ "agree_to_terms_of_use": "Accetto i Termini di Utilizzo", "terms_of_use_error": "Devi accettare i Termini d'Utilizzo", "registration-added-to-queue": "La tua registrazione è stata aggiunta alla coda di approvazione. Riceverai un'email quando sarà accettata da un amministratore.", - "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", - "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", + "registration-queue-average-time": "Il nostro tempo medio per l'approvazione delle iscrizioni è di %1 ore %2 minuti.", + "registration-queue-auto-approve-time": "La tua iscrizione a questo forum sarà completamente attivata entro un massimo di %1 ore.", "interstitial.intro": "Abbiamo bisogno di alcune informazioni aggiuntive prima di poter creare il tuo account.", "interstitial.errors-found": "Non abbiamo potuto completare la tua registrazione:", "gdpr_agree_data": "Acconsento alla raccolta e al trattamento dei miei dati personali su questo sito web.", From 9dac9630df03e888fdb576ca0346d9ff3e116af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 15 Nov 2020 10:36:30 -0500 Subject: [PATCH 26/67] fix: check tid in event handlers client side --- public/src/client/topic/events.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index 6db44e7050..bb42e1e026 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -96,7 +96,7 @@ define('forum/topic/events', [ } function onPostEdited(data) { - if (!data || !data.post) { + if (!data || !data.post || parseInt(data.post.tid, 10) !== parseInt(ajaxify.data.tid, 10)) { return; } var editedPostEl = components.get('post/content', data.post.pid).filter(function (index, el) { @@ -174,6 +174,9 @@ define('forum/topic/events', [ } function onPostPurged(postData) { + if (!postData || parseInt(postData.tid, 10) !== parseInt(ajaxify.data.tid, 10)) { + return; + } components.get('post', 'pid', postData.pid).fadeOut(500, function () { $(this).remove(); posts.showBottomPostBar(); From e4d2764d4cc838d2d11c550a34f1810816ea0f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 15 Nov 2020 16:43:06 -0500 Subject: [PATCH 27/67] fix: #8884, remove header/footer cache --- src/controllers/admin/cache.js | 3 --- src/middleware/render.js | 43 +++++------------------------- src/socket.io/admin/cache.js | 3 --- src/views/admin/advanced/cache.tpl | 34 +++-------------------- test/mocks/databasemock.js | 1 - 5 files changed, 11 insertions(+), 73 deletions(-) diff --git a/src/controllers/admin/cache.js b/src/controllers/admin/cache.js index fadec76338..840ff65efa 100644 --- a/src/controllers/admin/cache.js +++ b/src/controllers/admin/cache.js @@ -9,7 +9,6 @@ cacheController.get = function (req, res) { const groupCache = require('../../groups').cache; const objectCache = require('../../database').objectCache; const localCache = require('../../cache'); - const headerFooterCache = require('../../middleware').headerFooterCache; function getInfo(cache) { return { @@ -28,7 +27,6 @@ cacheController.get = function (req, res) { postCache: getInfo(postCache), groupCache: getInfo(groupCache), localCache: getInfo(localCache), - headerFooterCache: getInfo(headerFooterCache), }; if (objectCache) { @@ -44,7 +42,6 @@ cacheController.dump = function (req, res, next) { object: require('../../database').objectCache, group: require('../../groups').cache, local: require('../../cache'), - headerfooter: require('../../middleware').headerFooterCache, }; if (!caches[req.query.name]) { return next(); diff --git a/src/middleware/render.js b/src/middleware/render.js index 05950e13c0..44a0689c0b 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -10,19 +10,10 @@ const translator = require('../translator'); const widgets = require('../widgets'); const utils = require('../utils'); const slugify = require('../slugify'); -const cacheCreate = require('../cacheCreate'); -const cache = cacheCreate({ - name: 'header-footer', - max: 1000, - maxAge: 0, - enabled: global.env === 'production', -}); const relative_path = nconf.get('relative_path'); module.exports = function (middleware) { - middleware.headerFooterCache = cache; - middleware.processRender = function processRender(req, res, next) { // res.render post-processing, modified from here: https://gist.github.com/mrlannigan/5051687 const render = res.render; @@ -104,34 +95,14 @@ module.exports = function (middleware) { async function renderHeaderFooter(method, req, res, options) { let str = ''; - const lang = getLang(req, res); - function getCacheKey() { - return [lang, method] - .concat(req.path.split('/').slice(0, 4)) - .join('/'); + if (res.locals.renderHeader) { + str = await middleware[method](req, res, options); + } else if (res.locals.renderAdminHeader) { + str = await middleware.admin[method](req, res, options); + } else { + str = ''; } - let cacheKey; - if (req.uid === 0 && res.locals.renderHeader) { - cacheKey = getCacheKey(); - str = cache.get(cacheKey); - if (str) { - return str; - } - } - if (!str) { - if (res.locals.renderHeader) { - str = await middleware[method](req, res, options); - } else if (res.locals.renderAdminHeader) { - str = await middleware.admin[method](req, res, options); - } else { - str = ''; - } - } - const translated = await translate(str, lang); - if (req.uid === 0 && res.locals.renderHeader) { - cache.set(cacheKey, translated, 300000); - } - return translated; + return await translate(str, getLang(req, res)); } function getLang(req, res) { diff --git a/src/socket.io/admin/cache.js b/src/socket.io/admin/cache.js index de16f8faaf..534cefeac8 100644 --- a/src/socket.io/admin/cache.js +++ b/src/socket.io/admin/cache.js @@ -11,8 +11,6 @@ SocketCache.clear = async function (socket, data) { require('../../groups').cache.reset(); } else if (data.name === 'local') { require('../../cache').reset(); - } else if (data.name === 'headerfooter') { - require('../../middleware').headerFooterCache.reset(); } }; @@ -22,7 +20,6 @@ SocketCache.toggle = async function (socket, data) { object: require('../../database').objectCache, group: require('../../groups').cache, local: require('../../cache'), - headerfooter: require('../../middleware').headerFooterCache, }; if (!caches[data.name]) { return; diff --git a/src/views/admin/advanced/cache.tpl b/src/views/admin/advanced/cache.tpl index 32b7371fdb..46205e5fef 100644 --- a/src/views/admin/advanced/cache.tpl +++ b/src/views/admin/advanced/cache.tpl @@ -2,7 +2,7 @@
-
+
[[admin/advanced/cache:post-cache]]
@@ -37,7 +37,7 @@
-
+
Object Cache
@@ -63,7 +63,7 @@
-
+
Group Cache
@@ -89,7 +89,7 @@
-
+
Local Cache
@@ -114,32 +114,6 @@
- -
-
-
Header Footer Cache
-
-
- -
- {headerFooterCache.length} / {headerFooterCache.max}
- -
-
- [[admin/advanced/cache:percent-full, {headerFooterCache.percentFull}]] -
-
- - {headerFooterCache.hits}
- {headerFooterCache.misses}
- {headerFooterCache.hitRatio}
- - -
-
-
diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index 30f69f7954..9d4b7e5fda 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -173,7 +173,6 @@ async function setupMockDefaults() { require('../../src/groups').cache.reset(); require('../../src/posts/cache').reset(); require('../../src/cache').reset(); - require('../../src/middleware').headerFooterCache.reset(); winston.info('test_database flushed'); await setupDefaultConfigs(meta); From 2f4653a3cc286e2cefe9d3f94d983e9bd700eb29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 15 Nov 2020 16:50:24 -0500 Subject: [PATCH 28/67] fix: spec --- public/openapi/read/admin/advanced/cache.yaml | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/public/openapi/read/admin/advanced/cache.yaml b/public/openapi/read/admin/advanced/cache.yaml index e642ed0071..06d7890971 100644 --- a/public/openapi/read/admin/advanced/cache.yaml +++ b/public/openapi/read/admin/advanced/cache.yaml @@ -88,28 +88,8 @@ get: type: string enabled: type: boolean - headerFooterCache: - type: object - properties: - length: - type: number - max: - type: number - itemCount: - type: number - percentFull: - type: number - hits: - type: string - misses: - type: string - hitRatio: - type: string - enabled: - type: boolean required: - postCache - groupCache - localCache - - headerFooterCache - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file From ce9cf2a5450b60ab18231616721534c95bb7c3de Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 16 Nov 2020 09:11:10 +0000 Subject: [PATCH 29/67] Latest translations and fallbacks --- .../language/he/admin/advanced/database.json | 2 +- public/language/he/admin/manage/digest.json | 2 +- public/language/he/admin/menu.json | 2 +- public/language/he/category.json | 12 ++--- public/language/he/email.json | 4 +- public/language/he/error.json | 8 ++-- public/language/he/flags.json | 44 +++++++++---------- public/language/he/global.json | 16 +++---- public/language/he/groups.json | 8 ++-- public/language/he/ip-blacklist.json | 24 +++++----- public/language/he/modules.json | 24 +++++----- public/language/he/pages.json | 18 ++++---- public/language/he/post-queue.json | 18 ++++---- public/language/he/topic.json | 2 +- public/language/he/user.json | 24 +++++----- 15 files changed, 104 insertions(+), 104 deletions(-) diff --git a/public/language/he/admin/advanced/database.json b/public/language/he/admin/advanced/database.json index 50389867f6..356a4cd919 100644 --- a/public/language/he/admin/advanced/database.json +++ b/public/language/he/admin/advanced/database.json @@ -22,7 +22,7 @@ "mongo.bytes-out": "ביטים יוצאים", "mongo.num-requests": "מספר בקשות", "mongo.raw-info": "מידע לא מעובד מMongoDB", - "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", + "mongo.unauthorized": "NodeBB לא הצליחה לקבל את המידע הדרוש מMongoDB. אנא בדוק שלמשתמש יש הרשאת clusterMonitor לadmin database.", "redis": "Redis", "redis.version": "גרסת Redis", diff --git a/public/language/he/admin/manage/digest.json b/public/language/he/admin/manage/digest.json index 8f3661698a..b31b01077a 100644 --- a/public/language/he/admin/manage/digest.json +++ b/public/language/he/admin/manage/digest.json @@ -3,7 +3,7 @@ "disclaimer": "Please be advised that email delivery is not guaranteed, due to the nature of email technology. Many variables factor into whether an email sent to the recipient server is ultimately delivered into the user's inbox, including server reputation, blacklisted IP addresses, and whether DKIM/SPF/DMARC is configured.", "disclaimer-continued": "A successful delivery means the message was sent successfully by NodeBB and acknowledged by the recipient server. It does not mean the email landed in the inbox. For best results, we recommend using a third-party email delivery service such as SendGrid.", - "user": "User", + "user": "משתמש", "subscription": "Subscription Type", "last-delivery": "Last successful delivery", "default": "System default", diff --git a/public/language/he/admin/menu.json b/public/language/he/admin/menu.json index 6d6ce17c9d..cb952484e6 100644 --- a/public/language/he/admin/menu.json +++ b/public/language/he/admin/menu.json @@ -43,7 +43,7 @@ "section-appearance": "Appearance", "appearance/themes": "Themes", - "appearance/skins": "Skins", + "appearance/skins": "עיצובים", "appearance/customise": "Custom Content (HTML/JS/CSS)", "section-extend": "Extend", diff --git a/public/language/he/category.json b/public/language/he/category.json index e81f13ec8a..2c5322e81d 100644 --- a/public/language/he/category.json +++ b/public/language/he/category.json @@ -12,11 +12,11 @@ "watching": "עוקב", "not-watching": "לא עוקב", "ignoring": "מתעלם", - "watching.description": "Show topics in unread and recent", - "not-watching.description": "Do not show topics in unread, show in recent", - "ignoring.description": "Do not show topics in unread and recent", - "watching.message": "You are now watching updates from this category and all subcategories", - "notwatching.message": "You are not watching updates from this category and all subcategories", - "ignoring.message": "You are now ignoring updates from this category and all subcategories", + "watching.description": "הצג נושאים בנושאים שלא נקראו ובנושאים אחרונים", + "not-watching.description": "הסתר בנושאים שלא נקראו, הצג בנושאים אחרונים", + "ignoring.description": "הסתר נושאים בנושאים שלא נקראו ובנושאים אחרונים", + "watching.message": "אתה כעת עוקב אחר עדכונים בקטגוריה זו וכל תת-הקטגוריות", + "notwatching.message": "אתה כעת לא עוקב מעדכונים בקטגוריה זו וכל תת-הקטגוריות", + "ignoring.message": "אתה כעת מתעלם מעדכונים בקטגוריה זו וכל תת-הקטגוריות", "watched-categories": "קטגוריות נעקבות" } \ No newline at end of file diff --git a/public/language/he/email.json b/public/language/he/email.json index aaa3743083..9e1e4c93a0 100644 --- a/public/language/he/email.json +++ b/public/language/he/email.json @@ -1,5 +1,5 @@ { - "test-email.subject": "Test Email", + "test-email.subject": "מייל בדיקה", "password-reset-requested": "נדרש איפוס סיסמה!", "welcome-to": "ברוכים הבאים ל%1", "invite": "הזמנה מ%1", @@ -13,7 +13,7 @@ "welcome.cta": "לחץ כאן על מנת לאשר את כתובת המייל שלך.", "invitation.text1": "%1 הזמין אותך להצתרף ל%2", "invitation.text2": "ההזמנה של תפוג ב %1 ימים", - "invitation.cta": "Click here to create your account.", + "invitation.cta": "לחץ כאן ליצירת החשבון שלך.", "reset.text1": "קיבלנו בקשה לאפס את הסיסמה לחשבון שלך, כנראה מפני ששכחת אותה. אם לא ביקשת לאפס את הסיסמה, אנא התעלם ממייל זה.", "reset.text2": "על מנת להמשיך עם תהליך איפוס הסיסמה, אנא לחץ על הלינק הבא:", "reset.cta": "לחץ כאן לאפס את הסיסמה שלך.", diff --git a/public/language/he/error.json b/public/language/he/error.json index c203e844bf..1e8bd386d3 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -11,9 +11,9 @@ "invalid-uid": "זהוי משתמש שגוי", "invalid-username": "שם משתמש שגוי", "invalid-email": "אימייל שגוי", - "invalid-fullname": "Invalid Fullname", - "invalid-location": "Invalid Location", - "invalid-birthday": "Invalid Birthday", + "invalid-fullname": "שם מלא לא תקין", + "invalid-location": "מקום לא תקין", + "invalid-birthday": "יום הולדת לא תקין", "invalid-title": "שגיאה בכותרת", "invalid-user-data": "מידע משתמש שגוי", "invalid-password": "סיסמא שגויה", @@ -26,7 +26,7 @@ "invalid-pagination-value": "ערך דף לא חוקי, חייב להיות לפחות %1 ולא מעל %2", "username-taken": "שם משתמש תפוס", "email-taken": "כתובת אימייל תפוסה", - "email-invited": "Email was already invited", + "email-invited": "כבר נשלחה הזמנה למייל זה", "email-not-confirmed": "אין באפשרותך לפרסם עד אישור הודעת הדוא\"ל שלך, לחץ כאן כדי לאשר את הדוא\"ל שלך.", "email-not-confirmed-chat": "אין באפשרותך לשוחח עד שהדוא\"ל שלך יאושר, אנא לחץ כאן כדי לאשר את הדוא\"ל שלך.", "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", diff --git a/public/language/he/flags.json b/public/language/he/flags.json index 7246e9b52a..021ea96562 100644 --- a/public/language/he/flags.json +++ b/public/language/he/flags.json @@ -1,14 +1,14 @@ { "state": "מצב", - "reports": "Reports", - "first-reported": "First Reported", + "reports": "דוחות", + "first-reported": "דווח ראשון", "no-flags": "מופלטה! לא נמצאו סימונים.", "assignee": "מוקצה", "update": "עדכון", "updated": "עודכן", "target-purged": "התוכן שסומן נוקה ולא קיים יותר.", - "graph-label": "Daily Flags", + "graph-label": "דיווחים יומיים", "quick-filters": "סינון מהיר", "filter-active": "קיים סנן אחד או יותר ברשימת הסימונים הזו", "filter-reset": "הסר סינון", @@ -25,17 +25,17 @@ "filter-quick-mine": "הוקצה עבורי", "filter-cid-all": "כל הקטגוריות", "apply-filters": "הפעל סינון", - "more-filters": "More Filters", + "more-filters": "מסננים נוספים", "quick-actions": "פעולות מהירות", "flagged-user": "משתמש מסומן", "view-profile": "צפה בפרופיל", "start-new-chat": "התחל שיחה חדשה", "go-to-target": "צפה במטרת הסימון", - "assign-to-me": "Assign To Me", - "delete-post": "Delete Post", - "purge-post": "Purge Post", - "restore-post": "Restore Post", + "assign-to-me": "הקצה עבורי", + "delete-post": "מחק פוסט", + "purge-post": "מחק לצמיתות", + "restore-post": "שחזור פוסט", "user-view": "צפה בפרופיל", "user-edit": "ערוך פרופיל", @@ -43,11 +43,11 @@ "notes": "הערות הסימון", "add-note": "הוסף הערה", "no-notes": "אין הערות", - "delete-note-confirm": "Are you sure you want to delete this flag note?", + "delete-note-confirm": "האם אתה בטוח שאתה רוצה למחוק את ההערה הזו?", "note-added": "נוספה הערה", - "note-deleted": "Note Deleted", + "note-deleted": "ההערה נמחקה", - "history": "Account & Flag History", + "history": "היסטוריית הסימונים למשתמש", "no-history": "אין הסיטוריית סימונים", "state-all": "כל המצבים", @@ -57,15 +57,15 @@ "state-rejected": "נדחה", "no-assignee": "לא הוקצה", - "sort": "Sort by", - "sort-newest": "Newest first", - "sort-oldest": "Oldest first", - "sort-reports": "Most reports", - "sort-all": "All flag types...", - "sort-posts-only": "Posts only...", - "sort-downvotes": "Most downvotes", - "sort-upvotes": "Most upvotes", - "sort-replies": "Most replies", + "sort": "סדר על-פי", + "sort-newest": "החדש ראשון", + "sort-oldest": "הישן ראשון", + "sort-reports": "הכי הרבה דיווחים", + "sort-all": "כל סוגי הדיווחים", + "sort-posts-only": "פוסטים בלבד", + "sort-downvotes": "הכי הרבה הצבעות נגד", + "sort-upvotes": "הכי הרבה הצבעות", + "sort-replies": "הכי הרבה תגובות", "modal-title": "דווח על תוכן לא ראוי", "modal-body": "אנא ציין את הסיבה לסימון %1 %2 לצורך בקרה. לחלופין, השתמש באחד מכפתורי הדיווח המהיר אם אפשר.", @@ -80,6 +80,6 @@ "modal-submit-confirm-text-help": "שליחת דיווח מהיר תבטל כל סיבה קודמת שהוגדרה.", "bulk-actions": "Bulk Actions", - "bulk-resolve": "Resolve Flag(s)", - "bulk-success": "%1 flags updated" + "bulk-resolve": "השלם דיווחים", + "bulk-success": "%1 דיווחים עודכנו" } \ No newline at end of file diff --git a/public/language/he/global.json b/public/language/he/global.json index 15ec27764b..420512a741 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -30,7 +30,7 @@ "header.unread": "לא נקרא", "header.tags": "תגיות", "header.popular": "פופולרי", - "header.top": "Top", + "header.top": "הכי הרבה הצבעות", "header.users": "משתמשים", "header.groups": "קבוצות", "header.chats": "צ'אטים", @@ -52,20 +52,20 @@ "users": "משתמשים", "topics": "נושאים", "posts": "פוסטים", - "x-posts": "%1 posts", + "x-posts": "%1 פוסטים", "best": "הגבוה ביותר", "votes": "הצבעות", - "x-votes": "%1 votes", - "voters": "Voters", + "x-votes": "%1 הצבעות", + "voters": "מצביעים", "upvoters": "מצביעי בעד", "upvoted": "הוצבע בעד", "downvoters": "מצביעי נגד", "downvoted": "הוצבע נגד", "views": "צפיות", - "posters": "Posters", + "posters": "יוצרי הפוסטים", "reputation": "מוניטין", - "lastpost": "Last post", - "firstpost": "First post", + "lastpost": "פוסט אחרון", + "firstpost": "פוסט ראשון", "read_more": "קרא עוד", "more": "עוד", "posted_ago_by_guest": "הפוסט הועלה ב %1 על ידי אורח", @@ -92,7 +92,7 @@ "language": "שפה", "guest": "אורח", "guests": "אורחים", - "former_user": "A Former User", + "former_user": "משתמש שנמחק", "updated.title": "הפורום עודכן", "updated.message": "הפורום עודכן לגרסא האחרונה. נא ללחוץ כאן לעדכון הדף.", "privacy": "פרטיות", diff --git a/public/language/he/groups.json b/public/language/he/groups.json index b070cb04ed..bece06c44a 100644 --- a/public/language/he/groups.json +++ b/public/language/he/groups.json @@ -25,18 +25,18 @@ "details.latest_posts": "פוסטים אחרונים", "details.private": "פרטי", "details.disableJoinRequests": "בטל בקשות הצטרפות", - "details.disableLeave": "Disallow users from leaving the group", + "details.disableLeave": "אל תאפשר למשתמשים לעזוב את הקבוצה", "details.grant": "הענק/בטל בעלות", "details.kick": "גרש", "details.kick_confirm": "האם אתה בטוח שאתה רוצה להסיר משתמש זה מהקבוצה?", - "details.add-member": "Add Member", + "details.add-member": "הוסף משתמש", "details.owner_options": "ניהול הקבוצה", "details.group_name": "שם הקבוצה", "details.member_count": "כמות משתמשים", "details.creation_date": "תאריך יצירה", "details.description": "תיאור", - "details.member-post-cids": "Categories to display posts from", - "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", + "details.member-post-cids": "קטגוריות שמהם יוצגו פוסטים", + "details.member-post-cids-help": "הערה: אי בחירת קטגוריה תכלול את כל הקטגוריות. השתמש ב-ctrl ו-shift כדי לבחור אפשרויות מרובות.", "details.badge_preview": "תצוגה מקדימה של הסמל", "details.change_icon": "שנה אייקון", "details.change_label_colour": "Change Label Colour", diff --git a/public/language/he/ip-blacklist.json b/public/language/he/ip-blacklist.json index 588fbd62b6..5f1b6a2ffe 100644 --- a/public/language/he/ip-blacklist.json +++ b/public/language/he/ip-blacklist.json @@ -1,19 +1,19 @@ { - "lead": "Configure your IP blacklist here.", + "lead": "רשימת IP שחורה", "description": "Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and they will be prevented from logging in to or registering a new account.", - "active-rules": "Active Rules", - "validate": "Validate Blacklist", - "apply": "Apply Blacklist", - "hints": "Syntax Hints", - "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", - "hint-2": "You can add in comments by starting lines with the # symbol.", + "active-rules": "כללים פעילים", + "validate": "בדיקת רשימה", + "apply": "החל רשימה", + "hints": "עזרה בתחביר", + "hint-1": "כתוב כתובת IP אחת בשורה. ניתן להוסיף טווחי IP בפורמט CIDR (לדוגמא 192.168.100.0/22).", + "hint-2": "ניתן להוסיף הערות באמצעות התחלת השורה ב#.", - "validate.x-valid": "%1 out of %2 rule(s) valid.", - "validate.x-invalid": "The following %1 rules are invalid:", + "validate.x-valid": "%1 מתוך %2 כלל(ים) תקינים.", + "validate.x-invalid": "%1 הכללים הבאים לא תקינים: ", - "alerts.applied-success": "Blacklist Applied", + "alerts.applied-success": "הרשימה השחורה נשמרה", - "analytics.blacklist-hourly": "Figure 1 – Blacklist hits per hour", + "analytics.blacklist-hourly": "Figure 1 – כתובות נחסמו ביחס לשעה.", "analytics.blacklist-daily": "Figure 2 – Blacklist hits per day", - "ip-banned": "IP banned" + "ip-banned": "כתובת הIP הורחקה." } \ No newline at end of file diff --git a/public/language/he/modules.json b/public/language/he/modules.json index fe73d18039..8b6b19cb55 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -1,7 +1,7 @@ { "chat.chatting_with": "לשוחח עם", "chat.placeholder": "הקלד את הודעת הצ'אט כאן, לחץ אנטר לשליחה", - "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", + "chat.scroll-up-alert": "אתה מסתכל על הודעות ישנות. לחץ כאן למעבר להודעה האחרונה.", "chat.send": "שלח", "chat.no_active": "אין לך צ'אטים פעילים", "chat.user_typing": "%1 מקליד ...", @@ -13,7 +13,7 @@ "chat.recent-chats": "צ'אטים אחרונים", "chat.contacts": "אנשי קשר", "chat.message-history": "היסטוריית הודעות", - "chat.message-deleted": "Message Deleted", + "chat.message-deleted": "ההודעה נמחקה", "chat.options": "אפשרויות לשיחה", "chat.pop-out": "הוצא את חלון הצ'אט", "chat.minimize": "צמצם", @@ -24,21 +24,21 @@ "chat.delete_message_confirm": "האם אתה בטוח שברצונך למחוק הודעה זו?", "chat.retrieving-users": "שולף משתמשים", "chat.manage-room": "נהל חדר צ'אט", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "חפש משתמשים כאן. כאשר משתמש נבחר, הוא יצורף לצ'אט. המשתמש החדש לא יוכל לראות הודעות שנכתבו לפני הצטרפותו. רק מנהלי החדר () יכולים להסיר משתמשים מהצ'אט.", "chat.confirm-chat-with-dnd-user": "משתמש זה שינה את הסטטוס שלו ל 'לא להפריע'. אתה עדיין מעוניין לשוחח איתו?", - "chat.rename-room": "Rename Room", + "chat.rename-room": "שנה שם של חדר", "chat.rename-placeholder": "הזן את שם החדר שלך כאן", "chat.rename-help": "שם החדר המוגדר כאן יהיה זמין לכל המשתתפים בחדר.", "chat.leave": "עזוב שיחה", "chat.leave-prompt": "האם אתה בטוח שאתה רוצה לעזוב את השיחה הזו?", "chat.leave-help": "עזיבת צ'אט זה תסיר אותך מהתכתבות עתידית בצ'אט זה. אם תתווסף מחדש בעתיד, לא תראה כל היסטוריית צ'אט שלפני הצטרפותך מחדש.", "chat.in-room": "בתוך החדר הזה", - "chat.kick": "Kick", - "chat.show-ip": "Show IP", - "chat.owner": "Room Owner", - "chat.system.user-join": "%1 has joined the room", - "chat.system.user-leave": "%1 has left the room", - "chat.system.room-rename": "%2 has renamed this room: %1", + "chat.kick": "גרש", + "chat.show-ip": "הצג IP", + "chat.owner": "מנהל החדר", + "chat.system.user-join": "%1 נרשם לחדר", + "chat.system.user-leave": "%1 יצא מהחדר", + "chat.system.room-rename": "%2 שינה את שם החדר: %1", "composer.compose": "צור", "composer.show_preview": "הצג תצוגה מקדימה", "composer.hide_preview": "הסתר תצוגה מקדימה", @@ -52,14 +52,14 @@ "composer.formatting.italic": "נטוי", "composer.formatting.list": "רשימה", "composer.formatting.strikethrough": "קו פוסל", - "composer.formatting.code": "Code", + "composer.formatting.code": "קוד", "composer.formatting.link": "לינק", "composer.formatting.picture": "תמונה", "composer.upload-picture": "העלה תמונה", "composer.upload-file": "העלה קובץ", "composer.zen_mode": "מצב זן", "composer.select_category": "בחר קטגוריה", - "composer.textarea.placeholder": "Enter your post content here, drag and drop images", + "composer.textarea.placeholder": "כתוב את תוכן הפוסט כאן. ניתן לגרור לכאן תמונות.", "bootbox.ok": "אוקיי", "bootbox.cancel": "בטל", "bootbox.confirm": "אשר", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index c4692d99fd..3bd6a50b59 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -6,10 +6,10 @@ "popular-month": "נושאים חמים החודש", "popular-alltime": "הנושאים החמים בכל הזמנים", "recent": "נושאים אחרונים", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "הנושאים הנבחרים ביותר היום", + "top-week": "הנושאים הנבחרים ביותר השבוע", + "top-month": "הנושאים הנבחרים ביותר החודש", + "top-alltime": "הנושאים הנבחרים ביותר", "moderator-tools": "כלי מודרטור", "flagged-content": "תוכן מדווח", "ip-blacklist": "רשימת IP שחורה", @@ -43,10 +43,10 @@ "account/following": "אנשים ש%1 עוקב אחריהם", "account/followers": "אנשים שעוקבים אחרי %1", "account/posts": "הודעות שפורסמו על ידי %1", - "account/latest-posts": "Latest posts made by %1", + "account/latest-posts": "פוסטים אחרונים שנוצרו על ידי %1", "account/topics": "נושאים שנוצרו על ידי %1", "account/groups": "הקבוצות של %1", - "account/watched_categories": "%1's Watched Categories", + "account/watched_categories": "הקטגוריות ש-%1 עוקב אחריהם", "account/bookmarks": "הפוסטים השמורים של %1", "account/settings": "הגדרות משתמש", "account/watched": "נושאים שנצפו על ידי %1", @@ -54,9 +54,9 @@ "account/upvoted": "פוסטים שהוצבעו לטובה על ידי %1", "account/downvoted": "פוסטים שהוצבעו לרעה על ידי %1", "account/best": "הפוסטים הטובים ביותר שנוצרו על ידי %1", - "account/blocks": "Blocked users for %1", - "account/uploads": "Uploads by %1", - "account/sessions": "Login Sessions", + "account/blocks": "המשתמשים ש-%1 חסם", + "account/uploads": "העלאות של %1", + "account/sessions": "סשני התחברות", "confirm": "כתובת המייל אושרה", "maintenance.text": "%1 כרגע תחת עבודות תחזוקה. אנא חזור בזמן מאוחר יותר.", "maintenance.messageIntro": "בנוסף, המנהל השאיר את ההודעה הזו:", diff --git a/public/language/he/post-queue.json b/public/language/he/post-queue.json index 2742e3a7af..1aef0f967d 100644 --- a/public/language/he/post-queue.json +++ b/public/language/he/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 → Post Queue 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/he/topic.json b/public/language/he/topic.json index 267e9dfed6..4b882bf540 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -79,7 +79,7 @@ "thread_tools.purge_confirm": "אתה בטוח שאתה רוצה למחוק את הנושא הזה?", "thread_tools.merge_topics": "מזג נושאים", "thread_tools.merge": "מזג", - "topic_move_success": "This topic will be moved to \"%1\" shortly. Click here to undo.", + "topic_move_success": "נושא זה יועבר ל\"%1\" בקרוב. לחץ כאן לבטל.", "topic_move_multiple_success": "These topics will be moved to \"%1\" shortly. Click here to undo.", "topic_move_all_success": "All topics will be moved to \"%1\" shortly. Click here to undo.", "topic_move_undone": "Topic move undone", diff --git a/public/language/he/user.json b/public/language/he/user.json index 4152424ca1..66211b571a 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -14,14 +14,14 @@ "unban_account": "בטל את הרחקת החשבון", "delete_account": "מחק חשבון", "delete_account_as_admin": "מחק חשבון", - "delete_content": "Delete Account Content", - "delete_all": "Delete Account and Content", + "delete_content": "מחק תוכן חשבון", + "delete_all": "מחק חשבון ותוכן", "delete_account_confirm": "Are you sure you want to anonymize your posts and delete your account?
This action is irreversible and you will not be able to recover any of your data

Enter your password to confirm that you wish to destroy this account.", "delete_this_account_confirm": "Are you sure you want to delete this account while leaving its contents behind?
This action is irreversible, posts will be anonymized, and you will not be able to restore post associations with the deleted account

", "delete_account_content_confirm": "Are you sure you want to delete this account's content (posts/topics/uploads)?
This action is irreversible and you will not be able to recover any data

", "delete_all_confirm": "Are you sure you want to delete this account and all of its content (posts/topics/uploads)?
This action is irreversible and you will not be able to recover any data

", "account-deleted": "החשבון נמחק", - "account-content-deleted": "Account content deleted", + "account-content-deleted": "תוכן החשבון נמחק", "fullname": "שם מלא", "website": "אתר", "location": "מיקום", @@ -40,7 +40,7 @@ "followers": "עוקבים", "following": "עוקב אחרי", "blocks": "חסימות", - "block_toggle": "Toggle Block", + "block_toggle": " חסום/בטל חסימה", "block_user": "חסום משתמש", "unblock_user": "בטל חסימת משתמש", "aboutme": "אודותי", @@ -57,7 +57,7 @@ "change_picture": "שנה תמונה", "change_username": "שנה שם משתמש", "change_email": "שנה מייל", - "email_same_as_password": "Please enter your current password to continue – you've entered your new email again", + "email_same_as_password": "אנא כתוב את הסיסמא הנוכחית שלך כדי להמשיך – כתבת את כתובת המייל החדשה במקום.", "edit": "ערוך", "edit-profile": "ערוך פרופיל", "default_picture": "אייקון ברירת מחדל", @@ -111,10 +111,10 @@ "posts_per_page": "כמות פוסטים בעמוד", "max_items_per_page": "מקסימום %1", "acp_language": "שפת עמוד המנהל", - "notifications": "Notifications", + "notifications": "התראות", "upvote-notif-freq": "תדירות התראת הצבעה חיובית", "upvote-notif-freq.all": "כל ההצבעות החיוביות", - "upvote-notif-freq.first": "First Per Post", + "upvote-notif-freq.first": "הראשון לפוסט", "upvote-notif-freq.everyTen": "כל 10 הצבעות חיוביות", "upvote-notif-freq.threshold": "ב-1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "ב10, 100, 1000...", @@ -146,7 +146,7 @@ "info.ban-history": "היסטוריית הרחקות", "info.no-ban-history": "משתמש זה מעולם לא הורחק", "info.banned-until": "הורחק עד %1", - "info.banned-expiry": "Expiry", + "info.banned-expiry": "פג תוקף", "info.banned-permanently": "הורחק לצמיתות", "info.banned-reason-label": "סיבה", "info.banned-no-reason": "לא ניתנה סיבה.", @@ -173,10 +173,10 @@ "consent.right_to_erasure_description": "בכל עת תוכל לבטל את הסכמתך לאיסוף נתונים ו / או עיבודם על ידי מחיקת חשבונך. מחיקת הפרופיל שלך לא תגרום למחיקת התוכנים שפרסמת. על מנת למחוק את חשבונך ואת התוכן המקושר לו צור קשר עם צוות הניהול של האתר.", "consent.right_to_data_portability": "זכותך לניוד הנתונים", "consent.right_to_data_portability_description": "באפרותך לבקש ייצוא של כל הנתונים שנאספו מחשבונך אודותיך. תוכל לעשות זאת על ידי לחיצה על הלחצן המתאים מטה.", - "consent.export_profile": "Export Profile (.json)", - "consent.export-profile-success": "Exporting profile, you will get a notification when it is complete.", + "consent.export_profile": "יצוא פרופיל (.json)", + "consent.export-profile-success": "ייצוא הפרופיל מתבצע כעת. תקבל התראה כאשר הייצוא יסתיים.", "consent.export_uploads": "יצוא תוכן שהועלה (ZIP.)", - "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", + "consent.export-uploads-success": "ייצוא ההעלאות מתבצע כעת. תקבל התראה כאשר הייצוא יסתיים.", "consent.export_posts": "יצוא פוסטים (CVS.)", - "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete." + "consent.export-posts-success": "ייצוא הפוסטים מתבצע כעת. תקבל התראה כאשר הייצוא יסתיים." } \ No newline at end of file From d1e804aa610a38ca441350d8cb136eab9e693f45 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Nov 2020 08:07:08 +0000 Subject: [PATCH 30/67] fix(deps): update dependency benchpressjs to v2.2.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 151200b897..91a0f9c63f 100644 --- a/install/package.json +++ b/install/package.json @@ -41,7 +41,7 @@ "async": "^3.2.0", "autoprefixer": "^10.0.0", "bcryptjs": "2.4.3", - "benchpressjs": "2.1.0", + "benchpressjs": "2.2.2", "body-parser": "^1.19.0", "bootbox": "4.4.0", "bootstrap": "^3.4.1", From 996174a18718f71787446c1fe220920f2119e6d6 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 16 Nov 2020 14:49:07 +0000 Subject: [PATCH 31/67] chore: incrementing version number - v1.15.2-beta.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 91a0f9c63f..0aef3768d8 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.15.1", + "version": "1.15.2-beta.0", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 452d7f2b17867991d16f18d2dce1ddf300f6c3ea Mon Sep 17 00:00:00 2001 From: Tudor-Dan Ravoiu Date: Mon, 16 Nov 2020 17:10:28 +0200 Subject: [PATCH 32/67] Create verified/unverified user groups (#8889) Co-authored-by: Tudor-Dan Ravoiu --- src/meta/settings.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/meta/settings.js b/src/meta/settings.js index 76db1d41aa..eb8b87890a 100644 --- a/src/meta/settings.js +++ b/src/meta/settings.js @@ -85,6 +85,8 @@ Settings.set = async function (hash, values, quiet) { await db.setObject('settings:' + hash, values); } + cache.del('settings:' + hash); + plugins.fireHook('action:settings.set', { plugin: hash, settings: values, @@ -92,7 +94,6 @@ Settings.set = async function (hash, values, quiet) { pubsub.publish('action:settings.set.' + hash, values); Meta.reloadRequired = !quiet; - cache.del('settings:' + hash); }; Settings.setOne = async function (hash, field, value) { From 0a0b4661be917ef0161905929abfe7f4cebbdc61 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 16 Nov 2020 10:19:23 -0500 Subject: [PATCH 33/67] chore: remove debug log --- test/mocks/databasemock.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index 9d4b7e5fda..f8b57517f7 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -118,7 +118,6 @@ before(async function () { // Parse out the relative_url and other goodies from the configured URL const urlObject = url.parse(nconf.get('url')); nconf.set('url_parsed', urlObject); - console.log('stting urlparsed'); nconf.set('base_url', urlObject.protocol + '//' + urlObject.host); nconf.set('secure', urlObject.protocol === 'https:'); nconf.set('use_port', !!urlObject.port); From 20c05e80e44a256b26fdd003b86ced028473dc94 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 16 Nov 2020 15:21:11 +0000 Subject: [PATCH 34/67] chore: incrementing version number - v1.15.2-beta.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 0aef3768d8..0f62dea692 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.15.2-beta.0", + "version": "1.15.2-beta.1", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From b63b7ae5d75e40372b03ee92b0ffa2c07fde3827 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Nov 2020 15:36:35 +0000 Subject: [PATCH 35/67] fix(deps): update dependency json2csv to v5.0.5 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 0f62dea692..bda1031cb0 100644 --- a/install/package.json +++ b/install/package.json @@ -77,7 +77,7 @@ "jquery-serializeobject": "1.0.0", "jquery-ui": "1.12.1", "jsesc": "3.0.2", - "json2csv": "5.0.4", + "json2csv": "5.0.5", "jsonwebtoken": "^8.5.1", "less": "^3.11.1", "lodash": "^4.17.15", From d30ea25629a787c010401d07a646d124e91ecd7e Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Mon, 16 Nov 2020 09:55:24 -0700 Subject: [PATCH 36/67] feat(deps): benchpressjs@2.2.1 (#8887) Better warnings, faster template compiles --- install/web.js | 2 +- src/emailer.js | 4 +--- src/meta/templates.js | 6 ++---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/install/web.js b/install/web.js index 715b90a766..6589d8bc5a 100644 --- a/install/web.js +++ b/install/web.js @@ -240,7 +240,7 @@ async function compileTemplate() { const source = await fs.promises.readFile(sourceFile, 'utf8'); const [compiled] = await Promise.all([ - Benchpress.precompile(source), + Benchpress.precompile(source, { filename: 'install/index.tpl' }), mkdirp(path.dirname(destJs)), ]); diff --git a/src/emailer.js b/src/emailer.js index ac8abc9a14..9a5d67e07d 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -81,9 +81,7 @@ const buildCustomTemplates = async (config) => { await Promise.all(templatesToBuild.map(async (template) => { const source = await meta.templates.processImports(paths, template.path, template.text); - const compiled = await Benchpress.precompile(source, { - minify: global.env !== 'development', - }); + const compiled = await Benchpress.precompile(source, { filename: template.path }); await fs.promises.writeFile(template.fullpath.replace(/\.tpl$/, '.js'), compiled); })); diff --git a/src/meta/templates.js b/src/meta/templates.js index 16f7f23119..3ec9e03930 100644 --- a/src/meta/templates.js +++ b/src/meta/templates.js @@ -111,9 +111,7 @@ async function compileTemplate(filename, source) { })); source = await processImports(paths, filename, source); - const compiled = await Benchpress.precompile(source, { - minify: process.env.NODE_ENV !== 'development', - }); + const compiled = await Benchpress.precompile(source, { filename }); return await fs.promises.writeFile(path.join(viewsPath, filename.replace(/\.tpl$/, '.js')), compiled); } Templates.compileTemplate = compileTemplate; @@ -136,7 +134,7 @@ async function compile() { await mkdirp(path.join(viewsPath, path.dirname(name))); await fs.promises.writeFile(path.join(viewsPath, name), imported); - const compiled = await Benchpress.precompile(imported, { minify: process.env.NODE_ENV !== 'development' }); + const compiled = await Benchpress.precompile(imported, { filename: name }); await fs.promises.writeFile(path.join(viewsPath, name.replace(/\.tpl$/, '.js')), compiled); })); From dde9f1890f97f6bafebed9d3939082fd4e20e873 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Nov 2020 17:12:42 +0000 Subject: [PATCH 37/67] fix(deps): update dependency nodebb-plugin-mentions to v2.13.5 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index bda1031cb0..cd4d1f925d 100644 --- a/install/package.json +++ b/install/package.json @@ -98,7 +98,7 @@ "nodebb-plugin-emoji": "^3.3.0", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.12.1", - "nodebb-plugin-mentions": "2.13.4", + "nodebb-plugin-mentions": "2.13.5", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.7.6", "nodebb-rewards-essentials": "0.1.4", From 3ccebf112e1dd02eaa54904198cd8a08c34850b3 Mon Sep 17 00:00:00 2001 From: gasoved Date: Mon, 16 Nov 2020 22:47:23 +0300 Subject: [PATCH 38/67] feat: invites regardless of registration type, invite privilege, groups to join on acceptance (#8786) * feat: allow invites in normal registration mode + invite privilege * feat: select groups to join from an invite * test: check if groups from invitations have been joined * fix: remove unused variable * feat: write API versions of socket calls * docs: openapi specs for the new routes * test: iron out mongo redis difference * refactor: move inviteGroups endpoint into write API * refactor: use GET /api/v3/users/:uid/invites/groups Instead of GET /api/v3/users/:uid/inviteGroups * fix: no need for /api/v3 prefix when using api module * fix: tests * refactor: change POST /api/v3/users/invite To POST /api/v3/users/:uid/invites * refactor: make helpers.invite awaitable * fix: restrict invite API to self-use only * fix: move invite groups controller to write api, +tests * fix: tests Co-authored-by: Julian Lam --- .../en-GB/admin/manage/privileges.json | 1 + public/language/en-GB/users.json | 1 + public/openapi/read/admin/manage/users.yaml | 2 + public/openapi/write.yaml | 4 + public/openapi/write/users/uid/invites.yaml | 48 ++ .../write/users/uid/invites/groups.yaml | 23 + public/src/admin/manage/users.js | 63 ++- public/src/client/users.js | 62 ++- src/controllers/admin/users.js | 13 +- src/controllers/authentication.js | 8 +- src/controllers/users.js | 15 +- src/controllers/write/users.js | 60 ++- src/groups/user.js | 30 ++ src/privileges/global.js | 2 + src/privileges/users.js | 9 + src/routes/write/users.js | 3 + src/socket.io/user.js | 33 -- src/user/invite.js | 76 ++- src/views/admin/manage/users.tpl | 4 +- src/views/modals/invite.tpl | 12 + test/categories.js | 2 + test/helpers/index.js | 17 + test/user.js | 457 +++++++++++++----- 23 files changed, 725 insertions(+), 220 deletions(-) create mode 100644 public/openapi/write/users/uid/invites.yaml create mode 100644 public/openapi/write/users/uid/invites/groups.yaml create mode 100644 src/views/modals/invite.tpl diff --git a/public/language/en-GB/admin/manage/privileges.json b/public/language/en-GB/admin/manage/privileges.json index ac83a28a93..3b24b1cc3e 100644 --- a/public/language/en-GB/admin/manage/privileges.json +++ b/public/language/en-GB/admin/manage/privileges.json @@ -9,6 +9,7 @@ "upload-files": "Upload Files", "signature": "Signature", "ban": "Ban", + "invite": "Invite", "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", diff --git a/public/language/en-GB/users.json b/public/language/en-GB/users.json index 18cf03fde3..87c7d1b4fc 100644 --- a/public/language/en-GB/users.json +++ b/public/language/en-GB/users.json @@ -11,6 +11,7 @@ "online-only": "Online only", "invite": "Invite", "prompt-email": "Emails:", + "groups-to-join": "Groups to be joined when invite is accepted:", "invitation-email-sent": "An invitation email has been sent to %1", "user_list": "User List", "recent_topics": "Recent Topics", diff --git a/public/openapi/read/admin/manage/users.yaml b/public/openapi/read/admin/manage/users.yaml index 4b47e5f112..c3278c007b 100644 --- a/public/openapi/read/admin/manage/users.yaml +++ b/public/openapi/read/admin/manage/users.yaml @@ -27,6 +27,8 @@ get: type: string sort_lastonline: type: boolean + showInviteButton: + type: boolean inviteOnly: type: boolean adminInviteOnly: diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index c3396ea4ad..b4afa1fcbc 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -44,6 +44,10 @@ paths: $ref: 'write/users/uid/tokens/token.yaml' /users/{uid}/sessions/{uuid}: $ref: 'write/users/uid/sessions/uuid.yaml' + /users/{uid}/invites: + $ref: 'write/users/uid/invites.yaml' + /users/{uid}/invites/groups: + $ref: 'write/users/uid/invites/groups.yaml' /categories/: $ref: 'write/categories.yaml' /groups/: diff --git a/public/openapi/write/users/uid/invites.yaml b/public/openapi/write/users/uid/invites.yaml new file mode 100644 index 0000000000..9fd3596296 --- /dev/null +++ b/public/openapi/write/users/uid/invites.yaml @@ -0,0 +1,48 @@ +post: + tags: + - users + summary: invite users with email by email + description: This operation sends an invitation email to the given addresses, with an option to join selected groups on acceptance + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user sending invitations + example: 1 + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + emails: + type: string + description: A single or list of comma separated email addresses + example: friend01@example.com,friend02@example.com + groupsToJoin: + type: array + description: A collection of group names + example: ['administrators'] + required: + - emails + responses: + '200': + description: invitation email(s) sent + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + '400': + $ref: ../../../components/responses/400.yaml#/400 + '401': + $ref: ../../../components/responses/401.yaml#/401 + '403': + $ref: ../../../components/responses/403.yaml#/403 \ No newline at end of file diff --git a/public/openapi/write/users/uid/invites/groups.yaml b/public/openapi/write/users/uid/invites/groups.yaml new file mode 100644 index 0000000000..5683db658d --- /dev/null +++ b/public/openapi/write/users/uid/invites/groups.yaml @@ -0,0 +1,23 @@ +get: + tags: + - users + summary: Get group names that the user can invite + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to make the query for + example: 1 + responses: + '200': + description: A collection of group names returned + content: + application/json: + schema: + type: array + items: + type: string + '401': + $ref: ../../../../components/responses/401.yaml#/401 \ No newline at end of file diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index fbdd42f846..38ab5f88e5 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -1,8 +1,8 @@ 'use strict'; define('admin/manage/users', [ - 'translator', 'benchpress', 'autocomplete', 'api', 'slugify', -], function (translator, Benchpress, autocomplete, api, slugify) { + 'translator', 'benchpress', 'autocomplete', 'api', 'slugify', 'bootbox', +], function (translator, Benchpress, autocomplete, api, slugify, bootbox) { var Users = {}; Users.init = function () { @@ -454,20 +454,55 @@ define('admin/manage/users', [ } function handleInvite() { - $('[component="user/invite"]').on('click', function () { - bootbox.prompt('[[admin/manage/users:alerts.prompt-email]]', function (email) { - if (!email) { - return; - } - - socket.emit('user.invite', email, function (err) { - if (err) { - return app.alertError(err.message); - } - app.alertSuccess('[[admin/manage/users:alerts.email-sent-to, ' + email + ']]'); + $('[component="user/invite"]').on('click', function (e) { + e.preventDefault(); + api.get(`/api/v3/users/${app.user.uid}/invites/groups`, {}).then((groups) => { + Benchpress.parse('modals/invite', { groups: groups }, function (html) { + bootbox.dialog({ + message: html, + title: '[[admin/manage/users:invite]]', + onEscape: true, + buttons: { + cancel: { + label: '[[admin/manage/users:alerts.button-cancel]]', + className: 'btn-default', + }, + invite: { + label: '[[admin/manage/users:invite]]', + className: 'btn-primary', + callback: sendInvites, + }, + }, + }); }); + }).catch((err) => { + app.alertError(err.message); }); - return false; + }); + } + + function sendInvites() { + var $emails = $('#invite-modal-emails'); + var $groups = $('#invite-modal-groups'); + + var data = { + emails: $emails.val() + .split(',') + .map(m => m.trim()) + .filter(Boolean) + .filter((m, i, arr) => i === arr.indexOf(m)) + .join(','), + groupsToJoin: $groups.val(), + }; + + if (!data.emails) { + return; + } + + api.post(`/users/${app.user.uid}/invites`, data).then(() => { + app.alertSuccess('[[admin/manage/users:alerts.email-sent-to, ' + data.emails.replace(/,/g, ', ') + ']]'); + }).catch((err) => { + app.alertError(err.message); }); } diff --git a/public/src/client/users.js b/public/src/client/users.js index 859d0e686b..70f8783b9c 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -2,8 +2,8 @@ define('forum/users', [ - 'translator', 'benchpress', 'api', -], function (translator, Benchpress, api) { + 'translator', 'benchpress', 'api', 'bootbox', +], function (translator, Benchpress, api, bootbox) { var Users = {}; var searchTimeoutID = 0; @@ -136,21 +136,57 @@ define('forum/users', [ } function handleInvite() { - $('[component="user/invite"]').on('click', function () { - bootbox.prompt('[[users:prompt-email]]', function (email) { - if (!email) { - return; - } - - socket.emit('user.invite', email, function (err) { - if (err) { - return app.alertError(err.message); - } - app.alertSuccess('[[users:invitation-email-sent, ' + email + ']]'); + $('[component="user/invite"]').on('click', function (e) { + e.preventDefault(); + api.get(`/api/v3/users/${app.user.uid}/invites/groups`, {}).then((groups) => { + Benchpress.parse('modals/invite', { groups: groups }, function (html) { + bootbox.dialog({ + message: html, + title: '[[users:invite]]', + onEscape: true, + buttons: { + cancel: { + label: '[[modules:bootbox.cancel]]', + className: 'btn-default', + }, + invite: { + label: '[[users:invite]]', + className: 'btn-primary', + callback: sendInvites, + }, + }, + }); }); + }).catch((err) => { + app.alertError(err.message); }); }); } + function sendInvites() { + var $emails = $('#invite-modal-emails'); + var $groups = $('#invite-modal-groups'); + + var data = { + emails: $emails.val() + .split(',') + .map(m => m.trim()) + .filter(Boolean) + .filter((m, i, arr) => i === arr.indexOf(m)) + .join(','), + groupsToJoin: $groups.val(), + }; + + if (!data.emails) { + return; + } + + api.post(`/users/${app.user.uid}/invites`, data).then(() => { + app.alertSuccess('[[users:invitation-email-sent, ' + data.emails.replace(/,/g, ', ') + ']]'); + }).catch((err) => { + app.alertError(err.message); + }); + } + return Users; }); diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 3acd0cd808..2397de158d 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -9,6 +9,7 @@ const db = require('../../database'); const pagination = require('../../pagination'); const events = require('../../events'); const plugins = require('../../plugins'); +const privileges = require('../../privileges'); const utils = require('../../utils'); const usersController = module.exports; @@ -115,7 +116,7 @@ async function getUsers(req, res) { getUsersWithFields(set), ]); - render(req, res, { + await render(req, res, { users: users.filter(user => user && parseInt(user.uid, 10)), page: page, pageCount: Math.max(1, Math.ceil(count / resultsPerPage)), @@ -176,7 +177,7 @@ usersController.search = async function (req, res) { searchData.resultsPerPage = resultsPerPage; searchData.sortBy = req.query.sortBy; searchData.reverse = reverse; - render(req, res, searchData); + await render(req, res, searchData); }; usersController.registrationQueue = async function (req, res) { @@ -226,7 +227,7 @@ async function getInvites() { return invitations; } -function render(req, res, data) { +async function render(req, res, data) { data.pagination = pagination.create(data.page, data.pageCount, req.query); const registrationType = meta.config.registrationType; @@ -241,6 +242,12 @@ function render(req, res, data) { filterBy.forEach(function (filter) { data['filterBy_' + validator.escape(String(filter))] = true; }); + + data.showInviteButton = await privileges.users.hasInvitePrivilege(req.uid); + if (data.adminInviteOnly) { + data.showInviteButton = await privileges.users.isAdministrator(req.uid); + } + res.render('admin/manage/users', data); } diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 2bf8f59d2f..7d52e76082 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -55,7 +55,11 @@ async function registerAndLoginUser(req, res, userData) { await authenticationController.doLogin(req, uid); } - user.deleteInvitationKey(userData.email); + // Distinguish registrations through invites from direct ones + if (userData.token) { + await user.joinGroupsFromInvitation(uid, userData.email); + } + await user.deleteInvitationKey(userData.email); const referrer = req.body.referrer || req.session.referrer || nconf.get('relative_path') + '/'; const complete = await plugins.fireHook('filter:register.complete', { uid: uid, referrer: referrer }); req.session.returnTo = complete.referrer; @@ -74,7 +78,7 @@ authenticationController.register = async function (req, res) { const userData = req.body; try { - if (registrationType === 'invite-only' || registrationType === 'admin-invite-only') { + if (userData.token || registrationType === 'invite-only' || registrationType === 'admin-invite-only') { await user.verifyInvitation(userData); } diff --git a/src/controllers/users.js b/src/controllers/users.js index eef5b9c0e5..17d10fd517 100644 --- a/src/controllers/users.js +++ b/src/controllers/users.js @@ -96,7 +96,7 @@ async function renderIfAdminOrGlobalMod(set, req, res) { usersController.renderUsersPage = async function (set, req, res) { const userData = await usersController.getUsers(set, req.uid, req.query); - render(req, res, userData); + await render(req, res, userData); }; usersController.getUsers = async function (set, uid, query) { @@ -171,10 +171,15 @@ async function render(req, res, data) { data.inviteOnly = registrationType === 'invite-only' || registrationType === 'admin-invite-only'; data.adminInviteOnly = registrationType === 'admin-invite-only'; data.invites = await user.getInvitesNumber(req.uid); - data.showInviteButton = req.loggedIn && ( - (registrationType === 'invite-only' && (data.isAdmin || !data.maximumInvites || data.invites < data.maximumInvites)) || - (registrationType === 'admin-invite-only' && data.isAdmin) - ); + + data.showInviteButton = false; + if (data.adminInviteOnly) { + data.showInviteButton = await privileges.users.isAdministrator(req.uid); + } else if (req.loggedIn) { + const canInvite = await privileges.users.hasInvitePrivilege(req.uid); + data.showInviteButton = canInvite && (!data.maximumInvites || data.invites < data.maximumInvites); + } + data['reputation:disabled'] = meta.config['reputation:disabled']; res.append('X-Total-Count', data.userCount); diff --git a/src/controllers/write/users.js b/src/controllers/write/users.js index 72f10dbfb0..fe9004b757 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -5,9 +5,10 @@ const nconf = require('nconf'); const db = require('../../database'); const api = require('../../api'); -const user = require('../../user'); +const groups = require('../../groups'); const meta = require('../../meta'); const privileges = require('../../privileges'); +const user = require('../../user'); const utils = require('../../utils'); const helpers = require('../helpers'); @@ -153,3 +154,60 @@ Users.revokeSession = async (req, res) => { await user.auth.revokeSession(_id, req.params.uid); helpers.formatApiResponse(200, res); }; + +Users.invite = async (req, res) => { + const { emails, groupsToJoin = [] } = req.body; + + if (!emails || !Array.isArray(groupsToJoin)) { + return helpers.formatApiResponse(400, res, new Error('[[error:invalid-data]]')); + } + + // For simplicity, this API route is restricted to self-use only. This can change if needed. + if (parseInt(req.user.uid, 10) !== parseInt(req.params.uid, 10)) { + return helpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); + } + + const canInvite = await privileges.users.hasInvitePrivilege(req.uid); + if (!canInvite) { + return helpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); + } + + const registrationType = meta.config.registrationType; + const isAdmin = await user.isAdministrator(req.uid); + if (registrationType === 'admin-invite-only' && !isAdmin) { + return helpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); + } + + const inviteGroups = await groups.getUserInviteGroups(req.uid); + const cannotInvite = groupsToJoin.some(group => !inviteGroups.includes(group)); + if (groupsToJoin.length > 0 && cannotInvite) { + return helpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); + } + + const max = meta.config.maximumInvites; + const emailsArr = emails.split(',').map(email => email.trim()).filter(Boolean); + + for (const email of emailsArr) { + /* eslint-disable no-await-in-loop */ + let invites = 0; + if (max) { + invites = await user.getInvitesNumber(req.uid); + } + if (!isAdmin && max && invites >= max) { + return helpers.formatApiResponse(403, res, new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); + } + + await user.sendInvitationEmail(req.uid, email, groupsToJoin); + } + + return helpers.formatApiResponse(200, res); +}; + +Users.getInviteGroups = async function (req, res) { + if (parseInt(req.params.uid, 10) !== parseInt(req.user.uid, 10)) { + return helpers.formatApiResponse(401, res); + } + + const userInviteGroups = await groups.getUserInviteGroups(req.params.uid); + return helpers.formatApiResponse(200, res, userInviteGroups); +}; diff --git a/src/groups/user.js b/src/groups/user.js index 4cb01ce9e2..5255adff1a 100644 --- a/src/groups/user.js +++ b/src/groups/user.js @@ -31,4 +31,34 @@ module.exports = function (Groups) { const isMembers = await Groups.isMemberOfGroups(uid, groupNames); return groupNames.filter((name, i) => isMembers[i]); } + + Groups.getUserInviteGroups = async function (uid) { + let allGroups = await Groups.getNonPrivilegeGroups('groups:createtime', 0, -1); + allGroups = allGroups.filter(group => !Groups.ephemeralGroups.includes(group.name)); + + const publicGroups = allGroups.filter(group => group.hidden === 0 && group.system === 0 && group.private === 0); + const adminModGroups = [{ name: 'administrators' }, { name: 'Global Moderators' }]; + // Private (but not hidden) + const privateGroups = allGroups.filter(group => group.hidden === 0 && group.system === 0 && group.private === 1); + + const [ownership, isAdmin, isGlobalMod] = await Promise.all([ + Promise.all(privateGroups.map(group => Groups.ownership.isOwner(uid, group.name))), + user.isAdministrator(uid), + user.isGlobalModerator(uid), + ]); + const ownGroups = privateGroups.filter((group, index) => ownership[index]); + + let inviteGroups = []; + if (isAdmin) { + inviteGroups = inviteGroups.concat(adminModGroups).concat(privateGroups); + } else if (isGlobalMod) { + inviteGroups = inviteGroups.concat(privateGroups); + } else { + inviteGroups = inviteGroups.concat(ownGroups); + } + + return inviteGroups + .concat(publicGroups) + .map(group => group.name); + }; }; diff --git a/src/privileges/global.js b/src/privileges/global.js index 8a11e8a71a..3585a432cc 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -18,6 +18,7 @@ module.exports = function (privileges) { { name: '[[admin/manage/privileges:upload-files]]' }, { name: '[[admin/manage/privileges:signature]]' }, { name: '[[admin/manage/privileges:ban]]' }, + { name: '[[admin/manage/privileges:invite]]' }, { name: '[[admin/manage/privileges:search-content]]' }, { name: '[[admin/manage/privileges:search-users]]' }, { name: '[[admin/manage/privileges:search-tags]]' }, @@ -35,6 +36,7 @@ module.exports = function (privileges) { 'upload:post:file', 'signature', 'ban', + 'invite', 'search:content', 'search:users', 'search:tags', diff --git a/src/privileges/users.js b/src/privileges/users.js index 2f43ceca13..c2bd64777a 100644 --- a/src/privileges/users.js +++ b/src/privileges/users.js @@ -115,4 +115,13 @@ module.exports = function (privileges) { }); return data.canBan; }; + + privileges.users.hasInvitePrivilege = async function (uid) { + const canInvite = await privileges.global.can('invite', uid); + const data = await plugins.fireHook('filter:user.hasInvitePrivilege', { + uid: uid, + canInvite: canInvite, + }); + return data.canInvite; + }; }; diff --git a/src/routes/write/users.js b/src/routes/write/users.js index 4edca5d4a6..02b1629a89 100644 --- a/src/routes/write/users.js +++ b/src/routes/write/users.js @@ -39,6 +39,9 @@ function authenticatedRoutes() { // Shorthand route to access user routes by userslug router.all('/+bySlug/:userslug*?', [], controllers.write.users.redirectBySlug); + + setupApiRoute(router, 'post', '/:uid/invites', middlewares, controllers.write.users.invite); + setupApiRoute(router, 'get', '/:uid/invites/groups', [...middlewares, middleware.assert.user], controllers.write.users.getInviteGroups); } module.exports = function () { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index cc39126d8a..d4e65748af 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -1,7 +1,5 @@ 'use strict'; -const async = require('async'); - const util = require('util'); const sleep = util.promisify(setTimeout); @@ -223,37 +221,6 @@ SocketUser.getUnreadCounts = async function (socket) { return results; }; -SocketUser.invite = async function (socket, email) { - if (!email || !socket.uid) { - throw new Error('[[error:invalid-data]]'); - } - - const registrationType = meta.config.registrationType; - if (registrationType !== 'invite-only' && registrationType !== 'admin-invite-only') { - throw new Error('[[error:forum-not-invite-only]]'); - } - - const isAdmin = await user.isAdministrator(socket.uid); - if (registrationType === 'admin-invite-only' && !isAdmin) { - throw new Error('[[error:no-privileges]]'); - } - - const max = meta.config.maximumInvites; - email = email.split(',').map(email => email.trim()).filter(Boolean); - - await async.eachSeries(email, async function (email) { - let invites = 0; - if (max) { - invites = await user.getInvitesNumber(socket.uid); - } - if (!isAdmin && max && invites >= max) { - throw new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]'); - } - - await user.sendInvitationEmail(socket.uid, email); - }); -}; - SocketUser.getUserByUID = async function (socket, uid) { return await userController.getUserDataByField(socket.uid, 'uid', uid); }; diff --git a/src/user/invite.js b/src/user/invite.js index 82471d8b28..4c20eab70a 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -8,6 +8,7 @@ var validator = require('validator'); var db = require('../database'); var meta = require('../meta'); var emailer = require('../emailer'); +var groups = require('../groups'); var translator = require('../translator'); var utils = require('../utils'); @@ -36,13 +37,7 @@ module.exports = function (User) { }); }; - User.sendInvitationEmail = async function (uid, email) { - const token = utils.generateUUID(); - const registerLink = nconf.get('url') + '/register?token=' + token + '&email=' + encodeURIComponent(email); - - const expireDays = meta.config.inviteExpiration; - const expireIn = expireDays * 86400000; - + User.sendInvitationEmail = async function (uid, email, groupsToJoin) { const email_exists = await User.getUidByEmail(email); if (email_exists) { throw new Error('[[error:email-taken]]'); @@ -53,24 +48,7 @@ module.exports = function (User) { throw new Error('[[error:email-invited]]'); } - await db.setAdd('invitation:uid:' + uid, email); - await db.setAdd('invitation:uids', uid); - await db.set('invitation:email:' + email, token); - await db.pexpireAt('invitation:email:' + email, Date.now() + expireIn); - const username = await User.getUserField(uid, 'username'); - const title = meta.config.title || meta.config.browserTitle || 'NodeBB'; - const subject = await translator.translate('[[email:invite, ' + title + ']]', meta.config.defaultLang); - let data = { - site_title: title, - registerLink: registerLink, - subject: subject, - username: username, - template: 'invitation', - expireDays: expireDays, - }; - - // Append default data to this email payload - data = { ...emailer._defaultPayload, ...data }; + const data = await prepareInvitation(uid, email, groupsToJoin); await emailer.sendToEmail('invitation', email, meta.config.defaultLang, data); }; @@ -79,12 +57,28 @@ module.exports = function (User) { if (!query.token || !query.email) { throw new Error('[[error:invalid-data]]'); } - const token = await db.get('invitation:email:' + query.email); + const token = await db.getObjectField('invitation:email:' + query.email, 'token'); if (!token || token !== query.token) { throw new Error('[[error:invalid-token]]'); } }; + User.joinGroupsFromInvitation = async function (uid, email) { + let groupsToJoin = await db.getObjectField('invitation:email:' + email, 'groupsToJoin'); + + try { + groupsToJoin = JSON.parse(groupsToJoin); + } catch (e) { + return; + } + + if (!groupsToJoin || groupsToJoin.length < 1) { + return; + } + + await groups.join(groupsToJoin, uid); + }; + User.deleteInvitation = async function (invitedBy, email) { const invitedByUid = await User.getUidByUsername(invitedBy); if (!invitedByUid) { @@ -109,4 +103,34 @@ module.exports = function (User) { await db.setRemove('invitation:uids', uid); } } + + async function prepareInvitation(uid, email, groupsToJoin) { + const token = utils.generateUUID(); + const registerLink = nconf.get('url') + '/register?token=' + token + '&email=' + encodeURIComponent(email); + + const expireDays = meta.config.inviteExpiration; + const expireIn = expireDays * 86400000; + + await db.setAdd('invitation:uid:' + uid, email); + await db.setAdd('invitation:uids', uid); + await db.setObject('invitation:email:' + email, { + token, + groupsToJoin: JSON.stringify(groupsToJoin), + }); + await db.pexpireAt('invitation:email:' + email, Date.now() + expireIn); + + const username = await User.getUserField(uid, 'username'); + const title = meta.config.title || meta.config.browserTitle || 'NodeBB'; + const subject = await translator.translate('[[email:invite, ' + title + ']]', meta.config.defaultLang); + + return { + ...emailer._defaultPayload, // Append default data to this email payload + site_title: title, + registerLink: registerLink, + subject: subject, + username: username, + template: 'invitation', + expireDays: expireDays, + }; + } }; diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index e950ba7b40..826ed34411 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -3,9 +3,9 @@
- + - + [[admin/manage/users:download-csv]]
diff --git a/src/views/modals/invite.tpl b/src/views/modals/invite.tpl new file mode 100644 index 0000000000..8184bf8c23 --- /dev/null +++ b/src/views/modals/invite.tpl @@ -0,0 +1,12 @@ +
+ + +
+
+ + +
\ No newline at end of file diff --git a/test/categories.js b/test/categories.js index 242abd9294..f717052b5b 100644 --- a/test/categories.js +++ b/test/categories.js @@ -763,6 +763,7 @@ describe('Categories', function () { assert.ifError(err); assert.deepEqual(data, { ban: false, + invite: false, chat: false, 'search:content': false, 'search:users': false, @@ -812,6 +813,7 @@ describe('Categories', function () { assert.ifError(err); assert.deepEqual(data, { 'groups:ban': false, + 'groups:invite': false, 'groups:chat': true, 'groups:search:content': true, 'groups:search:users': true, diff --git a/test/helpers/index.js b/test/helpers/index.js index f38ef8795c..38239aaee0 100644 --- a/test/helpers/index.js +++ b/test/helpers/index.js @@ -1,6 +1,7 @@ 'use strict'; var request = require('request'); +const requestAsync = require('request-promise-native'); var nconf = require('nconf'); var fs = require('fs'); var winston = require('winston'); @@ -162,4 +163,20 @@ helpers.copyFile = function (source, target, callback) { } }; +helpers.invite = async function (body, uid, jar, csrf_token) { + const res = await requestAsync.post(`${nconf.get('url')}/api/v3/users/${uid}/invites`, { + jar: jar, + // using "form" since client "api" module make requests with "application/x-www-form-urlencoded" content-type + form: body, + headers: { + 'x-csrf-token': csrf_token, + }, + simple: false, + resolveWithFullResponse: true, + }); + + res.body = JSON.parse(res.body); + return { res, body }; +}; + require('../../src/promisify')(helpers); diff --git a/test/user.js b/test/user.js index 101373316c..02e3d010f8 100644 --- a/test/user.js +++ b/test/user.js @@ -5,6 +5,7 @@ var async = require('async'); var path = require('path'); var nconf = require('nconf'); var request = require('request'); +const requestAsync = require('request-promise-native'); var jwt = require('jsonwebtoken'); var db = require('./mocks/databasemock'); @@ -1919,160 +1920,374 @@ describe('User', function () { }); describe('invites', function () { - var socketUser = require('../src/socket.io/user'); + var notAnInviterUid; var inviterUid; var adminUid; + var PUBLIC_GROUP = 'publicGroup'; + var PRIVATE_GROUP = 'privateGroup'; + var OWN_PRIVATE_GROUP = 'ownPrivateGroup'; + var HIDDEN_GROUP = 'hiddenGroup'; + + var COMMON_PW = '123456'; + before(function (done) { async.parallel({ - inviter: async.apply(User.create, { username: 'inviter', email: 'inviter@nodebb.org' }), - admin: async.apply(User.create, { username: 'adminInvite' }), + publicGroup: async.apply(groups.create, { name: PUBLIC_GROUP, private: 0 }), + privateGroup: async.apply(groups.create, { name: PRIVATE_GROUP, private: 1 }), + hiddenGroup: async.apply(groups.create, { name: HIDDEN_GROUP, hidden: 1 }), + notAnInviter: async.apply(User.create, { username: 'notAnInviter', password: COMMON_PW, email: 'notaninviter@nodebb.org' }), + inviter: async.apply(User.create, { username: 'inviter', password: COMMON_PW, email: 'inviter@nodebb.org' }), + admin: async.apply(User.create, { username: 'adminInvite', password: COMMON_PW }), }, function (err, results) { assert.ifError(err); + notAnInviterUid = results.notAnInviter; inviterUid = results.inviter; adminUid = results.admin; - groups.join('administrators', adminUid, done); + async.parallel([ + async.apply(groups.create, { name: OWN_PRIVATE_GROUP, ownerUid: inviterUid, private: 1 }), + async.apply(groups.join, 'administrators', adminUid), + async.apply(groups.join, 'cid:0:privileges:invite', inviterUid), + ], done); }); }); - it('should error with invalid data', function (done) { - socketUser.invite({ uid: inviterUid }, null, function (err) { - assert.equal(err.message, '[[error:invalid-data]]'); - done(); - }); - }); + describe('when inviter is not an admin and does not have invite privilege', function () { + var csrf_token; + var jar; - it('should eror if forum is not invite only', function (done) { - socketUser.invite({ uid: inviterUid }, 'invite1@test.com', function (err) { - assert.equal(err.message, '[[error:forum-not-invite-only]]'); - done(); - }); - }); - - it('should error if user is not admin and type is admin-invite-only', function (done) { - meta.config.registrationType = 'admin-invite-only'; - socketUser.invite({ uid: inviterUid }, 'invite1@test.com', function (err) { - assert.equal(err.message, '[[error:no-privileges]]'); - done(); - }); - }); - - it('should send invitation email', function (done) { - meta.config.registrationType = 'invite-only'; - socketUser.invite({ uid: inviterUid }, 'invite1@test.com', function (err) { - assert.ifError(err); - done(); - }); - }); - - it('should error if ouf of invitations', function (done) { - meta.config.maximumInvites = 1; - socketUser.invite({ uid: inviterUid }, 'invite2@test.com', function (err) { - assert.equal(err.message, '[[error:invite-maximum-met, ' + 1 + ', ' + 1 + ']]'); - meta.config.maximumInvites = 5; - done(); - }); - }); - - it('should error if email exists', function (done) { - socketUser.invite({ uid: inviterUid }, 'inviter@nodebb.org', function (err) { - assert.equal(err.message, '[[error:email-taken]]'); - done(); - }); - }); - - it('should send invitation email', function (done) { - socketUser.invite({ uid: inviterUid }, 'invite2@test.com', function (err) { - assert.ifError(err); - done(); - }); - }); - - it('should get user\'s invites', function (done) { - User.getInvites(inviterUid, function (err, data) { - assert.ifError(err); - assert.notEqual(data.indexOf('invite1@test.com'), -1); - assert.notEqual(data.indexOf('invite2@test.com'), -1); - done(); - }); - }); - - it('should get all invites', function (done) { - User.getAllInvites(function (err, data) { - assert.ifError(err); - assert.equal(data[0].uid, inviterUid); - assert.notEqual(data[0].invitations.indexOf('invite1@test.com'), -1); - assert.notEqual(data[0].invitations.indexOf('invite2@test.com'), -1); - done(); - }); - }); - - it('should fail to verify invitation with invalid data', function (done) { - User.verifyInvitation({ token: '', email: '' }, function (err) { - assert.equal(err.message, '[[error:invalid-data]]'); - done(); - }); - }); - - it('should fail to verify invitation with invalid email', function (done) { - User.verifyInvitation({ token: 'test', email: 'doesnotexist@test.com' }, function (err) { - assert.equal(err.message, '[[error:invalid-token]]'); - done(); - }); - }); - - it('should verify installation with no errors', function (done) { - var email = 'invite1@test.com'; - db.get('invitation:email:' + email, function (err, token) { - assert.ifError(err); - User.verifyInvitation({ token: token, email: 'invite1@test.com' }, function (err) { + before(function (done) { + helpers.loginUser('notAnInviter', COMMON_PW, function (err, _jar) { assert.ifError(err); + jar = _jar; + + request({ + url: nconf.get('url') + '/api/config', + json: true, + jar: jar, + }, function (err, response, body) { + assert.ifError(err); + csrf_token = body.csrf_token; + done(); + }); + }); + }); + + it('should error if user does not have invite privilege', async () => { + const { res } = await helpers.invite({ emails: 'invite1@test.com', groupsToJoin: [] }, notAnInviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:no-privileges]]'); + }); + + it('should error out if user tries to use an inviter\'s uid via the API', async () => { + const { res } = await helpers.invite({ emails: 'invite1@test.com', groupsToJoin: [] }, inviterUid, jar, csrf_token); + const numInvites = await User.getInvitesNumber(inviterUid); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:no-privileges]]'); + assert.strictEqual(numInvites, 0); + }); + }); + + describe('when inviter has invite privilege', function () { + var csrf_token; + var jar; + + before(function (done) { + helpers.loginUser('inviter', COMMON_PW, function (err, _jar) { + assert.ifError(err); + jar = _jar; + + request({ + url: nconf.get('url') + '/api/config', + json: true, + jar: jar, + }, function (err, response, body) { + assert.ifError(err); + csrf_token = body.csrf_token; + done(); + }); + }); + }); + + it('should error with invalid data', async () => { + const { res } = await helpers.invite({}, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 400); + assert.strictEqual(res.body.status.message, '[[error:invalid-data]]'); + }); + + it('should error if user is not admin and type is admin-invite-only', async () => { + meta.config.registrationType = 'admin-invite-only'; + const { res } = await helpers.invite({ emails: 'invite1@test.com', groupsToJoin: [] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:no-privileges]]'); + }); + + it('should send invitation email (without groups to be joined)', async () => { + meta.config.registrationType = 'normal'; + const { res } = await helpers.invite({ emails: 'invite1@test.com', groupsToJoin: [] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 200); + }); + + it('should send multiple invitation emails (with a public group to be joined)', async () => { + const { res } = await helpers.invite({ emails: 'invite2@test.com,invite3@test.com', groupsToJoin: [PUBLIC_GROUP] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 200); + }); + + it('should error if the user has not permission to invite to the group', async () => { + const { res } = await helpers.invite({ emails: 'invite4@test.com', groupsToJoin: [PRIVATE_GROUP] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:no-privileges]]'); + }); + + it('should error if a non-admin tries to invite to the administrators group', async () => { + const { res } = await helpers.invite({ emails: 'invite4@test.com', groupsToJoin: ['administrators'] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:no-privileges]]'); + }); + + it('should to invite to own private group', async () => { + const { res } = await helpers.invite({ emails: 'invite4@test.com', groupsToJoin: [OWN_PRIVATE_GROUP] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 200); + }); + + it('should to invite to multiple groups', async () => { + const { res } = await helpers.invite({ emails: 'invite5@test.com', groupsToJoin: [PUBLIC_GROUP, OWN_PRIVATE_GROUP] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 200); + }); + + it('should error if tries to invite to hidden group', async () => { + const { res } = await helpers.invite({ emails: 'invite6@test.com', groupsToJoin: [HIDDEN_GROUP] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 403); + }); + + it('should error if ouf of invitations', async () => { + meta.config.maximumInvites = 1; + const { res } = await helpers.invite({ emails: 'invite6@test.com', groupsToJoin: [] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:invite-maximum-met, ' + 5 + ', ' + 1 + ']]'); + meta.config.maximumInvites = 10; + }); + + it('should send invitation email after maximumInvites increased', async () => { + const { res } = await helpers.invite({ emails: 'invite6@test.com', groupsToJoin: [] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 200); + }); + + it('should error if invite is sent via API with a different UID', async () => { + const { res } = await helpers.invite({ emails: 'inviter@nodebb.org', groupsToJoin: [] }, adminUid, jar, csrf_token); + const numInvites = await User.getInvitesNumber(adminUid); + assert.strictEqual(res.statusCode, 403); + assert.strictEqual(res.body.status.message, '[[error:no-privileges]]'); + assert.strictEqual(numInvites, 0); + }); + + it('should error if email exists', async () => { + const { res } = await helpers.invite({ emails: 'inviter@nodebb.org', groupsToJoin: [] }, inviterUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 400); + assert.strictEqual(res.body.status.message, '[[error:email-taken]]'); + }); + }); + + describe('when inviter is an admin', function () { + var csrf_token; + var jar; + + before(function (done) { + helpers.loginUser('adminInvite', COMMON_PW, function (err, _jar) { + assert.ifError(err); + jar = _jar; + + request({ + url: nconf.get('url') + '/api/config', + json: true, + jar: jar, + }, function (err, response, body) { + assert.ifError(err); + csrf_token = body.csrf_token; + done(); + }); + }); + }); + + it('should escape email', async () => { + await helpers.invite({ emails: '', groupsToJoin: [] }, adminUid, jar, csrf_token); + const data = await User.getInvites(adminUid); + assert.strictEqual(data[0], '<script>alert("ok");</script>'); + await User.deleteInvitationKey(''); + }); + + it('should invite to the administrators group if inviter is an admin', async () => { + const { res } = await helpers.invite({ emails: 'invite99@test.com', groupsToJoin: ['administrators'] }, adminUid, jar, csrf_token); + assert.strictEqual(res.statusCode, 200); + }); + }); + + describe('after invites checks', function () { + it('should get user\'s invites', function (done) { + User.getInvites(inviterUid, function (err, data) { + assert.ifError(err); + Array.from(Array(6)).forEach((_, i) => { + assert.notEqual(data.indexOf('invite' + (i + 1) + '@test.com'), -1); + }); done(); }); }); - }); - it('should error with invalid username', function (done) { - User.deleteInvitation('doesnotexist', 'test@test.com', function (err) { - assert.equal(err.message, '[[error:invalid-username]]'); - done(); - }); - }); - - it('should delete invitation', function (done) { - var socketUser = require('../src/socket.io/user'); - socketUser.deleteInvitation({ uid: adminUid }, { invitedBy: 'inviter', email: 'invite1@test.com' }, function (err) { - assert.ifError(err); - db.isSetMember('invitation:uid:' + inviterUid, 'invite1@test.com', function (err, isMember) { + it('should get all invites', function (done) { + User.getAllInvites(function (err, data) { assert.ifError(err); - assert.equal(isMember, false); + + var adminData = data.filter(d => parseInt(d.uid, 10) === adminUid)[0]; + assert.notEqual(adminData.invitations.indexOf('invite99@test.com'), -1); + + var inviterData = data.filter(d => parseInt(d.uid, 10) === inviterUid)[0]; + Array.from(Array(6)).forEach((_, i) => { + assert.notEqual(inviterData.invitations.indexOf('invite' + (i + 1) + '@test.com'), -1); + }); + done(); }); }); - }); - it('should delete invitation key', function (done) { - User.deleteInvitationKey('invite2@test.com', function (err) { - assert.ifError(err); - db.isSetMember('invitation:uid:' + inviterUid, 'invite2@test.com', function (err, isMember) { + it('should fail to verify invitation with invalid data', function (done) { + User.verifyInvitation({ token: '', email: '' }, function (err) { + assert.equal(err.message, '[[error:invalid-data]]'); + done(); + }); + }); + + it('should fail to verify invitation with invalid email', function (done) { + User.verifyInvitation({ token: 'test', email: 'doesnotexist@test.com' }, function (err) { + assert.equal(err.message, '[[error:invalid-token]]'); + done(); + }); + }); + + it('should verify installation with no errors', function (done) { + var email = 'invite1@test.com'; + db.getObjectField('invitation:email:' + email, 'token', function (err, token) { assert.ifError(err); - assert.equal(isMember, false); - db.isSetMember('invitation:uids', inviterUid, function (err, isMember) { + User.verifyInvitation({ token: token, email: 'invite1@test.com' }, function (err) { + assert.ifError(err); + done(); + }); + }); + }); + + it('should error with invalid username', function (done) { + User.deleteInvitation('doesnotexist', 'test@test.com', function (err) { + assert.equal(err.message, '[[error:invalid-username]]'); + done(); + }); + }); + + it('should delete invitation', function (done) { + var socketUser = require('../src/socket.io/user'); + socketUser.deleteInvitation({ uid: adminUid }, { invitedBy: 'inviter', email: 'invite1@test.com' }, function (err) { + assert.ifError(err); + db.isSetMember('invitation:uid:' + inviterUid, 'invite1@test.com', function (err, isMember) { assert.ifError(err); assert.equal(isMember, false); done(); }); }); }); + + it('should delete invitation key', function (done) { + User.deleteInvitationKey('invite99@test.com', function (err) { + assert.ifError(err); + db.isSetMember('invitation:uid:' + adminUid, 'invite99@test.com', function (err, isMember) { + assert.ifError(err); + assert.equal(isMember, false); + db.isSetMember('invitation:uids', adminUid, function (err, isMember) { + assert.ifError(err); + assert.equal(isMember, false); + done(); + }); + }); + }); + }); + + it('should joined the groups from invitation after registration', async function () { + var email = 'invite5@test.com'; + var groupsToJoin = [PUBLIC_GROUP, OWN_PRIVATE_GROUP]; + var token = await db.getObjectField('invitation:email:' + email, 'token'); + + await new Promise(function (resolve, reject) { + helpers.registerUser({ + username: 'invite5', + password: '123456', + 'password-confirm': '123456', + email: email, + gdpr_consent: true, + token: token, + }, async function (err, jar, response, body) { + if (err) { + reject(err); + } + + var memberships = await groups.isMemberOfGroups(body.uid, groupsToJoin); + var joinedToAll = memberships.filter(Boolean); + + if (joinedToAll.length !== groupsToJoin.length) { + reject(new Error('Not joined to the groups')); + } + + resolve(); + }); + }); + }); }); - it('should escape email', function (done) { - socketUser.invite({ uid: inviterUid }, '', function (err) { - assert.ifError(err); - User.getInvites(inviterUid, function (err, data) { + describe('invite groups', () => { + var csrf_token; + var jar; + + before(function (done) { + helpers.loginUser('inviter', COMMON_PW, function (err, _jar) { assert.ifError(err); - assert.equal(data[0], '<script>alert("ok");</script>'); - done(); + jar = _jar; + + request({ + url: nconf.get('url') + '/api/config', + json: true, + jar: jar, + }, function (err, response, body) { + assert.ifError(err); + csrf_token = body.csrf_token; + done(); + }); + }); + }); + + it('should show a list of groups for adding to an invite', async () => { + const body = await requestAsync({ + url: `${nconf.get('url')}/api/v3/users/${inviterUid}/invites/groups`, + json: true, + jar, + }); + + assert(Array.isArray(body.response)); + assert.strictEqual(2, body.response.length); + assert.deepStrictEqual(body.response, ['ownPrivateGroup', 'publicGroup']); + }); + + it('should error out if you request invite groups for another uid', async () => { + const res = await requestAsync({ + url: `${nconf.get('url')}/api/v3/users/${adminUid}/invites/groups`, + json: true, + jar, + simple: false, + resolveWithFullResponse: true, + }); + + assert.strictEqual(res.statusCode, 401); + assert.deepStrictEqual(res.body, { + status: { + code: 'not-authorised', + message: 'A valid login session was not found. Please log in and try again.', + }, + response: {}, }); }); }); From d83eb7f89e99c85914db8ef830c651ad91e862cb Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 16 Nov 2020 15:19:20 -0500 Subject: [PATCH 39/67] refactor: client-side handlers for user invitations DRY --- public/src/admin/manage/users.js | 62 ++------------------------ public/src/client/users.js | 59 ++---------------------- public/src/modules/accounts/invite.js | 64 +++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 115 deletions(-) create mode 100644 public/src/modules/accounts/invite.js diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 38ab5f88e5..4c6f202c0a 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -1,8 +1,8 @@ 'use strict'; define('admin/manage/users', [ - 'translator', 'benchpress', 'autocomplete', 'api', 'slugify', 'bootbox', -], function (translator, Benchpress, autocomplete, api, slugify, bootbox) { + 'translator', 'benchpress', 'autocomplete', 'api', 'slugify', 'bootbox', 'accounts/invite', +], function (translator, Benchpress, autocomplete, api, slugify, bootbox, AccountInvite) { var Users = {}; Users.init = function () { @@ -380,13 +380,10 @@ define('admin/manage/users', [ } handleSearch(); - handleUserCreate(); - - handleInvite(); - handleSort(); handleFilter(); + AccountInvite.handle(); }; function handleSearch() { @@ -453,59 +450,6 @@ define('admin/manage/users', [ }); } - function handleInvite() { - $('[component="user/invite"]').on('click', function (e) { - e.preventDefault(); - api.get(`/api/v3/users/${app.user.uid}/invites/groups`, {}).then((groups) => { - Benchpress.parse('modals/invite', { groups: groups }, function (html) { - bootbox.dialog({ - message: html, - title: '[[admin/manage/users:invite]]', - onEscape: true, - buttons: { - cancel: { - label: '[[admin/manage/users:alerts.button-cancel]]', - className: 'btn-default', - }, - invite: { - label: '[[admin/manage/users:invite]]', - className: 'btn-primary', - callback: sendInvites, - }, - }, - }); - }); - }).catch((err) => { - app.alertError(err.message); - }); - }); - } - - function sendInvites() { - var $emails = $('#invite-modal-emails'); - var $groups = $('#invite-modal-groups'); - - var data = { - emails: $emails.val() - .split(',') - .map(m => m.trim()) - .filter(Boolean) - .filter((m, i, arr) => i === arr.indexOf(m)) - .join(','), - groupsToJoin: $groups.val(), - }; - - if (!data.emails) { - return; - } - - api.post(`/users/${app.user.uid}/invites`, data).then(() => { - app.alertSuccess('[[admin/manage/users:alerts.email-sent-to, ' + data.emails.replace(/,/g, ', ') + ']]'); - }).catch((err) => { - app.alertError(err.message); - }); - } - function buildSearchQuery(params) { if ($('#user-search').val()) { params.query = $('#user-search').val(); diff --git a/public/src/client/users.js b/public/src/client/users.js index 70f8783b9c..50ecab2ac1 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -2,8 +2,8 @@ define('forum/users', [ - 'translator', 'benchpress', 'api', 'bootbox', -], function (translator, Benchpress, api, bootbox) { + 'translator', 'benchpress', 'api', 'accounts/invite', +], function (translator, Benchpress, api, AccountInvite) { var Users = {}; var searchTimeoutID = 0; @@ -25,7 +25,7 @@ define('forum/users', [ Users.handleSearch(); - handleInvite(); + AccountInvite.handle(); socket.removeListener('event:user_status_change', onUserStatusChange); socket.on('event:user_status_change', onUserStatusChange); @@ -135,58 +135,5 @@ define('forum/users', [ return utils.params().section || ''; } - function handleInvite() { - $('[component="user/invite"]').on('click', function (e) { - e.preventDefault(); - api.get(`/api/v3/users/${app.user.uid}/invites/groups`, {}).then((groups) => { - Benchpress.parse('modals/invite', { groups: groups }, function (html) { - bootbox.dialog({ - message: html, - title: '[[users:invite]]', - onEscape: true, - buttons: { - cancel: { - label: '[[modules:bootbox.cancel]]', - className: 'btn-default', - }, - invite: { - label: '[[users:invite]]', - className: 'btn-primary', - callback: sendInvites, - }, - }, - }); - }); - }).catch((err) => { - app.alertError(err.message); - }); - }); - } - - function sendInvites() { - var $emails = $('#invite-modal-emails'); - var $groups = $('#invite-modal-groups'); - - var data = { - emails: $emails.val() - .split(',') - .map(m => m.trim()) - .filter(Boolean) - .filter((m, i, arr) => i === arr.indexOf(m)) - .join(','), - groupsToJoin: $groups.val(), - }; - - if (!data.emails) { - return; - } - - api.post(`/users/${app.user.uid}/invites`, data).then(() => { - app.alertSuccess('[[users:invitation-email-sent, ' + data.emails.replace(/,/g, ', ') + ']]'); - }).catch((err) => { - app.alertError(err.message); - }); - } - return Users; }); diff --git a/public/src/modules/accounts/invite.js b/public/src/modules/accounts/invite.js new file mode 100644 index 0000000000..621c84bcba --- /dev/null +++ b/public/src/modules/accounts/invite.js @@ -0,0 +1,64 @@ +'use strict'; + +define('accounts/invite', ['api', 'benchpress', 'bootbox'], function (api, Benchpress, bootbox) { + const Invite = {}; + + function isACP() { + return ajaxify.data.template.name.startsWith('admin/'); + } + + Invite.handle = function () { + $('[component="user/invite"]').on('click', function (e) { + e.preventDefault(); + api.get(`/api/v3/users/${app.user.uid}/invites/groups`, {}).then((groups) => { + Benchpress.parse('modals/invite', { groups: groups }, function (html) { + bootbox.dialog({ + message: html, + title: `[[${isACP ? 'admin/manage/users:invite' : 'users:invite'}]]`, + onEscape: true, + buttons: { + cancel: { + label: `[[${isACP ? 'admin/manage/users:alerts.button-cancel' : 'modules:bootbox.cancel'}]]`, + className: 'btn-default', + }, + invite: { + label: `[[${isACP ? 'admin/manage/users:invite' : 'users:invite'}]]`, + className: 'btn-primary', + callback: Invite.send, + }, + }, + }); + }); + }).catch((err) => { + app.alertError(err.message); + }); + }); + }; + + Invite.send = function () { + var $emails = $('#invite-modal-emails'); + var $groups = $('#invite-modal-groups'); + + var data = { + emails: $emails.val() + .split(',') + .map(m => m.trim()) + .filter(Boolean) + .filter((m, i, arr) => i === arr.indexOf(m)) + .join(','), + groupsToJoin: $groups.val(), + }; + + if (!data.emails) { + return; + } + + api.post(`/users/${app.user.uid}/invites`, data).then(() => { + app.alertSuccess(`[[${isACP ? 'admin/manage/users:alerts.email-sent-to' : 'users:invitation-email-sent'}, ${data.emails.replace(/,/g, ', ')}]]`); + }).catch((err) => { + app.alertError(err.message); + }); + }; + + return Invite; +}); From e1d7c4d8aadb50eef6eb733249a23738572f11aa Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 16 Nov 2020 15:42:39 -0500 Subject: [PATCH 40/67] fix: internal helper method hasGlobalPrivilege, DRY --- src/controllers/admin/users.js | 3 ++- src/privileges/users.js | 25 +++++++++---------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 2397de158d..99f3d4231b 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -243,9 +243,10 @@ async function render(req, res, data) { data['filterBy_' + validator.escape(String(filter))] = true; }); - data.showInviteButton = await privileges.users.hasInvitePrivilege(req.uid); if (data.adminInviteOnly) { data.showInviteButton = await privileges.users.isAdministrator(req.uid); + } else { + data.showInviteButton = await privileges.users.hasInvitePrivilege(req.uid); } res.render('admin/manage/users', data); diff --git a/src/privileges/users.js b/src/privileges/users.js index c2bd64777a..9a391f2f13 100644 --- a/src/privileges/users.js +++ b/src/privileges/users.js @@ -107,21 +107,14 @@ module.exports = function (privileges) { return data.canBan; }; - privileges.users.hasBanPrivilege = async function (uid) { - const canBan = await privileges.global.can('ban', uid); - const data = await plugins.fireHook('filter:user.hasBanPrivilege', { - uid: uid, - canBan: canBan, - }); - return data.canBan; - }; + privileges.users.hasBanPrivilege = async uid => await hasGlobalPrivilege('ban', uid); + privileges.users.hasInvitePrivilege = async uid => await hasGlobalPrivilege('invite', uid); - privileges.users.hasInvitePrivilege = async function (uid) { - const canInvite = await privileges.global.can('invite', uid); - const data = await plugins.fireHook('filter:user.hasInvitePrivilege', { - uid: uid, - canInvite: canInvite, - }); - return data.canInvite; - }; + async function hasGlobalPrivilege(privilege, uid) { + const privilegeName = privilege.split('-').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join(''); + let payload = { uid }; + payload[`can${privilegeName}`] = await privileges.global.can(privilege, uid); + payload = await plugins.fireHook(`filter:user.has${privilegeName}Privilege`, payload); + return payload[`can${privilegeName}`]; + } }; From 84d545775e267b7b89f905f8c62f1f9aa609ec8c Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 16 Nov 2020 23:22:59 +0000 Subject: [PATCH 41/67] fix(deps): update dependency sharp to v0.26.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index cd4d1f925d..a7eefc89e5 100644 --- a/install/package.json +++ b/install/package.json @@ -127,7 +127,7 @@ "sanitize-html": "^2.0.0", "semver": "^7.2.1", "serve-favicon": "^2.5.0", - "sharp": "0.26.2", + "sharp": "0.26.3", "sitemap": "^6.1.0", "slideout": "1.0.1", "socket.io": "2.3.0", From 1d6bcbebde1632499fd35dce377f28d7dd7ff19b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 16 Nov 2020 21:31:55 -0500 Subject: [PATCH 42/67] feat: https://github.com/NodeBB/NodeBB/issues/8147 --- install/data/defaults.json | 3 ++- public/language/en-GB/admin/settings/user.json | 1 + public/language/en-GB/user.json | 2 +- public/openapi/components/schemas/SettingsObj.yaml | 3 +++ public/openapi/read/topic/topic_id/slug/post_index.yaml | 2 ++ public/src/client/topic.js | 2 +- src/controllers/topics.js | 1 + src/user/settings.js | 2 ++ src/views/admin/settings/user.tpl | 7 +++++++ 9 files changed, 20 insertions(+), 3 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index b6d4fa1907..24e1a4f9fb 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -139,5 +139,6 @@ "showAverageApprovalTime": true, "autoApproveTime": 0, "maxUserSessions": 10, - "useCompression": 0 + "useCompression": 0, + "updateUrlWithPostIndex": 1 } \ No newline at end of file diff --git a/public/language/en-GB/admin/settings/user.json b/public/language/en-GB/admin/settings/user.json index 88f00aefc8..e05aa5e3ed 100644 --- a/public/language/en-GB/admin/settings/user.json +++ b/public/language/en-GB/admin/settings/user.json @@ -65,6 +65,7 @@ "restrict-chat": "Only allow chat messages from users I follow", "outgoing-new-tab": "Open outgoing links in new tab", "topic-search": "Enable In-Topic Searching", + "update-url-with-post-index": "Update url with post index while browsing topics", "digest-freq": "Subscribe to Digest", "digest-freq.off": "Off", "digest-freq.daily": "Daily", diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index bbf2f2ba5f..cddce941c6 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -133,7 +133,7 @@ "enable_topic_searching": "Enable In-Topic Searching", "topic_search_help": "If enabled, in-topic searching will override the browser's default page search behaviour and allow you to search through the entire topic, instead of what is only shown on screen", - + "update_url_with_post_index": "Update url with post index while browsing topics", "scroll_to_my_post": "After posting a reply, show the new post", "follow_topics_you_reply_to": "Watch topics that you reply to", diff --git a/public/openapi/components/schemas/SettingsObj.yaml b/public/openapi/components/schemas/SettingsObj.yaml index 3b674996aa..9e95fb675c 100644 --- a/public/openapi/components/schemas/SettingsObj.yaml +++ b/public/openapi/components/schemas/SettingsObj.yaml @@ -37,6 +37,9 @@ Settings: topicSearchEnabled: type: boolean description: Enable keyword searching within topics + updateUrlWithPostIndex: + type: boolean + description: Update url with post index while browsing topics categoryTopicSort: type: string description: Default sorting strategy of the topics in a category diff --git a/public/openapi/read/topic/topic_id/slug/post_index.yaml b/public/openapi/read/topic/topic_id/slug/post_index.yaml index 514f3065e5..47e0a60d2e 100644 --- a/public/openapi/read/topic/topic_id/slug/post_index.yaml +++ b/public/openapi/read/topic/topic_id/slug/post_index.yaml @@ -388,6 +388,8 @@ get: type: number scrollToMyPost: type: boolean + updateUrlWithPostIndex: + type: boolean allowMultipleBadges: type: boolean privateUploads: diff --git a/public/src/client/topic.js b/public/src/client/topic.js index b193b8cc9e..c54c631c5a 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -227,7 +227,7 @@ define('forum/topic', [ updateUserBookmark(index); Topic.replaceURLTimeout = 0; - if (history.replaceState) { + if (ajaxify.data.updateUrlWithPostIndex && history.replaceState) { var search = window.location.search || ''; if (!config.usePagination) { search = (search && !/^\?page=\d+$/.test(search) ? search : ''); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 2b40f4595b..72fe28e5f6 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -81,6 +81,7 @@ topicsController.get = async function getTopic(req, res, callback) { topicData.postEditDuration = meta.config.postEditDuration; topicData.postDeleteDuration = meta.config.postDeleteDuration; topicData.scrollToMyPost = settings.scrollToMyPost; + topicData.updateUrlWithPostIndex = settings.updateUrlWithPostIndex; topicData.allowMultipleBadges = meta.config.allowMultipleBadges === 1; topicData.privateUploads = meta.config.privateUploads === 1; topicData.rssFeedUrl = relative_path + '/topic/' + topicData.tid + '.rss'; diff --git a/src/user/settings.js b/src/user/settings.js index 0f9494a1ce..ebb153852f 100644 --- a/src/user/settings.js +++ b/src/user/settings.js @@ -58,6 +58,7 @@ module.exports = function (User) { 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.updateUrlWithPostIndex = parseInt(getSetting(settings, 'updateUrlWithPostIndex', 1), 10) === 1; settings.bootswatchSkin = validator.escape(String(settings.bootswatchSkin || '')); settings.homePageRoute = validator.escape(String(settings.homePageRoute || '')).replace(///g, '/'); settings.scrollToMyPost = parseInt(getSetting(settings, 'scrollToMyPost', 1), 10) === 1; @@ -116,6 +117,7 @@ module.exports = function (User) { followTopicsOnReply: data.followTopicsOnReply, restrictChat: data.restrictChat, topicSearchEnabled: data.topicSearchEnabled, + updateUrlWithPostIndex: data.updateUrlWithPostIndex, homePageRoute: ((data.homePageRoute === 'custom' ? data.homePageCustom : data.homePageRoute) || '').replace(/^\//, ''), scrollToMyPost: data.scrollToMyPost, upvoteNotifFreq: data.upvoteNotifFreq, diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index c6f0db9062..f9f56e2eee 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -299,6 +299,13 @@
+
+ +
+
- + {{{ end }}}
- + {{{ end }}}
\ No newline at end of file diff --git a/src/views/sitemap.tpl b/src/views/sitemap.tpl index e579ed9974..45c6b64ac6 100644 --- a/src/views/sitemap.tpl +++ b/src/views/sitemap.tpl @@ -6,9 +6,9 @@ {url}/sitemap/categories.xml - + {{{ each topics }}} - {url}/sitemap/topics.@value.xml + {url}/sitemap/topics.{@value}.xml - + {{{ end }}} \ No newline at end of file From a87ccccc9c05e7236718fccadb5c558382af0233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 17 Nov 2020 18:46:25 -0500 Subject: [PATCH 57/67] fix: benchpress warnings --- src/views/admin/advanced/hooks.tpl | 8 +++---- src/views/admin/extend/rewards.tpl | 12 +++++----- src/views/admin/extend/widgets.tpl | 12 +++++----- src/views/admin/manage/admins-mods.tpl | 8 +++---- src/views/admin/manage/registration.tpl | 24 +++++++++---------- src/views/admin/manage/uploads.tpl | 6 ++--- .../admin/partials/blacklist-validate.tpl | 2 +- .../admin/partials/installed_plugin_item.tpl | 2 +- .../admin/partials/manage_user_groups.tpl | 8 +++---- src/views/admin/settings/email.tpl | 6 ++--- src/views/admin/settings/navigation.tpl | 16 ++++++------- 11 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/views/admin/advanced/hooks.tpl b/src/views/admin/advanced/hooks.tpl index c948c37e3b..b9b2493b88 100644 --- a/src/views/admin/advanced/hooks.tpl +++ b/src/views/admin/advanced/hooks.tpl @@ -1,5 +1,5 @@
- + {{{ each hooks }}}
\ No newline at end of file diff --git a/src/views/admin/extend/rewards.tpl b/src/views/admin/extend/rewards.tpl index 9df8ac01d0..bd226cc39d 100644 --- a/src/views/admin/extend/rewards.tpl +++ b/src/views/admin/extend/rewards.tpl @@ -4,23 +4,23 @@
[[admin/extend/rewards:rewards]]
    - + {{{ each active }}}


  • @@ -58,7 +58,7 @@
- + {{{ end }}}
diff --git a/src/views/admin/extend/widgets.tpl b/src/views/admin/extend/widgets.tpl index 2331001c1c..25d03f9829 100644 --- a/src/views/admin/extend/widgets.tpl +++ b/src/views/admin/extend/widgets.tpl @@ -1,26 +1,26 @@
- + {{{ each templates }}}
- + {{{ each templates.areas }}}

{../name} {templates.template} / {../location}

- + {{{ end }}}
- + {{{ end }}}
diff --git a/src/views/admin/manage/admins-mods.tpl b/src/views/admin/manage/admins-mods.tpl index 4db42dc6e4..9e0ac321c1 100644 --- a/src/views/admin/manage/admins-mods.tpl +++ b/src/views/admin/manage/admins-mods.tpl @@ -38,11 +38,11 @@
- + {{{ each categories }}}

[[admin/manage/admins-mods:moderators-of-category, {categories.name}]]{{{if categories.disabled}}}[[admin/manage/admins-mods:disabled]]{{{end}}}

- + {{{ each categories.moderators }}} - + {{{ end }}}
[[admin/manage/admins-mods:no-moderators]]
@@ -60,5 +60,5 @@

- + {{{ end }}}
diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index d82c40c3bc..d4effc8c5d 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -24,7 +24,7 @@ - + {{{ each users }}} @@ -55,7 +55,7 @@ {users.ip} - + {{{ each users.ipMatch }}}
@@ -63,29 +63,29 @@
{users.ipMatch.icon:text}
{users.ipMatch.username} - + {{{ end }}} - + {{{ each users.customRows }}} {users.customRows.value} - + {{{ end }}}
- + {{{ each users.customActions }}} - + {{{ end }}}
- + {{{ end }}}
@@ -110,8 +110,8 @@ - - + {{{ each invites }}} + {{{ each invites.invitations }}} {invites.username} @@ -122,8 +122,8 @@
- - + {{{ end }}} + {{{ end }}}
diff --git a/src/views/admin/manage/uploads.tpl b/src/views/admin/manage/uploads.tpl index 9751504b50..bec935d1af 100644 --- a/src/views/admin/manage/uploads.tpl +++ b/src/views/admin/manage/uploads.tpl @@ -30,9 +30,9 @@ - - @value - + {{{ each ../inPids }}} + {@value} + {{{ end }}} [[admin/manage/uploads:orphaned]] diff --git a/src/views/admin/partials/blacklist-validate.tpl b/src/views/admin/partials/blacklist-validate.tpl index 36c747aa9c..3d4aba6225 100644 --- a/src/views/admin/partials/blacklist-validate.tpl +++ b/src/views/admin/partials/blacklist-validate.tpl @@ -8,7 +8,7 @@

    -
  • @value
  • +
  • {@value}
\ No newline at end of file diff --git a/src/views/admin/partials/installed_plugin_item.tpl b/src/views/admin/partials/installed_plugin_item.tpl index d0855aa8b3..c3465d6585 100644 --- a/src/views/admin/partials/installed_plugin_item.tpl +++ b/src/views/admin/partials/installed_plugin_item.tpl @@ -1,5 +1,5 @@ -
  • +
  • {{{ if ../installed }}} diff --git a/src/views/admin/partials/manage_user_groups.tpl b/src/views/admin/partials/manage_user_groups.tpl index 6136f8c44c..a7599f9675 100644 --- a/src/views/admin/partials/manage_user_groups.tpl +++ b/src/views/admin/partials/manage_user_groups.tpl @@ -1,13 +1,13 @@ - +{{{ each users }}}
    {users.username}
    - + {{{ each users.groups }}} - + {{{ end }}}
    - \ No newline at end of file +{{{ end }}} \ No newline at end of file diff --git a/src/views/admin/settings/email.tpl b/src/views/admin/settings/email.tpl index 1d3c59d597..df1d2ce84d 100644 --- a/src/views/admin/settings/email.tpl +++ b/src/views/admin/settings/email.tpl @@ -54,9 +54,9 @@ - - - + {{{ each services }}} + + {{{ end }}}

    [[admin/settings/email:smtp-transport.service-help]] diff --git a/src/views/admin/settings/navigation.tpl b/src/views/admin/settings/navigation.tpl index 47d4e609e1..a8694c310c 100644 --- a/src/views/admin/settings/navigation.tpl +++ b/src/views/admin/settings/navigation.tpl @@ -15,7 +15,7 @@


      - + {{{ each enabled }}}
    • @@ -76,9 +76,9 @@ [[admin/settings/navigation:groups]]
      @@ -98,7 +98,7 @@
    • - + {{{ end }}}
    @@ -115,9 +115,9 @@ [[admin/settings/navigation:custom-route]]

  • - -
  • -
    + {{{ each available }}} +
  • +

    @@ -125,7 +125,7 @@ [[admin/settings/navigation:core]] [[admin/settings/navigation:plugin]]

  • - + {{{ end }}}
    From bee8cfe4e0dc3ed2319ee00cbcd2b3793f1adde9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Nov 2020 19:34:00 -0500 Subject: [PATCH 58/67] fix(deps): update dependency nodebb-theme-persona to v10.2.72 (#8903) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7bba8e3703..177af7ee30 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-spam-be-gone": "0.7.6", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", - "nodebb-theme-persona": "10.2.71", + "nodebb-theme-persona": "10.2.72", "nodebb-theme-slick": "1.3.2", "nodebb-theme-vanilla": "11.3.3", "nodebb-widget-essentials": "4.1.2", From b7b1f2035b0d2cebcb504c21a99ba49e8fc4aa36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Nov 2020 19:34:11 -0500 Subject: [PATCH 59/67] fix(deps): update dependency nodebb-plugin-composer-default to v6.4.7 (#8902) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 177af7ee30..3d79738cf3 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "@nodebb/mubsub": "1.7.1", "@nodebb/socket.io-adapter-mongo": "3.1.1", "nconf": "^0.10.0", - "nodebb-plugin-composer-default": "6.4.6", + "nodebb-plugin-composer-default": "6.4.7", "nodebb-plugin-dbsearch": "4.1.2", "nodebb-plugin-emoji": "^3.3.0", "nodebb-plugin-emoji-android": "2.0.0", From c2019b7b3aebcb73d116f66af265ba75da1eeb9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Nov 2020 20:57:03 -0500 Subject: [PATCH 60/67] fix(deps): update dependency nodebb-theme-persona to v10.2.73 (#8904) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3d79738cf3..c0ce0f6ed1 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-spam-be-gone": "0.7.6", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", - "nodebb-theme-persona": "10.2.72", + "nodebb-theme-persona": "10.2.73", "nodebb-theme-slick": "1.3.2", "nodebb-theme-vanilla": "11.3.3", "nodebb-widget-essentials": "4.1.2", From 62b62821c14fb242446dc415e36a08deb6ee60f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 17 Nov 2020 21:20:20 -0500 Subject: [PATCH 61/67] fix: navigation highlight /top was getting hightlighted in navigation if you went into a /topic --- public/src/app.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/src/app.js b/public/src/app.js index b8ae62ac7b..14a3593917 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -244,7 +244,10 @@ app.cacheBuster = null; $('#main-nav li') .removeClass('active') .find('a') - .filter(function (i, x) { return window.location.pathname.startsWith(x.getAttribute('href')); }) + .filter(function (i, x) { + return window.location.pathname === x.pathname || + window.location.pathname.startsWith(x.pathname + '/'); + }) .parent() .addClass('active'); } From a6afcfd53104345a4098dd582defa2f5d7c5bd12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 17 Nov 2020 21:28:32 -0500 Subject: [PATCH 62/67] feat: #8475, allow flagging self posts dont count flags towards self posts dont allow flagging your own account --- public/language/en-GB/flags.json | 2 +- src/flags.js | 5 ++++- src/socket.io/posts/tools.js | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/en-GB/flags.json +++ b/public/language/en-GB/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/src/flags.js b/src/flags.js index 3292cdd946..98ecfb2251 100644 --- a/src/flags.js +++ b/src/flags.js @@ -257,6 +257,9 @@ Flags.validate = async function (payload) { throw new Error('[[error:not-enough-reputation-to-flag]]'); } } else if (payload.type === 'user') { + if (parseInt(payload.id, 10) === parseInt(payload.uid, 10)) { + throw new Error('[[error:cant-flag-self]]'); + } const editable = await privileges.users.canEdit(payload.uid, payload.id); if (!editable && !meta.config['reputation:disabled'] && reporter.reputation < meta.config['min:rep:flag']) { throw new Error('[[error:not-enough-reputation-to-flag]]'); @@ -395,7 +398,7 @@ Flags.create = async function (type, id, uid, reason, timestamp) { posts.setPostField(id, 'flagId', flagId) ); - if (targetUid) { + if (targetUid && parseInt(targetUid, 10) !== parseInt(uid, 10)) { batched.push(user.incrementUserFlagsBy(targetUid, 1)); } } else if (type === 'user') { diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js index a0e4ae4715..b62f651e7a 100644 --- a/src/socket.io/posts/tools.js +++ b/src/socket.io/posts/tools.js @@ -42,7 +42,7 @@ module.exports = function (SocketPosts) { postData.display_edit_tools = results.canEdit.flag; postData.display_delete_tools = results.canDelete.flag; postData.display_purge_tools = results.canPurge; - postData.display_flag_tools = socket.uid && !postData.selfPost && results.canFlag.flag; + postData.display_flag_tools = socket.uid && results.canFlag.flag; postData.display_moderator_tools = postData.display_edit_tools || postData.display_delete_tools; postData.display_move_tools = results.isAdmin || results.isModerator; postData.display_change_owner_tools = results.isAdmin || results.isModerator; From 5f6137f0e609201e651b4aba6e093c3cb007d618 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Nov 2020 21:31:12 -0500 Subject: [PATCH 63/67] fix(deps): update dependency nodebb-theme-persona to v10.2.74 (#8905) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c0ce0f6ed1..ac8d0fa29b 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-spam-be-gone": "0.7.6", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.0.14", - "nodebb-theme-persona": "10.2.73", + "nodebb-theme-persona": "10.2.74", "nodebb-theme-slick": "1.3.2", "nodebb-theme-vanilla": "11.3.3", "nodebb-widget-essentials": "4.1.2", From fb567a7a33d2f5074b1e2ae885a61f2db5448e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 17 Nov 2020 22:11:39 -0500 Subject: [PATCH 64/67] feat: #4456 --- install/data/defaults.json | 1 + public/language/en-GB/admin/settings/guest.json | 6 +++--- src/topics/create.js | 14 ++++++++------ src/views/admin/settings/guest.tpl | 13 +++++++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 811ffa243b..d8ae3a488f 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -116,6 +116,7 @@ "hideEmail": 0, "allowGuestHandles": 0, "guestsIncrementTopicViews": 1, + "allowGuestReplyNotifications": 1, "incrementTopicViewsInterval": 60, "recentMaxTopics": 200, "disableRecentCategoryFilter": 0, diff --git a/public/language/en-GB/admin/settings/guest.json b/public/language/en-GB/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/en-GB/admin/settings/guest.json +++ b/public/language/en-GB/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/src/topics/create.js b/src/topics/create.js index afa8498b72..ca55a8066e 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -187,12 +187,14 @@ module.exports = function (Topics) { user.setUserField(uid, 'lastonline', Date.now()); } - Topics.notifyFollowers(postData, uid, { - type: 'new-reply', - bodyShort: translator.compile('notifications:user_posted_to', postData.user.username, postData.topic.title), - nid: 'new_post:tid:' + postData.topic.tid + ':pid:' + postData.pid + ':uid:' + uid, - mergeId: 'notifications:user_posted_to|' + postData.topic.tid, - }); + if (parseInt(uid, 10) || meta.config.allowGuestReplyNotifications) { + Topics.notifyFollowers(postData, uid, { + type: 'new-reply', + bodyShort: translator.compile('notifications:user_posted_to', postData.user.username, postData.topic.title), + nid: 'new_post:tid:' + postData.topic.tid + ':pid:' + postData.pid + ':uid:' + uid, + mergeId: 'notifications:user_posted_to|' + postData.topic.tid, + }); + } analytics.increment(['posts', 'posts:byCid:' + data.cid]); plugins.fireHook('action:topic.reply', { post: _.clone(postData), data: data }); diff --git a/src/views/admin/settings/guest.tpl b/src/views/admin/settings/guest.tpl index 368f384b79..3adaf9917c 100644 --- a/src/views/admin/settings/guest.tpl +++ b/src/views/admin/settings/guest.tpl @@ -1,7 +1,7 @@
    -
    [[admin/settings/guest:handles]]
    +
    [[admin/settings/guest:settings]]
    @@ -14,9 +14,6 @@ [[admin/settings/guest:handles.enabled-help]]

    -
    -
    [[admin/settings/guest:topic-views]]
    -
    +
    +
    + +
    +
    From 4e9b10ab7605629420cf23415a38f769c05522ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 17 Nov 2020 22:42:08 -0500 Subject: [PATCH 65/67] feat: #5274 --- install/data/defaults.json | 1 + public/language/en-GB/admin/settings/email.json | 6 ++++-- src/notifications.js | 3 +++ src/views/admin/settings/email.tpl | 14 ++++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index d8ae3a488f..05b16670cc 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -123,6 +123,7 @@ "maximumRelatedTopics": 0, "disableEmailSubscriptions": 0, "emailConfirmInterval": 10, + "removeEmailNotificationImages": 0, "inviteExpiration": 7, "digestHour": 17, "passwordExpiryDays": 0, diff --git a/public/language/en-GB/admin/settings/email.json b/public/language/en-GB/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/en-GB/admin/settings/email.json +++ b/public/language/en-GB/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/src/notifications.js b/src/notifications.js index d92aa71e8f..72e6e7ee07 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -175,6 +175,9 @@ async function pushToUids(uids, notification) { notification['cta-type'] = notification.type; } let body = notification.bodyLong || ''; + if (meta.config.removeEmailNotificationImages) { + body = body.replace(/]*>/, ''); + } body = posts.relativeToAbsolute(body, posts.urlRegex); body = posts.relativeToAbsolute(body, posts.imgRegex); await async.eachLimit(uids, 3, function (uid, next) { diff --git a/src/views/admin/settings/email.tpl b/src/views/admin/settings/email.tpl index df1d2ce84d..3e54b08e1f 100644 --- a/src/views/admin/settings/email.tpl +++ b/src/views/admin/settings/email.tpl @@ -154,4 +154,18 @@
    +
    +
    [[admin/settings/email:notifications.settings]]
    +
    +
    +
    + +
    +
    +
    +
    + From 8de48c3935ec220953449432301c2b3cbc1dfa47 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 18 Nov 2020 09:15:10 +0000 Subject: [PATCH 66/67] Latest translations and fallbacks --- public/language/ar/admin/settings/email.json | 6 +++-- public/language/ar/admin/settings/guest.json | 6 ++--- public/language/ar/flags.json | 2 +- public/language/ar/notifications.json | 1 + public/language/ar/topic.json | 1 + public/language/bg/admin/settings/email.json | 6 +++-- public/language/bg/admin/settings/guest.json | 6 ++--- public/language/bg/flags.json | 2 +- public/language/bg/notifications.json | 1 + public/language/bg/topic.json | 1 + public/language/bn/admin/settings/email.json | 6 +++-- public/language/bn/admin/settings/guest.json | 6 ++--- public/language/bn/flags.json | 2 +- public/language/bn/notifications.json | 1 + public/language/bn/topic.json | 1 + public/language/cs/admin/settings/email.json | 6 +++-- public/language/cs/admin/settings/guest.json | 6 ++--- public/language/cs/flags.json | 2 +- public/language/cs/notifications.json | 1 + public/language/cs/topic.json | 1 + public/language/da/admin/settings/email.json | 6 +++-- public/language/da/admin/settings/guest.json | 6 ++--- public/language/da/flags.json | 2 +- public/language/da/notifications.json | 1 + public/language/da/topic.json | 1 + public/language/de/admin/settings/email.json | 6 +++-- public/language/de/admin/settings/guest.json | 6 ++--- public/language/de/flags.json | 2 +- public/language/de/notifications.json | 1 + public/language/de/topic.json | 1 + public/language/el/admin/settings/email.json | 6 +++-- public/language/el/admin/settings/guest.json | 6 ++--- public/language/el/flags.json | 2 +- public/language/el/notifications.json | 1 + public/language/el/topic.json | 1 + .../language/en-US/admin/settings/email.json | 6 +++-- .../language/en-US/admin/settings/guest.json | 6 ++--- public/language/en-US/flags.json | 2 +- public/language/en-US/notifications.json | 1 + public/language/en-US/topic.json | 1 + .../en-x-pirate/admin/settings/email.json | 6 +++-- .../en-x-pirate/admin/settings/guest.json | 6 ++--- public/language/en-x-pirate/flags.json | 2 +- .../language/en-x-pirate/notifications.json | 1 + public/language/en-x-pirate/topic.json | 1 + public/language/es/admin/settings/email.json | 6 +++-- public/language/es/admin/settings/guest.json | 6 ++--- public/language/es/flags.json | 2 +- public/language/es/notifications.json | 1 + public/language/es/topic.json | 1 + public/language/et/admin/settings/email.json | 6 +++-- public/language/et/admin/settings/guest.json | 6 ++--- public/language/et/flags.json | 2 +- public/language/et/notifications.json | 1 + public/language/et/topic.json | 1 + .../language/fa-IR/admin/settings/email.json | 6 +++-- .../language/fa-IR/admin/settings/guest.json | 6 ++--- public/language/fa-IR/error.json | 2 +- public/language/fa-IR/flags.json | 2 +- public/language/fa-IR/modules.json | 2 +- public/language/fa-IR/notifications.json | 1 + public/language/fa-IR/topic.json | 25 ++++++++++--------- public/language/fi/admin/settings/email.json | 6 +++-- public/language/fi/admin/settings/guest.json | 6 ++--- public/language/fi/flags.json | 2 +- public/language/fi/notifications.json | 1 + public/language/fi/topic.json | 1 + .../language/fr/admin/manage/privileges.json | 2 +- public/language/fr/admin/settings/email.json | 6 +++-- public/language/fr/admin/settings/guest.json | 6 ++--- public/language/fr/admin/settings/user.json | 2 +- public/language/fr/flags.json | 2 +- public/language/fr/notifications.json | 1 + public/language/fr/topic.json | 1 + public/language/fr/user.json | 2 +- public/language/fr/users.json | 2 +- public/language/gl/admin/settings/email.json | 6 +++-- public/language/gl/admin/settings/guest.json | 6 ++--- public/language/gl/flags.json | 2 +- public/language/gl/notifications.json | 1 + public/language/gl/topic.json | 1 + public/language/he/admin/settings/email.json | 6 +++-- public/language/he/admin/settings/guest.json | 6 ++--- public/language/he/flags.json | 2 +- public/language/he/notifications.json | 1 + public/language/he/topic.json | 1 + public/language/hr/admin/settings/email.json | 6 +++-- public/language/hr/admin/settings/guest.json | 6 ++--- public/language/hr/flags.json | 2 +- public/language/hr/notifications.json | 1 + public/language/hr/topic.json | 1 + public/language/hu/admin/settings/email.json | 6 +++-- public/language/hu/admin/settings/guest.json | 6 ++--- public/language/hu/flags.json | 2 +- public/language/hu/notifications.json | 1 + public/language/hu/topic.json | 1 + public/language/id/admin/settings/email.json | 6 +++-- public/language/id/admin/settings/guest.json | 6 ++--- public/language/id/flags.json | 2 +- public/language/id/notifications.json | 1 + public/language/id/topic.json | 1 + public/language/it/admin/settings/email.json | 6 +++-- public/language/it/admin/settings/guest.json | 6 ++--- public/language/it/flags.json | 2 +- public/language/it/notifications.json | 1 + public/language/it/topic.json | 1 + public/language/ja/admin/settings/email.json | 6 +++-- public/language/ja/admin/settings/guest.json | 6 ++--- public/language/ja/flags.json | 2 +- public/language/ja/notifications.json | 1 + public/language/ja/topic.json | 1 + public/language/ko/admin/settings/email.json | 6 +++-- public/language/ko/admin/settings/guest.json | 6 ++--- public/language/ko/flags.json | 2 +- public/language/ko/notifications.json | 1 + public/language/ko/topic.json | 1 + public/language/lt/admin/settings/email.json | 6 +++-- public/language/lt/admin/settings/guest.json | 6 ++--- public/language/lt/flags.json | 2 +- public/language/lt/notifications.json | 1 + public/language/lt/topic.json | 1 + public/language/lv/admin/settings/email.json | 6 +++-- public/language/lv/admin/settings/guest.json | 6 ++--- public/language/lv/flags.json | 2 +- public/language/lv/notifications.json | 1 + public/language/lv/topic.json | 1 + public/language/ms/admin/settings/email.json | 6 +++-- public/language/ms/admin/settings/guest.json | 6 ++--- public/language/ms/flags.json | 2 +- public/language/ms/notifications.json | 1 + public/language/ms/topic.json | 1 + public/language/nb/admin/settings/email.json | 6 +++-- public/language/nb/admin/settings/guest.json | 6 ++--- public/language/nb/flags.json | 2 +- public/language/nb/notifications.json | 1 + public/language/nb/topic.json | 1 + public/language/nl/admin/settings/email.json | 6 +++-- public/language/nl/admin/settings/guest.json | 6 ++--- public/language/nl/flags.json | 2 +- public/language/nl/notifications.json | 1 + public/language/nl/topic.json | 1 + public/language/pl/admin/settings/email.json | 6 +++-- public/language/pl/admin/settings/guest.json | 6 ++--- public/language/pl/flags.json | 2 +- public/language/pl/notifications.json | 1 + public/language/pl/topic.json | 1 + .../language/pt-BR/admin/settings/email.json | 6 +++-- .../language/pt-BR/admin/settings/guest.json | 6 ++--- public/language/pt-BR/flags.json | 2 +- public/language/pt-BR/notifications.json | 1 + public/language/pt-BR/topic.json | 1 + .../language/pt-PT/admin/settings/email.json | 6 +++-- .../language/pt-PT/admin/settings/guest.json | 6 ++--- public/language/pt-PT/flags.json | 2 +- public/language/pt-PT/notifications.json | 1 + public/language/pt-PT/topic.json | 1 + public/language/ro/admin/settings/email.json | 6 +++-- public/language/ro/admin/settings/guest.json | 6 ++--- public/language/ro/flags.json | 2 +- public/language/ro/notifications.json | 1 + public/language/ro/topic.json | 1 + public/language/ru/admin/settings/email.json | 6 +++-- public/language/ru/admin/settings/guest.json | 6 ++--- public/language/ru/flags.json | 2 +- public/language/ru/notifications.json | 1 + public/language/ru/topic.json | 1 + public/language/rw/admin/settings/email.json | 6 +++-- public/language/rw/admin/settings/guest.json | 6 ++--- public/language/rw/flags.json | 2 +- public/language/rw/notifications.json | 1 + public/language/rw/topic.json | 1 + public/language/sc/admin/settings/email.json | 6 +++-- public/language/sc/admin/settings/guest.json | 6 ++--- public/language/sc/flags.json | 2 +- public/language/sc/notifications.json | 1 + public/language/sc/topic.json | 1 + public/language/sk/admin/settings/email.json | 6 +++-- public/language/sk/admin/settings/guest.json | 6 ++--- public/language/sk/flags.json | 2 +- public/language/sk/notifications.json | 1 + public/language/sk/topic.json | 1 + public/language/sl/admin/settings/email.json | 6 +++-- public/language/sl/admin/settings/guest.json | 6 ++--- public/language/sl/flags.json | 2 +- public/language/sl/notifications.json | 1 + public/language/sl/topic.json | 1 + public/language/sr/admin/settings/email.json | 6 +++-- public/language/sr/admin/settings/guest.json | 6 ++--- public/language/sr/flags.json | 2 +- public/language/sr/notifications.json | 1 + public/language/sr/topic.json | 1 + public/language/sv/admin/settings/email.json | 6 +++-- public/language/sv/admin/settings/guest.json | 6 ++--- public/language/sv/flags.json | 2 +- public/language/sv/notifications.json | 1 + public/language/sv/topic.json | 1 + public/language/th/admin/settings/email.json | 6 +++-- public/language/th/admin/settings/guest.json | 6 ++--- public/language/th/flags.json | 2 +- public/language/th/notifications.json | 1 + public/language/th/topic.json | 1 + .../language/tr/admin/manage/privileges.json | 2 +- public/language/tr/admin/menu.json | 4 +-- .../language/tr/admin/settings/advanced.json | 4 +-- public/language/tr/admin/settings/api.json | 8 +++--- public/language/tr/admin/settings/email.json | 6 +++-- .../language/tr/admin/settings/general.json | 10 ++++---- public/language/tr/admin/settings/guest.json | 6 ++--- public/language/tr/admin/settings/post.json | 2 +- public/language/tr/admin/settings/user.json | 8 +++--- public/language/tr/flags.json | 2 +- public/language/tr/groups.json | 4 +-- public/language/tr/notifications.json | 1 + public/language/tr/register.json | 4 +-- public/language/tr/topic.json | 1 + public/language/tr/user.json | 2 +- public/language/tr/users.json | 2 +- public/language/uk/admin/settings/email.json | 6 +++-- public/language/uk/admin/settings/guest.json | 6 ++--- public/language/uk/notifications.json | 1 + public/language/uk/topic.json | 1 + public/language/vi/admin/settings/email.json | 6 +++-- public/language/vi/admin/settings/guest.json | 6 ++--- public/language/vi/flags.json | 2 +- public/language/vi/notifications.json | 1 + public/language/vi/topic.json | 1 + .../language/zh-CN/admin/settings/email.json | 6 +++-- .../language/zh-CN/admin/settings/guest.json | 6 ++--- public/language/zh-CN/flags.json | 2 +- public/language/zh-CN/notifications.json | 1 + public/language/zh-CN/topic.json | 1 + .../language/zh-TW/admin/settings/email.json | 6 +++-- .../language/zh-TW/admin/settings/guest.json | 6 ++--- public/language/zh-TW/flags.json | 2 +- public/language/zh-TW/notifications.json | 1 + public/language/zh-TW/topic.json | 1 + 236 files changed, 482 insertions(+), 306 deletions(-) diff --git a/public/language/ar/admin/settings/email.json b/public/language/ar/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/ar/admin/settings/email.json +++ b/public/language/ar/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/ar/admin/settings/guest.json b/public/language/ar/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/ar/admin/settings/guest.json +++ b/public/language/ar/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/ar/flags.json b/public/language/ar/flags.json index 574e792e3b..1e5dff7c54 100644 --- a/public/language/ar/flags.json +++ b/public/language/ar/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 71ae442723..9f349b3895 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/ar/topic.json b/public/language/ar/topic.json index 63fc6a10ff..0871e78c11 100644 --- a/public/language/ar/topic.json +++ b/public/language/ar/topic.json @@ -30,6 +30,7 @@ "locked": "مقفل", "pinned": "مثبت", "moved": "منقول", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/bg/admin/settings/email.json b/public/language/bg/admin/settings/email.json index 3605e93a50..2722d28c0d 100644 --- a/public/language/bg/admin/settings/email.json +++ b/public/language/bg/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Следният адрес на е-поща е този, който получателят ще види в полетата „От“ и “Отговор до“.", "from": "Име за полето „От“", "from-help": "Името на изпращача, което да бъде показано в е-писмото.", - + "smtp-transport": "Транспорт чрез SMTP", "smtp-transport.enabled": "Използване на външен сървър за е-поща за изпращане на е-писма", "smtp-transport-help": "Можете да изберете от списък от познати услуги, или да въведете такава ръчно.", @@ -35,5 +35,7 @@ "subscriptions": "Резюмета по е-поща", "subscriptions.disable": "Изключване на резюметата по е-пощата", "subscriptions.hour": "Време за разпращане", - "subscriptions.hour-help": "Моля, въведете число, представляващо часа, в който да се разпращат е-писма с подготвеното резюме (напр.. 0 за полунощ, 17 за 5 следобед). Имайте предвид, че този час е според часовата зона на сървъра и може да не съвпада с часовника на системата Ви.
    Приблизителното време на сървъра е:
    Изпращането на следващия ежедневен бюлетин е планирано за " + "subscriptions.hour-help": "Моля, въведете число, представляващо часа, в който да се разпращат е-писма с подготвеното резюме (напр.. 0 за полунощ, 17 за 5 следобед). Имайте предвид, че този час е според часовата зона на сървъра и може да не съвпада с часовника на системата Ви.
    Приблизителното време на сървъра е:
    Изпращането на следващия ежедневен бюлетин е планирано за ", + "notifications.settings": "Настройки за известията по е-поща", + "notifications.remove-images": "Премахване на изображенията от известията по е-поща" } \ No newline at end of file diff --git a/public/language/bg/admin/settings/guest.json b/public/language/bg/admin/settings/guest.json index 4e1faed5a9..d87b6ec60d 100644 --- a/public/language/bg/admin/settings/guest.json +++ b/public/language/bg/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Имена за гостите", + "settings": "Настройки", "handles.enabled": "Позволяване на имената за гостите", "handles.enabled-help": "Тази възможност предоставя ново поле, което позволява на гостите да си изберат име, което да се използва за всяка публикация, която правят. Ако е изключено, всички те просто ще имат името „Гост“.", - "topic-views": "Преглеждания на темите", - "topic-views.enabled": "Гостите да допринасят за броя на преглеждания на темите" + "topic-views.enabled": "Гостите да допринасят за броя на преглеждания на темите", + "reply-notifications.enabled": "Гостите да могат да предизвикват изпращането на известия за отговорите си" } \ No newline at end of file diff --git a/public/language/bg/flags.json b/public/language/bg/flags.json index 66e013266b..d8d404f2a2 100644 --- a/public/language/bg/flags.json +++ b/public/language/bg/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Най-много положителни гласове", "sort-replies": "Най-много отговори", - "modal-title": "Докладване на неуместно съдържание", + "modal-title": "Докладване на съдържанието", "modal-body": "Моля, посочете причината за докладването на %1 %2 за преглед. Или използвайте някой от бутоните за бързо докладване, ако са приложими.", "modal-reason-spam": "Спам", "modal-reason-offensive": "Обидно", diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index d5818a10a5..f975415a91 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Когато бъде редактирана публикация в тема, която следите", "notificationType_follow": "Когато някой започне да Ви следва", "notificationType_new-chat": "Когато получите съобщение в разговор", + "notificationType_new-group-chat": "Когато получите съобщение в групов разговор", "notificationType_group-invite": "Когато получите покана за група", "notificationType_group-request-membership": "Когато някой поиска да се включи в група, на която Вие сте собственик", "notificationType_new-register": "Когато някой бъде добавен в опашката за регистрация", diff --git a/public/language/bg/topic.json b/public/language/bg/topic.json index b173eb2bfa..2c31e0f5d9 100644 --- a/public/language/bg/topic.json +++ b/public/language/bg/topic.json @@ -30,6 +30,7 @@ "locked": "Заключена", "pinned": "Закачена", "moved": "Преместена", + "moved-from": "Преместена от %1", "copy-ip": "Копиране на IP адреса", "ban-ip": "Блокиране на IP адреса", "view-history": "История на редакциите", diff --git a/public/language/bn/admin/settings/email.json b/public/language/bn/admin/settings/email.json index 205865077f..18d4209380 100644 --- a/public/language/bn/admin/settings/email.json +++ b/public/language/bn/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "ইমেইল ডাইজেস্ট", "subscriptions.disable": "ইমেইল ডাইজেস্ট নিষ্ক্রিয়", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/bn/admin/settings/guest.json b/public/language/bn/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/bn/admin/settings/guest.json +++ b/public/language/bn/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/bn/flags.json b/public/language/bn/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/bn/flags.json +++ b/public/language/bn/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/bn/notifications.json b/public/language/bn/notifications.json index f17cd098c2..6c99b29edd 100644 --- a/public/language/bn/notifications.json +++ b/public/language/bn/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/bn/topic.json b/public/language/bn/topic.json index 702e6d052f..078de5e741 100644 --- a/public/language/bn/topic.json +++ b/public/language/bn/topic.json @@ -30,6 +30,7 @@ "locked": "বন্ধ", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/cs/admin/settings/email.json b/public/language/cs/admin/settings/email.json index 1938eb5702..c545b1a4bf 100644 --- a/public/language/cs/admin/settings/email.json +++ b/public/language/cs/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Následující e-mailové adresy budou zobrazeny příjemci v políčkách „Od” a „Odpovědět”.", "from": "Jméno – od", "from-help": "Zobrazené jméno v e-mailu v – Od", - + "smtp-transport": "Přenos SMTP", "smtp-transport.enabled": "Pro odesílání e-mailů použít externí e-mailový server ", "smtp-transport-help": "Ze seznamu můžete vybrat známé služby nebo zadat vlastní.", @@ -35,5 +35,7 @@ "subscriptions": "E-mailové odběry", "subscriptions.disable": "Zakázat e-mailové odběry", "subscriptions.hour": "Hodina přehledu", - "subscriptions.hour-help": "Zadejte číslo odpovídající hodině, kdy mají být odeslány přehledové e-maily (tj. 0 pro půlnoc, 17 pro 5:00pm). Mějte na paměti, že tato hodina závisí na hodinách samotného serveru a nemusí tak souhlasit se systémovými hodinami.
    Přibližný čas serveru je: .
    Další odeslání přehledů je plánováno na ." + "subscriptions.hour-help": "Zadejte číslo odpovídající hodině, kdy mají být odeslány přehledové e-maily (tj. 0 pro půlnoc, 17 pro 5:00pm). Mějte na paměti, že tato hodina závisí na hodinách samotného serveru a nemusí tak souhlasit se systémovými hodinami.
    Přibližný čas serveru je: .
    Další odeslání přehledů je plánováno na .", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/cs/admin/settings/guest.json b/public/language/cs/admin/settings/guest.json index ff3c9b0065..9435fdc4df 100644 --- a/public/language/cs/admin/settings/guest.json +++ b/public/language/cs/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Zacházení s hosty", + "settings": "Settings", "handles.enabled": "Povolit upravení zacházení s hosty", "handles.enabled-help": "Tato možnost odkryje nové pole, které umožňuje hostům vybrat jméno, které se připojí ke každému příspěvku, který vytvoří. Bude-li zakázáno, budou jednoduše nazýváni „Host”", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/cs/flags.json b/public/language/cs/flags.json index cedf3990dd..4228803ec0 100644 --- a/public/language/cs/flags.json +++ b/public/language/cs/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Nahlásit nevhodný obsah", + "modal-title": "Report Content", "modal-body": "Zadejte váš důvod k označení %1 %2 pro kontrolu. Nebo použijte tlačítko je-li dostupné.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Urážlivé", diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 662cf1541d..6fe457883d 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Začne-li vás někdo sledovat", "notificationType_new-chat": "Obdržíte-li novou konverzační zprávu", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Obdržíte-li pozvání ke skupině", "notificationType_group-request-membership": "Pokud někdo požaduje připojení se do vaší skupiny", "notificationType_new-register": "Bude-li někdo přidán do registrační fronty", diff --git a/public/language/cs/topic.json b/public/language/cs/topic.json index 68f6a57c4d..14cff97bdf 100644 --- a/public/language/cs/topic.json +++ b/public/language/cs/topic.json @@ -30,6 +30,7 @@ "locked": "Uzamknuto", "pinned": "Připnuto", "moved": "Přesunuto", + "moved-from": "Moved from %1", "copy-ip": "Kopírovat IP", "ban-ip": "Zakázat IP", "view-history": "Upravit historii", diff --git a/public/language/da/admin/settings/email.json b/public/language/da/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/da/admin/settings/email.json +++ b/public/language/da/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/da/admin/settings/guest.json b/public/language/da/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/da/admin/settings/guest.json +++ b/public/language/da/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/da/flags.json b/public/language/da/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/da/flags.json +++ b/public/language/da/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/da/notifications.json b/public/language/da/notifications.json index e18b411132..daa04bcf68 100644 --- a/public/language/da/notifications.json +++ b/public/language/da/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/da/topic.json b/public/language/da/topic.json index 158dbf0587..7ae6aa1e22 100644 --- a/public/language/da/topic.json +++ b/public/language/da/topic.json @@ -30,6 +30,7 @@ "locked": "Låst", "pinned": "Pinned", "moved": "Flyttet", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/de/admin/settings/email.json b/public/language/de/admin/settings/email.json index 8c4a3508cd..89a5bbba80 100644 --- a/public/language/de/admin/settings/email.json +++ b/public/language/de/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Die folgende E-Mail Adresse ist die E-Mail Adresse, welche dem Empfänger im \"Von\" und \"Antworten\" Bereich sehen wird.", "from": "Name des Absenders", "from-help": "Der Name des Absenders, welcher in der E-Mail angezeigt werden soll.", - + "smtp-transport": "SMTP Konfiguration", "smtp-transport.enabled": "Benutze einen externen Email-Server", "smtp-transport-help": "Du kannst aus einer Liste bekannter Email-Provider auswählen, oder einen benutzerdefinierten eingeben.", @@ -35,5 +35,7 @@ "subscriptions": "Email Zusammenfassungen", "subscriptions.disable": "Deaktivierung der Email Zusammenfassungen", "subscriptions.hour": "Sende Zeit", - "subscriptions.hour-help": "Bitte geben Sie eine Nummer ein, welche die Stunde repräsentiert zu welcher geplante Emails versandt werden sollen (z.B. 0 für Mitternacht, 17 für 5 Uhr Nachmittags). Beachten Sie, dass die Zeit auf der Serverzeit basiert und daher nicht umbedingt mit ihrer Systemzeit übereinstimmen muss.
    Die ungefähre Serverzeit ist:
    Die nächste tägliche Sendung ist um geplant" + "subscriptions.hour-help": "Bitte geben Sie eine Nummer ein, welche die Stunde repräsentiert zu welcher geplante Emails versandt werden sollen (z.B. 0 für Mitternacht, 17 für 5 Uhr Nachmittags). Beachten Sie, dass die Zeit auf der Serverzeit basiert und daher nicht umbedingt mit ihrer Systemzeit übereinstimmen muss.
    Die ungefähre Serverzeit ist:
    Die nächste tägliche Sendung ist um geplant", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/de/admin/settings/guest.json b/public/language/de/admin/settings/guest.json index 63f5712808..6c0f22ef55 100644 --- a/public/language/de/admin/settings/guest.json +++ b/public/language/de/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Gastzugang", + "settings": "Settings", "handles.enabled": "Gastzugänge erlauben", "handles.enabled-help": "Diese Option offenbart ein neues Feld, welches Gästen erlaubt einen Nutzernamen zu wählen, welcher sie mit jedem Beitrag assoziiert den sie erstellen. Wenn diese Option deaktiviert ist, werden sie einfach \"Gast\" genannt", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/de/flags.json b/public/language/de/flags.json index c13378a447..914b2dcecc 100644 --- a/public/language/de/flags.json +++ b/public/language/de/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Anstößige Inhalte Melden", + "modal-title": "Report Content", "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", diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 736cf94e69..53407294d2 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Wenn ein Post bearbeitet wurde, in einem Thema welches du beobachtest", "notificationType_follow": "Wenn dir jemand neues folgt", "notificationType_new-chat": "Wenn du eine Chat Nachricht erhältst", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Wenn du eine Gruppeneinladung erhältst", "notificationType_group-request-membership": "Wenn jemand einer Gruppe beitreten möchte, die dir gehört", "notificationType_new-register": "Wenn jemand der Registrierungswarteschlange hinzugefügt wird", diff --git a/public/language/de/topic.json b/public/language/de/topic.json index 387375fa94..a28cb572dc 100644 --- a/public/language/de/topic.json +++ b/public/language/de/topic.json @@ -30,6 +30,7 @@ "locked": "Gesperrt", "pinned": "Angeheftet", "moved": "Verschoben", + "moved-from": "Moved from %1", "copy-ip": "IP-Adresse Kopieren", "ban-ip": "IP-Adresse bannen", "view-history": "Verlauf bearbeiten", diff --git a/public/language/el/admin/settings/email.json b/public/language/el/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/el/admin/settings/email.json +++ b/public/language/el/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/el/admin/settings/guest.json b/public/language/el/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/el/admin/settings/guest.json +++ b/public/language/el/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/el/flags.json b/public/language/el/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/el/flags.json +++ b/public/language/el/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/el/notifications.json b/public/language/el/notifications.json index 85efcdc2ed..248c0a6034 100644 --- a/public/language/el/notifications.json +++ b/public/language/el/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/el/topic.json b/public/language/el/topic.json index b726e77cd3..8128c0a405 100644 --- a/public/language/el/topic.json +++ b/public/language/el/topic.json @@ -30,6 +30,7 @@ "locked": "Κλειδωμένο", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/en-US/admin/settings/email.json b/public/language/en-US/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/en-US/admin/settings/email.json +++ b/public/language/en-US/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/en-US/admin/settings/guest.json b/public/language/en-US/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/en-US/admin/settings/guest.json +++ b/public/language/en-US/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/en-US/flags.json b/public/language/en-US/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/en-US/flags.json +++ b/public/language/en-US/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/en-US/notifications.json b/public/language/en-US/notifications.json index 91600bf79a..c5d367fae2 100644 --- a/public/language/en-US/notifications.json +++ b/public/language/en-US/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/en-US/topic.json b/public/language/en-US/topic.json index 933960757e..16dc2d4b75 100644 --- a/public/language/en-US/topic.json +++ b/public/language/en-US/topic.json @@ -30,6 +30,7 @@ "locked": "Locked", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/en-x-pirate/admin/settings/email.json b/public/language/en-x-pirate/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/en-x-pirate/admin/settings/email.json +++ b/public/language/en-x-pirate/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/settings/guest.json b/public/language/en-x-pirate/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/en-x-pirate/admin/settings/guest.json +++ b/public/language/en-x-pirate/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/en-x-pirate/flags.json b/public/language/en-x-pirate/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/en-x-pirate/flags.json +++ b/public/language/en-x-pirate/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/en-x-pirate/notifications.json b/public/language/en-x-pirate/notifications.json index 705fed3063..26adae26f2 100644 --- a/public/language/en-x-pirate/notifications.json +++ b/public/language/en-x-pirate/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/en-x-pirate/topic.json b/public/language/en-x-pirate/topic.json index 933960757e..16dc2d4b75 100644 --- a/public/language/en-x-pirate/topic.json +++ b/public/language/en-x-pirate/topic.json @@ -30,6 +30,7 @@ "locked": "Locked", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/es/admin/settings/email.json b/public/language/es/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/es/admin/settings/email.json +++ b/public/language/es/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/es/admin/settings/guest.json b/public/language/es/admin/settings/guest.json index 235c604455..0fbe97ac7b 100644 --- a/public/language/es/admin/settings/guest.json +++ b/public/language/es/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Manejar visitantes", + "settings": "Settings", "handles.enabled": "Permitir manejo de visitantes", "handles.enabled-help": "Esta opción expone un nuevo campo que permite a los invitados escoger un nombre para asociarse con cada entrada/respuesta que hagan. Si está desactivado, se les llamará simplemente \"Invitado\".", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/es/flags.json b/public/language/es/flags.json index a33c6919a6..8ac3583388 100644 --- a/public/language/es/flags.json +++ b/public/language/es/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Reportar contenido inapropiado", + "modal-title": "Report Content", "modal-body": "Por favor especifica tu razón para marcar %1 %2 para revisar. Alternativamente, usa una de los botones de reporte rápido si corresponde.", "modal-reason-spam": "Correo no deseado", "modal-reason-offensive": "Ofensivo", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 6dc1c86b19..cd0b726262 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Cuando alguien comienza a seguirte", "notificationType_new-chat": "Cuando recibes un mensaje de chat", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Cuando recibes una invitación a un grupo", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "Cuando alguien es añadido a una cola de registro", diff --git a/public/language/es/topic.json b/public/language/es/topic.json index dda4294346..d0073d0a43 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -30,6 +30,7 @@ "locked": "Cerrado", "pinned": "Fijo", "moved": "Movido", + "moved-from": "Moved from %1", "copy-ip": "Copiar IP", "ban-ip": "Banear IP", "view-history": "Editar Historial", diff --git a/public/language/et/admin/settings/email.json b/public/language/et/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/et/admin/settings/email.json +++ b/public/language/et/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/et/admin/settings/guest.json b/public/language/et/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/et/admin/settings/guest.json +++ b/public/language/et/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/et/flags.json b/public/language/et/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/et/flags.json +++ b/public/language/et/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 43a8469320..0db60d7e5c 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/et/topic.json b/public/language/et/topic.json index cbeff78e93..415dac6e17 100644 --- a/public/language/et/topic.json +++ b/public/language/et/topic.json @@ -30,6 +30,7 @@ "locked": "Lukustatud", "pinned": "Märgistatud", "moved": "Liigutatud", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/fa-IR/admin/settings/email.json b/public/language/fa-IR/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/fa-IR/admin/settings/email.json +++ b/public/language/fa-IR/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/settings/guest.json b/public/language/fa-IR/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/fa-IR/admin/settings/guest.json +++ b/public/language/fa-IR/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 42e0884fca..b2a7b9cf65 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -133,7 +133,7 @@ "reputation-system-disabled": "سیستم اعتبار غیر فعال شده است", "downvoting-disabled": "رأی منفی غیر فعال شده است", "not-enough-reputation-to-downvote": "شما اعتبار کافی برای دادن رأی منفی به این پست را ندارید.", - "not-enough-reputation-to-flag": "شما اعتبار کافی برای نشاندار کردن این پست ندارید", + "not-enough-reputation-to-flag": "شما اعتبار کافی را برای گزارش کردن این پست ندارید", "not-enough-reputation-min-rep-website": "شما اعتبار لازم برای درج آدرس وبسایت را ندارید", "not-enough-reputation-min-rep-aboutme": "شما اعتبار لازم برای ویرایش بخش درباره من را ندارید", "not-enough-reputation-min-rep-signature": "شما اعتبار لازم برای ایجاد امضاء را ندارید", diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index 18cb602477..b9b0e9ece7 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "گزارش محتوای نامناسب", + "modal-title": "Report Content", "modal-body": "لطفا علت گزارش %2 %1 را برای بررسی مشخص کنید. همچنین می توانید از یکی از دکمه های ارسال سریع استفاده کنید.", "modal-reason-spam": "هرزنامه", "modal-reason-offensive": "توهین آمیز", diff --git a/public/language/fa-IR/modules.json b/public/language/fa-IR/modules.json index 5df903c5b2..8f7d873aa9 100644 --- a/public/language/fa-IR/modules.json +++ b/public/language/fa-IR/modules.json @@ -59,7 +59,7 @@ "composer.upload-file": "بارگذاری فایل", "composer.zen_mode": "حالت ذن", "composer.select_category": "یک دسته‌بندی انتخاب کنید", - "composer.textarea.placeholder": "Enter your post content here, drag and drop images", + "composer.textarea.placeholder": "محتوای پست خود را اینجا وارد کنید یا تصاویر را به اینجا بکشید و رها کنید", "bootbox.ok": "باشه", "bootbox.cancel": "انصراف", "bootbox.confirm": "تایید", diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index aff9a5edb1..86508854c4 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "هنگامی که کسی شما را دنبال می کند", "notificationType_new-chat": "هنگامی که شما پیام چتی دریافت می کنید", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "هنگامی که شما دعوتنامه گروه دریافت می کنید", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "وقتی کسی به صف ثبت نام اضافه می شود", diff --git a/public/language/fa-IR/topic.json b/public/language/fa-IR/topic.json index eebcf522a8..5dd9b7fd32 100644 --- a/public/language/fa-IR/topic.json +++ b/public/language/fa-IR/topic.json @@ -22,7 +22,7 @@ "purge": "پاک کردن", "restore": "برگرداندن", "move": "جابه‌جا کردن", - "change-owner": "Change Owner", + "change-owner": "تغییر مالک پست", "fork": "شاخه ساختن", "link": "پیوند", "share": "اشتراک‌گذاری", @@ -30,12 +30,13 @@ "locked": "قفل شده است", "pinned": "سنجاق شده", "moved": "منتقل شده", + "moved-from": "Moved from %1", "copy-ip": "کپی IP", "ban-ip": "مسدود کردن IP", "view-history": "تاریخچه ویرایش", "bookmark_instructions": "برای بازگشت به آخرین پست در این موضوع اینجا را کلیک کنید.", - "flag-post": "Flag this post", - "flag-user": "Flag this user", + "flag-post": "گزارش این پست", + "flag-user": "گزارش این کاربر", "already-flagged": "Already Flagged", "view-flag-report": "View Flag Report", "merged_message": "This topic has been merged into %2", @@ -67,7 +68,7 @@ "thread_tools.move": "جابجا کردن موضوع", "thread_tools.move-posts": "انتقال پست ها", "thread_tools.move_all": "جابجایی همه", - "thread_tools.change_owner": "Change Owner", + "thread_tools.change_owner": "تغییر مالک پست", "thread_tools.select_category": "انتخاب دسته", "thread_tools.fork": "شاخه ساختن از موضوع", "thread_tools.delete": "پاک کردن موضوع", @@ -80,7 +81,7 @@ "thread_tools.merge_topics": "ادغام موضوع ها", "thread_tools.merge": "ادغام", "topic_move_success": "This topic will be moved to \"%1\" shortly. Click here to undo.", - "topic_move_multiple_success": "These topics will be moved to \"%1\" shortly. Click here to undo.", + "topic_move_multiple_success": "تاپیک به %1 منتقل خواهد شد. برای جلوگیری از منتقل شدن کلیک کنید.", "topic_move_all_success": "All topics will be moved to \"%1\" shortly. Click here to undo.", "topic_move_undone": "Topic move undone", "topic_move_posts_success": "Posts will be moved shortly. Click here to undo.", @@ -102,18 +103,18 @@ "fork_topic": "شاخه ساختن از موضوع", "fork_topic_instruction": "پست‌هایی را که می‌خواهید به موضوع تازه ببرید، انتخاب کنید", "fork_no_pids": "هیچ پستی انتخاب نشده!", - "no-posts-selected": "No posts selected!", - "x-posts-selected": "%1 post(s) selected", + "no-posts-selected": "هیچ پستی انتخاب نشده!", + "x-posts-selected": "%1 پست انتخاب شده", "x-posts-will-be-moved-to-y": "%1 post(s) will be moved to \"%2\"", - "fork_pid_count": "%1 پست (ها) انتخاب شده اند", + "fork_pid_count": "%1 پست انتخاب شده", "fork_success": "موضوع با موفقیت منشعب شد! برای رفتن به موضوع انشعابی اینجا را کلیک کنید.", "delete_posts_instruction": "با کلیک بر روی پست شما می خواهید به حذف/پاکسازی", - "merge_topics_instruction": "Click the topics you want to merge or search for them", - "merge-topic-list-title": "List of topics to be merged", - "merge-options": "Merge options", + "merge_topics_instruction": "تاپیک های مورد نظر برای ادغام را انتخاب کنید یا آن ها را جستجو کنید", + "merge-topic-list-title": "لیست تاپیک هایی که با هم ادغام می شوند", + "merge-options": "تنظیمات ادغام", "merge-select-main-topic": "Select the main topic", "merge-new-title-for-topic": "New title for topic", - "move_posts_instruction": "Click the posts you want to move then go to target topic and click move.", + "move_posts_instruction": "پست های مورد نظر را انتخاب کنید سپس به تاپیک مقصد بروید و گزینه جابه‌جا کردن را بزنید.", "change_owner_instruction": "Click the posts you want to assign to another user", "composer.title_placeholder": "عنوان موضوعتان را اینجا بنویسید...", "composer.handle_placeholder": "Enter your name/handle here", diff --git a/public/language/fi/admin/settings/email.json b/public/language/fi/admin/settings/email.json index 60b7b52e29..ac0b01163a 100644 --- a/public/language/fi/admin/settings/email.json +++ b/public/language/fi/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Sähköposti koosteet", "subscriptions.disable": "Poista sähköpostin koosteet käytöstä", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/fi/admin/settings/guest.json b/public/language/fi/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/fi/admin/settings/guest.json +++ b/public/language/fi/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/fi/flags.json b/public/language/fi/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/fi/flags.json +++ b/public/language/fi/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/fi/notifications.json b/public/language/fi/notifications.json index be327e7527..733c1a70a2 100644 --- a/public/language/fi/notifications.json +++ b/public/language/fi/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Kun joku alkaa seurata sinua", "notificationType_new-chat": "Kun saat viestin keskusteluun", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Kun saat kutsun ryhmään", "notificationType_group-request-membership": "Kun joku pyytää lupaa liittyä ryhmään, jonka omistaja olet", "notificationType_new-register": "Kun joku lisätään rekisteröintijonoon", diff --git a/public/language/fi/topic.json b/public/language/fi/topic.json index 664632b470..e27966e041 100644 --- a/public/language/fi/topic.json +++ b/public/language/fi/topic.json @@ -30,6 +30,7 @@ "locked": "Lukittu", "pinned": "Kiinnitetty", "moved": "Siirretty", + "moved-from": "Moved from %1", "copy-ip": "Kopioi IP", "ban-ip": "Ban IP", "view-history": "Muokkaa historiaa", diff --git a/public/language/fr/admin/manage/privileges.json b/public/language/fr/admin/manage/privileges.json index 80c1a2ab36..b9f4fcb5ef 100644 --- a/public/language/fr/admin/manage/privileges.json +++ b/public/language/fr/admin/manage/privileges.json @@ -9,7 +9,7 @@ "upload-files": "Fichiers envoyés", "signature": "Signature", "ban": "Bannir", - "invite": "Invite", + "invite": "Inviter", "search-content": "Rechercher un contenu", "search-users": "Rechercher des utilisateurs", "search-tags": "Rechercher les tags", diff --git a/public/language/fr/admin/settings/email.json b/public/language/fr/admin/settings/email.json index 09de353ad2..c36b86ea7b 100644 --- a/public/language/fr/admin/settings/email.json +++ b/public/language/fr/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "L'adresse e-mail suivante fait référence à l'adresse que le destinataire verra dans les champs \"De :\" et \"Répondre à :\". ", "from": "Nom de l’expéditeur", "from-help": "Le nom de l’expéditeur à afficher dans l'e-mail", - + "smtp-transport": "Protocole SMTP", "smtp-transport.enabled": "Utiliser un server extérieur pour envoyer les emails", "smtp-transport-help": "Vous pouvez sélectionner depuis une liste de services ou entrer un service personnalisé.", @@ -35,5 +35,7 @@ "subscriptions": "Actualités du forum ", "subscriptions.disable": "Désactiver les actualités du forum ", "subscriptions.hour": "Heure d'envoi", - "subscriptions.hour-help": "Veuillez entrer un nombre représentant l'heure à laquelle envoyer les emails de résumé (c'est à dire 0 pour minuit, 17 pour 5:00 pm). Gardez à l'esprit qu'il s'agit de l'heure du serveur, et peut ne pas correspondre à votre heure locale.
    L'heure du serveur est :
    Le prochain mail de resumé sera envoyé à " + "subscriptions.hour-help": "Veuillez entrer un nombre représentant l'heure à laquelle envoyer les emails de résumé (c'est à dire 0 pour minuit, 17 pour 5:00 pm). Gardez à l'esprit qu'il s'agit de l'heure du serveur, et peut ne pas correspondre à votre heure locale.
    L'heure du serveur est :
    Le prochain mail de resumé sera envoyé à ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/guest.json b/public/language/fr/admin/settings/guest.json index 422348f22b..0cde9b5f3a 100644 --- a/public/language/fr/admin/settings/guest.json +++ b/public/language/fr/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Gestion des invités", + "settings": "Settings", "handles.enabled": "Autoriser les invités à poster", "handles.enabled-help": "Cette option affiche un nouveau champ qui permet aux invités de choisir un nom qui sera associé à chaque message qu'ils rédigent. Si désactivé, il seront simplement nommés \"Invité\".", - "topic-views": "Consultations du sujet", - "topic-views.enabled": "Autoriser les invités à augmenter le nombre de consultations de sujets" + "topic-views.enabled": "Autoriser les invités à augmenter le nombre de consultations de sujets", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/user.json b/public/language/fr/admin/settings/user.json index 8b8fbf3fee..2f8e608045 100644 --- a/public/language/fr/admin/settings/user.json +++ b/public/language/fr/admin/settings/user.json @@ -65,7 +65,7 @@ "restrict-chat": "Autoriser uniquement les discussions aux utilisateurs que je suis", "outgoing-new-tab": "Ouvrir les liens sortants dans un nouvel onglet", "topic-search": "Activer la recherche au sein des sujets", - "update-url-with-post-index": "Update url with post index while browsing topics", + "update-url-with-post-index": "Mettre à jour l'URL avec l'index des articles", "digest-freq": "S'inscrire aux compte rendus", "digest-freq.off": "Désactivé", "digest-freq.daily": "Quotidien", diff --git a/public/language/fr/flags.json b/public/language/fr/flags.json index 2492cee1c3..238191de50 100644 --- a/public/language/fr/flags.json +++ b/public/language/fr/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Demandes positives", "sort-replies": "Réponses", - "modal-title": "Signaler un contenu inapproprié", + "modal-title": "Report Content", "modal-body": "Veuillez saisir le motif de votre signalement pour %1 %2 et sélectionner le bouton ci-dessous le plus approprié.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Choquant", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index 913efafb54..ef664344c6 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Lorsqu'un article est modifié dans un sujet que vous regardez", "notificationType_follow": "Lorsque quelqu'un commence à vous suivre", "notificationType_new-chat": "Lorsque vous recevez un message du chat ", + "notificationType_new-group-chat": "Lorsque vous recevez un message de discussion de groupe", "notificationType_group-invite": "Lorsque vous recevez une invitation d'un groupe", "notificationType_group-request-membership": "Quand quelqu'un demande à rejoindre un groupe que vous administrez", "notificationType_new-register": "Lorsque quelqu'un est ajouté à la file d'attente d'inscription", diff --git a/public/language/fr/topic.json b/public/language/fr/topic.json index 92f0d48071..4366bc070d 100644 --- a/public/language/fr/topic.json +++ b/public/language/fr/topic.json @@ -30,6 +30,7 @@ "locked": "Verrouillé", "pinned": "Épinglé", "moved": "Déplacé", + "moved-from": "Déplacé de %1", "copy-ip": "Copier l'IP", "ban-ip": "Bannir l'IP", "view-history": "Éditer l'historique", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 03f6e38456..593e9f001d 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -123,7 +123,7 @@ "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet", "enable_topic_searching": "Activer la recherche dans les sujets", "topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts affichés à l'écran.", - "update_url_with_post_index": "Update url with post index while browsing topics", + "update_url_with_post_index": "Mettre à jour l'URL avec l'index des articles", "scroll_to_my_post": "Après avoir répondu, montrer le nouveau message", "follow_topics_you_reply_to": "S'abonner aux sujets auxquels vous répondez", "follow_topics_you_create": "S'abonner aux sujets que vous créez", diff --git a/public/language/fr/users.json b/public/language/fr/users.json index c813e38e61..51413e9c93 100644 --- a/public/language/fr/users.json +++ b/public/language/fr/users.json @@ -11,7 +11,7 @@ "online-only": "En ligne uniquement", "invite": "Invitation", "prompt-email": "Emails:", - "groups-to-join": "Groups to be joined when invite is accepted:", + "groups-to-join": "Groupes à rejoindre lorsque l'invitation est acceptée:", "invitation-email-sent": "Un email d'invitation a été envoyé à %1", "user_list": "Liste d'Utilisateurs", "recent_topics": "Sujets Récents", diff --git a/public/language/gl/admin/settings/email.json b/public/language/gl/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/gl/admin/settings/email.json +++ b/public/language/gl/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/gl/admin/settings/guest.json b/public/language/gl/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/gl/admin/settings/guest.json +++ b/public/language/gl/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/gl/flags.json b/public/language/gl/flags.json index 14bda1b94a..29189beab3 100644 --- a/public/language/gl/flags.json +++ b/public/language/gl/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Reportar Contido Inapropiado", + "modal-title": "Report Content", "modal-body": "Por favor, especifique o seu motivo para marcar %1 %2 para revisión. Alternativamente, empregue un dos botóns de reporte rápido se fose pertinente.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Ofensivo", diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 6470a1fd96..059c57d3fb 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/gl/topic.json b/public/language/gl/topic.json index e7637f3561..ef9e356214 100644 --- a/public/language/gl/topic.json +++ b/public/language/gl/topic.json @@ -30,6 +30,7 @@ "locked": "Pechado", "pinned": "Fixo", "moved": "Movido", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/he/admin/settings/email.json b/public/language/he/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/he/admin/settings/email.json +++ b/public/language/he/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/he/admin/settings/guest.json b/public/language/he/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/he/admin/settings/guest.json +++ b/public/language/he/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/he/flags.json b/public/language/he/flags.json index 021ea96562..f0d0dc9727 100644 --- a/public/language/he/flags.json +++ b/public/language/he/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "הכי הרבה הצבעות", "sort-replies": "הכי הרבה תגובות", - "modal-title": "דווח על תוכן לא ראוי", + "modal-title": "Report Content", "modal-body": "אנא ציין את הסיבה לסימון %1 %2 לצורך בקרה. לחלופין, השתמש באחד מכפתורי הדיווח המהיר אם אפשר.", "modal-reason-spam": "זבל", "modal-reason-offensive": "פוגעני", diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index 58596f5a8a..8d02ec113b 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "כשמישהו מתחיל לעקוב אחריך", "notificationType_new-chat": "כשאתה מקבל הודעת צאט", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "כשאתה מקבל הזמנה מקבוצה", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "כאשר מישהו מתווסף לתור הרישום", diff --git a/public/language/he/topic.json b/public/language/he/topic.json index 4b882bf540..8909b61143 100644 --- a/public/language/he/topic.json +++ b/public/language/he/topic.json @@ -30,6 +30,7 @@ "locked": "נעול", "pinned": "נעוץ", "moved": "הועבר", + "moved-from": "Moved from %1", "copy-ip": "העתק כתובת IP", "ban-ip": "הרחק כתובת IP", "view-history": "ערוך היסטוריה", diff --git a/public/language/hr/admin/settings/email.json b/public/language/hr/admin/settings/email.json index 589332d162..b76e4551ba 100644 --- a/public/language/hr/admin/settings/email.json +++ b/public/language/hr/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Sljedeća email adresa je adresa koju će primatelj vidjeti u \"Od\" i \"Odgovori na\" poljima.", "from": "Od imena", "from-help": "Ime prikazano u dolaznom emailu.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Pregled Sati.", - "subscriptions.hour-help": "Unesite broj koji pretstavlja vrijeme kada će se poslati pregled mailom (npr. 0 za ponoć, 17za 5 popodne).Imajte na umu da to vrijeme predstavlja vrijeme servera te ne mora predstavljati vrijeme na Vašem sistemu. Vrijeme servera je:
    Sljedeći pregled će biti poslan ." + "subscriptions.hour-help": "Unesite broj koji pretstavlja vrijeme kada će se poslati pregled mailom (npr. 0 za ponoć, 17za 5 popodne).Imajte na umu da to vrijeme predstavlja vrijeme servera te ne mora predstavljati vrijeme na Vašem sistemu. Vrijeme servera je:
    Sljedeći pregled će biti poslan .", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/hr/admin/settings/guest.json b/public/language/hr/admin/settings/guest.json index 3b86812ee4..78c75a43e2 100644 --- a/public/language/hr/admin/settings/guest.json +++ b/public/language/hr/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Upravljanje gostima", + "settings": "Settings", "handles.enabled": "Dozvoli upravljanje gostima", "handles.enabled-help": "Ova opcija omogućava gostima da izaberi ime za svaku objavu koju naprave.Ako je onemogućena gosti će se zvati \"gost\".", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/hr/flags.json b/public/language/hr/flags.json index f9e8dff1e9..6c1761dfe4 100644 --- a/public/language/hr/flags.json +++ b/public/language/hr/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Prijavi neprimjereni sadržaj", + "modal-title": "Report Content", "modal-body": "Navedite razlog označavanja zastavom %1 %2 .U suprotnom koristite jedan od dugmića za brzo prijavljivanje.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Uvredljivo", diff --git a/public/language/hr/notifications.json b/public/language/hr/notifications.json index 85f031bab3..4e43f28e4d 100644 --- a/public/language/hr/notifications.json +++ b/public/language/hr/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/hr/topic.json b/public/language/hr/topic.json index 5a18c836fc..ba109d49a7 100644 --- a/public/language/hr/topic.json +++ b/public/language/hr/topic.json @@ -30,6 +30,7 @@ "locked": "Zaključano", "pinned": "Zakačeno", "moved": "Premješteno", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/hu/admin/settings/email.json b/public/language/hu/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/hu/admin/settings/email.json +++ b/public/language/hu/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/hu/admin/settings/guest.json b/public/language/hu/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/hu/admin/settings/guest.json +++ b/public/language/hu/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/hu/flags.json b/public/language/hu/flags.json index adc5a33942..9bf2b38188 100644 --- a/public/language/hu/flags.json +++ b/public/language/hu/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index 71e4edd6a2..46b386ca38 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Mikor valaki elkezd követni téged", "notificationType_new-chat": "Mikor chat üzenetet kapsz", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Mikor csoportmeghívást kapsz", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "Mikor valaki a regisztrációs várólistára kerül", diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 4ee0d90804..3825796197 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -30,6 +30,7 @@ "locked": "Zárolva", "pinned": "Rögzített", "moved": "Áthelyezett", + "moved-from": "Moved from %1", "copy-ip": "IP-cím másolása", "ban-ip": "IP-cím kitiltása", "view-history": "Edit History", diff --git a/public/language/id/admin/settings/email.json b/public/language/id/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/id/admin/settings/email.json +++ b/public/language/id/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/id/admin/settings/guest.json b/public/language/id/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/id/admin/settings/guest.json +++ b/public/language/id/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/id/flags.json b/public/language/id/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/id/flags.json +++ b/public/language/id/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/id/notifications.json b/public/language/id/notifications.json index 2192cce6cc..57f60009db 100644 --- a/public/language/id/notifications.json +++ b/public/language/id/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/id/topic.json b/public/language/id/topic.json index 764c8b6639..97fa869ae0 100644 --- a/public/language/id/topic.json +++ b/public/language/id/topic.json @@ -30,6 +30,7 @@ "locked": "Terkunci", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/it/admin/settings/email.json b/public/language/it/admin/settings/email.json index d67e27fcfa..5c7d376804 100644 --- a/public/language/it/admin/settings/email.json +++ b/public/language/it/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Il seguente indirizzo email si riferisce all'email che il destinatario vedrà nei campi \"Da\" e \"Rispondi a\".", "from": "Da Nome", "from-help": "Il nome da visualizzare nell'email.", - + "smtp-transport": "Trasporto SMTP", "smtp-transport.enabled": "Utilizza un server di posta elettronica esterno per inviare le email", "smtp-transport-help": "Puoi selezionare da un elenco di servizi noti o inserirne uno personalizzato.", @@ -35,5 +35,7 @@ "subscriptions": "Email riepilogo", "subscriptions.disable": "Disabilita email riepilogo", "subscriptions.hour": "Orario riepilogo", - "subscriptions.hour-help": "Si prega di inserire un numero che rappresenta l'ora per l'invio dell'email programmate (es. 0per mezzanotte, 17per le 17: 00). Tieni presente che questa è l'ora secondo il server stesso, e potrebbe non combaciare esattamente al tuo orologio di sistema.
    L'orario approssimativo del server è:
    La prossima trasmissione giornaliera è prevista alle " + "subscriptions.hour-help": "Si prega di inserire un numero che rappresenta l'ora per l'invio dell'email programmate (es. 0per mezzanotte, 17per le 17: 00). Tieni presente che questa è l'ora secondo il server stesso, e potrebbe non combaciare esattamente al tuo orologio di sistema.
    L'orario approssimativo del server è:
    La prossima trasmissione giornaliera è prevista alle ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/it/admin/settings/guest.json b/public/language/it/admin/settings/guest.json index e946d8a26a..798eb01eda 100644 --- a/public/language/it/admin/settings/guest.json +++ b/public/language/it/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Nome utente Ospite", + "settings": "Settings", "handles.enabled": "Consenti nome utente ospite", "handles.enabled-help": "Questa opzione mostra un nuovo campo che permette agli ospiti di scegliere un nome da associare ad ogni post che fanno. Se disabilitata, saranno semplicemente chiamati \"Ospite\".", - "topic-views": "Visualizzazioni discussione", - "topic-views.enabled": "Consentire agli ospiti di aumentare il numero di visualizzazioni della discussione" + "topic-views.enabled": "Consentire agli ospiti di aumentare il numero di visualizzazioni della discussione", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/it/flags.json b/public/language/it/flags.json index 9709236047..5473628978 100644 --- a/public/language/it/flags.json +++ b/public/language/it/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Più voti positivi", "sort-replies": "Più risposte", - "modal-title": "Segnala Contenuto Inappropriato", + "modal-title": "Report Content", "modal-body": "Specifica il motivo per cui contrassegni %1 %2 per la revisione. In alternativa, utilizza uno dei pulsanti di segnalazione rapida, se applicabile.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensivo", diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 45bd4df2ec..812cae26d4 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Quando un post viene modificato in un topic che stai guardando", "notificationType_follow": "Quando qualcuno inizia a seguirti", "notificationType_new-chat": "Quando ricevi un messaggio in chat", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Quando ricevi un invito ad un gruppo", "notificationType_group-request-membership": "Quando qualcuno richiede di iscriversi a un gruppo di tua proprietà", "notificationType_new-register": "Quando qualcuno è in attesa della registrazione", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index b257dcf8e5..252ac98c60 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -30,6 +30,7 @@ "locked": "Bloccato", "pinned": "Appeso", "moved": "Spostato", + "moved-from": "Moved from %1", "copy-ip": "Copia indirizzo IP", "ban-ip": "Banna indirizzo IP", "view-history": "Modifica storico", diff --git a/public/language/ja/admin/settings/email.json b/public/language/ja/admin/settings/email.json index 5d638c3af5..c1dd208061 100644 --- a/public/language/ja/admin/settings/email.json +++ b/public/language/ja/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "次の電子メールアドレスは「送信者」と「返信先」の欄に受信者が表示する電子メールを指します。", "from": "名前から", "from-help": "メールからの名前が表示されます。", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "ダイジェストアワー", - "subscriptions.hour-help": "スケジュールされたメールのダイジェストを送信する時間を表す数字を入力してください(深夜は0、午後5:00は17)これはサーバー自体に基づく時間であり、システムの時計と正確に一致しない場合があります。
    次の日のダイジェストは" + "subscriptions.hour-help": "スケジュールされたメールのダイジェストを送信する時間を表す数字を入力してください(深夜は0、午後5:00は17)これはサーバー自体に基づく時間であり、システムの時計と正確に一致しない場合があります。
    次の日のダイジェストは", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/guest.json b/public/language/ja/admin/settings/guest.json index 7d9d94db62..629e93d809 100644 --- a/public/language/ja/admin/settings/guest.json +++ b/public/language/ja/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "ゲストハンドル", + "settings": "Settings", "handles.enabled": "ゲストハンドルを有効にする", "handles.enabled-help": "このオプションでは新しい投稿が表示される時に、ゲストは自分が投稿する各投稿に関連付ける名前を選択できます。無効にすると、単に「ゲスト」と呼ばれます。", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/ja/flags.json b/public/language/ja/flags.json index 75c66b6681..df5a7713d4 100644 --- a/public/language/ja/flags.json +++ b/public/language/ja/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "不適切なコンテンツを報告する", + "modal-title": "Report Content", "modal-body": "レビューのために%1 %2 にフラグを付ける理由を指定してください。または必要に応じてクイックレポートボタンの1つを使用します。", "modal-reason-spam": "スパム", "modal-reason-offensive": "攻撃", diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index e3db188cd6..7686ab1f78 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "誰かがあなたをフォローしたとき", "notificationType_new-chat": "チャットメッセージを受信したとき", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "グループ招待を受けたとき", "notificationType_group-request-membership": "誰かがあなたのグループへの参加を要求したとき", "notificationType_new-register": "誰かが登録キューに追加されたとき", diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 2913a57a96..7b37b0d752 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -30,6 +30,7 @@ "locked": "ロック", "pinned": "ピンされた", "moved": "移動しました", + "moved-from": "Moved from %1", "copy-ip": "IPをコピー", "ban-ip": "IPをBan", "view-history": "履歴を編集", diff --git a/public/language/ko/admin/settings/email.json b/public/language/ko/admin/settings/email.json index cf7255cb1b..dd9ed857a4 100644 --- a/public/language/ko/admin/settings/email.json +++ b/public/language/ko/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "아래 이메일 주소는 수신인의 \"보낸 사람\"과 \"답장하기\" 항목에서 보이게 됩니다.", "from": "보낸 사람 이름", "from-help": "이메일에 표시할 보낸 사람 이름", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "발송 시간", - "subscriptions.hour-help": "정기 이메일을 보낼 시간을 기입해 주세요(예: 0은 자정, 17은 오후 5시 입니다. 이 시간은 서버기준이며, 귀하의 시스템 시간과 일치하지 않을 수 있습니다.
    서버 시간은 입니다.
    다음 정기 이메일은 에 발송 예정입니다." + "subscriptions.hour-help": "정기 이메일을 보낼 시간을 기입해 주세요(예: 0은 자정, 17은 오후 5시 입니다. 이 시간은 서버기준이며, 귀하의 시스템 시간과 일치하지 않을 수 있습니다.
    서버 시간은 입니다.
    다음 정기 이메일은 에 발송 예정입니다.", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/guest.json b/public/language/ko/admin/settings/guest.json index 56603dedc7..935f6c2ad1 100644 --- a/public/language/ko/admin/settings/guest.json +++ b/public/language/ko/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "게스트 처리", + "settings": "Settings", "handles.enabled": "미가입 사용자 닉네임 설정 허가", "handles.enabled-help": "이 옵션은 게스트들이 포스트를 작성할 때 이름을 적는 공간을 제공합니다. 이 옵션이 비활성화 돼있다면 \"Guest\" 라고 표시될 것입니다.", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/ko/flags.json b/public/language/ko/flags.json index c164aad462..4e0218d708 100644 --- a/public/language/ko/flags.json +++ b/public/language/ko/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "부적절한 컨텐츠 신고", + "modal-title": "Report Content", "modal-body": "%1 %2 에 대한 신고 사유를 적어주시거나, 빠른 신고 버튼 중 하나를 사용해 주세요.", "modal-reason-spam": "스팸", "modal-reason-offensive": "부적절한 글", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 640ce1374a..b0b29021d9 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "누군가 사용자님을 팔로우 하면", "notificationType_new-chat": "채팅 메시지를 받으면", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "그룹 초대를 받으면", "notificationType_group-request-membership": "누군가가 당신이 소유한 그룹에 참여를 요청했을 때", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index 437fd01ac1..81aafa2234 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -30,6 +30,7 @@ "locked": "잠긴 게시물", "pinned": "고정된 게시물", "moved": "이동된 게시물", + "moved-from": "Moved from %1", "copy-ip": "IP 복사", "ban-ip": "IP 차단", "view-history": "편집 기록", diff --git a/public/language/lt/admin/settings/email.json b/public/language/lt/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/lt/admin/settings/email.json +++ b/public/language/lt/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/lt/admin/settings/guest.json b/public/language/lt/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/lt/admin/settings/guest.json +++ b/public/language/lt/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/lt/flags.json b/public/language/lt/flags.json index 556035ffbb..1977059a92 100644 --- a/public/language/lt/flags.json +++ b/public/language/lt/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Šlamštas", "modal-reason-offensive": "Offensive", diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 2b09fbc8ff..c7f4446e04 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/lt/topic.json b/public/language/lt/topic.json index 7f0f281058..7d0b47f37b 100644 --- a/public/language/lt/topic.json +++ b/public/language/lt/topic.json @@ -30,6 +30,7 @@ "locked": "Užrakinta", "pinned": "Pinned", "moved": "Perkelta", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Blokuoti IP", "view-history": "Edit History", diff --git a/public/language/lv/admin/settings/email.json b/public/language/lv/admin/settings/email.json index 0d878340e9..084dd5c055 100644 --- a/public/language/lv/admin/settings/email.json +++ b/public/language/lv/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "E-pasta adrese, ko saņēmējs redzēs laukos \"No:\" un \"Atbildēt:\".", "from": "Sūtītāja vārds vai nosaukums", "from-help": "Vārds vai nosaukums, ko saņēmējs redzēs kā sūtītāju.", - + "smtp-transport": "SMTP transports", "smtp-transport.enabled": "Izmantot atsevišķu e-pasta serveri, lai nosūtītu e-pastus", "smtp-transport-help": "Izvēlies no labi zināmu pakalpojumu saraksta vai ievadi pielāgotu pakalpojumu.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Kopsavilkumu nosūtīšanas stunda", - "subscriptions.hour-help": "Ievadīt skaitli, kas norāda stundu, kurā nosūtītu e-pasta rakstu apkopojumu (piemēram, 0 nozīmē pusnakts, 17 nozīmē plkst.1700). Paturēt prātā, ka šī ir stunda servera laikā, un tā var neatbilst Tavam pulkstenim. Aptuvens servera laiks ir:
    Nākamais ikdienas apkopojums tiks nosūtīts " + "subscriptions.hour-help": "Ievadīt skaitli, kas norāda stundu, kurā nosūtītu e-pasta rakstu apkopojumu (piemēram, 0 nozīmē pusnakts, 17 nozīmē plkst.1700). Paturēt prātā, ka šī ir stunda servera laikā, un tā var neatbilst Tavam pulkstenim. Aptuvens servera laiks ir:
    Nākamais ikdienas apkopojums tiks nosūtīts ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/lv/admin/settings/guest.json b/public/language/lv/admin/settings/guest.json index e355222d3d..394c6b8a25 100644 --- a/public/language/lv/admin/settings/guest.json +++ b/public/language/lv/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Viesu iesaukas", + "settings": "Settings", "handles.enabled": "Atļaut viesu iesaukas", "handles.enabled-help": "Parādīt lauku, kas viesiem ļaus izvēlēties savu iesauku, kas saistīts ar katru viņu publicēto rakstu. Ja ir atspējots, viņus vienkārši sauks par \"Viesiem\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/lv/flags.json b/public/language/lv/flags.json index ec9a8547e7..9132179172 100644 --- a/public/language/lv/flags.json +++ b/public/language/lv/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Ziņot par nepiemērotu saturu", + "modal-title": "Report Content", "modal-body": "Lūdzu, norādi iemeslu, kāpēc %1 %2 ir atzīmēts pārskatīšanai. Citādi, izmanto vienu no ātrā ziņojuma pogām.", "modal-reason-spam": "Mēstule", "modal-reason-offensive": "Aizskarošs", diff --git a/public/language/lv/notifications.json b/public/language/lv/notifications.json index afd3c42343..cced8052fe 100644 --- a/public/language/lv/notifications.json +++ b/public/language/lv/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Kad kāds sāk Tev sekot", "notificationType_new-chat": "Kad saņemi sarunu", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Kad saņemi ielūgumu pievienoties grupai", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "Kad kāds tiek ievietots reģistrācijas rindā", diff --git a/public/language/lv/topic.json b/public/language/lv/topic.json index 6827595739..dc6f01b54b 100644 --- a/public/language/lv/topic.json +++ b/public/language/lv/topic.json @@ -30,6 +30,7 @@ "locked": "Slēgtie", "pinned": "Piespraustie", "moved": "Pārvietots", + "moved-from": "Moved from %1", "copy-ip": "Kopēt IP adresi", "ban-ip": "Bloķēt IP adresi", "view-history": "Rediģēšanas vēsture", diff --git a/public/language/ms/admin/settings/email.json b/public/language/ms/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/ms/admin/settings/email.json +++ b/public/language/ms/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/ms/admin/settings/guest.json b/public/language/ms/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/ms/admin/settings/guest.json +++ b/public/language/ms/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/ms/flags.json b/public/language/ms/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/ms/flags.json +++ b/public/language/ms/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index 444e49c195..598476cc8b 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/ms/topic.json b/public/language/ms/topic.json index a53aca52fa..5f7f6257f1 100644 --- a/public/language/ms/topic.json +++ b/public/language/ms/topic.json @@ -30,6 +30,7 @@ "locked": "Kunci", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/nb/admin/settings/email.json b/public/language/nb/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/nb/admin/settings/email.json +++ b/public/language/nb/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/nb/admin/settings/guest.json b/public/language/nb/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/nb/admin/settings/guest.json +++ b/public/language/nb/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/nb/flags.json b/public/language/nb/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/nb/flags.json +++ b/public/language/nb/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index 470d5d23bb..54f955a650 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index e33bd18b72..c59a5424f4 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -30,6 +30,7 @@ "locked": "Låst", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/nl/admin/settings/email.json b/public/language/nl/admin/settings/email.json index 5fdd953ced..e1d062b536 100644 --- a/public/language/nl/admin/settings/email.json +++ b/public/language/nl/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Het volgende e-mailadres refereert aan de e-mail die ontvanger ziet in de \"From\" en \"Reply To\" velden.", "from": "From Naam", "from-help": "De from naam om te tonen in de e-mail.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Gebruik een externe mail server om mails te verzenden", "smtp-transport-help": "Je kunt een bekende dienst uit de lijst selecteren of vul een aangepaste dienst in.", @@ -35,5 +35,7 @@ "subscriptions": "E-mail digests", "subscriptions.disable": "Schakel e-mail digests uit", "subscriptions.hour": "Uur van Digest", - "subscriptions.hour-help": "Voer het nummer in dat het uur representeerd waarop scheduled email digests worden verstuurd (bv. 0 voor middernacht, 17 voor 17:00). Neem er s.v.p. notie van dat dit het uur is van de server self, dit hoeft niet exact overeen te komen met de klok van uw systeem.
    De tijd op de server is bij benadering:
    De volgende dagelijkse digest staat gepland om " + "subscriptions.hour-help": "Voer het nummer in dat het uur representeerd waarop scheduled email digests worden verstuurd (bv. 0 voor middernacht, 17 voor 17:00). Neem er s.v.p. notie van dat dit het uur is van de server self, dit hoeft niet exact overeen te komen met de klok van uw systeem.
    De tijd op de server is bij benadering:
    De volgende dagelijkse digest staat gepland om ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/nl/admin/settings/guest.json b/public/language/nl/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/nl/admin/settings/guest.json +++ b/public/language/nl/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/nl/flags.json b/public/language/nl/flags.json index c6cce94e4e..5d36245b74 100644 --- a/public/language/nl/flags.json +++ b/public/language/nl/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Rapporteer ongepaste content", + "modal-title": "Report Content", "modal-body": "Beschrijf de reden voor het markeren van %1 %2 voor review. Of gebruik een van de snelknoppen indien van toepassing.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Aanstootgevend", diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index 6f33e6b37e..6c77277819 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Als een bericht wordt aangepast in een onderwerp dat je volgt", "notificationType_follow": "Als iemand begint met jou te volgen", "notificationType_new-chat": "Als je een chat-bericht ontvangt", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Als je een uitnodiging voor een groep ontvangt", "notificationType_group-request-membership": "Als iemand vraagt om lid te worden van een groep waarvan je eigenaar bent", "notificationType_new-register": "Als iemand wordt toegevoegd aan een registratiewachtrij", diff --git a/public/language/nl/topic.json b/public/language/nl/topic.json index 205eb899ce..48791248da 100644 --- a/public/language/nl/topic.json +++ b/public/language/nl/topic.json @@ -30,6 +30,7 @@ "locked": "Gesloten", "pinned": "Pinned", "moved": "Verplaatst", + "moved-from": "Moved from %1", "copy-ip": "Kopieer IP", "ban-ip": "Verban IP", "view-history": "Revisie geschiedenis", diff --git a/public/language/pl/admin/settings/email.json b/public/language/pl/admin/settings/email.json index e3774d23a9..0133f3617a 100644 --- a/public/language/pl/admin/settings/email.json +++ b/public/language/pl/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Ten adres e-mail odbiorca zobaczy w polach „Od” i „Odpowiedz”.", "from": "Pole „Od”", "from-help": "Nazwa „Od” widoczna w e-mailach", - + "smtp-transport": "Transport SMTP", "smtp-transport.enabled": "Używaj zewnętrznego serwera e-mail do wysyłania e-maili.", "smtp-transport-help": "Możesz wybrać z listy dobrze znanych usług lub wskazać usługę niestandardową.", @@ -35,5 +35,7 @@ "subscriptions": "Podsumowania e-mail", "subscriptions.disable": "Wyłącz podsumowania e-maili", "subscriptions.hour": "Godzina podsumowania", - "subscriptions.hour-help": "Wprowadź liczbę odpowiadającą godzinie, o której mają być wysyłane regularne e-maile z podsumowaniem (np. 0 dla północy lub 17 dla 17:00). Pamiętaj, że godzina jest godziną serwera i nie musi zgadzać się z czasem lokalnym administratora. Przybliżony czas serwera to:
    Wysłanie kolejnego e-maila z podsumowaniem zaplanowano na " + "subscriptions.hour-help": "Wprowadź liczbę odpowiadającą godzinie, o której mają być wysyłane regularne e-maile z podsumowaniem (np. 0 dla północy lub 17 dla 17:00). Pamiętaj, że godzina jest godziną serwera i nie musi zgadzać się z czasem lokalnym administratora. Przybliżony czas serwera to:
    Wysłanie kolejnego e-maila z podsumowaniem zaplanowano na ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/pl/admin/settings/guest.json b/public/language/pl/admin/settings/guest.json index 4eb4da8a21..1584969a45 100644 --- a/public/language/pl/admin/settings/guest.json +++ b/public/language/pl/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Podpisywanie się gości", + "settings": "Settings", "handles.enabled": "Zezwalaj gościom na podpisywanie się", "handles.enabled-help": "Opcja ta udostępnia gościom nowe pole, w którym mogą wybrać nazwę, pod jaką będą publikować posty. Jeśli opcja jest wyłączona, stosowana będzie po prostu nazwa „Gość”", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/pl/flags.json b/public/language/pl/flags.json index cc69a02ec9..241896eb4d 100644 --- a/public/language/pl/flags.json +++ b/public/language/pl/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Zgłoś niewłaściwe treści", + "modal-title": "Report Content", "modal-body": "Wskaż powód oflagowania i zgłoszenia %1 %2 do oceny. Jeśli to możliwe, użyj jednego z przycisków szybkiego zgłoszenia.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Treści obraźliwe", diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 5ff19a59a7..ae37815cc8 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Kiedy post jest edytowany w temacie, który obserwujesz", "notificationType_follow": "Kiedy ktoś zacznie Cię obserwować", "notificationType_new-chat": "Kiedy otrzymasz wiadomość na czacie", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Kiedy otrzymasz grupowe zaproszenie", "notificationType_group-request-membership": "Kiedy ktoś prosi o dołączenie do grupy, którą posiadasz", "notificationType_new-register": "Kiedy ktoś zostaje dodany do kolejki rejestracyjnej", diff --git a/public/language/pl/topic.json b/public/language/pl/topic.json index 682131652c..57f5ee1a1e 100644 --- a/public/language/pl/topic.json +++ b/public/language/pl/topic.json @@ -30,6 +30,7 @@ "locked": "Zablokowany", "pinned": "Przypięty", "moved": "Przeniesiony", + "moved-from": "Moved from %1", "copy-ip": "Kopiuj IP", "ban-ip": "Blokuj IP", "view-history": "Historia edycji", diff --git a/public/language/pt-BR/admin/settings/email.json b/public/language/pt-BR/admin/settings/email.json index edeef89aa4..6d233e6dfd 100644 --- a/public/language/pt-BR/admin/settings/email.json +++ b/public/language/pt-BR/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "O seguinte endereço de e-mail se refere ao e-mail que o destinatário verá nos campos \"De\" e \"Responder Para\".", "from": "Por Nome (From)", "from-help": "O nome que será mostrado em \"De\" no e-mail.", - + "smtp-transport": "Trasporte por SMTP", "smtp-transport.enabled": "Utilizar um servidor de e-mail externo para enviar e-mails", "smtp-transport-help": "Você pode escolher entre uma lista de serviços conhecidos ou adicionar um personalizado.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Hora de Envio dos Resumos", - "subscriptions.hour-help": "Por favor, entre um número representando a hora para enviar os resumos agendados via e-mail (por exemplo: 0 para meia-noite, 17 para 5:00pm). Tenha em mente que esta é a hora de acordo com o servidor e pode não combinar exatamente com o relógio do seu sistema.
    O horário aproximado do servidor é:
    O próximo resumo diário está agendado para ser enviado " + "subscriptions.hour-help": "Por favor, entre um número representando a hora para enviar os resumos agendados via e-mail (por exemplo: 0 para meia-noite, 17 para 5:00pm). Tenha em mente que esta é a hora de acordo com o servidor e pode não combinar exatamente com o relógio do seu sistema.
    O horário aproximado do servidor é:
    O próximo resumo diário está agendado para ser enviado ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/guest.json b/public/language/pt-BR/admin/settings/guest.json index 09422d5b18..84e3098de0 100644 --- a/public/language/pt-BR/admin/settings/guest.json +++ b/public/language/pt-BR/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Nome para Visitantes", + "settings": "Settings", "handles.enabled": "Permitir que visitantes escolham um nome", "handles.enabled-help": "Esta opção mostra um novo campo que permite visitantes de escolher um nome para associar a cada post que eles fizerem. Se desabilitado, eles serão simplesmente chamados de \"Visitante\".", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/pt-BR/flags.json b/public/language/pt-BR/flags.json index 0dff281db8..1bb5fc5a31 100644 --- a/public/language/pt-BR/flags.json +++ b/public/language/pt-BR/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Reportar Conteúdo Inadequado", + "modal-title": "Report Content", "modal-body": "Por favor, especifique a razão pela qual você está sinalizando %1 %2 para a revisão. Alternativamente, use um dos botões de reporte rápido se for aplicável.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Ofensivo", diff --git a/public/language/pt-BR/notifications.json b/public/language/pt-BR/notifications.json index d9fc33c48a..c06ba4e7ca 100644 --- a/public/language/pt-BR/notifications.json +++ b/public/language/pt-BR/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Quando alguém começar a seguir você", "notificationType_new-chat": "Quando você receber uma mensagem de chat", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Quando você receber um convite para um grupo", "notificationType_group-request-membership": "Quando alguém pede para participar de um grupo que você é dono", "notificationType_new-register": "Quando alguém for adicionado à fila de registro", diff --git a/public/language/pt-BR/topic.json b/public/language/pt-BR/topic.json index 9e5b448a82..7ae84e2309 100644 --- a/public/language/pt-BR/topic.json +++ b/public/language/pt-BR/topic.json @@ -30,6 +30,7 @@ "locked": "Trancado", "pinned": "Fixado", "moved": "Movido", + "moved-from": "Moved from %1", "copy-ip": "Copiar IP", "ban-ip": "Banir IP", "view-history": "Histórico de Edição", diff --git a/public/language/pt-PT/admin/settings/email.json b/public/language/pt-PT/admin/settings/email.json index 9a4d43bb02..8917a8ea07 100644 --- a/public/language/pt-PT/admin/settings/email.json +++ b/public/language/pt-PT/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Resumos por E-mail", "subscriptions.disable": "Desativar resumos por e-mail", "subscriptions.hour": "Hora do Resumo", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/settings/guest.json b/public/language/pt-PT/admin/settings/guest.json index d2e42cbedd..af3d498e80 100644 --- a/public/language/pt-PT/admin/settings/guest.json +++ b/public/language/pt-PT/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Nomes para visitantes", + "settings": "Settings", "handles.enabled": "Permitir nomes para visitantes", "handles.enabled-help": "Esta opção expôe um novo campo que permite a visitantes escolher um nome para associar a cada publicação que eles criem. Se desabilitada, eles simplesmente se chamarão \"Visitante\" ", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/pt-PT/flags.json b/public/language/pt-PT/flags.json index 87b36c6847..3f22c5b2c2 100644 --- a/public/language/pt-PT/flags.json +++ b/public/language/pt-PT/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Denunciar Conteúdo Impróprio", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Ofensivo", diff --git a/public/language/pt-PT/notifications.json b/public/language/pt-PT/notifications.json index ed1b911ef8..cda956aa54 100644 --- a/public/language/pt-PT/notifications.json +++ b/public/language/pt-PT/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Quando uma publicação é editada num tópico que estás a seguir", "notificationType_follow": "Quando alguém começa a seguir-te", "notificationType_new-chat": "Quando recebes uma mensagem numa conversa", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Quando recebes um convite para um grupo", "notificationType_group-request-membership": "Quando alguém pede para entrar num grupo que é teu", "notificationType_new-register": "Quando alguém é adicionado à fila de espera de registo", diff --git a/public/language/pt-PT/topic.json b/public/language/pt-PT/topic.json index 8ea32d45f9..7599763939 100644 --- a/public/language/pt-PT/topic.json +++ b/public/language/pt-PT/topic.json @@ -30,6 +30,7 @@ "locked": "Bloqueado", "pinned": "Afixado", "moved": "Movido", + "moved-from": "Moved from %1", "copy-ip": "Copiar IP", "ban-ip": "Banir IP", "view-history": "Histórico de Edição", diff --git a/public/language/ro/admin/settings/email.json b/public/language/ro/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/ro/admin/settings/email.json +++ b/public/language/ro/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/ro/admin/settings/guest.json b/public/language/ro/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/ro/admin/settings/guest.json +++ b/public/language/ro/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/ro/flags.json b/public/language/ro/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/ro/flags.json +++ b/public/language/ro/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index 10008327aa..175ee9c7e2 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/ro/topic.json b/public/language/ro/topic.json index c7ecedf806..dd1844b7b4 100644 --- a/public/language/ro/topic.json +++ b/public/language/ro/topic.json @@ -30,6 +30,7 @@ "locked": "Închis", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/ru/admin/settings/email.json b/public/language/ru/admin/settings/email.json index 805e300208..acdad4c0ed 100644 --- a/public/language/ru/admin/settings/email.json +++ b/public/language/ru/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Этот адрес получатели писем увидят в полях «От кого» и «Ответить».", "from": "От кого", "from-help": "Имя отправителя письма (или название форума).", - + "smtp-transport": "Сервис SMTP", "smtp-transport.enabled": "Использовать сторонний сервис для рассылки писем", "smtp-transport-help": "Выберите один из популярных сервисов или укажите свой почтовый сервер.", @@ -35,5 +35,7 @@ "subscriptions": "Новостные рассылки", "subscriptions.disable": "Отключить новостные рассылки", "subscriptions.hour": "Час отправки", - "subscriptions.hour-help": "Введите число, соответствующее номеру часа (например, 0 для полуночи, 17 для 17:00). Имейте в виду, что время определяется по часовому поясу сервера.
    Текущее время сервера:
    Следующая рассылка запланирована на " + "subscriptions.hour-help": "Введите число, соответствующее номеру часа (например, 0 для полуночи, 17 для 17:00). Имейте в виду, что время определяется по часовому поясу сервера.
    Текущее время сервера:
    Следующая рассылка запланирована на ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/guest.json b/public/language/ru/admin/settings/guest.json index 94d34bf6d6..4245f4eec1 100644 --- a/public/language/ru/admin/settings/guest.json +++ b/public/language/ru/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Имена гостей", + "settings": "Settings", "handles.enabled": "Разрешить гостям выбирать имена", "handles.enabled-help": "Эта настройка добавляет поле, в котором гость сможет указать имя, под которым он хочет оставить сообщение. Когда она выключена, вместо имени будет написано просто «Гость».", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index d14a6d21b3..25aa9ffb02 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Сообщить о недопустимом контенте", + "modal-title": "Report Content", "modal-body": "Укажите причину для жалобы на %1 %2. Вы можете использовать одну из подходящих стандартных причин.", "modal-reason-spam": "Спам", "modal-reason-offensive": "Оскорбительное содержимое", diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index 98be01de19..a8a05f48a9 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Когда сообщение было отредактировано в теме, на которую вы подписаны", "notificationType_follow": "Когда кто-то подписался на вас", "notificationType_new-chat": "Когда вы получаете сообщение в чат", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Когда вы получаете приглашение в группу", "notificationType_group-request-membership": "Когда кто-то хочет присоединиться к группе, которой вы управляете", "notificationType_new-register": "Когда в очереди на регистрацию появляется новый пользователь", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 32c4174e35..40f5bd5934 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -30,6 +30,7 @@ "locked": "Закрыта", "pinned": "Прикреплена", "moved": "Перенесена", + "moved-from": "Moved from %1", "copy-ip": "Копировать IP", "ban-ip": "Забанить IP", "view-history": "История правок", diff --git a/public/language/rw/admin/settings/email.json b/public/language/rw/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/rw/admin/settings/email.json +++ b/public/language/rw/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/rw/admin/settings/guest.json b/public/language/rw/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/rw/admin/settings/guest.json +++ b/public/language/rw/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/rw/flags.json b/public/language/rw/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/rw/flags.json +++ b/public/language/rw/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/rw/notifications.json b/public/language/rw/notifications.json index 466d7cef9d..fc6ea70cf4 100644 --- a/public/language/rw/notifications.json +++ b/public/language/rw/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/rw/topic.json b/public/language/rw/topic.json index 4459286859..fb15f3a347 100644 --- a/public/language/rw/topic.json +++ b/public/language/rw/topic.json @@ -30,6 +30,7 @@ "locked": "Birafungiranye", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/sc/admin/settings/email.json b/public/language/sc/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/sc/admin/settings/email.json +++ b/public/language/sc/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/sc/admin/settings/guest.json b/public/language/sc/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/sc/admin/settings/guest.json +++ b/public/language/sc/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/sc/flags.json b/public/language/sc/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/sc/flags.json +++ b/public/language/sc/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index e80a740a95..590e3aeb62 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/sc/topic.json b/public/language/sc/topic.json index f362bdf565..9c4fd5ce6d 100644 --- a/public/language/sc/topic.json +++ b/public/language/sc/topic.json @@ -30,6 +30,7 @@ "locked": "Locked", "pinned": "Pinned", "moved": "Moved", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/sk/admin/settings/email.json b/public/language/sk/admin/settings/email.json index ed440bb848..35fc262867 100644 --- a/public/language/sk/admin/settings/email.json +++ b/public/language/sk/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Nasledujúce e-mailové adresy budú zobrazené príjemcovi v políčkach 'Od' a 'Odpovedať'.", "from": "Meno - od", "from-help": "Zobrazené meno v e-maily v - Od", - + "smtp-transport": "Prenos SMTP", "smtp-transport.enabled": "Pre odosielanie e-mailov použiť externý e-mailový server", "smtp-transport-help": "Zo zoznamu môžete vybrať známe služby alebo zadať vlastné.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/sk/admin/settings/guest.json b/public/language/sk/admin/settings/guest.json index bd342391fb..760cd59c8b 100644 --- a/public/language/sk/admin/settings/guest.json +++ b/public/language/sk/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Zaobchádzanie s hosťami", + "settings": "Settings", "handles.enabled": "Povoliť upravovanie zaobchádzania s hosťami", "handles.enabled-help": "Táto možnosť odkryje nové pole, ktoré umožňuje hosťom vybrať meno, ktoré sa pripojí ku každému príspevku, ktorý vytvorí. Ak bude zakázané, budú jednoducho nazývaní 'Hosť'", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/sk/flags.json b/public/language/sk/flags.json index bf24b2dfa8..f328f60e18 100644 --- a/public/language/sk/flags.json +++ b/public/language/sk/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Nahlásiť nevhodný obsah", + "modal-title": "Report Content", "modal-body": "Zadajte dôvod, pre ktorý chcete označiť %1 %2 na kontrolu. Prípadne použite jedno z tlačidiel rýchleho hlásenia, ak je to vhodné.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Urážlivý", diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index 04d86ca116..ef9f509cff 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Ak Vás začne niekto sledovať", "notificationType_new-chat": "Ak obdržíte novú správu konverzácie", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Ak obdržíte pozvanie do skupiny", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "Ak bude niekto pridaný do registračnej fronty", diff --git a/public/language/sk/topic.json b/public/language/sk/topic.json index c4c5ce68c9..d63f25d323 100644 --- a/public/language/sk/topic.json +++ b/public/language/sk/topic.json @@ -30,6 +30,7 @@ "locked": "Uzamknuté", "pinned": "Pripnuté", "moved": "Presunuté", + "moved-from": "Moved from %1", "copy-ip": "Kopírovať IP adresu", "ban-ip": "Zablokovať IP adresu", "view-history": "Upraviť históriu", diff --git a/public/language/sl/admin/settings/email.json b/public/language/sl/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/sl/admin/settings/email.json +++ b/public/language/sl/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/sl/admin/settings/guest.json b/public/language/sl/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/sl/admin/settings/guest.json +++ b/public/language/sl/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/sl/flags.json b/public/language/sl/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/sl/flags.json +++ b/public/language/sl/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/sl/notifications.json b/public/language/sl/notifications.json index 418a4db93e..9cf0a326b4 100644 --- a/public/language/sl/notifications.json +++ b/public/language/sl/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "When someone starts following you", "notificationType_new-chat": "When you receive a chat message", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "When you receive a group invite", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "When someone gets added to registration queue", diff --git a/public/language/sl/topic.json b/public/language/sl/topic.json index 494c0e25af..3ed9160fd8 100644 --- a/public/language/sl/topic.json +++ b/public/language/sl/topic.json @@ -30,6 +30,7 @@ "locked": "Zaklenjeno", "pinned": "Pripeto", "moved": "Premaknjeno", + "moved-from": "Moved from %1", "copy-ip": "Copy IP", "ban-ip": "Ban IP", "view-history": "Edit History", diff --git a/public/language/sr/admin/settings/email.json b/public/language/sr/admin/settings/email.json index 31274349b9..d7f907b94f 100644 --- a/public/language/sr/admin/settings/email.json +++ b/public/language/sr/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Označena email adresa se odnosi na email koga će primalac videti \"Od\" i \"Odgovori\" poljima.", "from": "Od koga", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Molim unesite broj koji označava satnicu kada da pošalje zakazani sažeti email (nrp. 0 za ponoć, 17 za 5:00 pm). Uzmite u obzir da će se slanje događati po satnici samog servara, i da vrlo verovatno se ne poklapa sa satnicom vašeg sistema.
    Trenutno vreme servera je:
    Sledeći dnevni sažeti email zakazan je za slanje u " + "subscriptions.hour-help": "Molim unesite broj koji označava satnicu kada da pošalje zakazani sažeti email (nrp. 0 za ponoć, 17 za 5:00 pm). Uzmite u obzir da će se slanje događati po satnici samog servara, i da vrlo verovatno se ne poklapa sa satnicom vašeg sistema.
    Trenutno vreme servera je:
    Sledeći dnevni sažeti email zakazan je za slanje u ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/sr/admin/settings/guest.json b/public/language/sr/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/sr/admin/settings/guest.json +++ b/public/language/sr/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/sr/flags.json b/public/language/sr/flags.json index f1b3b808db..3d9c10a421 100644 --- a/public/language/sr/flags.json +++ b/public/language/sr/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Пријави неприкладан садржај", + "modal-title": "Report Content", "modal-body": "Наведите разлог за означавање %1 %2 за проверу. Алтернативно, користите један од тастера за брзу пријаву ко је применљиво.", "modal-reason-spam": "Непожељно", "modal-reason-offensive": "Увредљиво", diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index 0f1bbc6527..2431eef20e 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Када је порука уређена у теми коју надгледате", "notificationType_follow": "Када неко почне да вас прати", "notificationType_new-chat": "Када примите поруку за ћаскање", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Када примите позивницу за групу", "notificationType_group-request-membership": "Када неко затражи да се придружи групи коју поседујете", "notificationType_new-register": "Када је неко додат на чекање за регистрацију", diff --git a/public/language/sr/topic.json b/public/language/sr/topic.json index e002fa1f8f..affe0651c4 100644 --- a/public/language/sr/topic.json +++ b/public/language/sr/topic.json @@ -30,6 +30,7 @@ "locked": "Закључано", "pinned": "Закачено", "moved": "Премештено", + "moved-from": "Moved from %1", "copy-ip": "Копирај IP", "ban-ip": "Бануј IP", "view-history": "Уреди историју", diff --git a/public/language/sv/admin/settings/email.json b/public/language/sv/admin/settings/email.json index d2136c2ef3..8f11cd9449 100644 --- a/public/language/sv/admin/settings/email.json +++ b/public/language/sv/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Epostsammandrag", "subscriptions.disable": "Avaktivera epostsammandrag", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/sv/admin/settings/guest.json b/public/language/sv/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/sv/admin/settings/guest.json +++ b/public/language/sv/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/sv/flags.json b/public/language/sv/flags.json index c4b915ea26..4a617433ad 100644 --- a/public/language/sv/flags.json +++ b/public/language/sv/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Rapportera opassande innehåll", + "modal-title": "Report Content", "modal-body": "Vänligen ange anledningen till att du flaggar %1 %2 för granskning. Alternativt, använd en av snabbrapporteringsknapparna.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Kränkande", diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index 500602ade4..14fabefc9a 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "När någon börjar följa dig", "notificationType_new-chat": "När du får ett chattmeddelande", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "När du får en gruppinbjudan", "notificationType_group-request-membership": "När någon ber om att få gå med i en grupp du äger", "notificationType_new-register": "När någon läggs till i registreringskön", diff --git a/public/language/sv/topic.json b/public/language/sv/topic.json index 1e876d6a36..197d235d3e 100644 --- a/public/language/sv/topic.json +++ b/public/language/sv/topic.json @@ -30,6 +30,7 @@ "locked": "Låst", "pinned": "Fäst", "moved": "Flyttad", + "moved-from": "Moved from %1", "copy-ip": "Kopiera IP", "ban-ip": "Banna IP", "view-history": "Redigera historik", diff --git a/public/language/th/admin/settings/email.json b/public/language/th/admin/settings/email.json index f6ade9cfc9..839fd2b6f6 100644 --- a/public/language/th/admin/settings/email.json +++ b/public/language/th/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/th/admin/settings/guest.json b/public/language/th/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/th/admin/settings/guest.json +++ b/public/language/th/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/th/flags.json b/public/language/th/flags.json index eabb76398c..bddef72f81 100644 --- a/public/language/th/flags.json +++ b/public/language/th/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "รายงานเนื้อหาไม่เหมาะสม", + "modal-title": "Report Content", "modal-body": "กรุณาระเหตุผลสำหรับการปักธง %1 %2 สำหรับการรีวิว หรือไม่ก็ใช้หนึ่งในปุ่มกดรายงานด่วนถ้าเป็นไปได้", "modal-reason-spam": "สแปม", "modal-reason-offensive": "น่ารังเกียจ", diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index 5d8b12583e..b076ad1697 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "เมื่อมีคนติดตามคุณ", "notificationType_new-chat": "เมื่อคุณได้รับข้อความใหม่", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "เมื่อคุณได้รับเชิญเข้ากลุ่ม", "notificationType_group-request-membership": "When someone requests to join a group you own", "notificationType_new-register": "เมื่อมีคนถูกเพิ่มในคิวลงทะเบียน", diff --git a/public/language/th/topic.json b/public/language/th/topic.json index b66c499b54..57c29e9cf0 100644 --- a/public/language/th/topic.json +++ b/public/language/th/topic.json @@ -30,6 +30,7 @@ "locked": "ถูกล็อก", "pinned": "ถูกปักหมุด", "moved": "ถูกย้าย", + "moved-from": "Moved from %1", "copy-ip": "คัดลอก IP", "ban-ip": "แบน IP", "view-history": "แก้ไขประวัติ", diff --git a/public/language/tr/admin/manage/privileges.json b/public/language/tr/admin/manage/privileges.json index 7b7ce492ce..821d8607bf 100644 --- a/public/language/tr/admin/manage/privileges.json +++ b/public/language/tr/admin/manage/privileges.json @@ -9,7 +9,7 @@ "upload-files": "Dosya Yükle", "signature": "İmza", "ban": "Ban", - "invite": "Invite", + "invite": "Davet et", "search-content": "İçerik Arama", "search-users": "Kullanıcıları Ara", "search-tags": "Etiketleri Ara", diff --git a/public/language/tr/admin/menu.json b/public/language/tr/admin/menu.json index 7069833691..7ead54cb9e 100644 --- a/public/language/tr/admin/menu.json +++ b/public/language/tr/admin/menu.json @@ -31,7 +31,7 @@ "settings/pagination": "Sayfalama", "settings/tags": "Etiketler", "settings/notifications": "Bildirimler", - "settings/api": "API Access", + "settings/api": "API Erişimi", "settings/sounds": "Sesler", "settings/social": "Sosyal", "settings/cookies": "Çerezler", @@ -71,7 +71,7 @@ "logout": "Çıkış", "view-forum": "Forumu Görüntüle", - "search.placeholder": "Press "/" to search for settings", + "search.placeholder": "Ayarları aramak için "/" işaretine tıklayın", "search.no-results": "Sonuç yok...", "search.search-forum": "Forumda ara: ", "search.keep-typing": "Sonuçları görmek için daha fazla yazın...", diff --git a/public/language/tr/admin/settings/advanced.json b/public/language/tr/admin/settings/advanced.json index 5067ca06e4..28e2766d79 100644 --- a/public/language/tr/admin/settings/advanced.json +++ b/public/language/tr/admin/settings/advanced.json @@ -37,7 +37,7 @@ "analytics.settings": "Analitik Ayarlar", "analytics.max-cache": "Analytics Cache Max Value", "analytics.max-cache-help": "On high-traffic installs, the cache could be exhausted continuously if there are more concurrent active users than the Max Cache value. (Restart required)", - "compression.settings": "Compression Settings", - "compression.enable": "Enable Compression", + "compression.settings": "Sıkıştırma Ayarları", + "compression.enable": "Sıkıştırmayı Aktifleştir", "compression.help": "This setting enables gzip compression. For a high-traffic website in production, the best way to put compression in place is to implement it at a reverse proxy level. You can enable it here for testing purposes." } \ No newline at end of file diff --git a/public/language/tr/admin/settings/api.json b/public/language/tr/admin/settings/api.json index ba7d964a04..ede02cd927 100644 --- a/public/language/tr/admin/settings/api.json +++ b/public/language/tr/admin/settings/api.json @@ -2,11 +2,11 @@ "tokens": "Tokens", "lead-text": "From this page you can configure access to the Write API in NodeBB.", "intro": "By default, the Write API authenticates users based on their session cookie, but NodeBB also supports Bearer authentication via tokens generated via this page.", - "docs": "Click here to access the full API specification", + "docs": "Tüm API özeliklerine erişmek için buraya tıklayın. ", - "uid": "User ID", + "uid": "Kullanıcı ID", "uid-help-text": "Specify a User ID to associate with this token. If the user ID is 0, it will be considered a master token, which can assume the identity of other users based on the _uid parameter", - "description": "Description", - "no-description": "No description specified.", + "description": "Açıklama", + "no-description": "Hiçbir açıklama belirtilmemiş.", "token-on-save": "Token will be generated once form is saved" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/email.json b/public/language/tr/admin/settings/email.json index 6dc0d4a7b6..73e7f67d21 100644 --- a/public/language/tr/admin/settings/email.json +++ b/public/language/tr/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Özet E-postaları", "subscriptions.disable": "Özet e-postalarını kapat", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "E-posta bildirim seçenekleri", + "notifications.remove-images": "Görselleri e-posta bildirimlerinden kaldır" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/general.json b/public/language/tr/admin/settings/general.json index 176df64367..7b8e876149 100644 --- a/public/language/tr/admin/settings/general.json +++ b/public/language/tr/admin/settings/general.json @@ -27,12 +27,12 @@ "log.alt-text-placeholder": "Erişilebilirlik için alternatif metin", "favicon": "Favicon", "favicon.upload": "Yükle", - "pwa": "Progressive Web App", - "touch-icon": "Touch Icon", + "pwa": "İleri Web Uygulaması", + "touch-icon": "Dokunma Simgesi", "touch-icon.upload": "Yükle", - "touch-icon.help": "Recommended size and format: 512x512, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", - "maskable-icon": "Maskable (Homescreen) Icon", - "maskable-icon.help": "Recommended size and format: 512x512, PNG format only. If no maskable icon is specified, NodeBB will fall back to the Touch Icon.", + "touch-icon.help": "Önerilen Boyut: 512x512. Önerilen format: PNG. Simge belirtilmezse varsayılan olarak favicon kullanılır.", + "maskable-icon": "Maskelenebilir (Ana Ekran) Simgesi", + "maskable-icon.help": "Önerilen boyut ve format: 512x512, PNG formatı. If no maskable icon is specified, NodeBB will fall back to the Touch Icon.", "outgoing-links": "Harici Bağlantılar", "outgoing-links.warning-page": "Dışarı giden bağlantılar için uyarı sayfası kullan", "search-default-sort-by": "Aramada varsayılan sıralama", diff --git a/public/language/tr/admin/settings/guest.json b/public/language/tr/admin/settings/guest.json index 5b5a112576..1362b3affb 100644 --- a/public/language/tr/admin/settings/guest.json +++ b/public/language/tr/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Ziyaretçi Kolları", + "settings": "Ayarlar", "handles.enabled": "Misafir üyelere izin ver", "handles.enabled-help": "Bu seçenek, misafirlerin yaptıkları her gönderiyle ilişkilendirebilecekleri bir isim alanı sunar. Devre dışı bırakılırsa, gönderenin ismi basitçe \"Misafir\" olarak adlandırılacaktır.", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Ziyaretçilerin konu bakış sayısını arttırmasına izin ver", + "reply-notifications.enabled": "Ziyaretçilerin cevap bildirimleri oluşturmasına izin ver" } \ 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 d91fbc1cb3..3f3b6734d5 100644 --- a/public/language/tr/admin/settings/post.json +++ b/public/language/tr/admin/settings/post.json @@ -35,7 +35,7 @@ "timestamp.necro-threshold": "Ardışık iletiler arasında geçen gün sayısı (Necro Sınırı)", "timestamp.necro-threshold-help": "Eğer iki ardışık ileti arasında geçen süre Necro Sınırı'ndan fazlaysa, geçen süre yazıyla belirtilecek. (Varsayılan: 7, yani bir hafta). Etkinsizleştirmek için 0 yazınız.", "timestamp.topic-views-interval": "Increment topic views interval (in minutes)", - "timestamp.topic-views-interval-help": "Topic views will only increment once every X minutes as defined by this setting.", + "timestamp.topic-views-interval-help": "Başlıkların bakış sayısı bu ayarların belirttiği her X dakikada bir güncellenecek. ", "teaser": "Teaser İleti", "teaser.last-post": "Son – cevap yoksa orijinal gönderi de dahil olmak üzere en son gönderiyi gösterir.", "teaser.last-reply": "Son – cevap yoksa en son yanıtı veya \"Yanıt yok\" yertutucusunu gösterir.", diff --git a/public/language/tr/admin/settings/user.json b/public/language/tr/admin/settings/user.json index e6f7bbd972..e3f1c18353 100644 --- a/public/language/tr/admin/settings/user.json +++ b/public/language/tr/admin/settings/user.json @@ -43,9 +43,9 @@ "registration-type.disabled": "Kayıt yok", "registration-type.help": "Normal - Kullanıcılar, kayıt sayfasından kayıt olabililrler
    \nDavetiye İle - Kullanıcılar, başkalarını users sayfasından davet edebilirler.
    \nYönetici Davetiyesi İle - Sadece yöneticiler başkalarını users sayfasından ve admin/manage/users sayfasından davet edebilir.
    \nKayıt Yok - Yeni üye kaydı kapalı
    ", "registration-approval-type.help": "Normal - Kullanıcılar hemen kaydolur.
    \nYönetici Onayı - Kullanıcı kayıtları, yöneticiler tarafından onaylansın diyeapproval queue sırasına konulur.
    \nIP için Yönetici Onayı - Yeni Kullanıcılar için Normal Üyelik; hali hazırda kayıtlı olan IP adresleri için Yönetici Onayı
    ", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", - "registration-queue-show-average-time": "Show users average time it takes to approve a new user", + "registration-queue-auto-approve-time": "Otomatik onaylanma süresi", + "registration-queue-auto-approve-time-help": "Kullanıcıların otomatik onayı için geçecek süre (saat). İptal etmek için 0 yazın.", + "registration-queue-show-average-time": "Kullanıcılara ortalama üyelik onaylanma süresini göster", "registration.max-invites": "Kullanıcı Başına Maksimum Davetiye", "max-invites": "Kullanıcı Başına Maksimum Davetiye", "max-invites-help": "Kısıtlama olmaması için 0. Yöneticiler sınırsız davetiyeye sahiptir
    \"Yalnızca Davet\" seçeneği için geçerlidir", @@ -65,7 +65,7 @@ "restrict-chat": "Sadece takip ettiğim kişilerden sohbetleri kabul et", "outgoing-new-tab": "Dışarı giden bağlantıları yeni sekmede aç", "topic-search": "Konu içi aramayı etkinleştir", - "update-url-with-post-index": "Update url with post index while browsing topics", + "update-url-with-post-index": "Sayfayı okurken URL bağlantısındaki ileti numarasını güncelle", "digest-freq": "Özet e-postalarına abone ol", "digest-freq.off": "Kapalı", "digest-freq.daily": "Günlük", diff --git a/public/language/tr/flags.json b/public/language/tr/flags.json index cbf39d5d52..a7c482eaf2 100644 --- a/public/language/tr/flags.json +++ b/public/language/tr/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "En çok artılanan", "sort-replies": "En çok cevap verilen", - "modal-title": "Uygunsuz İçeriği Rapor Et", + "modal-title": "İçeriği Şikayet Et", "modal-body": "%1 %2 için şikayet nedenini belirtiniz. Alternatif olarak hızlı rapor butonlarından birini kullanabilirsiniz.", "modal-reason-spam": "Gereksiz", "modal-reason-offensive": "Saldırgan", diff --git a/public/language/tr/groups.json b/public/language/tr/groups.json index 89ec68c3fb..5cdffb2295 100644 --- a/public/language/tr/groups.json +++ b/public/language/tr/groups.json @@ -35,8 +35,8 @@ "details.member_count": "Üye Sayısı", "details.creation_date": "Oluşturulma Tarihi", "details.description": "Tanımlama", - "details.member-post-cids": "Categories to display posts from", - "details.member-post-cids-help": "Note: Selecting no categories will assume all categories are included. Use ctrl and shift to select multiple options.", + "details.member-post-cids": "İletilerin gösterileceği kategoriler", + "details.member-post-cids-help": "Not: Hiçbir kategori belirtilmezse, tüm kategoriler dahil edilecek. Birden fazla kategori seçimi için ctrl ve shift tuşlarını kullanın. ", "details.badge_preview": "Rozet Önizlemesi", "details.change_icon": "İkonu Değiştir", "details.change_label_colour": "Etiket Rengini Değiştir", diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index 94b065cdf2..83132c1e14 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "Takip ettiğiniz bir konudaki bir ileti değiştirildiğinde", "notificationType_follow": "Biri sizi takip etmeye başlayınca", "notificationType_new-chat": "Bir sohbet mesajı aldığınızda", + "notificationType_new-group-chat": "Grup sohbet mesajı aldığınızda", "notificationType_group-invite": "Bir gruba katılım davetiyesi aldığınızda", "notificationType_group-request-membership": "Biri size ait bir gruba üye olmak istediğinde", "notificationType_new-register": "Biri kayıt kuyruğuna eklendiğinde", diff --git a/public/language/tr/register.json b/public/language/tr/register.json index 6d2abcb98c..4bdfe87e1a 100644 --- a/public/language/tr/register.json +++ b/public/language/tr/register.json @@ -18,8 +18,8 @@ "agree_to_terms_of_use": "Kullanım Şartlarını Kabul Ediyorum", "terms_of_use_error": "Kullanım Şartlarını Kabul Etmeniz Gerekiyor", "registration-added-to-queue": "Kayıt olma isteğiniz kabul listesine eklenmiştir. Yönetici tarafından kabul edildiğinizde e-posta alacaksınız.", - "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", - "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", + "registration-queue-average-time": "Üyelik onayı için bekleyeceğiniz ortalama süre: %1 saat %2 dakika.", + "registration-queue-auto-approve-time": "Forum üyeliğiniz %1 saat içerisinde tamamen aktifleştirilecektir. ", "interstitial.intro": "Hesabınızı yaratmadan önce bazı ekstra bilgiler gerekiyor.", "interstitial.errors-found": "Kaydınız tamamlanamadı:", "gdpr_agree_data": "Bu web sitesinde kişisel bilgilerimin toplanmasını ve işlenmesini kabul ediyorum.", diff --git a/public/language/tr/topic.json b/public/language/tr/topic.json index 0060b36557..cb7a6e3cff 100644 --- a/public/language/tr/topic.json +++ b/public/language/tr/topic.json @@ -30,6 +30,7 @@ "locked": "Kilitli", "pinned": "Sabitlendi", "moved": "Taşındı", + "moved-from": "Şuradan taşındı: %1", "copy-ip": "IP Kopyala", "ban-ip": "IP Yasakla", "view-history": "Geçmişi Düzenle", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 603932d150..73cc7d081e 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -123,7 +123,7 @@ "open_links_in_new_tab": "Dışarı giden bağlantıları yeni sekmede aç", "enable_topic_searching": "Konu içi aramayı aktive et", "topic_search_help": "Aktive edilirse, konu içi arama tarayıcının normal arama davranışını değiştirerek tüm konuyu aramanızı sağlar", - "update_url_with_post_index": "Update url with post index while browsing topics", + "update_url_with_post_index": "Sayfayı okurken URL bağlantısındaki ileti numarasını güncelle", "scroll_to_my_post": "Cevap yazdıktan sonra yeni iletiyi göster", "follow_topics_you_reply_to": "Cevap verdiğim başlıkları takip et", "follow_topics_you_create": "Oluşturduğum başlıkları takip et", diff --git a/public/language/tr/users.json b/public/language/tr/users.json index 40bd09047e..fb539f9bdf 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -11,7 +11,7 @@ "online-only": "Sadece çevrimiçi", "invite": "Davet et", "prompt-email": "Eposta:", - "groups-to-join": "Groups to be joined when invite is accepted:", + "groups-to-join": "Davet kabul edildiğinde katılacağınız gruplar:", "invitation-email-sent": "%1'e bir davet e-posta'sı gönderildi", "user_list": "Kullanıcı Listesi", "recent_topics": "Güncel Konular", diff --git a/public/language/uk/admin/settings/email.json b/public/language/uk/admin/settings/email.json index bd74d9d519..e8171e17e0 100644 --- a/public/language/uk/admin/settings/email.json +++ b/public/language/uk/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "Отримувачі будуть бачити цю адресу в полях \"From\" та \"Reply To\".", "from": "Ім'я відправника", "from-help": "Ім'я відправника, що буде показано в електронних листах", - + "smtp-transport": "Протокол SMTP", "smtp-transport.enabled": "Використовувати зовнішній поштовий сервер для відправлення повідомлень", "smtp-transport-help": "Ви можете обрати поштовий сервіс зі списку або використати ваш власний сервіс.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Година дайджесту", - "subscriptions.hour-help": "Вкажіть, будь ласка, годину о котрій кожного дня буде надсилатися дайджест (наприклад 0 — це північ, а 17 — п'ята година вечора). Зверніть увагу, що година визначається згідно налаштувань сервера і може не співпадати з часом вашого комп'ютера.
    Приблизний час сервера:
    Наступний дайджест заплановано до відправки " + "subscriptions.hour-help": "Вкажіть, будь ласка, годину о котрій кожного дня буде надсилатися дайджест (наприклад 0 — це північ, а 17 — п'ята година вечора). Зверніть увагу, що година визначається згідно налаштувань сервера і може не співпадати з часом вашого комп'ютера.
    Приблизний час сервера:
    Наступний дайджест заплановано до відправки ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/uk/admin/settings/guest.json b/public/language/uk/admin/settings/guest.json index 8d54dcfa67..1e439e53a6 100644 --- a/public/language/uk/admin/settings/guest.json +++ b/public/language/uk/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Гостьові імена", + "settings": "Settings", "handles.enabled": "Дозволити гостьові імена", "handles.enabled-help": "Ця опція надає додаткове поле, що дозволяє гостям обрати собі ім'я для кожного посту. Якщо вимкнено, вони будуть просто зватися \"Гість\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/uk/notifications.json b/public/language/uk/notifications.json index eef2ab42a1..7656fcbb5e 100644 --- a/public/language/uk/notifications.json +++ b/public/language/uk/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Коли хтось починає слідкувати за вами", "notificationType_new-chat": "Коли ви отримуєте повідомлення чату", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Коли ви отримуєте запрошення до групи", "notificationType_group-request-membership": "Коли хтось подає запит на приєднання до групи, якою ви володієте", "notificationType_new-register": "Коли когось додано до черги на реєстрацію", diff --git a/public/language/uk/topic.json b/public/language/uk/topic.json index 6176fa87ba..bc5f78287f 100644 --- a/public/language/uk/topic.json +++ b/public/language/uk/topic.json @@ -30,6 +30,7 @@ "locked": "Заблокована", "pinned": "Закріплена", "moved": "Переміщена", + "moved-from": "Moved from %1", "copy-ip": "Копіювати IP", "ban-ip": "Заблокувати IP", "view-history": "Редагувати історію", diff --git a/public/language/vi/admin/settings/email.json b/public/language/vi/admin/settings/email.json index 8b127a6afc..26481a209a 100644 --- a/public/language/vi/admin/settings/email.json +++ b/public/language/vi/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", - + "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", @@ -35,5 +35,7 @@ "subscriptions": "Email Digests", "subscriptions.disable": "Disable email digests", "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent " + "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
    The approximate server time is:
    The next daily digest is scheduled to be sent ", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/vi/admin/settings/guest.json b/public/language/vi/admin/settings/guest.json index 3ba81aa778..75d44f37e4 100644 --- a/public/language/vi/admin/settings/guest.json +++ b/public/language/vi/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "Guest Handles", + "settings": "Settings", "handles.enabled": "Allow guest handles", "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/vi/flags.json b/public/language/vi/flags.json index 10698842cc..13b3567bc9 100644 --- a/public/language/vi/flags.json +++ b/public/language/vi/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "Report Inappropriate Content", + "modal-title": "Report Content", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensive", diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index cbc6e98906..2f1a7e6048 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "When a post is edited in a topic you are watching", "notificationType_follow": "Khi ai đó theo dõi bạn", "notificationType_new-chat": "Khi bạn nhận được thông điệp chat", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "Khi bạn nhận được lời mời gia nhập nhóm", "notificationType_group-request-membership": "Khi ai đó yêu cầu tham gia một nhóm bạn sở hữu", "notificationType_new-register": "Khi ai đó được thêm vào lượt chờ đăng ký", diff --git a/public/language/vi/topic.json b/public/language/vi/topic.json index 0fc45e0e13..65998bedc5 100644 --- a/public/language/vi/topic.json +++ b/public/language/vi/topic.json @@ -30,6 +30,7 @@ "locked": "Khóa", "pinned": "Đã ghim", "moved": "Chuyển đi", + "moved-from": "Moved from %1", "copy-ip": "Sao chép IP", "ban-ip": "Cấm IP", "view-history": "Lịch sử chỉnh sửa", diff --git a/public/language/zh-CN/admin/settings/email.json b/public/language/zh-CN/admin/settings/email.json index a465b8900c..64b034879c 100644 --- a/public/language/zh-CN/admin/settings/email.json +++ b/public/language/zh-CN/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "下面的电子邮件地址代表收件人在“发件人”和“回复”中所看到的地址。", "from": "发送者", "from-help": "用于邮件中显示的发送者", - + "smtp-transport": "SMTP 通信", "smtp-transport.enabled": "使用一个外部电子邮箱系统来发送邮件", "smtp-transport-help": "您可以从列表中选取一个已知的服务或自定义。", @@ -35,5 +35,7 @@ "subscriptions": "电子邮件摘要", "subscriptions.disable": "禁用电子邮件摘要", "subscriptions.hour": "摘要小时", - "subscriptions.hour-help": "请输入一个代表小时的数字来发送计划的电子邮件摘要 (例如,对于午夜,0,对于下午5:00,17)。 请记住,这是根据服务器本身的时间,可能与您的系统时钟不完全匹配。
    服务器的大致时间为:
    下一个每日摘要被计划在发送" + "subscriptions.hour-help": "请输入一个代表小时的数字来发送计划的电子邮件摘要 (例如,对于午夜,0,对于下午5:00,17)。 请记住,这是根据服务器本身的时间,可能与您的系统时钟不完全匹配。
    服务器的大致时间为:
    下一个每日摘要被计划在发送", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/guest.json b/public/language/zh-CN/admin/settings/guest.json index d4c98c2b26..725beaf2d1 100644 --- a/public/language/zh-CN/admin/settings/guest.json +++ b/public/language/zh-CN/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "游客用户名", + "settings": "Settings", "handles.enabled": "允许游客用户名", "handles.enabled-help": "这个选项将允许游客使用一个额外的输入框来设置发帖时的用户名,如果被禁用,仅会统一显示为“游客”", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/zh-CN/flags.json b/public/language/zh-CN/flags.json index 99cd14b5c7..dbcc5dba94 100644 --- a/public/language/zh-CN/flags.json +++ b/public/language/zh-CN/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "最多顶", "sort-replies": "最多回复", - "modal-title": "举报不适内容", + "modal-title": "Report Content", "modal-body": "请选择或者输入您举报 %1%2 的原因以便版主进行审核。", "modal-reason-spam": "垃圾信息", "modal-reason-offensive": "人身攻击", diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index 59ab9764a2..45bc43c3b2 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "当您关注的主题有帖子被编辑时", "notificationType_follow": "当有人关注您时", "notificationType_new-chat": "当您收到聊天消息时", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "当您收到群组邀请时", "notificationType_group-request-membership": "当有人请求加入您拥有的用户组时", "notificationType_new-register": "当有人被添加到申请队列时", diff --git a/public/language/zh-CN/topic.json b/public/language/zh-CN/topic.json index 0effe4205f..fccddf200c 100644 --- a/public/language/zh-CN/topic.json +++ b/public/language/zh-CN/topic.json @@ -30,6 +30,7 @@ "locked": "已锁定", "pinned": "已固定", "moved": "已移动", + "moved-from": "Moved from %1", "copy-ip": "复制IP", "ban-ip": "封禁IP", "view-history": "编辑历史", diff --git a/public/language/zh-TW/admin/settings/email.json b/public/language/zh-TW/admin/settings/email.json index 43eb05afe9..987aef7c09 100644 --- a/public/language/zh-TW/admin/settings/email.json +++ b/public/language/zh-TW/admin/settings/email.json @@ -4,7 +4,7 @@ "address-help": "下面的電子郵件地址代表收件人在“發送人”和“回覆”中所看到的地址。", "from": "發送人", "from-help": "用於郵件中顯示的發送人", - + "smtp-transport": "SMTP 通信", "smtp-transport.enabled": "使用一個外部電子郵件系統來發送郵件", "smtp-transport-help": "您可以從列表中選取一個已知的服務或自訂。", @@ -35,5 +35,7 @@ "subscriptions": "電子郵件摘要", "subscriptions.disable": "禁用電子郵件摘要", "subscriptions.hour": "摘要小時", - "subscriptions.hour-help": "請輸入一個代表小時的數字來發送排程的電子郵件摘要 (例如,對於午夜,0,對於下午5:00,17)。 請記住,這是根據伺服器本身的時間,可能與您的系統時鐘不完全符合。
    伺服器的大致時間為:
    下一個每日摘要被排程在發送" + "subscriptions.hour-help": "請輸入一個代表小時的數字來發送排程的電子郵件摘要 (例如,對於午夜,0,對於下午5:00,17)。 請記住,這是根據伺服器本身的時間,可能與您的系統時鐘不完全符合。
    伺服器的大致時間為:
    下一個每日摘要被排程在發送", + "notifications.settings": "Email notification settings", + "notifications.remove-images": "Remove images from email notifications" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/guest.json b/public/language/zh-TW/admin/settings/guest.json index 777b254aaf..a46b34a3f9 100644 --- a/public/language/zh-TW/admin/settings/guest.json +++ b/public/language/zh-TW/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "handles": "訪客使用者名", + "settings": "Settings", "handles.enabled": "允許訪客使用者名", "handles.enabled-help": "這個選項將允許訪客使用一個額外的輸入框來設置發文時的使用者名,如果被禁用,僅會統一顯示為“訪客”", - "topic-views": "Topic views", - "topic-views.enabled": "Allow guests to increase topic view counts" + "topic-views.enabled": "Allow guests to increase topic view counts", + "reply-notifications.enabled": "Allow guests to generate reply notifications" } \ No newline at end of file diff --git a/public/language/zh-TW/flags.json b/public/language/zh-TW/flags.json index 0b0fa9c3d3..883891eda6 100644 --- a/public/language/zh-TW/flags.json +++ b/public/language/zh-TW/flags.json @@ -67,7 +67,7 @@ "sort-upvotes": "Most upvotes", "sort-replies": "Most replies", - "modal-title": "舉報不適內容", + "modal-title": "Report Content", "modal-body": "請選擇或者輸入您舉報 %1%2 的原因以便版主進行審核。", "modal-reason-spam": "垃圾訊息", "modal-reason-offensive": "人身攻擊", diff --git a/public/language/zh-TW/notifications.json b/public/language/zh-TW/notifications.json index 129454c339..9a982f8970 100644 --- a/public/language/zh-TW/notifications.json +++ b/public/language/zh-TW/notifications.json @@ -60,6 +60,7 @@ "notificationType_post-edit": "當您關注中的主題有貼文被編輯時", "notificationType_follow": "當有人追隨您時", "notificationType_new-chat": "當您收到聊天訊息時", + "notificationType_new-group-chat": "When you receive a group chat message", "notificationType_group-invite": "當您收到群組邀請時", "notificationType_group-request-membership": "當有人請求加入您擁有的群組時", "notificationType_new-register": "當有註冊申請待審核時", diff --git a/public/language/zh-TW/topic.json b/public/language/zh-TW/topic.json index b4defa47a0..b50e287032 100644 --- a/public/language/zh-TW/topic.json +++ b/public/language/zh-TW/topic.json @@ -30,6 +30,7 @@ "locked": "已鎖定", "pinned": "已置頂", "moved": "已移動", + "moved-from": "Moved from %1", "copy-ip": "複製IP", "ban-ip": "禁用IP", "view-history": "編輯歷史", From fa4177c3bc0b0a4b4c81632d406b653963922cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 18 Nov 2020 14:25:39 -0500 Subject: [PATCH 67/67] fix: #6407, fix feeds display latest posts instead of oldest in topic rss feed fix missing await that was causing rss_tokens to not function fix feed test more tests for getTopicWithPosts --- src/routes/feeds.js | 8 +-- src/topics/index.js | 12 ++-- test/feeds.js | 2 +- test/topics.js | 135 ++++++++++++++++++++++++++++++++++++++------ 4 files changed, 130 insertions(+), 27 deletions(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index be23cafed6..0c12af5334 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -53,7 +53,7 @@ async function validateTokenIfRequiresLogin(requiresLogin, cid, req, res) { await user.auth.logAttempt(uid, req.ip); return helpers.notAllowed(req, res); } - const userPrivileges = privileges.categories.get(cid, uid); + const userPrivileges = await privileges.categories.get(cid, uid); if (!userPrivileges.read) { return helpers.notAllowed(req, res); } @@ -77,7 +77,7 @@ async function generateForTopic(req, res) { } if (await validateTokenIfRequiresLogin(!userPrivileges['topics:read'], topic.cid, req, res)) { - const topicData = await topics.getTopicWithPosts(topic, 'tid:' + tid + ':posts', req.uid || req.query.uid || 0, 0, 25, false); + const topicData = await topics.getTopicWithPosts(topic, 'tid:' + tid + ':posts', req.uid || req.query.uid || 0, 0, 24, true); topics.modifyPostsByPrivilege(topicData, userPrivileges); @@ -94,8 +94,8 @@ async function generateForTopic(req, res) { if (topicData.posts.length > 0) { feed.pubDate = new Date(parseInt(topicData.posts[0].timestamp, 10)).toUTCString(); } - - topicData.posts.forEach(function (postData) { + const replies = topicData.posts.slice(1); + replies.forEach(function (postData) { if (!postData.deleted) { const dateStamp = new Date(parseInt(parseInt(postData.edited, 10) === 0 ? postData.timestamp : postData.edited, 10)).toUTCString(); diff --git a/src/topics/index.js b/src/topics/index.js index 943930e375..372141dda5 100644 --- a/src/topics/index.js +++ b/src/topics/index.js @@ -189,18 +189,20 @@ Topics.getTopicWithPosts = async function (topicData, set, uid, start, stop, rev }; async function getMainPostAndReplies(topic, set, uid, start, stop, reverse) { + let repliesStart = start; + let repliesStop = stop; if (stop > 0) { - stop -= 1; + repliesStop -= 1; if (start > 0) { - start -= 1; + repliesStart -= 1; } } - const pids = await posts.getPidsFromSet(set, start, stop, reverse); + const pids = await posts.getPidsFromSet(set, repliesStart, repliesStop, reverse); if (!pids.length && !topic.mainPid) { return []; } - if (parseInt(topic.mainPid, 10) && start === 0) { + if (topic.mainPid && start === 0) { pids.unshift(topic.mainPid); } const postData = await posts.getPostsByPids(pids, uid); @@ -213,7 +215,7 @@ async function getMainPostAndReplies(topic, set, uid, start, stop, reverse) { replies = postData.slice(1); } - Topics.calculatePostIndices(replies, start); + Topics.calculatePostIndices(replies, repliesStart); return await Topics.addPostData(postData, uid); } diff --git a/test/feeds.js b/test/feeds.js index 34bf9d3905..6f540c1c71 100644 --- a/test/feeds.js +++ b/test/feeds.js @@ -182,7 +182,7 @@ describe('feeds', function () { request(nconf.get('url') + '/category/' + cid + '.rss?uid=' + fooUid + '&token=' + rssToken, { }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert(body); + assert(body.startsWith(' { + assert.strictEqual(post.index, index); + }); + }); + + it('should return 3 posts from 1 to 3 excluding main post', async function () { + const topicData = await topics.getTopicData(tid); + const start = 1; + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 3, false); + assert.strictEqual(data.posts.length, 3); + assert.strictEqual(data.posts[0].content, 'topic reply 1'); + assert.strictEqual(data.posts[1].content, 'topic reply 2'); + assert.strictEqual(data.posts[2].content, 'topic reply 3'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index + start); + }); + }); + + it('should return main post and last 2 posts', async function () { + const topicData = await topics.getTopicData(tid); + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, 2, true); + assert.strictEqual(data.posts.length, 3); + assert.strictEqual(data.posts[0].content, 'main post'); + assert.strictEqual(data.posts[1].content, 'topic reply 30'); + assert.strictEqual(data.posts[2].content, 'topic reply 29'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index); + }); + }); + + it('should return last 3 posts and not main post', async function () { + const topicData = await topics.getTopicData(tid); + const start = 1; + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 3, true); + assert.strictEqual(data.posts.length, 3); + assert.strictEqual(data.posts[0].content, 'topic reply 30'); + assert.strictEqual(data.posts[1].content, 'topic reply 29'); + assert.strictEqual(data.posts[2].content, 'topic reply 28'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index + start); + }); + }); + + it('should return posts 29 to 27 posts and not main post', async function () { + const topicData = await topics.getTopicData(tid); + const start = 2; + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 4, true); + assert.strictEqual(data.posts.length, 3); + assert.strictEqual(data.posts[0].content, 'topic reply 29'); + assert.strictEqual(data.posts[1].content, 'topic reply 28'); + assert.strictEqual(data.posts[2].content, 'topic reply 27'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index + start); + }); + }); + + it('should return 3 posts in reverse', async function () { + const topicData = await topics.getTopicData(tid); + const start = 28; + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, start, 30, true); + assert.strictEqual(data.posts.length, 3); + assert.strictEqual(data.posts[0].content, 'topic reply 3'); + assert.strictEqual(data.posts[1].content, 'topic reply 2'); + assert.strictEqual(data.posts[2].content, 'topic reply 1'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index + start); + }); + }); + + it('should get all posts with main post at the start', async function () { + const topicData = await topics.getTopicData(tid); + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, -1, false); + assert.strictEqual(data.posts.length, 31); + assert.strictEqual(data.posts[0].content, 'main post'); + assert.strictEqual(data.posts[1].content, 'topic reply 1'); + assert.strictEqual(data.posts[data.posts.length - 1].content, 'topic reply 30'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index); + }); + }); + + it('should get all posts in reverse with main post at the start followed by reply 30', async function () { + const topicData = await topics.getTopicData(tid); + const data = await topics.getTopicWithPosts(topicData, 'tid:' + tid + ':posts', topic.userId, 0, -1, true); + assert.strictEqual(data.posts.length, 31); + assert.strictEqual(data.posts[0].content, 'main post'); + assert.strictEqual(data.posts[1].content, 'topic reply 30'); + assert.strictEqual(data.posts[data.posts.length - 1].content, 'topic reply 1'); + data.posts.forEach((post, index) => { + assert.strictEqual(post.index, index); }); }); });