From 5d6535719a2fc2594bcf62d4890c433b5703a206 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 3 Sep 2025 14:02:58 -0400 Subject: [PATCH 01/82] chore: update default settings undoTimeout reduced to 0 post queue default enabled with minimum reputation to bypass set to 1 --- install/data/defaults.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index b6ae97a3c7..d90730d396 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -24,8 +24,8 @@ "newbieChatMessageDelay": 120000, "notificationSendDelay": 60, "newbieReputationThreshold": 3, - "postQueue": 0, - "postQueueReputationThreshold": 0, + "postQueue": 1, + "postQueueReputationThreshold": 1, "groupsExemptFromPostQueue": ["administrators", "Global Moderators"], "groupsExemptFromNewUserRestrictions": ["administrators", "Global Moderators"], "groupsExemptFromMaintenanceMode": ["administrators", "Global Moderators"], @@ -36,7 +36,7 @@ "maximumTagsPerTopic": 5, "minimumTagLength": 3, "maximumTagLength": 15, - "undoTimeout": 10000, + "undoTimeout": 0, "allowTopicsThumbnail": 1, "registrationType": "normal", "registrationApprovalType": "normal", From 0f9015f050a42843770c9351d63fb2e158e4e4d9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 3 Sep 2025 14:45:31 -0400 Subject: [PATCH 02/82] fix: deprecated call to api.topics.move --- public/src/client/topic/move.js | 31 +++++++++++++++++++++---------- src/socket.io/topics/move.js | 2 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/public/src/client/topic/move.js b/public/src/client/topic/move.js index ba4f055e68..df23091357 100644 --- a/public/src/client/topic/move.js +++ b/public/src/client/topic/move.js @@ -2,8 +2,8 @@ define('forum/topic/move', [ - 'categorySelector', 'alerts', 'hooks', -], function (categorySelector, alerts, hooks) { + 'categorySelector', 'alerts', 'hooks', 'api', +], function (categorySelector, alerts, hooks, api) { const Move = {}; let modal; let selectedCategory; @@ -88,15 +88,26 @@ define('forum/topic/move', [ function moveTopics(data) { hooks.fire('action:topic.move', data); - socket.emit(!data.tids ? 'topics.moveAll' : 'topics.move', data, function (err) { - if (err) { - return alerts.error(err); - } + if (data.tids) { + data.tids.forEach((tid) => { + api.put(`/topics/${tid}/move`, { cid: data.cid }).then(() => { + if (typeof data.onComplete === 'function') { + data.onComplete(); + } + }).catch(alerts.error); + }); + } else { + socket.emit('topics.moveAll', data, function (err) { + if (err) { + return alerts.error(err); + } + + if (typeof data.onComplete === 'function') { + data.onComplete(); + } + }); + } - if (typeof data.onComplete === 'function') { - data.onComplete(); - } - }); } function closeMoveModal() { diff --git a/src/socket.io/topics/move.js b/src/socket.io/topics/move.js index edda6b2c77..a3fd3a8076 100644 --- a/src/socket.io/topics/move.js +++ b/src/socket.io/topics/move.js @@ -11,7 +11,7 @@ const sockets = require('..'); module.exports = function (SocketTopics) { SocketTopics.move = async function (socket, data) { - sockets.warnDeprecated(socket, 'GET /api/v3/topics/:tid/move'); + sockets.warnDeprecated(socket, 'PUT /api/v3/topics/:tid/move'); if (!data || !Array.isArray(data.tids) || !data.cid) { throw new Error('[[error:invalid-data]]'); From 2ea624fc8e945a3bd44c4cb10848f21b2c733f63 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 4 Sep 2025 16:55:04 -0400 Subject: [PATCH 03/82] fix: use newline_boundaries param for tokenizer during title and summary generation, attempt to serve HTML in summary generation --- src/activitypub/mocks.js | 14 +++++++++++--- src/activitypub/notes.js | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/activitypub/mocks.js b/src/activitypub/mocks.js index b3c641e0c3..380823fa31 100644 --- a/src/activitypub/mocks.js +++ b/src/activitypub/mocks.js @@ -757,17 +757,25 @@ Mocks.notes.public = async (post) => { attachment: normalizeAttachment(noteAttachment), }; - const sentences = tokenizer.sentences(post.content, { sanitize: true }); + const sentences = tokenizer.sentences(post.content, { newline_boundaries: true }); // Append sentences to summary until it contains just under 500 characters of content const limit = 500; + let remaining = limit; summary = sentences.reduce((memo, sentence) => { - const remaining = limit - memo.length; - if (sentence.length < remaining) { + const clean = sanitize(sentence, { + allowedTags: [], + allowedAttributes: {}, + }); + remaining = remaining - clean.length; + if (remaining > 0) { memo += ` ${sentence}`; } return memo; }, ''); + + // Final sanitization to clean up tags + summary = posts.sanitize(summary); } let context = await posts.getPostField(post.pid, 'context'); diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index ce9371fd26..5739d25ecf 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -156,7 +156,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { // mainPid ok to leave as-is if (!title) { - const sentences = tokenizer.sentences(content || sourceContent, { sanitize: true }); + const sentences = tokenizer.sentences(content || sourceContent, { sanitize: true, newline_boundaries: true }); title = sentences.shift(); } From 2de200b31129632b146e84e09268f68afb47786f Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Fri, 5 Sep 2025 09:20:19 +0000 Subject: [PATCH 04/82] Latest translations and fallbacks --- public/language/vi/admin/settings/activitypub.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/vi/admin/settings/activitypub.json b/public/language/vi/admin/settings/activitypub.json index c9e7308bb1..df53588641 100644 --- a/public/language/vi/admin/settings/activitypub.json +++ b/public/language/vi/admin/settings/activitypub.json @@ -34,10 +34,10 @@ "relays.litepub": "NodeBB follows the LitePub-style relay standard. The URL you enter here should end with /actor.", "relays.add": "Add New Relay", "relays.relay": "Relay", - "relays.state": "State", - "relays.state-0": "Pending", - "relays.state-1": "Receiving only", - "relays.state-2": "Active", + "relays.state": "Trạng thái", + "relays.state-0": "Đang đợi", + "relays.state-1": "Chỉ nhận", + "relays.state-2": "Kích hoạt", "server-filtering": "Lọc", "count": "NodeBB này hiện đã biết về %1 máy chủ", From 15f9fbaa5cec0708ad248cfc1ca3f6f5e44ec210 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 5 Sep 2025 13:11:52 -0400 Subject: [PATCH 05/82] feat: add minor pre-processing step to better handle header elements in incoming html --- install/package.json | 1 + src/activitypub/notes.js | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 14e65fabd7..b2c185bacf 100644 --- a/install/package.json +++ b/install/package.json @@ -120,6 +120,7 @@ "pg-cursor": "2.15.3", "postcss": "8.5.6", "postcss-clean": "1.2.0", + "pretty": "^2.0.0", "progress-webpack-plugin": "1.0.16", "prompt": "1.3.0", "redis": "5.8.2", diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 5739d25ecf..1671f8b1c6 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -3,6 +3,7 @@ const winston = require('winston'); const nconf = require('nconf'); const tokenizer = require('sbd'); +const pretty = require('pretty'); const db = require('../database'); const batch = require('../batch'); @@ -156,7 +157,8 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { // mainPid ok to leave as-is if (!title) { - const sentences = tokenizer.sentences(content || sourceContent, { sanitize: true, newline_boundaries: true }); + const prettified = pretty(content || sourceContent); + const sentences = tokenizer.sentences(prettified, { sanitize: true, newline_boundaries: true }); title = sentences.shift(); } From 9bfce68b5eea7bc91edb24939761bbe82d434c69 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 5 Sep 2025 14:39:23 -0400 Subject: [PATCH 06/82] test: disable post queue when testing posting logic --- test/topics.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/topics.js b/test/topics.js index eaae7d76c7..023b737bf3 100644 --- a/test/topics.js +++ b/test/topics.js @@ -54,6 +54,14 @@ describe('Topic\'s', () => { }); describe('.post', () => { + before(() => { + meta.config.postQueue = 0; + }); + + after(() => { + meta.config.postQueue = 1; + }); + it('should fail to create topic with invalid data', async () => { try { await apiTopics.create({ uid: 0 }, null); @@ -2337,6 +2345,12 @@ describe('Topic\'s', () => { content: 'The content of scheduled test topic', timestamp: new Date(Date.now() + 86400000).getTime(), }; + + meta.config.postQueue = 0; + }); + + after(() => { + meta.config.postQueue = 1; }); it('should create a scheduled topic as pinned, deleted, included in "topics:scheduled" zset and with a timestamp in future', async () => { From 5528c6eb1949bc72f6e450dfeb127059cadbf72c Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Mon, 8 Sep 2025 09:20:47 +0000 Subject: [PATCH 07/82] Latest translations and fallbacks --- public/language/vi/admin/settings/activitypub.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/public/language/vi/admin/settings/activitypub.json b/public/language/vi/admin/settings/activitypub.json index df53588641..d6da5bd675 100644 --- a/public/language/vi/admin/settings/activitypub.json +++ b/public/language/vi/admin/settings/activitypub.json @@ -28,12 +28,12 @@ "rules.value": "Giá trị", "rules.cid": "Danh mục", - "relays": "Relays", - "relays.intro": "A relay improves discovery of content to and from your NodeBB. Subscribing to a relay means content received by the relay is forwarded here, and content posted here is syndicated outward by the relay.", - "relays.warning": "Note: Relays can send larges amounts of traffic in, and may increase storage and processing costs.", - "relays.litepub": "NodeBB follows the LitePub-style relay standard. The URL you enter here should end with /actor.", - "relays.add": "Add New Relay", - "relays.relay": "Relay", + "relays": "Chuyển tiếp", + "relays.intro": "Một chuyển tiếp cải thiện khám phá nội dung đến và từ nodeBB của bạn. Đăng ký một chuyển tiếp có nghĩa là nội dung nhận được bởi chuyển tiếp được chuyển tiếp ở đây và nội dung được đăng ở đây được cung cấp bên ngoài bởi chuyển tiếp.", + "relays.warning": "Lưu ý: Chuyển tiếp có thể gửi lượng lưu lượng truy cập lớn và có thể tăng gánh nặng lưu trữ và xử lý.", + "relays.litepub": "NodeBB tuân theo tiêu chuẩn chuyển tiếp kiểu LitePub. URL bạn nhập ở đây sẽ kết thúc với /actor.", + "relays.add": "Thêm Chuyển Tiếp Mới", + "relays.relay": "Chuyển tiếp", "relays.state": "Trạng thái", "relays.state-0": "Đang đợi", "relays.state-1": "Chỉ nhận", From 1d6a9fe738bdbe628306bbaa640fb30eaea86e45 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 8 Sep 2025 14:57:51 -0400 Subject: [PATCH 08/82] feat: allow user auto-categorization rule --- .../en-GB/admin/settings/activitypub.json | 3 ++- public/src/admin/settings/activitypub.js | 18 +++++++++++++++++- src/activitypub/notes.js | 7 +++++++ src/activitypub/rules.js | 11 +++++++++++ src/views/admin/partials/activitypub/rules.tpl | 3 ++- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/public/language/en-GB/admin/settings/activitypub.json b/public/language/en-GB/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/en-GB/admin/settings/activitypub.json +++ b/public/language/en-GB/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/src/admin/settings/activitypub.js b/public/src/admin/settings/activitypub.js index 8c79d95b4b..0da00293de 100644 --- a/public/src/admin/settings/activitypub.js +++ b/public/src/admin/settings/activitypub.js @@ -6,7 +6,8 @@ define('admin/settings/activitypub', [ 'categorySelector', 'api', 'alerts', -], function (Benchpress, bootbox, categorySelector, api, alerts) { + 'translator', +], function (Benchpress, bootbox, categorySelector, api, alerts, translator) { const Module = {}; Module.init = function () { @@ -95,6 +96,21 @@ define('admin/settings/activitypub', [ modal.find('input').focus(); }); + + // help text + const updateHelp = async (key, el) => { + const text = await translator.translate(`[[admin/settings/activitypub:rules.help-${key}]]`); + el.innerHTML = text; + }; + const helpTextEl = modal.get(0).querySelector('#help-text'); + const typeEl = modal.get(0).querySelector('#type'); + updateHelp(modal.get(0).querySelector('#type option').value, helpTextEl); + if (typeEl && helpTextEl) { + typeEl.addEventListener('change', function () { + updateHelp(this.value, helpTextEl); + }); + } + // category switcher categorySelector.init(modal.find('[component="category-selector"]'), { onSelect: function (selectedCategory) { diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 3a00323859..cc5e7fe393 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -417,6 +417,13 @@ async function assignCategory(post) { } break; } + + case 'user': { + if (post.uid === value) { + activitypub.helpers.log(`[activitypub] - Rule match: user ${value}; cid: ${target}`); + return target; + } + } } } diff --git a/src/activitypub/rules.js b/src/activitypub/rules.js index 3a9a560552..9b3a002aab 100644 --- a/src/activitypub/rules.js +++ b/src/activitypub/rules.js @@ -3,6 +3,8 @@ const db = require('../database'); const utils = require('../utils'); +const activitypub = require('.'); + const Rules = module.exports; Rules.list = async () => { @@ -19,6 +21,15 @@ Rules.list = async () => { Rules.add = async (type, value, cid) => { const uuid = utils.generateUUID(); + // normalize user rule values into a uid + if (type === 'user' && value.indexOf('@') !== -1) { + const response = await activitypub.actors.assert(value); + if (!response) { + throw new Error('[[error:no-user]]'); + } + value = await db.getObjectField('handle:uid', String(value).toLowerCase()); + } + await Promise.all([ db.setObject(`rid:${uuid}`, { type, value, cid }), db.sortedSetAdd('categorization:rid', Date.now(), uuid), diff --git a/src/views/admin/partials/activitypub/rules.tpl b/src/views/admin/partials/activitypub/rules.tpl index e321a86744..33273942b5 100644 --- a/src/views/admin/partials/activitypub/rules.tpl +++ b/src/views/admin/partials/activitypub/rules.tpl @@ -8,13 +8,14 @@
-

[[admin/settings/activitypub:rules.modal.values-multiple]]

+

From 8939010195babe649267c317b20666727ac12345 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Mon, 8 Sep 2025 19:37:21 +0000 Subject: [PATCH 09/82] chore(i18n): fallback strings for new resources: nodebb.admin-settings-activitypub --- public/language/ar/admin/settings/activitypub.json | 3 ++- public/language/az/admin/settings/activitypub.json | 3 ++- public/language/bg/admin/settings/activitypub.json | 3 ++- public/language/bn/admin/settings/activitypub.json | 3 ++- public/language/cs/admin/settings/activitypub.json | 3 ++- public/language/da/admin/settings/activitypub.json | 3 ++- public/language/de/admin/settings/activitypub.json | 3 ++- public/language/el/admin/settings/activitypub.json | 3 ++- public/language/en-US/admin/settings/activitypub.json | 3 ++- public/language/en-x-pirate/admin/settings/activitypub.json | 3 ++- public/language/es/admin/settings/activitypub.json | 3 ++- public/language/et/admin/settings/activitypub.json | 3 ++- public/language/fa-IR/admin/settings/activitypub.json | 3 ++- public/language/fi/admin/settings/activitypub.json | 3 ++- public/language/fr/admin/settings/activitypub.json | 3 ++- public/language/gl/admin/settings/activitypub.json | 3 ++- public/language/he/admin/settings/activitypub.json | 3 ++- public/language/hr/admin/settings/activitypub.json | 3 ++- public/language/hu/admin/settings/activitypub.json | 3 ++- public/language/hy/admin/settings/activitypub.json | 3 ++- public/language/id/admin/settings/activitypub.json | 3 ++- public/language/it/admin/settings/activitypub.json | 3 ++- public/language/ja/admin/settings/activitypub.json | 3 ++- public/language/ko/admin/settings/activitypub.json | 3 ++- public/language/lt/admin/settings/activitypub.json | 3 ++- public/language/lv/admin/settings/activitypub.json | 3 ++- public/language/ms/admin/settings/activitypub.json | 3 ++- public/language/nb/admin/settings/activitypub.json | 3 ++- public/language/nl/admin/settings/activitypub.json | 3 ++- public/language/nn-NO/admin/settings/activitypub.json | 3 ++- public/language/pl/admin/settings/activitypub.json | 3 ++- public/language/pt-BR/admin/settings/activitypub.json | 3 ++- public/language/pt-PT/admin/settings/activitypub.json | 3 ++- public/language/ro/admin/settings/activitypub.json | 3 ++- public/language/ru/admin/settings/activitypub.json | 3 ++- public/language/rw/admin/settings/activitypub.json | 3 ++- public/language/sc/admin/settings/activitypub.json | 3 ++- public/language/sk/admin/settings/activitypub.json | 3 ++- public/language/sl/admin/settings/activitypub.json | 3 ++- public/language/sq-AL/admin/settings/activitypub.json | 3 ++- public/language/sr/admin/settings/activitypub.json | 3 ++- public/language/sv/admin/settings/activitypub.json | 3 ++- public/language/th/admin/settings/activitypub.json | 3 ++- public/language/tr/admin/settings/activitypub.json | 3 ++- public/language/uk/admin/settings/activitypub.json | 3 ++- public/language/ur/admin/settings/activitypub.json | 3 ++- public/language/vi/admin/settings/activitypub.json | 3 ++- public/language/zh-CN/admin/settings/activitypub.json | 3 ++- public/language/zh-TW/admin/settings/activitypub.json | 3 ++- 49 files changed, 98 insertions(+), 49 deletions(-) diff --git a/public/language/ar/admin/settings/activitypub.json b/public/language/ar/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/ar/admin/settings/activitypub.json +++ b/public/language/ar/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/az/admin/settings/activitypub.json b/public/language/az/admin/settings/activitypub.json index db67fe8e2b..2399a20908 100644 --- a/public/language/az/admin/settings/activitypub.json +++ b/public/language/az/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/bg/admin/settings/activitypub.json b/public/language/bg/admin/settings/activitypub.json index 83b33df719..4c856f6cd3 100644 --- a/public/language/bg/admin/settings/activitypub.json +++ b/public/language/bg/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Съдържанието открито чрез ActivityPub може да бъде категоризирано автоматично следвайки определени правила (например дума отбелязана с диез)", "rules.modal.title": "Как работи това", "rules.modal.instructions": "Цялото входящо съдържание се проверява спрямо правилата и ако има съвпадения – те се преместват в избраната категория.

Забележка Съдържанието, което вече е категоризирано (например в отдалечена категория) няма да преминава тези проверки.", - "rules.modal.values-multiple": "Ако искате да се проверяват няколко стойности, разделете ги със запетая (пример: едно,две,три)", "rules.add": "Добавяне на ново правило", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Тип", "rules.value": "Стойност", "rules.cid": "Категория", diff --git a/public/language/bn/admin/settings/activitypub.json b/public/language/bn/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/bn/admin/settings/activitypub.json +++ b/public/language/bn/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/cs/admin/settings/activitypub.json b/public/language/cs/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/cs/admin/settings/activitypub.json +++ b/public/language/cs/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/da/admin/settings/activitypub.json b/public/language/da/admin/settings/activitypub.json index c868684859..b70d230cf5 100644 --- a/public/language/da/admin/settings/activitypub.json +++ b/public/language/da/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/de/admin/settings/activitypub.json b/public/language/de/admin/settings/activitypub.json index f08220e9df..34f2635f78 100644 --- a/public/language/de/admin/settings/activitypub.json +++ b/public/language/de/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Über ActivityPub entdeckte Inhalte können automatisch anhand bestimmter Regeln (z. B. Hashtags) kategorisiert werden.", "rules.modal.title": "Wie es funktioniert", "rules.modal.instructions": "Eingehende Inhalte werden mit diesen Kategorisierungsregeln abgeglichen, und passende Inhalte werden automatisch in die gewünschte Kategorie verschoben. Hinweis: Inhalte, die bereits kategorisiert sind (z. B. in einer externen Kategorie), durchlaufen diese Regeln nicht.", - "rules.modal.values-multiple": "Um mehrere Werte abzugleichen, Einträge mit einem Komma trennen (z. B. eins,zwei,drei).", "rules.add": "Neue Regel hinzufügen", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Typ", "rules.value": "Wert", "rules.cid": "Kategorie", diff --git a/public/language/el/admin/settings/activitypub.json b/public/language/el/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/el/admin/settings/activitypub.json +++ b/public/language/el/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/en-US/admin/settings/activitypub.json b/public/language/en-US/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/en-US/admin/settings/activitypub.json +++ b/public/language/en-US/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/en-x-pirate/admin/settings/activitypub.json b/public/language/en-x-pirate/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/en-x-pirate/admin/settings/activitypub.json +++ b/public/language/en-x-pirate/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/es/admin/settings/activitypub.json b/public/language/es/admin/settings/activitypub.json index da972be67d..5bc9a80078 100644 --- a/public/language/es/admin/settings/activitypub.json +++ b/public/language/es/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/et/admin/settings/activitypub.json b/public/language/et/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/et/admin/settings/activitypub.json +++ b/public/language/et/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/fa-IR/admin/settings/activitypub.json b/public/language/fa-IR/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/fa-IR/admin/settings/activitypub.json +++ b/public/language/fa-IR/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/fi/admin/settings/activitypub.json b/public/language/fi/admin/settings/activitypub.json index 8fc3168448..a916af734e 100644 --- a/public/language/fi/admin/settings/activitypub.json +++ b/public/language/fi/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/fr/admin/settings/activitypub.json b/public/language/fr/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/fr/admin/settings/activitypub.json +++ b/public/language/fr/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/gl/admin/settings/activitypub.json b/public/language/gl/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/gl/admin/settings/activitypub.json +++ b/public/language/gl/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/he/admin/settings/activitypub.json b/public/language/he/admin/settings/activitypub.json index 7d7f2360cf..784350dfff 100644 --- a/public/language/he/admin/settings/activitypub.json +++ b/public/language/he/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/hr/admin/settings/activitypub.json b/public/language/hr/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/hr/admin/settings/activitypub.json +++ b/public/language/hr/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/hu/admin/settings/activitypub.json b/public/language/hu/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/hu/admin/settings/activitypub.json +++ b/public/language/hu/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/hy/admin/settings/activitypub.json b/public/language/hy/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/hy/admin/settings/activitypub.json +++ b/public/language/hy/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/id/admin/settings/activitypub.json b/public/language/id/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/id/admin/settings/activitypub.json +++ b/public/language/id/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/it/admin/settings/activitypub.json b/public/language/it/admin/settings/activitypub.json index ed794f82b7..764085b800 100644 --- a/public/language/it/admin/settings/activitypub.json +++ b/public/language/it/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "I contenuti scoperti tramite ActivityPub possono essere categorizzati automaticamente in base a determinate regole (ad es. hashtag)", "rules.modal.title": "Come funziona", "rules.modal.instructions": "Tutti i contenuti in arrivo sono controllati in base a queste regole di categorizzazione e i contenuti corrispondenti sono automaticamente spostati nella categoria scelta.

N.B. Contenuti già categorizzati (ad es. in una categoria remota) non passerà attraverso queste regole.", - "rules.modal.values-multiple": "Per abbinare più valori, separa le voci con una virgola (es. uno,due,tre)", "rules.add": "Aggiungi nuova regola", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Tipo", "rules.value": "Valore", "rules.cid": "Categoria", diff --git a/public/language/ja/admin/settings/activitypub.json b/public/language/ja/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/ja/admin/settings/activitypub.json +++ b/public/language/ja/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/ko/admin/settings/activitypub.json b/public/language/ko/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/ko/admin/settings/activitypub.json +++ b/public/language/ko/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/lt/admin/settings/activitypub.json b/public/language/lt/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/lt/admin/settings/activitypub.json +++ b/public/language/lt/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/lv/admin/settings/activitypub.json b/public/language/lv/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/lv/admin/settings/activitypub.json +++ b/public/language/lv/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/ms/admin/settings/activitypub.json b/public/language/ms/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/ms/admin/settings/activitypub.json +++ b/public/language/ms/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/nb/admin/settings/activitypub.json b/public/language/nb/admin/settings/activitypub.json index 2d280b94e5..bab848c368 100644 --- a/public/language/nb/admin/settings/activitypub.json +++ b/public/language/nb/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/nl/admin/settings/activitypub.json b/public/language/nl/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/nl/admin/settings/activitypub.json +++ b/public/language/nl/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/nn-NO/admin/settings/activitypub.json b/public/language/nn-NO/admin/settings/activitypub.json index f75280fc73..79f6f05cd6 100644 --- a/public/language/nn-NO/admin/settings/activitypub.json +++ b/public/language/nn-NO/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/pl/admin/settings/activitypub.json b/public/language/pl/admin/settings/activitypub.json index 5ea1cccc2b..a9ce74deda 100644 --- a/public/language/pl/admin/settings/activitypub.json +++ b/public/language/pl/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Zawartość odkrywana via ActivePub może być automatycznie przyszeregowana w oparciu m.in o hashtag", "rules.modal.title": "Jak to działa", "rules.modal.instructions": "Wszelka zawartość z zewnątrz jest sprawdzana pod kątem zasad przyszeregowania a zatem z automatu umieszczana we własciwych kategoriach.

N.B. Zawartość już przyszeregowana (np. zdalna kategoria) nie podlega przetworzeniu przez reguły.", - "rules.modal.values-multiple": "Aby dopasować wiele wartości oddziel je przecinkami (np. jeden,dwa,trzy)", "rules.add": "Dodaj nową regułę", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Typ", "rules.value": "Wartość", "rules.cid": "Kategoria", diff --git a/public/language/pt-BR/admin/settings/activitypub.json b/public/language/pt-BR/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/pt-BR/admin/settings/activitypub.json +++ b/public/language/pt-BR/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/pt-PT/admin/settings/activitypub.json b/public/language/pt-PT/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/pt-PT/admin/settings/activitypub.json +++ b/public/language/pt-PT/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/ro/admin/settings/activitypub.json b/public/language/ro/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/ro/admin/settings/activitypub.json +++ b/public/language/ro/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/ru/admin/settings/activitypub.json b/public/language/ru/admin/settings/activitypub.json index 55eb27a108..201d4d7a65 100644 --- a/public/language/ru/admin/settings/activitypub.json +++ b/public/language/ru/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/rw/admin/settings/activitypub.json b/public/language/rw/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/rw/admin/settings/activitypub.json +++ b/public/language/rw/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/sc/admin/settings/activitypub.json b/public/language/sc/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/sc/admin/settings/activitypub.json +++ b/public/language/sc/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/sk/admin/settings/activitypub.json b/public/language/sk/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/sk/admin/settings/activitypub.json +++ b/public/language/sk/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/sl/admin/settings/activitypub.json b/public/language/sl/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/sl/admin/settings/activitypub.json +++ b/public/language/sl/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/sq-AL/admin/settings/activitypub.json b/public/language/sq-AL/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/sq-AL/admin/settings/activitypub.json +++ b/public/language/sq-AL/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/sr/admin/settings/activitypub.json b/public/language/sr/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/sr/admin/settings/activitypub.json +++ b/public/language/sr/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/sv/admin/settings/activitypub.json b/public/language/sv/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/sv/admin/settings/activitypub.json +++ b/public/language/sv/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/th/admin/settings/activitypub.json b/public/language/th/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/th/admin/settings/activitypub.json +++ b/public/language/th/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/tr/admin/settings/activitypub.json b/public/language/tr/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/tr/admin/settings/activitypub.json +++ b/public/language/tr/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/uk/admin/settings/activitypub.json b/public/language/uk/admin/settings/activitypub.json index 1b00672e0f..5ab4fa43e8 100644 --- a/public/language/uk/admin/settings/activitypub.json +++ b/public/language/uk/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/ur/admin/settings/activitypub.json b/public/language/ur/admin/settings/activitypub.json index 537f7354eb..9f2b98f72a 100644 --- a/public/language/ur/admin/settings/activitypub.json +++ b/public/language/ur/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", diff --git a/public/language/vi/admin/settings/activitypub.json b/public/language/vi/admin/settings/activitypub.json index d6da5bd675..d7290381d3 100644 --- a/public/language/vi/admin/settings/activitypub.json +++ b/public/language/vi/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Nội dung được phát hiện thông qua ActivityPub có thể được tự động phân loại dựa trên các quy tắc nhất định (ví dụ: hashtag)", "rules.modal.title": "Cách nó hoạt động", "rules.modal.instructions": "Bất kỳ nội dung đến nào cũng được kiểm tra theo các quy tắc phân loại này và nội dung phù hợp được tự động chuyển sang danh mục lựa chọn.

N.B. Nội dung đã được phân loại (nghĩa là trong một danh mục từ xa) sẽ không thông qua các quy tắc này.", - "rules.modal.values-multiple": "Để phù hợp với nhiều giá trị, tách các mục riêng biệt với dấu phẩy (vd: một,hai,ba)", "rules.add": "Thêm Quy Tắc Mới", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Loại", "rules.value": "Giá trị", "rules.cid": "Danh mục", diff --git a/public/language/zh-CN/admin/settings/activitypub.json b/public/language/zh-CN/admin/settings/activitypub.json index 39de463e70..97703c18f8 100644 --- a/public/language/zh-CN/admin/settings/activitypub.json +++ b/public/language/zh-CN/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "通过 ActivityPub 发现的内容可根据特定规则(如标签)进行自动分类。", "rules.modal.title": "它的工作原理", "rules.modal.instructions": "所有传入的内容都会根据这些分类规则进行检查,符合规则的内容会自动移动到指定的版块目录中。

注: 已分类的内容(即位于远程版块中的内容)将不会受这些规则的影响。", - "rules.modal.values-multiple": "要匹配多个值,请用逗号分隔各条目 (如:一,二,三)", "rules.add": "添加规则", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "类型", "rules.value": "值", "rules.cid": "版块", diff --git a/public/language/zh-TW/admin/settings/activitypub.json b/public/language/zh-TW/admin/settings/activitypub.json index 6fdf6c0602..dd07276f94 100644 --- a/public/language/zh-TW/admin/settings/activitypub.json +++ b/public/language/zh-TW/admin/settings/activitypub.json @@ -22,8 +22,9 @@ "rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)", "rules.modal.title": "How it works", "rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.

N.B. Content that is already categorized (i.e. in a remote category) will not pass through these rules.", - "rules.modal.values-multiple": "To match multiple values, separate entries with a comma (e.g. one,two,three)", "rules.add": "Add New Rule", + "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", + "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", "rules.type": "Type", "rules.value": "Value", "rules.cid": "Category", From 3044f3829109aa791e28ad5b4ba41c581492b6fe Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Tue, 9 Sep 2025 09:20:59 +0000 Subject: [PATCH 10/82] Latest translations and fallbacks --- public/language/pl/admin/settings/activitypub.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/language/pl/admin/settings/activitypub.json b/public/language/pl/admin/settings/activitypub.json index a9ce74deda..3d6712f199 100644 --- a/public/language/pl/admin/settings/activitypub.json +++ b/public/language/pl/admin/settings/activitypub.json @@ -23,8 +23,8 @@ "rules.modal.title": "Jak to działa", "rules.modal.instructions": "Wszelka zawartość z zewnątrz jest sprawdzana pod kątem zasad przyszeregowania a zatem z automatu umieszczana we własciwych kategoriach.

N.B. Zawartość już przyszeregowana (np. zdalna kategoria) nie podlega przetworzeniu przez reguły.", "rules.add": "Dodaj nową regułę", - "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", - "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", + "rules.help-hashtag": "Wątki zawierające hashtag gdzie wielkość liter nie ma znaczenia będą dopasowane. Pomiń symbol # przy wprowadzaniu", + "rules.help-user": "Wątki utworzone przez wybranego użytkownika będą dopasowane. Wprowadź zawołanie lub pełne ID (np. bob@example.org lub https://example.org/users/bob.", "rules.type": "Typ", "rules.value": "Wartość", "rules.cid": "Kategoria", From a5ea4b405621909796cfb3aaf42525f7ea23952c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 9 Sep 2025 11:07:28 -0400 Subject: [PATCH 11/82] chore: up eslint --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 810b1f65a8..58baf44fb7 100644 --- a/install/package.json +++ b/install/package.json @@ -163,7 +163,7 @@ "@commitlint/cli": "19.8.1", "@commitlint/config-angular": "19.8.1", "coveralls": "3.1.1", - "@eslint/js": "9.34.0", + "@eslint/js": "9.35.0", "@stylistic/eslint-plugin": "5.3.1", "eslint-config-nodebb": "1.1.11", "eslint-plugin-import": "2.32.0", From 10350ea6f6101d4b28efd29affc87ed55d42386a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 9 Sep 2025 11:20:03 -0400 Subject: [PATCH 12/82] revert: post queue changes to fix tests --- install/data/defaults.json | 4 ++-- test/topics.js | 14 -------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index d90730d396..574a8bfe01 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -24,8 +24,8 @@ "newbieChatMessageDelay": 120000, "notificationSendDelay": 60, "newbieReputationThreshold": 3, - "postQueue": 1, - "postQueueReputationThreshold": 1, + "postQueue": 0, + "postQueueReputationThreshold": 0, "groupsExemptFromPostQueue": ["administrators", "Global Moderators"], "groupsExemptFromNewUserRestrictions": ["administrators", "Global Moderators"], "groupsExemptFromMaintenanceMode": ["administrators", "Global Moderators"], diff --git a/test/topics.js b/test/topics.js index 023b737bf3..eaae7d76c7 100644 --- a/test/topics.js +++ b/test/topics.js @@ -54,14 +54,6 @@ describe('Topic\'s', () => { }); describe('.post', () => { - before(() => { - meta.config.postQueue = 0; - }); - - after(() => { - meta.config.postQueue = 1; - }); - it('should fail to create topic with invalid data', async () => { try { await apiTopics.create({ uid: 0 }, null); @@ -2345,12 +2337,6 @@ describe('Topic\'s', () => { content: 'The content of scheduled test topic', timestamp: new Date(Date.now() + 86400000).getTime(), }; - - meta.config.postQueue = 0; - }); - - after(() => { - meta.config.postQueue = 1; }); it('should create a scheduled topic as pinned, deleted, included in "topics:scheduled" zset and with a timestamp in future', async () => { From 8d6a0f0298679a3c6e4c399decc9d58cb6684529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 9 Sep 2025 11:28:29 -0400 Subject: [PATCH 13/82] test: ap timeouts --- test/mocks/databasemock.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index 179288bbcf..460a93c416 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -193,6 +193,7 @@ async function setupMockDefaults() { meta.config.initialPostDelay = 0; meta.config.newbiePostDelay = 0; meta.config.autoDetectLang = 0; + meta.config.activitypubProbeTimeout = 30000; require('../../src/groups').cache.reset(); require('../../src/posts/cache').getOrCreate().reset(); From 8d4e46529f861e4514799ba2db3447ff7f8ddd17 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 10 Sep 2025 13:49:20 +0000 Subject: [PATCH 14/82] chore(i18n): fallback strings for new resources: nodebb.admin-manage-categories --- public/language/ar/admin/manage/categories.json | 2 ++ public/language/az/admin/manage/categories.json | 2 ++ public/language/bg/admin/manage/categories.json | 2 ++ public/language/bn/admin/manage/categories.json | 2 ++ public/language/cs/admin/manage/categories.json | 2 ++ public/language/da/admin/manage/categories.json | 2 ++ public/language/de/admin/manage/categories.json | 2 ++ public/language/el/admin/manage/categories.json | 2 ++ public/language/en-US/admin/manage/categories.json | 2 ++ public/language/en-x-pirate/admin/manage/categories.json | 2 ++ public/language/es/admin/manage/categories.json | 2 ++ public/language/et/admin/manage/categories.json | 2 ++ public/language/fa-IR/admin/manage/categories.json | 2 ++ public/language/fi/admin/manage/categories.json | 2 ++ public/language/fr/admin/manage/categories.json | 2 ++ public/language/gl/admin/manage/categories.json | 2 ++ public/language/he/admin/manage/categories.json | 2 ++ public/language/hr/admin/manage/categories.json | 2 ++ public/language/hu/admin/manage/categories.json | 2 ++ public/language/hy/admin/manage/categories.json | 2 ++ public/language/id/admin/manage/categories.json | 2 ++ public/language/it/admin/manage/categories.json | 2 ++ public/language/ja/admin/manage/categories.json | 2 ++ public/language/ko/admin/manage/categories.json | 2 ++ public/language/lt/admin/manage/categories.json | 2 ++ public/language/lv/admin/manage/categories.json | 2 ++ public/language/ms/admin/manage/categories.json | 2 ++ public/language/nb/admin/manage/categories.json | 2 ++ public/language/nl/admin/manage/categories.json | 2 ++ public/language/nn-NO/admin/manage/categories.json | 2 ++ public/language/pl/admin/manage/categories.json | 2 ++ public/language/pt-BR/admin/manage/categories.json | 2 ++ public/language/pt-PT/admin/manage/categories.json | 2 ++ public/language/ro/admin/manage/categories.json | 2 ++ public/language/ru/admin/manage/categories.json | 2 ++ public/language/rw/admin/manage/categories.json | 2 ++ public/language/sc/admin/manage/categories.json | 2 ++ public/language/sk/admin/manage/categories.json | 2 ++ public/language/sl/admin/manage/categories.json | 2 ++ public/language/sq-AL/admin/manage/categories.json | 2 ++ public/language/sr/admin/manage/categories.json | 2 ++ public/language/sv/admin/manage/categories.json | 2 ++ public/language/th/admin/manage/categories.json | 2 ++ public/language/tr/admin/manage/categories.json | 2 ++ public/language/uk/admin/manage/categories.json | 2 ++ public/language/ur/admin/manage/categories.json | 2 ++ public/language/vi/admin/manage/categories.json | 2 ++ public/language/zh-CN/admin/manage/categories.json | 2 ++ public/language/zh-TW/admin/manage/categories.json | 2 ++ 49 files changed, 98 insertions(+) diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index f2469f7414..bf68795076 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/az/admin/manage/categories.json b/public/language/az/admin/manage/categories.json index 6540f6c4e9..c07a127295 100644 --- a/public/language/az/admin/manage/categories.json +++ b/public/language/az/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federasiya təsviri", "federatedDescription.help": "Bu mətn digər vebsaytlar/tətbiqlər tərəfindən sorğulandıqda kateqoriya təsvirinə əlavə olunacaq.", "federatedDescription.default": "Bu, aktual müzakirələrdən ibarət forum kateqoriyasıdır. Bu kateqoriyanı qeyd etməklə yeni müzakirələrə başlaya bilərsiniz.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Arxa fon rəngi", "text-color": "Mətnin rəngi", "bg-image-size": "Fon şəklinin ölçüsü", diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 51a23cb96b..21a2ebd641 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Федерирано описание", "federatedDescription.help": "Този текст ще бъде добавен към описанието на категорията, когато други уеб сайтове и приложения изискват информация за нея.", "federatedDescription.default": "Това е категория във форума, съдържаща тематични дискусии. Може да започнете нова дискусия, като споменете този форум.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Цвят на фона", "text-color": "Цвят на текста", "bg-image-size": "Размер на фоновото изображение", diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index 8a8942a9f1..5277ddf50a 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Barva pozadí", "text-color": "Barva textu", "bg-image-size": "Velikost obrázku pozadí", diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index 54ce8cd595..a491c842cc 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index 327f17ae07..ef9cf71289 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Hintergrundfarbe", "text-color": "Textfarbe", "bg-image-size": "Hintergrundbildgröße", diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index 74e14ce149..a2eb86107f 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Descripción federada", "federatedDescription.help": "Este texto será agregado a la descripción de la categoría cuando sea buscado por otros sitios y aplicaciones.", "federatedDescription.default": "Esta es una categoría de foro que contiene discusiones pasadas. Puedes iniciar nuevas discusiones mencionando esta categoría.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Color de Fondo", "text-color": "Color del Texto", "bg-image-size": "Tamaño de la Imagen de Fondo", diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index f80ae0e28e..5771d6a3fe 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index 0b50fb20ad..e567de337b 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Taustaväri", "text-color": "Tekstin väri", "bg-image-size": "Taustakuvan koko", diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index 35b588d572..c346a8a60b 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Couleur d'arrière plan", "text-color": "Couleur du texte", "bg-image-size": "Taille de l'image d'arrière plan", diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index e250ec3867..5ce040d841 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "תיאור פדרציה", "federatedDescription.help": "טקסט זה יצורף לתיאור הקטגוריה כאשר הוא יתבקש על ידי אתרים או אפליקציות אחרות.", "federatedDescription.default": "זוהי קטגוריית פורום המכילה דיון אקטואלי. תוכלו להתחיל דיונים חדשים על ידי אזכור קטגוריה זו.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "צבע רקע", "text-color": "צבע טקסט", "bg-image-size": "גודל תמונת רקע", diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index f7169fb5d7..e3dcc1ff04 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Pozadniska boja", "text-color": "Boja teksta", "bg-image-size": "Veličina pozadinske slike", diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index 865c015202..8c9378a9c9 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Háttérszín", "text-color": "Szövegszín", "bg-image-size": "Háttérkép mérete", diff --git a/public/language/hy/admin/manage/categories.json b/public/language/hy/admin/manage/categories.json index 16ea33717d..b47fec23be 100644 --- a/public/language/hy/admin/manage/categories.json +++ b/public/language/hy/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Ֆոնի գույնը", "text-color": "Տեքստի գույն ", "bg-image-size": "Ֆոնային նկարի չափը", diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index b9ad1c8be3..e6abf93576 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Descrizione federazione", "federatedDescription.help": "Questo testo sarà aggiunto alla descrizione della categoria quando interrogato da altri siti web/app.", "federatedDescription.default": "Questa è una categoria del forum che contiene discussioni di attualità. Puoi iniziare nuove discussioni menzionando questa categoria.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Colore sfondo", "text-color": "Colore testo", "bg-image-size": "Dimensione dell'immagine di sfondo", diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index 44252e8c1a..dbd1c2ed86 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "背景色", "text-color": "テキストカラー", "bg-image-size": "背景画像サイズ", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 2625775110..62c37899a0 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "배경 색상", "text-color": "텍스트 색상", "bg-image-size": "배경 이미지 크기", diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index fba8b697ad..4746223d60 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Fona krāsa", "text-color": "Teksta krāsa", "bg-image-size": "Fona bildes lielums", diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index 0cf4511dd6..d9333c679f 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Bakgrunnsfarge", "text-color": "Tekstfarge", "bg-image-size": "Størrelse på bakgrunnsbilde", diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index 31db61a5dd..bdf146510e 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/nn-NO/admin/manage/categories.json b/public/language/nn-NO/admin/manage/categories.json index 900971a999..dad82a5ee3 100644 --- a/public/language/nn-NO/admin/manage/categories.json +++ b/public/language/nn-NO/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Bakgrunnsfarge", "text-color": "Tekstfarge", "bg-image-size": "Storleik på bakgrunnsbilete", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 80835e8152..0236d7f6dd 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Opis federacji", "federatedDescription.help": "Ten tekst zostanie użyty dla opisu sekcji widocznej z poziomu innych stron/aplikacji.", "federatedDescription.default": "Ta sekcja forum zawiera dyskusje tematyczne. Możesz rozpocząć nową dyskusję wzmiankując tę kategorię.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Kolor tła", "text-color": "Kolor tekstu", "bg-image-size": "Wielkość obrazka tła", diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index c07d5537a5..3b41afca38 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Cor de Fundo", "text-color": "Cor do Texto", "bg-image-size": "Tamanho da Imagem de Fundo", diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 75d054e475..3fb24317f8 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Cor de Fundo", "text-color": "Cor do Texto", "bg-image-size": "Tamanho da Imagem de Fundo", diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index 36843c00a8..3ab043db8f 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Цвет фона", "text-color": "Цвет текста", "bg-image-size": "Размер фонового изображения", diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 5cd7b32ebe..34ad2e086e 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Farba pozadia", "text-color": "Farba textu", "bg-image-size": "Veľkosť obrázku na pozadí", diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index 129cce0663..cde764efa8 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Barva ozadja", "text-color": "Barva besedila", "bg-image-size": "Velikost slike ozadja", diff --git a/public/language/sq-AL/admin/manage/categories.json b/public/language/sq-AL/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/sq-AL/admin/manage/categories.json +++ b/public/language/sq-AL/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index d66dd814a1..7532cd9cd1 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index e43fb441af..7287d92af4 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Background Colour", "text-color": "Text Colour", "bg-image-size": "Background Image Size", diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index fd61be437c..f28cdc9cb0 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "สีพื้น", "text-color": "สีข้อความ", "bg-image-size": "ขนาดภาพพื้นหลัง", diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index af50cc0700..4bd70dc4ab 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Arkaplan Rengi", "text-color": "Yazı Rengi", "bg-image-size": "Arkaplan Görseli Boyutu", diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index 0d2dc60d0a..556f750f44 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Колір фону", "text-color": "Колір тексту", "bg-image-size": "Розмір фонового зображення", diff --git a/public/language/ur/admin/manage/categories.json b/public/language/ur/admin/manage/categories.json index d050877aa2..175a81965f 100644 --- a/public/language/ur/admin/manage/categories.json +++ b/public/language/ur/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "فیڈریٹڈ تفصیل", "federatedDescription.help": "یہ متن زمرہ کی تفصیل میں شامل کیا جائے گا جب دیگر ویب سائٹس اور ایپلی کیشنز اس کے بارے میں معلومات طلب کریں گی۔", "federatedDescription.default": "یہ فورم میں ایک زمرہ ہے جس میں موضوعاتی بحثیں شامل ہیں۔ آپ اس فورم کا ذکر کرکے ایک نئی بحث شروع کر سکتے ہیں۔", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "پس منظر کا رنگ", "text-color": "متن کا رنگ", "bg-image-size": "پس منظر تصویر کا سائز", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 45f3d12d89..d1e14a6e9b 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Mô Tả Liên Kết", "federatedDescription.help": "Văn bản này sẽ được thêm vào mô tả danh mục khi được truy vấn bởi các trang web/ứng dụng khác.", "federatedDescription.default": "Đây là một danh mục diễn đàn có chứa thảo luận tại chỗ. Bạn có thể bắt đầu các cuộc thảo luận mới bằng cách đề cập đến thể loại này.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "Màu Nền", "text-color": "Màu Chữ", "bg-image-size": "Kích Thước Hình Nền", diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 52302c243e..2763d4d467 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "“联邦化”说明", "federatedDescription.help": "当其他网站/应用程序查询时,该文本将附加到版块描述中。", "federatedDescription.default": "这是一个包含专题讨论的论坛版块。您可以通过提及该版块开始新的讨论。", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "背景颜色", "text-color": "图标颜色", "bg-image-size": "背景图片大小", diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index 4da07dc01c..25f495b009 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -17,6 +17,8 @@ "federatedDescription": "Federated Description", "federatedDescription.help": "This text will be appended to the category description when queried by other websites/apps.", "federatedDescription.default": "This is a forum category containing topical discussion. You can start new discussions by mentioning this category.", + "topic-template": "Topic Template", + "topic-template.help": "Define a template for new topics created in this category.", "bg-color": "背景顏色", "text-color": "圖示顏色", "bg-image-size": "背景圖片大小", From feda629f821b284e0f16f8c3c4263116306a43d7 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 10 Sep 2025 14:48:24 -0400 Subject: [PATCH 15/82] chore: remove formatApiResponse logging --- src/controllers/helpers.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index e11692867e..a6ade8c73b 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -448,10 +448,6 @@ helpers.getHomePageRoutes = async function (uid) { }; helpers.formatApiResponse = async (statusCode, res, payload) => { - if (!res.hasOwnProperty('req')) { - console.log('formatApiResponse', statusCode, payload); - } - if (res.req.method === 'HEAD') { return res.sendStatus(statusCode); } From 6adfbb2482e80504665ae552cb6ea48d16c18f04 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 17:26:21 -0400 Subject: [PATCH 16/82] fix(deps): update dependency lru-cache to v11.2.1 (#13644) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 9f7ba81589..c099390c7d 100644 --- a/install/package.json +++ b/install/package.json @@ -88,7 +88,7 @@ "jsonwebtoken": "9.0.2", "lodash": "4.17.21", "logrotate-stream": "0.2.9", - "lru-cache": "11.1.0", + "lru-cache": "11.2.1", "mime": "3.0.0", "mkdirp": "3.0.1", "mongodb": "6.19.0", From ac90ef8c9a8844dd7dcd9dc89a9692eee455a203 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Sep 2025 17:27:20 -0400 Subject: [PATCH 17/82] chore(deps): update dependency mocha to v11.7.2 (#13636) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c099390c7d..66b26b29dc 100644 --- a/install/package.json +++ b/install/package.json @@ -172,7 +172,7 @@ "husky": "8.0.3", "jsdom": "26.1.0", "lint-staged": "16.1.5", - "mocha": "11.7.1", + "mocha": "11.7.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", "nyc": "17.1.0", From 67fa433f1af91f9dff915b4f9002cb7a65a4502f Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 11 Sep 2025 09:21:14 +0000 Subject: [PATCH 18/82] Latest translations and fallbacks --- public/language/bg/admin/manage/categories.json | 4 ++-- public/language/bg/admin/settings/activitypub.json | 4 ++-- public/language/pl/admin/manage/categories.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 21a2ebd641..cd847e56bf 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -17,8 +17,8 @@ "federatedDescription": "Федерирано описание", "federatedDescription.help": "Този текст ще бъде добавен към описанието на категорията, когато други уеб сайтове и приложения изискват информация за нея.", "federatedDescription.default": "Това е категория във форума, съдържаща тематични дискусии. Може да започнете нова дискусия, като споменете този форум.", - "topic-template": "Topic Template", - "topic-template.help": "Define a template for new topics created in this category.", + "topic-template": "Шаблон за темите", + "topic-template.help": "Създайте шаблон за новите теми в тази категория.", "bg-color": "Цвят на фона", "text-color": "Цвят на текста", "bg-image-size": "Размер на фоновото изображение", diff --git a/public/language/bg/admin/settings/activitypub.json b/public/language/bg/admin/settings/activitypub.json index 4c856f6cd3..dea26e2dfa 100644 --- a/public/language/bg/admin/settings/activitypub.json +++ b/public/language/bg/admin/settings/activitypub.json @@ -23,8 +23,8 @@ "rules.modal.title": "Как работи това", "rules.modal.instructions": "Цялото входящо съдържание се проверява спрямо правилата и ако има съвпадения – те се преместват в избраната категория.

Забележка Съдържанието, което вече е категоризирано (например в отдалечена категория) няма да преминава тези проверки.", "rules.add": "Добавяне на ново правило", - "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", - "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", + "rules.help-hashtag": "Ще се търсят съвпадения с теми съдържащи тази дума с диез (не се прави разлика между главни и малки букви). Не въвеждайте знака #", + "rules.help-user": "Ще се търсят теми създадени от този потребител. Въведете псевдоним или пълен идентификатор (например bob@example.org или https://example.org/users/bob.", "rules.type": "Тип", "rules.value": "Стойност", "rules.cid": "Категория", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 0236d7f6dd..4e6c2f3e9f 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -17,8 +17,8 @@ "federatedDescription": "Opis federacji", "federatedDescription.help": "Ten tekst zostanie użyty dla opisu sekcji widocznej z poziomu innych stron/aplikacji.", "federatedDescription.default": "Ta sekcja forum zawiera dyskusje tematyczne. Możesz rozpocząć nową dyskusję wzmiankując tę kategorię.", - "topic-template": "Topic Template", - "topic-template.help": "Define a template for new topics created in this category.", + "topic-template": "Szablon wątku", + "topic-template.help": "Stwórz szablon dla nowych wątków dodawanych w tej kategorii.", "bg-color": "Kolor tła", "text-color": "Kolor tekstu", "bg-image-size": "Wielkość obrazka tła", From 6a1e9e8a110193a8540566bbd0adbaebaa047dce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 09:23:59 -0400 Subject: [PATCH 19/82] fix(deps): update dependency workerpool to v9.3.4 (#13650) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 66b26b29dc..c0ee11a46f 100644 --- a/install/package.json +++ b/install/package.json @@ -152,7 +152,7 @@ "webpack": "5.101.3", "webpack-merge": "6.0.1", "winston": "3.17.0", - "workerpool": "9.3.3", + "workerpool": "9.3.4", "xml": "1.0.1", "xregexp": "5.1.2", "yargs": "17.7.2", From 4f5e770c5f55689f090a4d1867f69ca2b3a4443c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 09:24:29 -0400 Subject: [PATCH 20/82] chore(deps): update actions/setup-node action to v5 (#13647) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index fe9710ac5a..a94157f446 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -86,7 +86,7 @@ jobs: - run: cp install/package.json package.json - name: Install Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: ${{ matrix.node }} From 95fb084ca49084d257e11b58cef9d30ed84394e1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 11 Sep 2025 10:30:21 -0400 Subject: [PATCH 21/82] fix: wrap majority of note assertion logic in try..catch to handle exceptions so that the lock is always released --- src/activitypub/notes.js | 394 ++++++++++++++++++++------------------- 1 file changed, 200 insertions(+), 194 deletions(-) diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 4b9685a54c..466de29877 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -64,213 +64,219 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { return null; } - if (!options.skipChecks) { - id = (await activitypub.checkHeader(id)) || id; - } - - let chain; - let context = await activitypub.contexts.get(uid, id); - if (context.tid) { - await unlock(id); - const { tid } = context; - return { tid, count: 0 }; - } else if (context.context) { - chain = Array.from(await activitypub.contexts.getItems(uid, context.context, { input })); - if (chain && chain.length) { - // Context resolves, use in later topic creation - context = context.context; - } - } else { - context = undefined; - } - - if (!chain || !chain.length) { - // Fall back to inReplyTo traversal on context retrieval failure - chain = Array.from(await Notes.getParentChain(uid, input)); - chain.reverse(); - } - - // Can't resolve — give up. - if (!chain.length) { - await unlock(id); - return null; - } - - // Reorder chain items by timestamp - chain = chain.sort((a, b) => a.timestamp - b.timestamp); - - const mainPost = chain[0]; - let { pid: mainPid, tid, uid: authorId, timestamp, title, content, sourceContent, _activitypub } = mainPost; - const hasTid = !!tid; - - const cid = hasTid ? await topics.getTopicField(tid, 'cid') : options.cid || -1; - - if (options.cid && cid === -1) { - // Move topic if currently uncategorized - await topics.tools.move(tid, { cid: options.cid, uid: 'system' }); - } - - const members = await db.isSortedSetMembers(`tid:${tid}:posts`, chain.slice(1).map(p => p.pid)); - members.unshift(await posts.exists(mainPid)); - if (tid && members.every(Boolean)) { - // All cached, return early. - activitypub.helpers.log('[notes/assert] No new notes to process.'); - await unlock(id); - return { tid, count: 0 }; - } - - if (hasTid) { - mainPid = await topics.getTopicField(tid, 'mainPid'); - } else { - // Check recipients/audience for category (local or remote) - const set = activitypub.helpers.makeSet(_activitypub, ['to', 'cc', 'audience']); - await activitypub.actors.assert(Array.from(set)); - - // Local - const resolved = await Promise.all(Array.from(set).map(async id => await activitypub.helpers.resolveLocalId(id))); - const recipientCids = resolved - .filter(Boolean) - .filter(({ type }) => type === 'category') - .map(obj => obj.id); - - // Remote - let remoteCid; - const assertedGroups = await categories.exists(Array.from(set)); - try { - const { hostname } = new URL(mainPid); - remoteCid = Array.from(set).filter((id, idx) => { - const { hostname: cidHostname } = new URL(id); - return assertedGroups[idx] && cidHostname === hostname; - }).shift(); - } catch (e) { - // noop - winston.error('[activitypub/notes.assert] Could not parse URL of mainPid', e.stack); + try { + if (!options.skipChecks) { + id = (await activitypub.checkHeader(id)) || id; } - if (remoteCid || recipientCids.length) { - // Overrides passed-in value, respect addressing from main post over booster - options.cid = remoteCid || recipientCids.shift(); + let chain; + let context = await activitypub.contexts.get(uid, id); + if (context.tid) { + await unlock(id); + const { tid } = context; + return { tid, count: 0 }; + } else if (context.context) { + chain = Array.from(await activitypub.contexts.getItems(uid, context.context, { input })); + if (chain && chain.length) { + // Context resolves, use in later topic creation + context = context.context; + } + } else { + context = undefined; } - // Auto-categorization (takes place only if all other categorization efforts fail) - if (!options.cid) { - options.cid = await assignCategory(mainPost); + if (!chain || !chain.length) { + // Fall back to inReplyTo traversal on context retrieval failure + chain = Array.from(await Notes.getParentChain(uid, input)); + chain.reverse(); } - // mainPid ok to leave as-is - if (!title) { - const prettified = pretty(content || sourceContent); - const sentences = tokenizer.sentences(prettified, { sanitize: true, newline_boundaries: true }); - title = sentences.shift(); - } - - // Remove any custom emoji from title - if (_activitypub && _activitypub.tag && Array.isArray(_activitypub.tag)) { - _activitypub.tag - .filter(tag => tag.type === 'Emoji') - .forEach((tag) => { - title = title.replace(new RegExp(tag.name, 'g'), ''); - }); - } - } - mainPid = utils.isNumber(mainPid) ? parseInt(mainPid, 10) : mainPid; - - // Relation & privilege check for local categories - const inputIndex = chain.map(n => n.pid).indexOf(id); - const hasRelation = - uid || hasTid || - options.skipChecks || options.cid || - await assertRelation(chain[inputIndex !== -1 ? inputIndex : 0]); - - const privilege = `topics:${tid ? 'reply' : 'create'}`; - const allowed = await privileges.categories.can(privilege, options.cid || cid, activitypub._constants.uid); - if (!hasRelation || !allowed) { - if (!hasRelation) { - activitypub.helpers.log(`[activitypub/notes.assert] Not asserting ${id} as it has no relation to existing tracked content.`); - } - - await unlock(id); - return null; - } - - tid = tid || utils.generateUUID(); - mainPost.tid = tid; - - const urlMap = chain.reduce((map, post) => (post.url ? map.set(post.url, post.id) : map), new Map()); - const unprocessed = chain.map((post) => { - post.tid = tid; // add tid to post hash - - // Ensure toPids in replies are ids - if (urlMap.has(post.toPid)) { - post.toPid = urlMap.get(post.toPid); - } - - return post; - }).filter((p, idx) => !members[idx]); - const count = unprocessed.length; - activitypub.helpers.log(`[notes/assert] ${count} new note(s) found.`); - - if (!hasTid) { - const { to, cc, attachment } = mainPost._activitypub; - const tags = await Notes._normalizeTags(mainPost._activitypub.tag || []); - - try { - await topics.post({ - tid, - uid: authorId, - cid: options.cid || cid, - pid: mainPid, - title, - timestamp, - tags, - content: mainPost.content, - sourceContent: mainPost.sourceContent, - _activitypub: mainPost._activitypub, - }); - unprocessed.shift(); - } catch (e) { - activitypub.helpers.log(`[activitypub/notes.assert] Could not post topic (${mainPost.pid}): ${e.message}`); + // Can't resolve — give up. + if (!chain.length) { + await unlock(id); return null; } - // These must come after topic is posted + // Reorder chain items by timestamp + chain = chain.sort((a, b) => a.timestamp - b.timestamp); + + const mainPost = chain[0]; + let { pid: mainPid, tid, uid: authorId, timestamp, title, content, sourceContent, _activitypub } = mainPost; + const hasTid = !!tid; + + const cid = hasTid ? await topics.getTopicField(tid, 'cid') : options.cid || -1; + + if (options.cid && cid === -1) { + // Move topic if currently uncategorized + await topics.tools.move(tid, { cid: options.cid, uid: 'system' }); + } + + const members = await db.isSortedSetMembers(`tid:${tid}:posts`, chain.slice(1).map(p => p.pid)); + members.unshift(await posts.exists(mainPid)); + if (tid && members.every(Boolean)) { + // All cached, return early. + activitypub.helpers.log('[notes/assert] No new notes to process.'); + await unlock(id); + return { tid, count: 0 }; + } + + if (hasTid) { + mainPid = await topics.getTopicField(tid, 'mainPid'); + } else { + // Check recipients/audience for category (local or remote) + const set = activitypub.helpers.makeSet(_activitypub, ['to', 'cc', 'audience']); + await activitypub.actors.assert(Array.from(set)); + + // Local + const resolved = await Promise.all(Array.from(set).map(async id => await activitypub.helpers.resolveLocalId(id))); + const recipientCids = resolved + .filter(Boolean) + .filter(({ type }) => type === 'category') + .map(obj => obj.id); + + // Remote + let remoteCid; + const assertedGroups = await categories.exists(Array.from(set)); + try { + const { hostname } = new URL(mainPid); + remoteCid = Array.from(set).filter((id, idx) => { + const { hostname: cidHostname } = new URL(id); + return assertedGroups[idx] && cidHostname === hostname; + }).shift(); + } catch (e) { + // noop + winston.error('[activitypub/notes.assert] Could not parse URL of mainPid', e.stack); + } + + if (remoteCid || recipientCids.length) { + // Overrides passed-in value, respect addressing from main post over booster + options.cid = remoteCid || recipientCids.shift(); + } + + // Auto-categorization (takes place only if all other categorization efforts fail) + if (!options.cid) { + options.cid = await assignCategory(mainPost); + } + + // mainPid ok to leave as-is + if (!title) { + const prettified = pretty(content || sourceContent); + const sentences = tokenizer.sentences(prettified, { sanitize: true, newline_boundaries: true }); + title = sentences.shift(); + } + + // Remove any custom emoji from title + if (_activitypub && _activitypub.tag && Array.isArray(_activitypub.tag)) { + _activitypub.tag + .filter(tag => tag.type === 'Emoji') + .forEach((tag) => { + title = title.replace(new RegExp(tag.name, 'g'), ''); + }); + } + } + mainPid = utils.isNumber(mainPid) ? parseInt(mainPid, 10) : mainPid; + + // Relation & privilege check for local categories + const inputIndex = chain.map(n => n.pid).indexOf(id); + const hasRelation = + uid || hasTid || + options.skipChecks || options.cid || + await assertRelation(chain[inputIndex !== -1 ? inputIndex : 0]); + + const privilege = `topics:${tid ? 'reply' : 'create'}`; + const allowed = await privileges.categories.can(privilege, options.cid || cid, activitypub._constants.uid); + if (!hasRelation || !allowed) { + if (!hasRelation) { + activitypub.helpers.log(`[activitypub/notes.assert] Not asserting ${id} as it has no relation to existing tracked content.`); + } + + await unlock(id); + return null; + } + + tid = tid || utils.generateUUID(); + mainPost.tid = tid; + + const urlMap = chain.reduce((map, post) => (post.url ? map.set(post.url, post.id) : map), new Map()); + const unprocessed = chain.map((post) => { + post.tid = tid; // add tid to post hash + + // Ensure toPids in replies are ids + if (urlMap.has(post.toPid)) { + post.toPid = urlMap.get(post.toPid); + } + + return post; + }).filter((p, idx) => !members[idx]); + const count = unprocessed.length; + activitypub.helpers.log(`[notes/assert] ${count} new note(s) found.`); + + if (!hasTid) { + const { to, cc, attachment } = mainPost._activitypub; + const tags = await Notes._normalizeTags(mainPost._activitypub.tag || []); + + try { + await topics.post({ + tid, + uid: authorId, + cid: options.cid || cid, + pid: mainPid, + title, + timestamp, + tags, + content: mainPost.content, + sourceContent: mainPost.sourceContent, + _activitypub: mainPost._activitypub, + }); + unprocessed.shift(); + } catch (e) { + activitypub.helpers.log(`[activitypub/notes.assert] Could not post topic (${mainPost.pid}): ${e.message}`); + return null; + } + + // These must come after topic is posted + await Promise.all([ + Notes.updateLocalRecipients(mainPid, { to, cc }), + mainPost._activitypub.image ? topics.thumbs.associate({ + id: tid, + path: mainPost._activitypub.image, + }) : null, + posts.attachments.update(mainPid, attachment), + ]); + + if (context) { + activitypub.helpers.log(`[activitypub/notes.assert] Associating tid ${tid} with context ${context}`); + await topics.setTopicField(tid, 'context', context); + } + } + + for (const post of unprocessed) { + const { to, cc, attachment } = post._activitypub; + + try { + // eslint-disable-next-line no-await-in-loop + await topics.reply(post); + // eslint-disable-next-line no-await-in-loop + await Promise.all([ + Notes.updateLocalRecipients(post.pid, { to, cc }), + posts.attachments.update(post.pid, attachment), + ]); + } catch (e) { + activitypub.helpers.log(`[activitypub/notes.assert] Could not add reply (${post.pid}): ${e.message}`); + } + } + await Promise.all([ - Notes.updateLocalRecipients(mainPid, { to, cc }), - mainPost._activitypub.image ? topics.thumbs.associate({ - id: tid, - path: mainPost._activitypub.image, - }) : null, - posts.attachments.update(mainPid, attachment), + Notes.syncUserInboxes(tid, uid), + unlock(id), ]); - if (context) { - activitypub.helpers.log(`[activitypub/notes.assert] Associating tid ${tid} with context ${context}`); - await topics.setTopicField(tid, 'context', context); - } + return { tid, count }; + } catch (e) { + winston.warn(`[activitypub/notes.assert] Could not assert ${id} (${e.message}), releasing lock.`); + await unlock(id); + return null; } - - for (const post of unprocessed) { - const { to, cc, attachment } = post._activitypub; - - try { - // eslint-disable-next-line no-await-in-loop - await topics.reply(post); - // eslint-disable-next-line no-await-in-loop - await Promise.all([ - Notes.updateLocalRecipients(post.pid, { to, cc }), - posts.attachments.update(post.pid, attachment), - ]); - } catch (e) { - activitypub.helpers.log(`[activitypub/notes.assert] Could not add reply (${post.pid}): ${e.message}`); - } - } - - await Promise.all([ - Notes.syncUserInboxes(tid, uid), - unlock(id), - ]); - - return { tid, count }; }; Notes.assertPrivate = async (object) => { From 9184a7a4cc8c68c094d9ddbe86dd0c23f578986e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 11 Sep 2025 17:28:56 -0400 Subject: [PATCH 22/82] fix: add missing unlock in nested try/catch --- src/activitypub/notes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 466de29877..d485fdd256 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -231,6 +231,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { unprocessed.shift(); } catch (e) { activitypub.helpers.log(`[activitypub/notes.assert] Could not post topic (${mainPost.pid}): ${e.message}`); + await unlock(id); return null; } From 7147a2e31aeb4711c9a8ff398db50f33810243e6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 17:46:24 -0400 Subject: [PATCH 23/82] chore(deps): update dependency lint-staged to v16.1.6 (#13635) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c0ee11a46f..e4ca5287f7 100644 --- a/install/package.json +++ b/install/package.json @@ -171,7 +171,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "8.0.3", "jsdom": "26.1.0", - "lint-staged": "16.1.5", + "lint-staged": "16.1.6", "mocha": "11.7.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From 10344c98a8730f89a0e16f5c535944016cf1fefc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 18:58:34 -0400 Subject: [PATCH 24/82] fix(deps): update dependency sass to v1.92.1 (#13645) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e4ca5287f7..76040c41a6 100644 --- a/install/package.json +++ b/install/package.json @@ -128,7 +128,7 @@ "rss": "1.2.2", "rtlcss": "4.3.0", "sanitize-html": "2.17.0", - "sass": "1.91.0", + "sass": "1.92.1", "satori": "0.18.2", "sbd": "^1.0.19", "semver": "7.7.2", From 15b0b54000d237045e0d4aa2dc4c12d6ce07b7d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 18:58:44 -0400 Subject: [PATCH 25/82] chore(deps): update dependency sass-embedded to v1.92.1 (#13638) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 76040c41a6..45d058319b 100644 --- a/install/package.json +++ b/install/package.json @@ -179,7 +179,7 @@ "smtp-server": "3.14.0" }, "optionalDependencies": { - "sass-embedded": "1.91.0" + "sass-embedded": "1.92.1" }, "resolutions": { "*/jquery": "3.7.1" From eecf9dda6498c649cd2cceaa57508abf5c8fb1ee Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Fri, 12 Sep 2025 09:21:18 +0000 Subject: [PATCH 26/82] Latest translations and fallbacks --- public/language/zh-CN/admin/manage/categories.json | 4 ++-- public/language/zh-CN/admin/settings/activitypub.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 2763d4d467..8e07c202d7 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -17,8 +17,8 @@ "federatedDescription": "“联邦化”说明", "federatedDescription.help": "当其他网站/应用程序查询时,该文本将附加到版块描述中。", "federatedDescription.default": "这是一个包含专题讨论的论坛版块。您可以通过提及该版块开始新的讨论。", - "topic-template": "Topic Template", - "topic-template.help": "Define a template for new topics created in this category.", + "topic-template": "主题模板", + "topic-template.help": "为本版块下新建的主题定义模板。", "bg-color": "背景颜色", "text-color": "图标颜色", "bg-image-size": "背景图片大小", diff --git a/public/language/zh-CN/admin/settings/activitypub.json b/public/language/zh-CN/admin/settings/activitypub.json index 97703c18f8..5a0ef40eca 100644 --- a/public/language/zh-CN/admin/settings/activitypub.json +++ b/public/language/zh-CN/admin/settings/activitypub.json @@ -23,8 +23,8 @@ "rules.modal.title": "它的工作原理", "rules.modal.instructions": "所有传入的内容都会根据这些分类规则进行检查,符合规则的内容会自动移动到指定的版块目录中。

注: 已分类的内容(即位于远程版块中的内容)将不会受这些规则的影响。", "rules.add": "添加规则", - "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", - "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", + "rules.help-hashtag": "包含此不区分大小写的标签的主题将匹配。请勿输入 # 符号。", + "rules.help-user": "由输入用户创建的主题将匹配。请输入用户名或完整ID(例如:bob@example.orghttps://example.org/users/bob.", "rules.type": "类型", "rules.value": "值", "rules.cid": "版块", From 1e82af66a6f2c57f5ef971d6f1b52b7a30f74b36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Sep 2025 11:36:55 -0400 Subject: [PATCH 27/82] fix(deps): update dependency bootswatch to v5.3.8 (#13651) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 45d058319b..a10b527155 100644 --- a/install/package.json +++ b/install/package.json @@ -48,7 +48,7 @@ "body-parser": "2.2.0", "bootbox": "6.0.4", "bootstrap": "5.3.8", - "bootswatch": "5.3.7", + "bootswatch": "5.3.8", "chalk": "4.1.2", "chart.js": "4.5.0", "cli-graph": "3.2.2", From 19f391989001c228e5af04e2321525cf8daa9f0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 13 Sep 2025 20:27:47 -0400 Subject: [PATCH 28/82] fix(deps): update dependency commander to v14.0.1 (#13652) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3c9d48dc7c..c9283edddc 100644 --- a/install/package.json +++ b/install/package.json @@ -53,7 +53,7 @@ "chart.js": "4.5.0", "cli-graph": "3.2.2", "clipboard": "2.0.11", - "commander": "14.0.0", + "commander": "14.0.1", "compare-versions": "6.1.1", "compression": "1.8.1", "connect-flash": "0.1.1", From db89250982c6c67194bc08dd319831cd24fdfb6a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:09:40 -0400 Subject: [PATCH 29/82] fix(deps): update dependency @fontsource/inter to v5.2.7 (#13655) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 16279e6eb1..554a5e9c84 100644 --- a/install/package.json +++ b/install/package.json @@ -30,7 +30,7 @@ "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", "@fontsource-utils/scss": "0.2.1", - "@fontsource/inter": "5.2.6", + "@fontsource/inter": "5.2.7", "@fontsource/poppins": "5.2.6", "@fortawesome/fontawesome-free": "6.7.2", "@isaacs/ttlcache": "1.4.1", From 5f4790a48c5b30f6d0558aee2d089523b2c9fdce Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 15 Sep 2025 14:01:00 -0400 Subject: [PATCH 30/82] feat: allow activities to be addressed to as:Public or Public to be treated as public content --- src/activitypub/inbox.js | 8 ++++++-- src/activitypub/index.js | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/activitypub/inbox.js b/src/activitypub/inbox.js index 754720f208..c1caacd698 100644 --- a/src/activitypub/inbox.js +++ b/src/activitypub/inbox.js @@ -32,11 +32,15 @@ function reject(type, object, target, senderType = 'uid', id = 0) { }).catch(err => winston.error(err.stack)); } +function publiclyAddressed(recipients) { + return activitypub._constants.acceptablePublicAddresses.some(address => recipients.includes(address)); +} + inbox.create = async (req) => { const { object, actor } = req.body; // Alternative logic for non-public objects - const isPublic = [...(object.to || []), ...(object.cc || [])].includes(activitypub._constants.publicAddress); + const isPublic = publiclyAddressed([...(object.to || []), ...(object.cc || [])]); if (!isPublic) { return await activitypub.notes.assertPrivate(object); } @@ -76,7 +80,7 @@ inbox.add = async (req) => { inbox.update = async (req) => { const { actor, object } = req.body; - const isPublic = [...(object.to || []), ...(object.cc || [])].includes(activitypub._constants.publicAddress); + const isPublic = publiclyAddressed([...(object.to || []), ...(object.cc || [])]); // Origin checking const actorHostname = new URL(actor).hostname; diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 11f16322e2..167eb16d15 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -38,6 +38,7 @@ const ActivityPub = module.exports; ActivityPub._constants = Object.freeze({ uid: -2, publicAddress: 'https://www.w3.org/ns/activitystreams#Public', + acceptablePublicAddresses: ['https://www.w3.org/ns/activitystreams#Public', 'as:Public', 'Public'], acceptableTypes: [ 'application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', From b1e134b44ef09c1ce817df240c51fedf605b514c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 16 Sep 2025 19:08:10 -0400 Subject: [PATCH 31/82] pass string to isUUID --- src/controllers/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/topics.js b/src/controllers/topics.js index ae68290729..4cacc31cd9 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -26,7 +26,7 @@ topicsController.get = async function getTopic(req, res, next) { const tid = req.params.topic_id; if ( (req.params.post_index && !utils.isNumber(req.params.post_index) && req.params.post_index !== 'unread') || - (!utils.isNumber(tid) && !validator.isUUID(tid)) + (!utils.isNumber(tid) && !validator.isUUID(String(tid))) ) { return next(); } From 8324be2d796301d004c03591dbe211cc3a066a62 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 21:18:11 -0400 Subject: [PATCH 32/82] fix(deps): update dependency fs-extra to v11.3.2 (#13658) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 554a5e9c84..4820d5b910 100644 --- a/install/package.json +++ b/install/package.json @@ -72,7 +72,7 @@ "express-useragent": "1.0.15", "fetch-cookie": "3.1.0", "file-loader": "6.2.0", - "fs-extra": "11.3.1", + "fs-extra": "11.3.2", "graceful-fs": "4.2.11", "helmet": "7.2.0", "html-to-text": "9.0.5", From b845aa48be5b2fe1ff4a28eccec5ca40981718fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Sep 2025 21:26:59 -0400 Subject: [PATCH 33/82] fix(deps): update dependency nodebb-theme-harmony to v2.1.20 (#13659) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 4820d5b910..fc4bbdb424 100644 --- a/install/package.json +++ b/install/package.json @@ -106,7 +106,7 @@ "nodebb-plugin-spam-be-gone": "2.3.2", "nodebb-plugin-web-push": "0.7.5", "nodebb-rewards-essentials": "1.0.2", - "nodebb-theme-harmony": "2.1.19", + "nodebb-theme-harmony": "2.1.20", "nodebb-theme-lavender": "7.1.19", "nodebb-theme-peace": "2.2.48", "nodebb-theme-persona": "14.1.14", From b2d91dc3199b6287d466d48b0babfa8971a58b44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:41:33 -0400 Subject: [PATCH 34/82] fix(deps): update dependency satori to v0.18.3 (#13660) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index fc4bbdb424..357f9899fd 100644 --- a/install/package.json +++ b/install/package.json @@ -129,7 +129,7 @@ "rtlcss": "4.3.0", "sanitize-html": "2.17.0", "sass": "1.92.1", - "satori": "0.18.2", + "satori": "0.18.3", "sbd": "^1.0.19", "semver": "7.7.2", "serve-favicon": "2.5.1", From 3238248eecde18c1f026ede7f4b7b91267dd4fb0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 11:41:57 -0400 Subject: [PATCH 35/82] chore(deps): update dependency jsdom to v27 (#13653) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 357f9899fd..4a5848ef18 100644 --- a/install/package.json +++ b/install/package.json @@ -170,7 +170,7 @@ "grunt": "1.6.1", "grunt-contrib-watch": "1.1.0", "husky": "8.0.3", - "jsdom": "26.1.0", + "jsdom": "27.0.0", "lint-staged": "16.1.6", "mocha": "11.7.2", "mocha-lcov-reporter": "1.3.0", From c8680f300af316365f5e1a88f612fab390389d13 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:00:39 -0400 Subject: [PATCH 36/82] fix(deps): update dependency sharp to v0.34.4 (#13662) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 4a5848ef18..189557cd07 100644 --- a/install/package.json +++ b/install/package.json @@ -133,7 +133,7 @@ "sbd": "^1.0.19", "semver": "7.7.2", "serve-favicon": "2.5.1", - "sharp": "0.34.3", + "sharp": "0.34.4", "sitemap": "8.0.0", "socket.io": "4.8.1", "socket.io-client": "4.8.1", From 9b48bbd5019173c25f00514062b5a930a3940efc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 17:33:55 -0400 Subject: [PATCH 37/82] fix(deps): update dependency esbuild to v0.25.10 (#13664) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 189557cd07..d0ab4d0d34 100644 --- a/install/package.json +++ b/install/package.json @@ -66,7 +66,7 @@ "csrf-sync": "4.2.1", "daemon": "1.1.0", "diff": "8.0.2", - "esbuild": "0.25.9", + "esbuild": "0.25.10", "express": "4.21.2", "express-session": "1.18.2", "express-useragent": "1.0.15", From 559155da6389ed648461b1dc68904c22c59d0082 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 19 Sep 2025 10:34:57 -0400 Subject: [PATCH 38/82] refactor: notes.assert to add finally block, update assertPayload to update instances:lastSeen via method instead of direct db call --- src/activitypub/notes.js | 30 ++++++++---------------------- src/middleware/activitypub.js | 2 +- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 98f40dde8c..044a2f69f7 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -20,15 +20,6 @@ const utils = require('../utils'); const activitypub = module.parent.exports; const Notes = module.exports; -async function lock(value) { - const count = await db.incrObjectField('locks', value); - return count <= 1; -} - -async function unlock(value) { - await db.deleteObjectField('locks', value); -} - Notes._normalizeTags = async (tag, cid) => { const systemTags = (meta.config.systemTags || '').split(','); const maxTags = await categories.getCategoryField(cid, 'maxTags'); @@ -64,7 +55,9 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { } let id = !activitypub.helpers.isUri(input) ? input.id : input; - const lockStatus = await lock(id); + + let lockStatus = await db.incrObjectField('locks', id); + lockStatus = lockStatus <= 1; if (!lockStatus) { // unable to achieve lock, stop processing. winston.warn(`[activitypub/notes.assert] Unable to acquire lock, skipping processing of ${id}`); return null; @@ -78,7 +71,6 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { let chain; let context = await activitypub.contexts.get(uid, id); if (context.tid) { - await unlock(id); const { tid } = context; return { tid, count: 0 }; } else if (context.context) { @@ -99,7 +91,6 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { // Can't resolve — give up. if (!chain.length) { - await unlock(id); return null; } @@ -122,7 +113,6 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { if (tid && members.every(Boolean)) { // All cached, return early. activitypub.helpers.log('[notes/assert] No new notes to process.'); - await unlock(id); return { tid, count: 0 }; } @@ -196,7 +186,6 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { activitypub.helpers.log(`[activitypub/notes.assert] Not asserting ${id} as it has no relation to existing tracked content.`); } - await unlock(id); return null; } @@ -237,7 +226,6 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { unprocessed.shift(); } catch (e) { activitypub.helpers.log(`[activitypub/notes.assert] Could not post topic (${mainPost.pid}): ${e.message}`); - await unlock(id); return null; } @@ -273,16 +261,14 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { } } - await Promise.all([ - Notes.syncUserInboxes(tid, uid), - unlock(id), - ]); - + await Notes.syncUserInboxes(tid, uid); return { tid, count }; } catch (e) { - winston.warn(`[activitypub/notes.assert] Could not assert ${id} (${e.message}), releasing lock.`); - await unlock(id); + winston.warn(`[activitypub/notes.assert] Could not assert ${id} (${e.message}).`); return null; + } finally { + winston.verbose(`[activitypub/notes.assert] Releasing lock (${id})`); + await db.deleteObjectField('locks', id); } }; diff --git a/src/middleware/activitypub.js b/src/middleware/activitypub.js index 4504f83d44..45bfffa4b9 100644 --- a/src/middleware/activitypub.js +++ b/src/middleware/activitypub.js @@ -98,7 +98,7 @@ middleware.assertPayload = helpers.try(async function (req, res, next) { activitypub.helpers.log(`[middleware/activitypub] Blocked incoming activity from ${hostname}.`); return res.sendStatus(403); } - await db.sortedSetAdd('instances:lastSeen', Date.now(), hostname); + await activitypub.instances.log(hostname); // Origin checking if (typeof object !== 'string' && object.hasOwnProperty('id')) { From be9212b59fc97ecb5519efeadb803a3a77dd1486 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 19 Sep 2025 10:56:35 -0400 Subject: [PATCH 39/82] fix: update activitypubFilterList logic so that it is also checked on resolveInbox and ActivityPub.get methods, updated instances.isAllowed to no longer return a promise --- src/activitypub/index.js | 27 ++++++++++++++++++++++++++- src/activitypub/instances.js | 2 +- src/middleware/activitypub.js | 4 ++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 167eb16d15..6b51236bfa 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -152,7 +152,23 @@ ActivityPub.resolveInboxes = async (ids) => { batch: 500, }); - return Array.from(inboxes); + let inboxArr = Array.from(inboxes); + + // Filter out blocked instances + const blocked = []; + inboxArr = inboxArr.filter((inbox) => { + const { hostname } = new URL(inbox); + const allowed = ActivityPub.instances.isAllowed(hostname); + if (!allowed) { + blocked.push(inbox); + } + return allowed; + }); + if (blocked.length) { + ActivityPub.helpers.log(`[activitypub/resolveInboxes] Not delivering to blocked instances: ${blocked.join(', ')}`); + } + + return inboxArr; }; ActivityPub.getPublicKey = async (type, id) => { @@ -305,6 +321,15 @@ ActivityPub.get = async (type, id, uri, options) => { throw new Error('[[error:activitypub.not-enabled]]'); } + const { hostname } = new URL(uri); + const allowed = ActivityPub.instances.isAllowed(hostname); + if (!allowed) { + ActivityPub.helpers.log(`[activitypub/get] Not retrieving ${uri}, domain is blocked.`); + const e = new Error(`[[error:activitypub.get-failed]]`); + e.code = `ap_get_domain_blocked`; + throw e; + } + options = { cache: true, ...options, diff --git a/src/activitypub/instances.js b/src/activitypub/instances.js index 16765ea553..64502c0998 100644 --- a/src/activitypub/instances.js +++ b/src/activitypub/instances.js @@ -11,7 +11,7 @@ Instances.log = async (domain) => { Instances.getCount = async () => db.sortedSetCard('instances:lastSeen'); -Instances.isAllowed = async (domain) => { +Instances.isAllowed = (domain) => { let { activitypubFilter: type, activitypubFilterList: list } = meta.config; list = new Set(String(list).split('\n')); // eslint-disable-next-line no-bitwise diff --git a/src/middleware/activitypub.js b/src/middleware/activitypub.js index 45bfffa4b9..730b4e78af 100644 --- a/src/middleware/activitypub.js +++ b/src/middleware/activitypub.js @@ -93,12 +93,12 @@ middleware.assertPayload = helpers.try(async function (req, res, next) { // Domain check const { hostname } = new URL(actor); - const allowed = await activitypub.instances.isAllowed(hostname); + const allowed = activitypub.instances.isAllowed(hostname); if (!allowed) { activitypub.helpers.log(`[middleware/activitypub] Blocked incoming activity from ${hostname}.`); return res.sendStatus(403); } - await activitypub.instances.log(hostname); + activitypub.instances.log(hostname); // Origin checking if (typeof object !== 'string' && object.hasOwnProperty('id')) { From d122bf4a985e180e60196bdfaaa8e3bf035d1c12 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 19 Sep 2025 12:43:11 -0400 Subject: [PATCH 40/82] fix: update logic as to whether a post is served as an article or not Now, if OP is less than 500 characters, it is just federated out as a Note instead. --- src/activitypub/mocks.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/activitypub/mocks.js b/src/activitypub/mocks.js index 380823fa31..5cbd7876a7 100644 --- a/src/activitypub/mocks.js +++ b/src/activitypub/mocks.js @@ -603,7 +603,6 @@ Mocks.notes.public = async (post) => { let inReplyTo = null; let tag = null; let followersUrl; - const isMainPost = post.pid === post.topic.mainPid; let name = null; ({ titleRaw: name } = await topics.getTopicFields(post.tid, ['title'])); @@ -716,7 +715,9 @@ Mocks.notes.public = async (post) => { }); // Special handling for main posts (as:Article w/ as:Note preview) - const noteAttachment = isMainPost ? [...attachment] : null; + const plaintext = posts.sanitizePlaintext(content); + const isArticle = post.pid === post.topic.mainPid && plaintext.length > 500; + const noteAttachment = isArticle ? [...attachment] : null; const [uploads, thumbs] = await Promise.all([ posts.uploads.listWithSizes(post.pid), topics.getTopicField(post.tid, 'thumbs'), @@ -748,7 +749,7 @@ Mocks.notes.public = async (post) => { attachment = normalizeAttachment(attachment); let preview; let summary = null; - if (isMainPost) { + if (isArticle) { preview = { type: 'Note', attributedTo: `${nconf.get('url')}/uid/${post.user.uid}`, @@ -798,7 +799,7 @@ Mocks.notes.public = async (post) => { let object = { '@context': 'https://www.w3.org/ns/activitystreams', id, - type: isMainPost ? 'Article' : 'Note', + type: isArticle ? 'Article' : 'Note', to: Array.from(to), cc: Array.from(cc), inReplyTo, From 3f8ff7139fc74518ae09576e84ee8cc58a491fe7 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Sun, 21 Sep 2025 09:20:01 +0000 Subject: [PATCH 41/82] Latest translations and fallbacks --- public/language/hr/register.json | 2 +- public/language/hr/user.json | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/language/hr/register.json b/public/language/hr/register.json index 4d52f4ea15..ca8637095b 100644 --- a/public/language/hr/register.json +++ b/public/language/hr/register.json @@ -22,7 +22,7 @@ "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'd like some additional information in order to update your account…", - "interstitial.intro-new": "We'd like some additional information before we can create your account…", + "interstitial.intro-new": "Željeli bismo neke dodatne informacije prije nego što možemo kreirati vaš račun…", "interstitial.errors-found": "Please review the entered information:", "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.", diff --git a/public/language/hr/user.json b/public/language/hr/user.json index e5d7875220..f6d5802e04 100644 --- a/public/language/hr/user.json +++ b/public/language/hr/user.json @@ -225,10 +225,10 @@ "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", "consent.export-posts": "Export Posts (.csv)", "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete.", - "emailUpdate.intro": "Please enter your email address below. This forum uses your email address for scheduled digest and notifications, as well as for account recovery in the event of a lost password.", - "emailUpdate.optional": "This field is optional. You are not obligated to provide your email address, but without a validated email you will not be able to recover your account or login with your email.", - "emailUpdate.required": "This field is required.", - "emailUpdate.change-instructions": "A confirmation email will be sent to the entered email address with a unique link. Accessing that link will confirm your ownership of the email address and it will become active on your account. At any time, you are able to update your email on file from within your account page.", - "emailUpdate.password-challenge": "Please enter your password in order to verify account ownership.", - "emailUpdate.pending": "Your email address has not yet been confirmed, but an email has been sent out requesting confirmation. If you wish to invalidate that request and send a new confirmation request, please fill in the form below." + "emailUpdate.intro": "Molimo unesite svoju e-adresu u nastavku. Ovaj forum koristi vašu e-adresu za planirane sažetke i obavijesti, kao i za oporavak računa u slučaju izgubljene lozinke.", + "emailUpdate.optional": "Ovo polje je opcionalno.. Niste obavezni dati svoju e-adresu, ali bez potvrđene e-pošte nećete moći oporaviti svoj račun niti se prijaviti koristeći e-poštu.", + "emailUpdate.required": "Ovo polje je obavezno.", + "emailUpdate.change-instructions": "Na unesenu e-adresu biće poslana e-poruka za potvrdu s jedinstvenim linkom. Pristupom tom linku potvrđuje se vaše vlasništvo nad adresom e-pošte i ona će postati aktivna na vašem računu. U bilo kojem trenutku možete ažurirati e-adresu u svojoj evidenciji putem stranice svog računa.", + "emailUpdate.password-challenge": "Molimo unesite svoju lozinku kako biste potvrdili vlasništvo nad računom.", + "emailUpdate.pending": "Vaša e-adresa još nije potvrđena, ali je poslana e-poruka za potvrdu. Ako želite poništiti taj zahtjev i poslati novi zahtjev za potvrdu, molimo popunite obrazac u nastavku." } \ No newline at end of file From 218f5eabe2a29a18089dae05526c7ca8b2bfca69 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 23 Sep 2025 10:58:00 -0400 Subject: [PATCH 42/82] fix: #13668, privilege checking on topic create for remote users; was not properly checking against fediverse pseudo-user --- src/topics/create.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/topics/create.js b/src/topics/create.js index 2f41c822b1..43001a9bd3 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -89,11 +89,12 @@ module.exports = function (Topics) { Topics.post = async function (data) { data = await plugins.hooks.fire('filter:topic.post', data); const { uid } = data; + const remoteUid = !utils.isNumber(uid); const [categoryExists, canCreate, canTag, isAdmin] = await Promise.all([ parseInt(data.cid, 10) > 0 ? categories.exists(data.cid) : true, - privileges.categories.can('topics:create', data.cid, uid), - privileges.categories.can('topics:tag', data.cid, uid), + privileges.categories.can('topics:create', data.cid, remoteUid ? -2 : uid), + privileges.categories.can('topics:tag', data.cid, remoteUid ? -2 : uid), privileges.users.isAdministrator(uid), ]); From 6e84e35fc3ac3c02d5741d3255d5286b8906561c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 19:40:03 -0400 Subject: [PATCH 43/82] fix(deps): update fontsource monorepo (#13663) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/package.json b/install/package.json index b0ef7ebf50..460dbc4564 100644 --- a/install/package.json +++ b/install/package.json @@ -29,9 +29,9 @@ }, "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", - "@fontsource-utils/scss": "0.2.1", - "@fontsource/inter": "5.2.7", - "@fontsource/poppins": "5.2.6", + "@fontsource-utils/scss": "0.2.2", + "@fontsource/inter": "5.2.8", + "@fontsource/poppins": "5.2.7", "@fortawesome/fontawesome-free": "6.7.2", "@isaacs/ttlcache": "1.4.1", "@nodebb/spider-detector": "2.0.3", From 1b5804e1c9f118ebed6e88a19a3589f92840af0a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:16:28 -0400 Subject: [PATCH 44/82] fix(deps): update dependency sass to v1.93.2 (#13674) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 460dbc4564..b28334d3d5 100644 --- a/install/package.json +++ b/install/package.json @@ -128,7 +128,7 @@ "rss": "1.2.2", "rtlcss": "4.3.0", "sanitize-html": "2.17.0", - "sass": "1.92.1", + "sass": "1.93.2", "satori": "0.18.3", "sbd": "^1.0.19", "semver": "7.7.2", From df9d637c139b8c6f35bc12c688786053168daf1b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:16:38 -0400 Subject: [PATCH 45/82] chore(deps): update dependency sass-embedded to v1.93.2 (#13673) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b28334d3d5..f5a4e36c86 100644 --- a/install/package.json +++ b/install/package.json @@ -179,7 +179,7 @@ "smtp-server": "3.14.0" }, "optionalDependencies": { - "sass-embedded": "1.92.1" + "sass-embedded": "1.93.2" }, "resolutions": { "*/jquery": "3.7.1" From 00d80616d9d4c2e83c99babd55b768d3c8516bc3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:17:28 -0400 Subject: [PATCH 46/82] fix(deps): update dependency lru-cache to v11.2.2 (#13669) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f5a4e36c86..13cce76075 100644 --- a/install/package.json +++ b/install/package.json @@ -88,7 +88,7 @@ "jsonwebtoken": "9.0.2", "lodash": "4.17.21", "logrotate-stream": "0.2.9", - "lru-cache": "11.2.1", + "lru-cache": "11.2.2", "mime": "3.0.0", "mkdirp": "3.0.1", "mongodb": "6.19.0", From d0921ea5a231d39d25b43b72027acc8a32399a46 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 24 Sep 2025 09:20:40 +0000 Subject: [PATCH 47/82] Latest translations and fallbacks --- public/language/vi/admin/manage/categories.json | 4 ++-- public/language/vi/admin/settings/activitypub.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index d1e14a6e9b..efc0cee1dd 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -17,8 +17,8 @@ "federatedDescription": "Mô Tả Liên Kết", "federatedDescription.help": "Văn bản này sẽ được thêm vào mô tả danh mục khi được truy vấn bởi các trang web/ứng dụng khác.", "federatedDescription.default": "Đây là một danh mục diễn đàn có chứa thảo luận tại chỗ. Bạn có thể bắt đầu các cuộc thảo luận mới bằng cách đề cập đến thể loại này.", - "topic-template": "Topic Template", - "topic-template.help": "Define a template for new topics created in this category.", + "topic-template": "Mẫu Chủ Đề", + "topic-template.help": "Xác định mẫu cho các chủ đề mới được tạo trong danh mục này.", "bg-color": "Màu Nền", "text-color": "Màu Chữ", "bg-image-size": "Kích Thước Hình Nền", diff --git a/public/language/vi/admin/settings/activitypub.json b/public/language/vi/admin/settings/activitypub.json index d7290381d3..c1a9a54a7e 100644 --- a/public/language/vi/admin/settings/activitypub.json +++ b/public/language/vi/admin/settings/activitypub.json @@ -23,8 +23,8 @@ "rules.modal.title": "Cách nó hoạt động", "rules.modal.instructions": "Bất kỳ nội dung đến nào cũng được kiểm tra theo các quy tắc phân loại này và nội dung phù hợp được tự động chuyển sang danh mục lựa chọn.

N.B. Nội dung đã được phân loại (nghĩa là trong một danh mục từ xa) sẽ không thông qua các quy tắc này.", "rules.add": "Thêm Quy Tắc Mới", - "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", - "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", + "rules.help-hashtag": "Các chủ đề có chứa hashtag không phân biệt chữ hoa chữ thường này sẽ khớp. Không nhập ký tự #", + "rules.help-user": "Các chủ đề do người dùng đã nhập đã tạo sẽ khớp. Nhập tên người dùng hoặc ID đầy đủ (vd: bob@example.org hoặc https://example.org/users/bob.", "rules.type": "Loại", "rules.value": "Giá trị", "rules.cid": "Danh mục", From 8c553b1854a65a0df02fb36f97e8118a99b6611d Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 24 Sep 2025 10:00:57 -0400 Subject: [PATCH 48/82] fix: regression 218f5ea from via, stricter check on whether the calling user is a remote uid --- src/topics/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics/create.js b/src/topics/create.js index 43001a9bd3..8f347c736a 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -89,7 +89,7 @@ module.exports = function (Topics) { Topics.post = async function (data) { data = await plugins.hooks.fire('filter:topic.post', data); const { uid } = data; - const remoteUid = !utils.isNumber(uid); + const remoteUid = activitypub.helpers.isUri(uid); const [categoryExists, canCreate, canTag, isAdmin] = await Promise.all([ parseInt(data.cid, 10) > 0 ? categories.exists(data.cid) : true, From 175dc2090654a70add7a7cca401688da93525c63 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 24 Sep 2025 10:42:16 -0400 Subject: [PATCH 49/82] fix: #13676, bug where nested remote categories could not be removed --- src/controllers/admin/categories.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js index e6bb7aaa41..a74b362765 100644 --- a/src/controllers/admin/categories.js +++ b/src/controllers/admin/categories.js @@ -218,7 +218,9 @@ categoriesController.removeRemote = async function (req, res) { return helpers.formatApiResponse(400, res); } - await db.sortedSetRemove('cid:0:children', req.params.cid); - cache.del('cid:0:children'); + const parentCid = await categories.getCategoryField(req.params.cid, 'parentCid'); + await db.sortedSetRemove(`cid:${parentCid || 0}:children`, req.params.cid); + cache.del(`cid:${parentCid || 0}:children`); + res.sendStatus(200); }; From bd80b77a7a06cacaeb527fe8e6896af7dffb56f9 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 24 Sep 2025 11:25:20 -0400 Subject: [PATCH 50/82] feat: ability to nickname remote categories, closes #13677 --- .../en-GB/admin/manage/categories.json | 4 ++ public/src/admin/manage/categories.js | 37 +++++++++++++++++-- src/categories/data.js | 6 ++- src/controllers/admin/categories.js | 15 +++++++- src/routes/admin.js | 1 + .../partials/categories/category-rows.tpl | 2 + 6 files changed, 58 insertions(+), 7 deletions(-) diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/en-GB/admin/manage/categories.json +++ b/public/language/en-GB/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

Do you really want to purge this category \"%1\"?

Warning! All topics and posts in this category will be purged!

Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index c50edfc3df..5478beab39 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -81,7 +81,21 @@ define('admin/manage/categories', [ }); }); - $('.categories').on('click', 'a[data-action="remove"]', Categories.removeCategory); + $('.categories').on('click', 'a[data-action]', function () { + const action = this.getAttribute('data-action'); + + switch (action) { + case 'remove': { + Categories.remove.call(this); + break; + } + + case 'rename': { + Categories.rename.call(this); + break; + } + } + }); $('#toggle-collapse-all').on('click', function () { const $this = $(this); @@ -181,9 +195,24 @@ define('admin/manage/categories', [ }); }; - Categories.removeCategory = function () { - const cid = this.getAttribute('data-cid'); - api.del(`/api/admin/manage/categories/${encodeURIComponent(cid)}`).then(ajaxify.refresh); + Categories.remove = function () { + bootbox.confirm('[[admin/manage/categories:alert.confirm-remove]]', (ok) => { + if (ok) { + const cid = this.getAttribute('data-cid'); + api.del(`/api/admin/manage/categories/${encodeURIComponent(cid)}`).then(ajaxify.refresh); + } + }); + }; + + Categories.rename = function () { + bootbox.prompt({ + title: '[[admin/manage/categories:alert.rename]]', + message: '

[[admin/manage/categories:alert.rename-help]]

', + callback: (name) => { + const cid = this.getAttribute('data-cid'); + api.post(`/api/admin/manage/categories/${encodeURIComponent(cid)}/name`, { name }).then(ajaxify.refresh); + }, + }); }; Categories.create = function (payload) { diff --git a/src/categories/data.js b/src/categories/data.js index 97c7e3a0c0..dc4467ffa3 100644 --- a/src/categories/data.js +++ b/src/categories/data.js @@ -117,7 +117,7 @@ function modifyCategory(category, fields) { db.parseIntFields(category, intFields, fields); - const escapeFields = ['name', 'description', 'federatedDescription', 'color', 'bgColor', 'backgroundImage', 'imageClass', 'class', 'link']; + const escapeFields = ['name', 'nickname', 'description', 'federatedDescription', 'color', 'bgColor', 'backgroundImage', 'imageClass', 'class', 'link']; escapeFields.forEach((field) => { if (category.hasOwnProperty(field)) { category[field] = validator.escape(String(category[field] || '')); @@ -139,4 +139,8 @@ function modifyCategory(category, fields) { if (category.description) { category.descriptionParsed = category.descriptionParsed || category.description; } + + if (category.nickname) { + category.name = category.nickname; + } } diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js index a74b362765..5e503b1964 100644 --- a/src/controllers/admin/categories.js +++ b/src/controllers/admin/categories.js @@ -65,9 +65,9 @@ categoriesController.getAll = async function (req, res) { } const fields = [ - 'cid', 'name', 'icon', 'parentCid', 'disabled', 'link', + 'cid', 'name', 'nickname', 'icon', 'parentCid', 'disabled', 'link', 'order', 'color', 'bgColor', 'backgroundImage', 'imageClass', - 'subCategoriesPerPage', 'description', + 'subCategoriesPerPage', 'description', 'descriptionParsed', ]; let categoriesData = await categories.getCategoriesFields(cids, fields); ({ categories: categoriesData } = await plugins.hooks.fire('filter:admin.categories.get', { categories: categoriesData, fields: fields })); @@ -213,6 +213,17 @@ categoriesController.addRemote = async function (req, res) { res.sendStatus(200); }; +categoriesController.renameRemote = async (req, res) => { + if (utils.isNumber(req.params.cid)) { + return helpers.formatApiResponse(400, res); + } + + const { name } = req.body; + await categories.setCategoryField(req.params.cid, 'nickname', name); + + res.sendStatus(200); +}; + categoriesController.removeRemote = async function (req, res) { if (utils.isNumber(req.params.cid)) { return helpers.formatApiResponse(400, res); diff --git a/src/routes/admin.js b/src/routes/admin.js index 967746b304..5421b4d0ef 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -82,6 +82,7 @@ function apiRoutes(router, name, middleware, controllers) { router.get(`/api/${name}/analytics`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.dashboard.getAnalytics)); router.get(`/api/${name}/advanced/cache/dump`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.cache.dump)); router.post(`/api/${name}/manage/categories`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.categories.addRemote)); + router.post(`/api/${name}/manage/categories/:cid/name`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.categories.renameRemote)); router.delete(`/api/${name}/manage/categories/:cid`, middleware.ensureLoggedIn, helpers.tryRoute(controllers.admin.categories.removeRemote)); const multer = require('multer'); diff --git a/src/views/admin/partials/categories/category-rows.tpl b/src/views/admin/partials/categories/category-rows.tpl index 4cef2ae416..5ed85f9da9 100644 --- a/src/views/admin/partials/categories/category-rows.tpl +++ b/src/views/admin/partials/categories/category-rows.tpl @@ -43,6 +43,8 @@
  • [[admin/manage/categories:analytics]]
  • [[admin/manage/categories:privileges]]
  • [[admin/manage/categories:federation]]
  • + {{{ else }}} +
  • [[admin/manage/categories:rename]]
  • {{{ end }}}
  • [[admin/manage/categories:set-order]]
  • From 8730073af14a605a73c2848075472da640666591 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 24 Sep 2025 15:25:46 +0000 Subject: [PATCH 51/82] chore(i18n): fallback strings for new resources: nodebb.admin-manage-categories --- public/language/ar/admin/manage/categories.json | 4 ++++ public/language/az/admin/manage/categories.json | 4 ++++ public/language/bg/admin/manage/categories.json | 4 ++++ public/language/bn/admin/manage/categories.json | 4 ++++ public/language/cs/admin/manage/categories.json | 4 ++++ public/language/da/admin/manage/categories.json | 4 ++++ public/language/de/admin/manage/categories.json | 4 ++++ public/language/el/admin/manage/categories.json | 4 ++++ public/language/en-US/admin/manage/categories.json | 4 ++++ public/language/en-x-pirate/admin/manage/categories.json | 4 ++++ public/language/es/admin/manage/categories.json | 4 ++++ public/language/et/admin/manage/categories.json | 4 ++++ public/language/fa-IR/admin/manage/categories.json | 4 ++++ public/language/fi/admin/manage/categories.json | 4 ++++ public/language/fr/admin/manage/categories.json | 4 ++++ public/language/gl/admin/manage/categories.json | 4 ++++ public/language/he/admin/manage/categories.json | 4 ++++ public/language/hr/admin/manage/categories.json | 4 ++++ public/language/hu/admin/manage/categories.json | 4 ++++ public/language/hy/admin/manage/categories.json | 4 ++++ public/language/id/admin/manage/categories.json | 4 ++++ public/language/it/admin/manage/categories.json | 4 ++++ public/language/ja/admin/manage/categories.json | 4 ++++ public/language/ko/admin/manage/categories.json | 4 ++++ public/language/lt/admin/manage/categories.json | 4 ++++ public/language/lv/admin/manage/categories.json | 4 ++++ public/language/ms/admin/manage/categories.json | 4 ++++ public/language/nb/admin/manage/categories.json | 4 ++++ public/language/nl/admin/manage/categories.json | 4 ++++ public/language/nn-NO/admin/manage/categories.json | 4 ++++ public/language/pl/admin/manage/categories.json | 4 ++++ public/language/pt-BR/admin/manage/categories.json | 4 ++++ public/language/pt-PT/admin/manage/categories.json | 4 ++++ public/language/ro/admin/manage/categories.json | 4 ++++ public/language/ru/admin/manage/categories.json | 4 ++++ public/language/rw/admin/manage/categories.json | 4 ++++ public/language/sc/admin/manage/categories.json | 4 ++++ public/language/sk/admin/manage/categories.json | 4 ++++ public/language/sl/admin/manage/categories.json | 4 ++++ public/language/sq-AL/admin/manage/categories.json | 4 ++++ public/language/sr/admin/manage/categories.json | 4 ++++ public/language/sv/admin/manage/categories.json | 4 ++++ public/language/th/admin/manage/categories.json | 4 ++++ public/language/tr/admin/manage/categories.json | 4 ++++ public/language/uk/admin/manage/categories.json | 4 ++++ public/language/ur/admin/manage/categories.json | 4 ++++ public/language/vi/admin/manage/categories.json | 4 ++++ public/language/zh-CN/admin/manage/categories.json | 4 ++++ public/language/zh-TW/admin/manage/categories.json | 4 ++++ 49 files changed, 196 insertions(+) diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index bf68795076..6dad1fda9f 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "اعدادات القسم", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/az/admin/manage/categories.json b/public/language/az/admin/manage/categories.json index c07a127295..2badd19450 100644 --- a/public/language/az/admin/manage/categories.json +++ b/public/language/az/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Keç...", "settings": "Kateqoriya parametrləri", "edit-category": "Kateqoriyanı redaktə et", @@ -111,6 +112,9 @@ "alert.create": "Kateqoriya yarat", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Bu \"%1\" kateqoriyasını həqiqətən təmizləmək istəyirsiniz?

    Xəbərdarlıq! Bu kateqoriyadakı bütün mövzular və yazılar silinəcək!

    Kateqoriyanın təmizlənməsi bütün mövzuları və yazıları siləcək və kateqoriyanı verilənlər bazasından siləcək. Kateqoriyanı müvəqqəti olaraq silmək istəyirsinizsə, bunun əvəzinə kateqoriyanı \"deaktiv etmək\" istəyəcəksiniz.

    ", "alert.purge-success": "Kateqoriya təmizləndi!", "alert.copy-success": "Parametrlər kopyalandı!", diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index cd847e56bf..6826a56407 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Добавяне на локална категория", "add-remote-category": "Добавяне на отдалечена категория", "remove": "Премахване", + "rename": "Rename", "jump-to": "Прехвърляне към…", "settings": "Настройки на категорията", "edit-category": "Редактиране на категорията", @@ -111,6 +112,9 @@ "alert.create": "Създаване на категория", "alert.add": "Добавяне на категория", "alert.add-help": "Отдалечена категория може да бъде добавена в списъка с категории, като посочите нейния идентификатор.

    Забележка – отдалечената категория може да не отразява всички публикувани теми, освен ако поне един локален потребител не я следи/наблюдава.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Наистина ли искате да изтриете категорията „%1“?

    Внимание! Всички теми и публикации в тази категория ще бъдат изтрити!

    Изтриването на категорията ще премахне всички теми и публикации, и ще изтрие категорията от базата данни. Ако искате да премахнете категорията временно, можете просто да я „изключите“.

    ", "alert.purge-success": "Категорията е изтрита!", "alert.copy-success": "Настройките са копирани!", diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index 5277ddf50a..e2c23f4c4d 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Nastavení kategorie", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Vytvořit kategorii", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Opravdu chcete vyčistit tuto kategorii \"%1\"?

    UpozorněníVšechny témata a příspěvky v této kategorii budou smazána.

    Smazání kategorie vyjme všechny témata a příspěvky a odstraní kategorii z databáze. Pokud chcete vyjmout kategorii dočasně, raději místo toho kategorii „zakažte”.

    ", "alert.purge-success": "Kategorie byla vyčištěna.", "alert.copy-success": "Nastavení bylo zkopírováno.", diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index a491c842cc..558a24ed5e 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index ef9cf71289..388f49bbb7 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Springen zu...", "settings": "Kategorieeinstellungen", "edit-category": "Kategorie bearbeiten", @@ -111,6 +112,9 @@ "alert.create": "Erstelle eine Kategorie", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Möchtest du die Kategorie \"%1\" wirklich löschen?

    Warnung! Alle Themen und Beiträge in dieser Kategorie werden gelöscht!

    Löschen einer Kategorie wird alle Themen und Beiträge zu entfernen, und die Kategorie aus der Datenbank löschen. Falls du eine Kategorie temporär entfernen möchstest, dann kannst du sie stattdessen \"deaktivieren\".", "alert.purge-success": "Kategorie gelöscht!", "alert.copy-success": "Einstellungen kopiert!", diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index a2eb86107f..e8d5519c31 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Configuración de Categoría", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Crear una Categoría", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    ¿Realmente quieres purgar esta categoría\"%1\"?

    ¡Cuidado! ¡Todos los temas y respuestas en esta categoría serán purgados!

    Purgar una categoría eliminará todos los temas y respuestas, y borrará la categoría de la base de datos. Si quieres eliminar una categoría temporalmente, deberías \"desactivar\" esa categoría en su lugar.

    ", "alert.purge-success": "¡Categoría purgada!", "alert.copy-success": "¡Configuración Copiada!", diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index 5771d6a3fe..77970e4785 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "تنظیمات دسته‌بندی", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index e567de337b..7a7c14acb5 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Siirry...", "settings": "Kategoria-asetukset", "edit-category": "Muokkaa kategoriaa", @@ -111,6 +112,9 @@ "alert.create": "Luo kategoria.", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Kategoria poistettiin!", "alert.copy-success": "Asetukset kopioitiin!", diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index c346a8a60b..1a8fc79c00 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Aller à...", "settings": "Paramètres de la catégorie", "edit-category": "Modifier les catégories", @@ -111,6 +112,9 @@ "alert.create": "Créer une catégorie", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Voulez-vous vraiment purger cette catégorie \"%1\" ?

    Attentionc!Tous les sujets et messages dans cette catégorie vont être supprimés

    Purger une catégorie va enlever tous les sujets et messages en supprimant la catégorie de la base de données. Si vous voulez seulement enlevez une catégorietemporairement, il faut plutôt \"désactiver\" la catégorie.", "alert.purge-success": "Catégorie purgée !", "alert.copy-success": "Paramètres copiés !", diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index 5ce040d841..cae48f5b58 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "קפיצה אל...", "settings": "הגדרות קטגוריות", "edit-category": "עריכת קטגוריה", @@ -111,6 +112,9 @@ "alert.create": "יצירת קטגוריה", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    האם אתם בטוחים שאתם רוצים למחוק את קטגוריית \"%1\"?

    אזהרה! כל הנושאים והפוסטים בקטגוריה זו ימחקו!

    מחיקת קטגוריה תסיר את כל הנושאים והפוסטים ותמחק את הקטגוריה ממסד הנתונים. אם ברצונכם להסיר את הקטגוריה באופן זמני, בחרו ב\"השבתת\" הקטגוריה.

    ", "alert.purge-success": "הקטגוריה נמחקה!", "alert.copy-success": "ההגדרות הועתקו!", diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index e3dcc1ff04..8055d5c45e 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Postavke kategorije", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Napravi kategoriju", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Kategorija odbačena!", "alert.copy-success": "Postavke kopirane!", diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index 8c9378a9c9..3dab541e3a 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Kategória beállítások", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Kategória létrehozása", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Biztosan szeretnéd teljesen törölni ezt a kategóriát \"%1\"?

    Figyelem! Minden témakör és hozzászólás teljesen törlésre kerül ebben a kategóriában!

    Egy kategória teljes törlése eltávolítja a témaköröket és hozzászólásokat, valamint törli a kategóriát az adatbázisból. Amennyiben szeretnél egy kategóriát ideiglenesen törölni, használd a kategória \"kikapcsolása\" funkciót.

    ", "alert.purge-success": "Kategória törölve!", "alert.copy-success": "Beállítások másolva!", diff --git a/public/language/hy/admin/manage/categories.json b/public/language/hy/admin/manage/categories.json index b47fec23be..c69a8758aa 100644 --- a/public/language/hy/admin/manage/categories.json +++ b/public/language/hy/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Անցնել դեպի․․․", "settings": "Կատեգորիայի կարգավորումներ", "edit-category": "Խմբագրել Կատեգորիան", @@ -111,6 +112,9 @@ "alert.create": "Ստեղծել կատեգորիա", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "Վստա՞հ եք, որ ուզում եք մաքրել այս «%1» կատեգորիան: Զգուշացում: Այս կատեգորիայի բոլոր թեմաներն ու գրառումները կջնջվեն: Կատեգորիայի մաքրումը կհեռացնի բոլոր թեմաներն ու գրառումները և կջնջի կատեգորիան տվյալների բազայից: Եթե ցանկանում եք ժամանակավորապես հեռացնել կատեգորիան, փոխարենը կցանկանաք «անջատել» կատեգորիան:", "alert.purge-success": "Կատեգորիան մաքրվել է:", "alert.copy-success": "Կարգավորումները պատճենվեցին:", diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index e6abf93576..1f23efb0bf 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Aggiungi categoria locale", "add-remote-category": "Aggiungi categoria remota", "remove": "Rimuovi", + "rename": "Rename", "jump-to": "Vai a...", "settings": "Impostazioni Categoria", "edit-category": "Modifica categoria", @@ -111,6 +112,9 @@ "alert.create": "Crea una Categoria", "alert.add": "Aggiungi una categoria", "alert.add-help": "Le categorie remote possono essere aggiunte all'elenco delle categorie specificando il loro identificatore.

    Nota — La categoria remota potrebbe non riflettere tutte le discussioni pubblicate a meno che almeno un utente locale non ne tenga traccia.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Vuoi davvero eliminare definitivamente questa categoria \"%1\"?

    Attenzione!Tutte le discussioni e i post in questa categoria saranno eliminati definitivamente!

    Eliminare definitivamente una categoria rimuoverà tutte le discussioni e i post ed eliminerà la categoria dal database. Se vuoi rimuovere una categoria temporaneamente, puoi invece \"disabilitare\" la categoria.", "alert.purge-success": "Categoria eliminata definitivamente!", "alert.copy-success": "Impostazioni copiate!", diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index dbd1c2ed86..4ac0a1a088 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "カテゴリ設定", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "カテゴリを作成", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    本当にこのカテゴリ \"%1\"を切り離しますか?

    警告!このカテゴリのすべてのスレッドと投稿が削除されます。

    カテゴリをパージすると、すべてのスレッドと投稿が削除され、データベースからカテゴリが削除されます。一時的にカテゴリを削除する場合は、代わりにカテゴリを無効にすることをおすすめします。

    ", "alert.purge-success": "カテゴリが切り離されました!", "alert.copy-success": "設定をコピーしました。", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 62c37899a0..3ba1e6b434 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "이동...", "settings": "카테고리 설정", "edit-category": "카테고리 수정", @@ -111,6 +112,9 @@ "alert.create": "카테고리 만들기", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    정말로 이 카테고리 \"%1\"를 정리하시겠습니까?

    경고! 이 카테고리의 모든 토픽과 게시물을 정리합니다!

    카테고리를 정리하면 모든 토픽과 게시물이 제거되며 데이터베이스에서 카테고리가 삭제됩니다. 카테고리를 일시적으로 제거하려면 카테고리를 대신 \"비활성화\"해야 합니다.

    ", "alert.purge-success": "카테고리를 정리했습니다!", "alert.copy-success": "설정을 복사했습니다!", diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index 4746223d60..6ecfca5e1e 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Kategorijas iestatījumi", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Izveidot kategoriju", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Vai tiešām vēlies iztīrīt šo kategoriju \"%1\"?

    Brīdinājums!Visi temati un raksti šajā kategorijā tiks iztīrīti!

    Iztukšojot kategoriju, tiks noņemti visi temati un raksti un kategorija tiks izdzēsta no datu bāzes. Ja vēlies īslaicīgi noņemt kategoriju, \"atspējo\" to.

    ", "alert.purge-success": "Kategorija iztīrīta!", "alert.copy-success": "Iestatījumi kopēti!", diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index d9333c679f..ce4ba41f88 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Hopp til...", "settings": "Kategoriinnstillinger", "edit-category": "Rediger kategori", @@ -111,6 +112,9 @@ "alert.create": "Opprett en kategori", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Vil du virkelig renske kategorien \"%1\"?

    Advarsel! Alle tråder og innlegg i denne kategorien vil bli rensket!

    Rensking av en kategori vil fjerne alle tråder og innlegg, og slette kategorien fra databasen. Hvis du vil fjerne en kategori midlertidig, vil du \"deaktivere\" kategorien i stedet.

    ", "alert.purge-success": "Kategori renset!", "alert.copy-success": "Innstillinger kopiert!", diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index bdf146510e..cfad2842cb 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/nn-NO/admin/manage/categories.json b/public/language/nn-NO/admin/manage/categories.json index dad82a5ee3..e6eeb673a4 100644 --- a/public/language/nn-NO/admin/manage/categories.json +++ b/public/language/nn-NO/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Hopp til", "settings": "Innstillingar", "edit-category": "Rediger kategori", @@ -111,6 +112,9 @@ "alert.create": "Opprett kategori", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "Er du sikker på at du vil rense denne kategorien?", "alert.purge-success": "Kategorien vart rensa med suksess", "alert.copy-success": "Innstillingar kopiert med suksess", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 4e6c2f3e9f..54efd54518 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Dodaj lokalną kategorię", "add-remote-category": "Dodaj zdalną kategorię", "remove": "Usuń", + "rename": "Rename", "jump-to": "Skocz do...", "settings": "Ustawienia kategorii", "edit-category": "Edytuj kategorię", @@ -111,6 +112,9 @@ "alert.create": "Utwórz kategorię", "alert.add": "Dodaj do kategorii", "alert.add-help": "Zdalne kategorie mogą zostać przypisane do kategorii po ich wskazaniu.

    Uwaga — Zdalna kategoria może nie być w pełni wypełniona wątkami do czasu gdy jeden z lokalnych użytkowników zacznie ją śledzić/obserwować.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Czy na pewno chcesz wymazać tą kategorię \"%1\"?

    Uwaga! Wszystkie tematy oraz posty z tej kategorii zostaną wymazane!

    Wymazanie kategorii skasuje wszystkie tematy, posty oraz skasuję kategorię z bazy danych. Jeśli chcesz tymczasowousunąć kategorię, będziesz musiał \"wyłączyć\" kategorię.

    ", "alert.purge-success": "Kategoria wymazana!", "alert.copy-success": "Ustawienie skopiowane!", diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 3b41afca38..5adceac9f5 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Configurações de Categorias", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Criar uma Categoria", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Você realmente quer purgar esta categoria \"%1\"?

    Aviso! Todos os tópicos e posts desta categoria serão purgados!

    Purgar uma categoria removerá todos os tópicos e posts, e deletará a categoria do banco de dados. Se você quiser remover uma categoria temporariamente, ao invés de fazer isso nós recomendados que você \"desabilite\" a categoria.

    ", "alert.purge-success": "Categoria purgada!", "alert.copy-success": "Configurações Copiadas!", diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 3fb24317f8..38e4e941dd 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Definições da Categoria", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Criar uma Categoria", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Tens a certeza que pretendes eliminar definitivamente esta categoria \"%1\"?

    \n
    Atenção! Todos os tópicos e publicações feitas nesta categoria vão ser eliminados também!

    Eliminar uma categoria irá remover todos os tópicos e publicações e eliminar a categoria da base de dados. Se pretendes remover temporariamente uma categoria, em vez disso podes apenas \"desativar\" essa categoria.

    ", "alert.purge-success": "Categoria eliminada!", "alert.copy-success": "Definições Copiadas!", diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index 3ab043db8f..a6208e7dbe 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Настройки категории", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Создать категорию", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Вы точно хотите очистить категорию «%1»?

    Предупреждение! Все темы и сообщения в этой категории будут удалены

    Очистка категории удаляет все темы и сообщения, а также саму категорию из базы данных. Если вы хотите удалить категорию временно, вместо очистки вам нужно выбрать \"отключить\" .

    ", "alert.purge-success": "Категория очищена!", "alert.copy-success": "Настройки скопированы!", diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 34ad2e086e..2bf14fba46 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Nastavenia kategórie", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Vytvoriť kategóriu", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Naozaj chcete vyčistiť túto kategóriu „%1“?

    Upozornenie! Všetky témy a príspevky v tejto kategórií budu odstránené!

    Vyčistenie kategórií odstráni všetky témy a príspevky a odstráni kategórie z databázy. Pokiaľ chcete vyčistiť kategórie dočasne. radšej namiesto toho kategóriu „zakážte“.

    ", "alert.purge-success": "Kategória bola vyčistená!", "alert.copy-success": "Nastavenia boli skopírované!", diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index cde764efa8..8f9f4c1a2d 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Nastavitve kategorije", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Ustvari kategorijo", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Kategorija je počiščena!", "alert.copy-success": "Nastavitve so kopirane!", diff --git a/public/language/sq-AL/admin/manage/categories.json b/public/language/sq-AL/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/sq-AL/admin/manage/categories.json +++ b/public/language/sq-AL/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index 7532cd9cd1..3d1b8c68dc 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index 7287d92af4..c86a889a52 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Category Settings", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index f28cdc9cb0..57d25baac5 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "ไปที่...", "settings": "การตั้งค่าหมวดหมู่", "edit-category": "แก้ไขหมวดหมู่", @@ -111,6 +112,9 @@ "alert.create": "Create a Category", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 4bd70dc4ab..0c6ae24494 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Kategori Ayarları", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Bir Kategori Yarat", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    \"% 1\" kategorisini gerçekten temizlemek istiyor musunuz?

    Uyarı! Bu kategorideki tüm başlıklar ve iletiler temizlenir!

    Bir kategoriyi temizlemek, tüm başlıkları ve iletileri kaldıracak ve kategoriyi veritabanından silecektir. Bir kategoriyi geçici olarak kaldırmak isterseniz, kategoriyi \"devre dışı\" bırakmanız yeterlidir.

    ", "alert.purge-success": "Kategori temizlendi!", "alert.copy-success": "Ayarlar Kopyalandı!", diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index 556f750f44..a9dcdf8830 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "Налаштування категорій", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "Створити категорію", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Ви впевнені, що бажаєте стерти категорію \"%1\"?

    Увага! Всі теми та пости в цій категорії буде знищено!

    Стирання категорії видалить всі теми та пости і видалить категорію з бази данних. Якщо ви хотіли тимчасово видалити категорію, вам, натомість, варто її просто \"вимкнути\".

    ", "alert.purge-success": "Категорію стерто!", "alert.copy-success": "Налаштування скопійовано!", diff --git a/public/language/ur/admin/manage/categories.json b/public/language/ur/admin/manage/categories.json index 175a81965f..1cbb648963 100644 --- a/public/language/ur/admin/manage/categories.json +++ b/public/language/ur/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "پر جائیں…", "settings": "زمرہ کی ترتیبات", "edit-category": "زمرہ ترمیم کریں", @@ -111,6 +112,9 @@ "alert.create": "زمرہ بنائیں", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    کیا آپ واقعی زمرہ '%1' کو حذف کرنا چاہتے ہیں؟

    انتباہ! اس زمرہ کے تمام موضوعات اور پوسٹس حذف ہو جائیں گی!

    زمرہ حذف کرنے سے تمام موضوعات اور پوسٹس ہٹ جائیں گی، اور زمرہ ڈیٹا بیس سے حذف ہو جائے گا۔ اگر آپ زمرہ کو عارضی طور پر ہٹانا چاہتے ہیں، تو آپ اسے صرف 'غیر فعال' کر سکتے ہیں۔

    ", "alert.purge-success": "زمرہ حذف ہو گیا!", "alert.copy-success": "ترتیبات نقل ہو گئیں!", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index efc0cee1dd..7e79676cf6 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Thêm danh mục Cục Bộ", "add-remote-category": "Thêm danh mục Từ Xa", "remove": "Xóa", + "rename": "Rename", "jump-to": "Chuyển tới...", "settings": "Cài Đặt Chuyên Mục", "edit-category": "Sửa Danh Mục", @@ -111,6 +112,9 @@ "alert.create": "Tạo Chuyên Mục", "alert.add": "Thêm Danh Mục", "alert.add-help": "Các danh mục từ xa có thể được thêm vào danh sách danh sách bằng cách chỉ định cách xử lý của chúng.

    Ghi chú — Danh mục từ xa có thể không phản ánh tất cả các chủ đề được xuất bản trừ khi có ít nhất một người dùng cục bộ theo dõi/xem nó.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Bạn có chắc muốn loại bỏ danh mục \"%1\" này không?

    Cảnh báo! Tất cả chủ đề và bài đăng trong danh mục này sẽ bị xóa!

    Xóa danh mục sẽ xóa tất cả các chủ đề và bài đăng, đồng thời xóa danh mục khỏi cơ sở dữ liệu. Nếu bạn muốn xóa một danh mụctạm thời, thay vào đó bạn sẽ muốn \"vô hiệu hóa\" danh mục.

    ", "alert.purge-success": "Đã loại bỏ chuyên mục!", "alert.copy-success": "Đã Sao Chép Cài Đặt!", diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 8e07c202d7..0a1a96fab6 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "添加本地版块", "add-remote-category": "添加远程版块", "remove": "移除", + "rename": "Rename", "jump-to": "跳转…", "settings": "版块设置", "edit-category": "编辑版块", @@ -111,6 +112,9 @@ "alert.create": "创建一个版块", "alert.add": "添加一个版块", "alert.add-help": "可以通过指定其句柄将远程版块添加到版块列表中。

    注: — 远程版块可能无法反映所有已发布的主题,除非至少有一名本地用户关注或订阅该版块。", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    您确定要清除此版块“%1”吗?

    警告! 版块将被清除!

    清除版块将删除所有主题和帖子,并从数据库中删除版块。 如果您想暂时移除版块,请使用停用版块。

    ", "alert.purge-success": "版块已删除!", "alert.copy-success": "设置已复制!", diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index 25f495b009..daffec9006 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -4,6 +4,7 @@ "add-local-category": "Add Local category", "add-remote-category": "Add Remote category", "remove": "Remove", + "rename": "Rename", "jump-to": "Jump to...", "settings": "版面設定", "edit-category": "Edit Category", @@ -111,6 +112,9 @@ "alert.create": "建立一個版面", "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", + "alert.rename": "Rename a Remote Category", + "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    您確定要清除 “%1” 版面嗎?

    警告! 版面將被清除!

    清除版塊將刪除所有主題和帖子,並從數據庫中刪除版塊。 如果您想暫時移除版塊,請使用停用版塊。

    ", "alert.purge-success": "版面已刪除!", "alert.copy-success": "設定已複製!", From cf3964be6f7a51355e543b4e92e26b7f02b76f7a Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 24 Sep 2025 13:48:57 -0400 Subject: [PATCH 52/82] chore: fix grammatical error in language string --- public/language/en-GB/admin/manage/categories.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/en-GB/admin/manage/categories.json +++ b/public/language/en-GB/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", From 6055b345e1e55d33320e7b5690f51b6bcda23bd3 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 24 Sep 2025 17:49:25 +0000 Subject: [PATCH 53/82] chore(i18n): fallback strings for new resources: nodebb.admin-manage-categories --- public/language/ar/admin/manage/categories.json | 2 +- public/language/az/admin/manage/categories.json | 2 +- public/language/bg/admin/manage/categories.json | 8 ++++---- public/language/bn/admin/manage/categories.json | 2 +- public/language/cs/admin/manage/categories.json | 2 +- public/language/da/admin/manage/categories.json | 2 +- public/language/de/admin/manage/categories.json | 2 +- public/language/el/admin/manage/categories.json | 2 +- public/language/en-US/admin/manage/categories.json | 2 +- public/language/en-x-pirate/admin/manage/categories.json | 2 +- public/language/es/admin/manage/categories.json | 2 +- public/language/et/admin/manage/categories.json | 2 +- public/language/fa-IR/admin/manage/categories.json | 2 +- public/language/fi/admin/manage/categories.json | 2 +- public/language/fr/admin/manage/categories.json | 2 +- public/language/gl/admin/manage/categories.json | 2 +- public/language/he/admin/manage/categories.json | 2 +- public/language/hr/admin/manage/categories.json | 2 +- public/language/hu/admin/manage/categories.json | 2 +- public/language/hy/admin/manage/categories.json | 2 +- public/language/id/admin/manage/categories.json | 2 +- public/language/it/admin/manage/categories.json | 2 +- public/language/ja/admin/manage/categories.json | 2 +- public/language/ko/admin/manage/categories.json | 2 +- public/language/lt/admin/manage/categories.json | 2 +- public/language/lv/admin/manage/categories.json | 2 +- public/language/ms/admin/manage/categories.json | 2 +- public/language/nb/admin/manage/categories.json | 2 +- public/language/nl/admin/manage/categories.json | 2 +- public/language/nn-NO/admin/manage/categories.json | 2 +- public/language/pl/admin/manage/categories.json | 2 +- public/language/pt-BR/admin/manage/categories.json | 2 +- public/language/pt-PT/admin/manage/categories.json | 2 +- public/language/ro/admin/manage/categories.json | 2 +- public/language/ru/admin/manage/categories.json | 2 +- public/language/rw/admin/manage/categories.json | 2 +- public/language/sc/admin/manage/categories.json | 2 +- public/language/sk/admin/manage/categories.json | 2 +- public/language/sl/admin/manage/categories.json | 2 +- public/language/sq-AL/admin/manage/categories.json | 2 +- public/language/sr/admin/manage/categories.json | 2 +- public/language/sv/admin/manage/categories.json | 2 +- public/language/th/admin/manage/categories.json | 2 +- public/language/tr/admin/manage/categories.json | 2 +- public/language/uk/admin/manage/categories.json | 2 +- public/language/ur/admin/manage/categories.json | 2 +- public/language/vi/admin/manage/categories.json | 2 +- public/language/zh-CN/admin/manage/categories.json | 2 +- public/language/zh-TW/admin/manage/categories.json | 2 +- 49 files changed, 52 insertions(+), 52 deletions(-) diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index 6dad1fda9f..42282e425d 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/az/admin/manage/categories.json b/public/language/az/admin/manage/categories.json index 2badd19450..1fc1544231 100644 --- a/public/language/az/admin/manage/categories.json +++ b/public/language/az/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Bu \"%1\" kateqoriyasını həqiqətən təmizləmək istəyirsiniz?

    Xəbərdarlıq! Bu kateqoriyadakı bütün mövzular və yazılar silinəcək!

    Kateqoriyanın təmizlənməsi bütün mövzuları və yazıları siləcək və kateqoriyanı verilənlər bazasından siləcək. Kateqoriyanı müvəqqəti olaraq silmək istəyirsinizsə, bunun əvəzinə kateqoriyanı \"deaktiv etmək\" istəyəcəksiniz.

    ", "alert.purge-success": "Kateqoriya təmizləndi!", diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 6826a56407..f378442de1 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -4,7 +4,7 @@ "add-local-category": "Добавяне на локална категория", "add-remote-category": "Добавяне на отдалечена категория", "remove": "Премахване", - "rename": "Rename", + "rename": "Преименуване", "jump-to": "Прехвърляне към…", "settings": "Настройки на категорията", "edit-category": "Редактиране на категорията", @@ -112,9 +112,9 @@ "alert.create": "Създаване на категория", "alert.add": "Добавяне на категория", "alert.add-help": "Отдалечена категория може да бъде добавена в списъка с категории, като посочите нейния идентификатор.

    Забележка – отдалечената категория може да не отразява всички публикувани теми, освен ако поне един локален потребител не я следи/наблюдава.", - "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", - "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", + "alert.rename": "Преименуване на отдалечена категория", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", + "alert.confirm-remove": "Наистина ли искате да премахнете тази категория? Можете да я добавите отново по всяко време.", "alert.confirm-purge": "

    Наистина ли искате да изтриете категорията „%1“?

    Внимание! Всички теми и публикации в тази категория ще бъдат изтрити!

    Изтриването на категорията ще премахне всички теми и публикации, и ще изтрие категорията от базата данни. Ако искате да премахнете категорията временно, можете просто да я „изключите“.

    ", "alert.purge-success": "Категорията е изтрита!", "alert.copy-success": "Настройките са копирани!", diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index e2c23f4c4d..1623ea6e66 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Opravdu chcete vyčistit tuto kategorii \"%1\"?

    UpozorněníVšechny témata a příspěvky v této kategorii budou smazána.

    Smazání kategorie vyjme všechny témata a příspěvky a odstraní kategorii z databáze. Pokud chcete vyjmout kategorii dočasně, raději místo toho kategorii „zakažte”.

    ", "alert.purge-success": "Kategorie byla vyčištěna.", diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index 558a24ed5e..8985fc7d64 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index 388f49bbb7..968badebce 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Möchtest du die Kategorie \"%1\" wirklich löschen?

    Warnung! Alle Themen und Beiträge in dieser Kategorie werden gelöscht!

    Löschen einer Kategorie wird alle Themen und Beiträge zu entfernen, und die Kategorie aus der Datenbank löschen. Falls du eine Kategorie temporär entfernen möchstest, dann kannst du sie stattdessen \"deaktivieren\".", "alert.purge-success": "Kategorie gelöscht!", diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index e8d5519c31..5cd865c742 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    ¿Realmente quieres purgar esta categoría\"%1\"?

    ¡Cuidado! ¡Todos los temas y respuestas en esta categoría serán purgados!

    Purgar una categoría eliminará todos los temas y respuestas, y borrará la categoría de la base de datos. Si quieres eliminar una categoría temporalmente, deberías \"desactivar\" esa categoría en su lugar.

    ", "alert.purge-success": "¡Categoría purgada!", diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index 77970e4785..2f2a16a5ec 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index 7a7c14acb5..42aea3b6bb 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Kategoria poistettiin!", diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index 1a8fc79c00..fc33293483 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Voulez-vous vraiment purger cette catégorie \"%1\" ?

    Attentionc!Tous les sujets et messages dans cette catégorie vont être supprimés

    Purger une catégorie va enlever tous les sujets et messages en supprimant la catégorie de la base de données. Si vous voulez seulement enlevez une catégorietemporairement, il faut plutôt \"désactiver\" la catégorie.", "alert.purge-success": "Catégorie purgée !", diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index cae48f5b58..f52d852820 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    האם אתם בטוחים שאתם רוצים למחוק את קטגוריית \"%1\"?

    אזהרה! כל הנושאים והפוסטים בקטגוריה זו ימחקו!

    מחיקת קטגוריה תסיר את כל הנושאים והפוסטים ותמחק את הקטגוריה ממסד הנתונים. אם ברצונכם להסיר את הקטגוריה באופן זמני, בחרו ב\"השבתת\" הקטגוריה.

    ", "alert.purge-success": "הקטגוריה נמחקה!", diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index 8055d5c45e..e35b386134 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Kategorija odbačena!", diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index 3dab541e3a..92b0b26507 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Biztosan szeretnéd teljesen törölni ezt a kategóriát \"%1\"?

    Figyelem! Minden témakör és hozzászólás teljesen törlésre kerül ebben a kategóriában!

    Egy kategória teljes törlése eltávolítja a témaköröket és hozzászólásokat, valamint törli a kategóriát az adatbázisból. Amennyiben szeretnél egy kategóriát ideiglenesen törölni, használd a kategória \"kikapcsolása\" funkciót.

    ", "alert.purge-success": "Kategória törölve!", diff --git a/public/language/hy/admin/manage/categories.json b/public/language/hy/admin/manage/categories.json index c69a8758aa..8a69bcad22 100644 --- a/public/language/hy/admin/manage/categories.json +++ b/public/language/hy/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "Վստա՞հ եք, որ ուզում եք մաքրել այս «%1» կատեգորիան: Զգուշացում: Այս կատեգորիայի բոլոր թեմաներն ու գրառումները կջնջվեն: Կատեգորիայի մաքրումը կհեռացնի բոլոր թեմաներն ու գրառումները և կջնջի կատեգորիան տվյալների բազայից: Եթե ցանկանում եք ժամանակավորապես հեռացնել կատեգորիան, փոխարենը կցանկանաք «անջատել» կատեգորիան:", "alert.purge-success": "Կատեգորիան մաքրվել է:", diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index 1f23efb0bf..dd4562df02 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Aggiungi una categoria", "alert.add-help": "Le categorie remote possono essere aggiunte all'elenco delle categorie specificando il loro identificatore.

    Nota — La categoria remota potrebbe non riflettere tutte le discussioni pubblicate a meno che almeno un utente locale non ne tenga traccia.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Vuoi davvero eliminare definitivamente questa categoria \"%1\"?

    Attenzione!Tutte le discussioni e i post in questa categoria saranno eliminati definitivamente!

    Eliminare definitivamente una categoria rimuoverà tutte le discussioni e i post ed eliminerà la categoria dal database. Se vuoi rimuovere una categoria temporaneamente, puoi invece \"disabilitare\" la categoria.", "alert.purge-success": "Categoria eliminata definitivamente!", diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index 4ac0a1a088..9e2b43ca2a 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    本当にこのカテゴリ \"%1\"を切り離しますか?

    警告!このカテゴリのすべてのスレッドと投稿が削除されます。

    カテゴリをパージすると、すべてのスレッドと投稿が削除され、データベースからカテゴリが削除されます。一時的にカテゴリを削除する場合は、代わりにカテゴリを無効にすることをおすすめします。

    ", "alert.purge-success": "カテゴリが切り離されました!", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 3ba1e6b434..5d15d42604 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    정말로 이 카테고리 \"%1\"를 정리하시겠습니까?

    경고! 이 카테고리의 모든 토픽과 게시물을 정리합니다!

    카테고리를 정리하면 모든 토픽과 게시물이 제거되며 데이터베이스에서 카테고리가 삭제됩니다. 카테고리를 일시적으로 제거하려면 카테고리를 대신 \"비활성화\"해야 합니다.

    ", "alert.purge-success": "카테고리를 정리했습니다!", diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index 6ecfca5e1e..5bd9db9d4f 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Vai tiešām vēlies iztīrīt šo kategoriju \"%1\"?

    Brīdinājums!Visi temati un raksti šajā kategorijā tiks iztīrīti!

    Iztukšojot kategoriju, tiks noņemti visi temati un raksti un kategorija tiks izdzēsta no datu bāzes. Ja vēlies īslaicīgi noņemt kategoriju, \"atspējo\" to.

    ", "alert.purge-success": "Kategorija iztīrīta!", diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index ce4ba41f88..fb07c084b9 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Vil du virkelig renske kategorien \"%1\"?

    Advarsel! Alle tråder og innlegg i denne kategorien vil bli rensket!

    Rensking av en kategori vil fjerne alle tråder og innlegg, og slette kategorien fra databasen. Hvis du vil fjerne en kategori midlertidig, vil du \"deaktivere\" kategorien i stedet.

    ", "alert.purge-success": "Kategori renset!", diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index cfad2842cb..96f61da1a3 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/nn-NO/admin/manage/categories.json b/public/language/nn-NO/admin/manage/categories.json index e6eeb673a4..7d175abcf3 100644 --- a/public/language/nn-NO/admin/manage/categories.json +++ b/public/language/nn-NO/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "Er du sikker på at du vil rense denne kategorien?", "alert.purge-success": "Kategorien vart rensa med suksess", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 54efd54518..34d5839353 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Dodaj do kategorii", "alert.add-help": "Zdalne kategorie mogą zostać przypisane do kategorii po ich wskazaniu.

    Uwaga — Zdalna kategoria może nie być w pełni wypełniona wątkami do czasu gdy jeden z lokalnych użytkowników zacznie ją śledzić/obserwować.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Czy na pewno chcesz wymazać tą kategorię \"%1\"?

    Uwaga! Wszystkie tematy oraz posty z tej kategorii zostaną wymazane!

    Wymazanie kategorii skasuje wszystkie tematy, posty oraz skasuję kategorię z bazy danych. Jeśli chcesz tymczasowousunąć kategorię, będziesz musiał \"wyłączyć\" kategorię.

    ", "alert.purge-success": "Kategoria wymazana!", diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 5adceac9f5..8f8d3bc66e 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Você realmente quer purgar esta categoria \"%1\"?

    Aviso! Todos os tópicos e posts desta categoria serão purgados!

    Purgar uma categoria removerá todos os tópicos e posts, e deletará a categoria do banco de dados. Se você quiser remover uma categoria temporariamente, ao invés de fazer isso nós recomendados que você \"desabilite\" a categoria.

    ", "alert.purge-success": "Categoria purgada!", diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 38e4e941dd..7ec4c606d0 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Tens a certeza que pretendes eliminar definitivamente esta categoria \"%1\"?

    \n
    Atenção! Todos os tópicos e publicações feitas nesta categoria vão ser eliminados também!

    Eliminar uma categoria irá remover todos os tópicos e publicações e eliminar a categoria da base de dados. Se pretendes remover temporariamente uma categoria, em vez disso podes apenas \"desativar\" essa categoria.

    ", "alert.purge-success": "Categoria eliminada!", diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index a6208e7dbe..145aaebd0d 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Вы точно хотите очистить категорию «%1»?

    Предупреждение! Все темы и сообщения в этой категории будут удалены

    Очистка категории удаляет все темы и сообщения, а также саму категорию из базы данных. Если вы хотите удалить категорию временно, вместо очистки вам нужно выбрать \"отключить\" .

    ", "alert.purge-success": "Категория очищена!", diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 2bf14fba46..ead53a4cce 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Naozaj chcete vyčistiť túto kategóriu „%1“?

    Upozornenie! Všetky témy a príspevky v tejto kategórií budu odstránené!

    Vyčistenie kategórií odstráni všetky témy a príspevky a odstráni kategórie z databázy. Pokiaľ chcete vyčistiť kategórie dočasne. radšej namiesto toho kategóriu „zakážte“.

    ", "alert.purge-success": "Kategória bola vyčistená!", diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index 8f9f4c1a2d..d32877156b 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Kategorija je počiščena!", diff --git a/public/language/sq-AL/admin/manage/categories.json b/public/language/sq-AL/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/sq-AL/admin/manage/categories.json +++ b/public/language/sq-AL/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index 3d1b8c68dc..38037f7206 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index c86a889a52..0064d996e3 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index 57d25baac5..81e8ac0f4a 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Do you really want to purge this category \"%1\"?

    Warning! All topics and posts in this category will be purged!

    Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category temporarily, you'll want to \"disable\" the category instead.

    ", "alert.purge-success": "Category purged!", diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 0c6ae24494..cc0566b075 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    \"% 1\" kategorisini gerçekten temizlemek istiyor musunuz?

    Uyarı! Bu kategorideki tüm başlıklar ve iletiler temizlenir!

    Bir kategoriyi temizlemek, tüm başlıkları ve iletileri kaldıracak ve kategoriyi veritabanından silecektir. Bir kategoriyi geçici olarak kaldırmak isterseniz, kategoriyi \"devre dışı\" bırakmanız yeterlidir.

    ", "alert.purge-success": "Kategori temizlendi!", diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index a9dcdf8830..2903206195 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Ви впевнені, що бажаєте стерти категорію \"%1\"?

    Увага! Всі теми та пости в цій категорії буде знищено!

    Стирання категорії видалить всі теми та пости і видалить категорію з бази данних. Якщо ви хотіли тимчасово видалити категорію, вам, натомість, варто її просто \"вимкнути\".

    ", "alert.purge-success": "Категорію стерто!", diff --git a/public/language/ur/admin/manage/categories.json b/public/language/ur/admin/manage/categories.json index 1cbb648963..e183820111 100644 --- a/public/language/ur/admin/manage/categories.json +++ b/public/language/ur/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    کیا آپ واقعی زمرہ '%1' کو حذف کرنا چاہتے ہیں؟

    انتباہ! اس زمرہ کے تمام موضوعات اور پوسٹس حذف ہو جائیں گی!

    زمرہ حذف کرنے سے تمام موضوعات اور پوسٹس ہٹ جائیں گی، اور زمرہ ڈیٹا بیس سے حذف ہو جائے گا۔ اگر آپ زمرہ کو عارضی طور پر ہٹانا چاہتے ہیں، تو آپ اسے صرف 'غیر فعال' کر سکتے ہیں۔

    ", "alert.purge-success": "زمرہ حذف ہو گیا!", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 7e79676cf6..915e334af3 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Thêm Danh Mục", "alert.add-help": "Các danh mục từ xa có thể được thêm vào danh sách danh sách bằng cách chỉ định cách xử lý của chúng.

    Ghi chú — Danh mục từ xa có thể không phản ánh tất cả các chủ đề được xuất bản trừ khi có ít nhất một người dùng cục bộ theo dõi/xem nó.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    Bạn có chắc muốn loại bỏ danh mục \"%1\" này không?

    Cảnh báo! Tất cả chủ đề và bài đăng trong danh mục này sẽ bị xóa!

    Xóa danh mục sẽ xóa tất cả các chủ đề và bài đăng, đồng thời xóa danh mục khỏi cơ sở dữ liệu. Nếu bạn muốn xóa một danh mụctạm thời, thay vào đó bạn sẽ muốn \"vô hiệu hóa\" danh mục.

    ", "alert.purge-success": "Đã loại bỏ chuyên mục!", diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 0a1a96fab6..07c53a18aa 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "添加一个版块", "alert.add-help": "可以通过指定其句柄将远程版块添加到版块列表中。

    注: — 远程版块可能无法反映所有已发布的主题,除非至少有一名本地用户关注或订阅该版块。", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    您确定要清除此版块“%1”吗?

    警告! 版块将被清除!

    清除版块将删除所有主题和帖子,并从数据库中删除版块。 如果您想暂时移除版块,请使用停用版块。

    ", "alert.purge-success": "版块已删除!", diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index daffec9006..844fc6153a 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Add a Category", "alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.

    Note — The remote category may not reflect all topics published unless at least one local user tracks/watches it.", "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter the a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", "alert.confirm-purge": "

    您確定要清除 “%1” 版面嗎?

    警告! 版面將被清除!

    清除版塊將刪除所有主題和帖子,並從數據庫中刪除版塊。 如果您想暫時移除版塊,請使用停用版塊。

    ", "alert.purge-success": "版面已刪除!", From 2b987d09ce487bb97891c8c38d639a2e6c216537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 25 Sep 2025 02:03:14 -0400 Subject: [PATCH 54/82] perf: update old upgrade scripts to use bulkSet/Add fix a missing await --- src/upgrades/1.10.2/upgrade_bans_to_hashes.js | 34 ++++++---- src/upgrades/1.10.2/username_email_history.js | 45 +++++++------ .../1.12.1/clear_username_email_history.js | 53 ++++++---------- .../1.12.1/moderation_notes_refactor.js | 10 +-- src/upgrades/1.13.0/clean_post_topic_hash.js | 3 +- .../1.6.2/topics_lastposttime_zset.js | 35 ++++++----- src/upgrades/1.7.1/notification-settings.js | 35 ++++++++--- src/upgrades/1.7.3/topic_votes.js | 56 ++++++++++------- src/upgrades/1.8.1/diffs_zset_to_listhash.js | 63 +++++++------------ .../1.9.0/refresh_post_upload_associations.js | 19 +++--- src/upgrades/2.8.7/fix-email-sorted-sets.js | 2 +- src/upgrades/3.7.0/category-read-by-uid.js | 2 +- 12 files changed, 186 insertions(+), 171 deletions(-) diff --git a/src/upgrades/1.10.2/upgrade_bans_to_hashes.js b/src/upgrades/1.10.2/upgrade_bans_to_hashes.js index 84c7a0ed4d..2bc55b4667 100644 --- a/src/upgrades/1.10.2/upgrade_bans_to_hashes.js +++ b/src/upgrades/1.10.2/upgrade_bans_to_hashes.js @@ -11,14 +11,23 @@ module.exports = { method: async function () { const { progress } = this; + progress.total = await db.sortedSetCard('users:joindate'); + await batch.processSortedSet('users:joindate', async (uids) => { - for (const uid of uids) { - progress.incr(); - const [bans, reasons, userData] = await Promise.all([ - db.getSortedSetRevRangeWithScores(`uid:${uid}:bans`, 0, -1), - db.getSortedSetRevRangeWithScores(`banned:${uid}:reasons`, 0, -1), - db.getObjectFields(`user:${uid}`, ['banned', 'banned:expire', 'joindate', 'lastposttime', 'lastonline']), - ]); + progress.incr(uids.length); + const [allUserData, allBans] = await Promise.all([ + db.getObjectsFields( + uids.map(uid => `user:${uid}`), + ['banned', 'banned:expire', 'joindate', 'lastposttime', 'lastonline'], + ), + db.getSortedSetsMembersWithScores( + uids.map(uid => `uid:${uid}:bans`) + ), + ]); + + await Promise.all(uids.map(async (uid, index) => { + const userData = allUserData[index]; + const bans = allBans[index] || []; // has no history, but is banned, create plain object with just uid and timestmap if (!bans.length && parseInt(userData.banned, 10)) { @@ -31,6 +40,7 @@ module.exports = { const banKey = `uid:${uid}:ban:${banTimestamp}`; await addBan(uid, banKey, { uid: uid, timestamp: banTimestamp }); } else if (bans.length) { + const reasons = await db.getSortedSetRevRangeWithScores(`banned:${uid}:reasons`, 0, -1); // process ban history for (const ban of bans) { const reasonData = reasons.find(reasonData => reasonData.score === ban.score); @@ -46,14 +56,16 @@ module.exports = { await addBan(uid, banKey, data); } } - } + })); }, { - progress: this.progress, + batch: 500, }); }, }; async function addBan(uid, key, data) { - await db.setObject(key, data); - await db.sortedSetAdd(`uid:${uid}:bans:timestamp`, data.timestamp, key); + await Promise.all([ + db.setObject(key, data), + db.sortedSetAdd(`uid:${uid}:bans:timestamp`, data.timestamp, key), + ]); } diff --git a/src/upgrades/1.10.2/username_email_history.js b/src/upgrades/1.10.2/username_email_history.js index 3b03568a69..8ee4306e3d 100644 --- a/src/upgrades/1.10.2/username_email_history.js +++ b/src/upgrades/1.10.2/username_email_history.js @@ -11,27 +11,34 @@ module.exports = { method: async function () { const { progress } = this; - await batch.processSortedSet('users:joindate', async (uids) => { - async function updateHistory(uid, set, fieldName) { - const count = await db.sortedSetCard(set); - if (count <= 0) { - // User has not changed their username/email before, record original username - const userData = await user.getUserFields(uid, [fieldName, 'joindate']); - if (userData && userData.joindate && userData[fieldName]) { - await db.sortedSetAdd(set, userData.joindate, [userData[fieldName], userData.joindate].join(':')); - } - } - } + progress.total = await db.sortedSetCard('users:joindate'); - await Promise.all(uids.map(async (uid) => { - await Promise.all([ - updateHistory(uid, `user:${uid}:usernames`, 'username'), - updateHistory(uid, `user:${uid}:emails`, 'email'), - ]); - progress.incr(); - })); + await batch.processSortedSet('users:joindate', async (uids) => { + const [usernameHistory, emailHistory, userData] = await Promise.all([ + db.sortedSetsCard(uids.map(uid => `user:${uid}:usernames`)), + db.sortedSetsCard(uids.map(uid => `user:${uid}:emails`)), + user.getUsersFields(uids, ['uid', 'username', 'email', 'joindate']), + ]); + + const bulkAdd = []; + userData.forEach((data, index) => { + const thisUsernameHistory = usernameHistory[index]; + const thisEmailHistory = emailHistory[index]; + if (thisUsernameHistory <= 0 && data && data.joindate && data.username) { + bulkAdd.push([ + `user:${data.uid}:usernames`, data.joindate, [data.username, data.joindate].join(':'), + ]); + } + if (thisEmailHistory <= 0 && data && data.joindate && data.email) { + bulkAdd.push([ + `user:${data.uid}:emails`, data.joindate, [data.email, data.joindate].join(':'), + ]); + } + }); + await db.sortedSetAddBulk(bulkAdd); + progress.incr(uids.length); }, { - progress: this.progress, + batch: 500, }); }, }; diff --git a/src/upgrades/1.12.1/clear_username_email_history.js b/src/upgrades/1.12.1/clear_username_email_history.js index 822b500884..0d36534502 100644 --- a/src/upgrades/1.12.1/clear_username_email_history.js +++ b/src/upgrades/1.12.1/clear_username_email_history.js @@ -1,45 +1,32 @@ 'use strict'; -const async = require('async'); + const db = require('../../database'); const user = require('../../user'); +const batch = require('../../batch'); module.exports = { name: 'Delete username email history for deleted users', timestamp: Date.UTC(2019, 2, 25), - method: function (callback) { + method: async function () { const { progress } = this; - let currentUid = 1; - db.getObjectField('global', 'nextUid', (err, nextUid) => { - if (err) { - return callback(err); - } - progress.total = nextUid; - async.whilst((next) => { - next(null, currentUid < nextUid); - }, - (next) => { - progress.incr(); - user.exists(currentUid, (err, exists) => { - if (err) { - return next(err); - } - if (exists) { - currentUid += 1; - return next(); - } - db.deleteAll([`user:${currentUid}:usernames`, `user:${currentUid}:emails`], (err) => { - if (err) { - return next(err); - } - currentUid += 1; - next(); - }); - }); - }, - (err) => { - callback(err); - }); + + progress.total = await db.getObjectField('global', 'nextUid'); + const allUids = []; + for (let i = 1; i < progress.total; i += 1) { + allUids.push(i); + } + await batch.processArray(allUids, async (uids) => { + const exists = await user.exists(uids); + const missingUids = uids.filter((uid, index) => !exists[index]); + const keysToDelete = [ + ...missingUids.map(uid => `user:${uid}:usernames`), + ...missingUids.map(uid => `user:${uid}:emails`), + ]; + await db.deleteAll(keysToDelete); + progress.incr(uids.length); + }, { + batch: 500, }); }, }; diff --git a/src/upgrades/1.12.1/moderation_notes_refactor.js b/src/upgrades/1.12.1/moderation_notes_refactor.js index 390273d74a..85118a9a0c 100644 --- a/src/upgrades/1.12.1/moderation_notes_refactor.js +++ b/src/upgrades/1.12.1/moderation_notes_refactor.js @@ -12,10 +12,12 @@ module.exports = { const { progress } = this; await batch.processSortedSet('users:joindate', async (uids) => { - await Promise.all(uids.map(async (uid) => { - progress.incr(); - - const notes = await db.getSortedSetRevRange(`uid:${uid}:moderation:notes`, 0, -1); + progress.incr(uids.length); + const allNotes = await db.getSortedSetsMembers( + uids.map(uid => `uid:${uid}:moderation:notes`) + ); + await Promise.all(uids.map(async (uid, index) => { + const notes = allNotes[index]; for (const note of notes) { const noteData = JSON.parse(note); noteData.timestamp = noteData.timestamp || Date.now(); diff --git a/src/upgrades/1.13.0/clean_post_topic_hash.js b/src/upgrades/1.13.0/clean_post_topic_hash.js index caa6dbd8f6..20cfd78c22 100644 --- a/src/upgrades/1.13.0/clean_post_topic_hash.js +++ b/src/upgrades/1.13.0/clean_post_topic_hash.js @@ -8,6 +8,7 @@ module.exports = { timestamp: Date.UTC(2019, 9, 7), method: async function () { const { progress } = this; + progress.total = await db.sortedSetCard('posts:pid') + await db.sortedSetCard('topics:tid'); await cleanPost(progress); await cleanTopic(progress); }, @@ -51,7 +52,6 @@ async function cleanPost(progress) { })); }, { batch: 500, - progress: progress, }); } @@ -90,6 +90,5 @@ async function cleanTopic(progress) { })); }, { batch: 500, - progress: progress, }); } diff --git a/src/upgrades/1.6.2/topics_lastposttime_zset.js b/src/upgrades/1.6.2/topics_lastposttime_zset.js index 1dee9feb1a..f299b19c01 100644 --- a/src/upgrades/1.6.2/topics_lastposttime_zset.js +++ b/src/upgrades/1.6.2/topics_lastposttime_zset.js @@ -1,29 +1,30 @@ 'use strict'; -const async = require('async'); - const db = require('../../database'); +const batch = require('../../batch'); module.exports = { name: 'New sorted set cid::tids:lastposttime', timestamp: Date.UTC(2017, 9, 30), - method: function (callback) { + method: async function () { const { progress } = this; + progress.total = await db.sortedSetCard('topics:tid'); - require('../../batch').processSortedSet('topics:tid', (tids, next) => { - async.eachSeries(tids, (tid, next) => { - db.getObjectFields(`topic:${tid}`, ['cid', 'timestamp', 'lastposttime'], (err, topicData) => { - if (err || !topicData) { - return next(err); - } - progress.incr(); - - const timestamp = topicData.lastposttime || topicData.timestamp || Date.now(); - db.sortedSetAdd(`cid:${topicData.cid}:tids:lastposttime`, timestamp, tid, next); - }, next); - }, next); + await batch.processSortedSet('topics:tid', async (tids) => { + const topicData = await db.getObjectsFields( + tids.map(tid => `topic:${tid}`), ['tid', 'cid', 'timestamp', 'lastposttime'] + ); + const bulkAdd = []; + topicData.forEach((data) => { + if (data && data.cid && data.tid) { + const timestamp = data.lastposttime || data.timestamp || Date.now(); + bulkAdd.push([`cid:${data.cid}:tids:lastposttime`, timestamp, data.tid]); + } + }); + await db.sortedSetAddBulk(bulkAdd); + progress.incr(tids.length); }, { - progress: this.progress, - }, callback); + batch: 500, + }); }, }; diff --git a/src/upgrades/1.7.1/notification-settings.js b/src/upgrades/1.7.1/notification-settings.js index fed592effb..e3693d4f04 100644 --- a/src/upgrades/1.7.1/notification-settings.js +++ b/src/upgrades/1.7.1/notification-settings.js @@ -8,23 +8,38 @@ module.exports = { timestamp: Date.UTC(2017, 10, 15), method: async function () { const { progress } = this; - + progress.total = await db.sortedSetCard('users:joindate'); await batch.processSortedSet('users:joindate', async (uids) => { - await Promise.all(uids.map(async (uid) => { - progress.incr(); - const userSettings = await db.getObjectFields(`user:${uid}:settings`, ['sendChatNotifications', 'sendPostNotifications']); - if (userSettings) { + + const userSettings = await db.getObjectsFields( + uids.map(uid => `user:${uid}:settings`), + ['sendChatNotifications', 'sendPostNotifications'], + ); + + const bulkSet = []; + userSettings.forEach((settings, index) => { + const set = {}; + if (settings) { if (parseInt(userSettings.sendChatNotifications, 10) === 1) { - await db.setObjectField(`user:${uid}:settings`, 'notificationType_new-chat', 'notificationemail'); + set['notificationType_new-chat'] = 'notificationemail'; } if (parseInt(userSettings.sendPostNotifications, 10) === 1) { - await db.setObjectField(`user:${uid}:settings`, 'notificationType_new-reply', 'notificationemail'); + set['notificationType_new-reply'] = 'notificationemail'; + } + if (Object.keys(set).length) { + bulkSet.push([`user:${uids[index]}:settings`, set]); } } - await db.deleteObjectFields(`user:${uid}:settings`, ['sendChatNotifications', 'sendPostNotifications']); - })); + }); + await db.setObjectBulk(bulkSet); + + await db.deleteObjectFields( + uids.map(uid => `user:${uid}:settings`), + ['sendChatNotifications', 'sendPostNotifications'], + ); + + progress.incr(uids.length); }, { - progress: progress, batch: 500, }); }, diff --git a/src/upgrades/1.7.3/topic_votes.js b/src/upgrades/1.7.3/topic_votes.js index 008aaece0a..d5f6b9fd57 100644 --- a/src/upgrades/1.7.3/topic_votes.js +++ b/src/upgrades/1.7.3/topic_votes.js @@ -10,32 +10,42 @@ module.exports = { method: async function () { const { progress } = this; - batch.processSortedSet('topics:tid', async (tids) => { - await Promise.all(tids.map(async (tid) => { - progress.incr(); - const topicData = await db.getObjectFields(`topic:${tid}`, ['mainPid', 'cid', 'pinned']); - if (topicData.mainPid && topicData.cid) { - const postData = await db.getObject(`post:${topicData.mainPid}`); - if (postData) { - const upvotes = parseInt(postData.upvotes, 10) || 0; - const downvotes = parseInt(postData.downvotes, 10) || 0; - const data = { - upvotes: upvotes, - downvotes: downvotes, - }; - const votes = upvotes - downvotes; - await Promise.all([ - db.setObject(`topic:${tid}`, data), - db.sortedSetAdd('topics:votes', votes, tid), - ]); - if (parseInt(topicData.pinned, 10) !== 1) { - await db.sortedSetAdd(`cid:${topicData.cid}:tids:votes`, votes, tid); - } + progress.total = await db.sortedSetCard('topics:tid'); + + await batch.processSortedSet('topics:tid', async (tids) => { + const topicsData = await db.getObjectsFields( + tids.map(tid => `topic:${tid}`), + ['tid', 'mainPid', 'cid', 'pinned'], + ); + const mainPids = topicsData.map(topicData => topicData && topicData.mainPid); + const mainPosts = await db.getObjects(mainPids.map(pid => `post:${pid}`)); + + const bulkSet = []; + const bulkAdd = []; + + topicsData.forEach((topicData, index) => { + const mainPost = mainPosts[index]; + if (mainPost && topicData && topicData.cid) { + const upvotes = parseInt(mainPost.upvotes, 10) || 0; + const downvotes = parseInt(mainPost.downvotes, 10) || 0; + const data = { + upvotes: upvotes, + downvotes: downvotes, + }; + const votes = upvotes - downvotes; + bulkSet.push([`topic:${topicData.tid}`, data]); + bulkAdd.push(['topics:votes', votes, topicData.tid]); + if (parseInt(topicData.pinned, 10) !== 1) { + bulkAdd.push([`cid:${topicData.cid}:tids:votes`, votes, topicData.tid]); } } - })); + }); + + await db.setObjectBulk(bulkSet); + await db.sortedSetAddBulk('topics:votes', bulkAdd); + + progress.incr(tids.length); }, { - progress: progress, batch: 500, }); }, diff --git a/src/upgrades/1.8.1/diffs_zset_to_listhash.js b/src/upgrades/1.8.1/diffs_zset_to_listhash.js index 370242fba1..277418a79e 100644 --- a/src/upgrades/1.8.1/diffs_zset_to_listhash.js +++ b/src/upgrades/1.8.1/diffs_zset_to_listhash.js @@ -1,57 +1,40 @@ 'use strict'; -const async = require('async'); const db = require('../../database'); const batch = require('../../batch'); - module.exports = { name: 'Reformatting post diffs to be stored in lists and hash instead of single zset', timestamp: Date.UTC(2018, 2, 15), - method: function (callback) { + method: async function () { const { progress } = this; - batch.processSortedSet('posts:pid', (pids, next) => { - async.each(pids, (pid, next) => { - db.getSortedSetRangeWithScores(`post:${pid}:diffs`, 0, -1, (err, diffs) => { - if (err) { - return next(err); - } + progress.total = await db.sortedSetCard('posts:pid'); - if (!diffs || !diffs.length) { - progress.incr(); - return next(); - } + await batch.processSortedSet('posts:pid', async (pids) => { + const postDiffs = await db.getSortedSetsMembersWithScores( + pids.map(pid => `post:${pid}:diffs`), + ); - // For each diff, push to list - async.each(diffs, (diff, next) => { - async.series([ - async.apply(db.delete.bind(db), `post:${pid}:diffs`), - async.apply(db.listPrepend.bind(db), `post:${pid}:diffs`, diff.score), - async.apply(db.setObject.bind(db), `diff:${pid}.${diff.score}`, { - pid: pid, - patch: diff.value, - }), - ], next); - }, (err) => { - if (err) { - return next(err); - } + await db.deleteAll(pids.map(pid => `post:${pid}:diffs`)); - progress.incr(); - return next(); - }); - }); - }, (err) => { - if (err) { - // Probably type error, ok to incr and continue - progress.incr(); + await Promise.all(postDiffs.map(async (diffs, index) => { + if (!diffs || !diffs.length) { + return; } - - return next(); - }); + diffs.reverse(); + const pid = pids[index]; + await db.listAppend(`post:${pid}:diffs`, diffs.map(d => d.score)); + await db.setObjectBulk( + diffs.map(d => ([`diff:${pid}.${d.score}`, { + pid: pid, + patch: d.value, + }])) + ); + })); + progress.incr(pids.length); }, { - progress: progress, - }, callback); + batch: 500, + }); }, }; diff --git a/src/upgrades/1.9.0/refresh_post_upload_associations.js b/src/upgrades/1.9.0/refresh_post_upload_associations.js index 44acfc079f..6183529641 100644 --- a/src/upgrades/1.9.0/refresh_post_upload_associations.js +++ b/src/upgrades/1.9.0/refresh_post_upload_associations.js @@ -1,21 +1,20 @@ 'use strict'; -const async = require('async'); +const db = require('../../database'); const posts = require('../../posts'); +const batch = require('../../batch'); module.exports = { name: 'Refresh post-upload associations', timestamp: Date.UTC(2018, 3, 16), - method: function (callback) { + method: async function () { const { progress } = this; - - require('../../batch').processSortedSet('posts:pid', (pids, next) => { - async.each(pids, (pid, next) => { - posts.uploads.sync(pid, next); - progress.incr(); - }, next); + progress.total = await db.sortedSetCard('posts:pid'); + await batch.processSortedSet('posts:pid', async (pids) => { + await Promise.all(pids.map(pid => posts.uploads.sync(pid))); + progress.incr(pids.length); }, { - progress: this.progress, - }, callback); + batch: 500, + }); }, }; diff --git a/src/upgrades/2.8.7/fix-email-sorted-sets.js b/src/upgrades/2.8.7/fix-email-sorted-sets.js index fcab69a8f4..84919e6774 100644 --- a/src/upgrades/2.8.7/fix-email-sorted-sets.js +++ b/src/upgrades/2.8.7/fix-email-sorted-sets.js @@ -26,7 +26,7 @@ module.exports = { } // user has email but doesn't match whats stored in user hash, gh#11259 - if (userData.email && userData.email.toLowerCase() !== email.toLowerCase()) { + if (userData.email && email && String(userData.email).toLowerCase() !== email.toLowerCase()) { bulkRemove.push(['email:uid', email]); bulkRemove.push(['email:sorted', `${email.toLowerCase()}:${uid}`]); } diff --git a/src/upgrades/3.7.0/category-read-by-uid.js b/src/upgrades/3.7.0/category-read-by-uid.js index 4ef564f53a..971620613e 100644 --- a/src/upgrades/3.7.0/category-read-by-uid.js +++ b/src/upgrades/3.7.0/category-read-by-uid.js @@ -9,6 +9,7 @@ module.exports = { method: async function () { const { progress } = this; const nextCid = await db.getObjectField('global', 'nextCid'); + progress.total = nextCid; const allCids = []; for (let i = 1; i <= nextCid; i++) { allCids.push(i); @@ -18,7 +19,6 @@ module.exports = { progress.incr(cids.length); }, { batch: 500, - progress, }); }, }; From 15fdaba5f6d0e88610ae73bfcc2ecf2e3b0ad08c Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 25 Sep 2025 09:20:45 +0000 Subject: [PATCH 55/82] Latest translations and fallbacks --- public/language/bg/admin/manage/categories.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index f378442de1..ee60e90e0c 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -113,7 +113,7 @@ "alert.add": "Добавяне на категория", "alert.add-help": "Отдалечена категория може да бъде добавена в списъка с категории, като посочите нейния идентификатор.

    Забележка – отдалечената категория може да не отразява всички публикувани теми, освен ако поне един локален потребител не я следи/наблюдава.", "alert.rename": "Преименуване на отдалечена категория", - "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", + "alert.rename-help": "Въведете новото име за тази категория. Оставете празно, за да върнете оригиналното име.", "alert.confirm-remove": "Наистина ли искате да премахнете тази категория? Можете да я добавите отново по всяко време.", "alert.confirm-purge": "

    Наистина ли искате да изтриете категорията „%1“?

    Внимание! Всички теми и публикации в тази категория ще бъдат изтрити!

    Изтриването на категорията ще премахне всички теми и публикации, и ще изтрие категорията от базата данни. Ако искате да премахнете категорията временно, можете просто да я „изключите“.

    ", "alert.purge-success": "Категорията е изтрита!", From 7184507be2b769269bd6846ed85e15f021c940b4 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 25 Sep 2025 15:12:52 -0400 Subject: [PATCH 56/82] fix: #13667, record to instances:lastSeen instead of domains:lastSeen --- src/activitypub/index.js | 2 +- test/activitypub/analytics.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 6b51236bfa..459c86c8fe 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -522,7 +522,7 @@ ActivityPub.record = async ({ id, type, actor }) => { await Promise.all([ db.sortedSetAdd(`activities:datetime`, now, id), - db.sortedSetAdd('domains:lastSeen', now, hostname), + ActivityPub.instances.log(hostname), analytics.increment(['activities', `activities:byType:${type}`, `activities:byHost:${hostname}`]), ]); }; diff --git a/test/activitypub/analytics.js b/test/activitypub/analytics.js index 85c8792115..9faf50ddb0 100644 --- a/test/activitypub/analytics.js +++ b/test/activitypub/analytics.js @@ -1,7 +1,7 @@ 'use strict'; -const nconf = require('nconf'); const assert = require('assert'); +const nconf = require('nconf'); const db = require('../../src/database'); const controllers = require('../../src/controllers'); @@ -105,7 +105,7 @@ describe('Analytics', () => { it('should increment the last seen time of that domain', async () => { const id = `https://example.org/activity/${utils.generateUUID()}`; - const before = await db.sortedSetScore('domains:lastSeen', 'example.org'); + const before = await db.sortedSetScore('instances:lastSeen', 'example.org'); await controllers.activitypub.postInbox({ body: { id, @@ -118,7 +118,7 @@ describe('Analytics', () => { }, }, { sendStatus: () => {} }); - const after = await db.sortedSetScore('domains:lastSeen', 'example.org'); + const after = await db.sortedSetScore('instances:lastSeen', 'example.org'); assert(before && after); assert(before < after); From 051043b6820feecc77ea9a885aa24608252426dc Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 25 Sep 2025 15:15:24 -0400 Subject: [PATCH 57/82] doc: 'nickname' and 'descriptionParsed' use in categories controller --- public/openapi/read/admin/manage/categories.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/public/openapi/read/admin/manage/categories.yaml b/public/openapi/read/admin/manage/categories.yaml index bbf8efb8fe..c4c48b7a06 100644 --- a/public/openapi/read/admin/manage/categories.yaml +++ b/public/openapi/read/admin/manage/categories.yaml @@ -25,8 +25,14 @@ get: description: A category identifier name: type: string + nickname: + type: string + description: A custom name given to a remote category for de-duplication purposes (not available to local categories.) description: type: string + descriptionParsed: + type: string + description: A variable-length description of the category (usually displayed underneath the category name). Unlike `description`, this value here will have been run through any parsers installed on the forum (e.g. Markdown) disabled: type: number icon: From 158780870062f47e2db4be26f7a845e1f3a223fa Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 25 Sep 2025 15:18:26 -0400 Subject: [PATCH 58/82] test: short OPs create Notes again --- test/activitypub/actors.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/activitypub/actors.js b/test/activitypub/actors.js index 8c3c02e905..7fc90659a6 100644 --- a/test/activitypub/actors.js +++ b/test/activitypub/actors.js @@ -768,8 +768,8 @@ describe('Controllers', () => { assert.strictEqual(response.statusCode, 200); }); - it('should return a Article type object', () => { - assert.strictEqual(body.type, 'Article'); + it('should return a Note type object', () => { + assert.strictEqual(body.type, 'Note'); }); }); From 3bba9029320d88563986417d115d324f443e0d15 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 25 Sep 2025 15:29:10 -0400 Subject: [PATCH 59/82] test: more fixes for note vs. article --- test/activitypub/feps.js | 6 +++--- test/activitypub/notes.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/activitypub/feps.js b/test/activitypub/feps.js index 76b7d35cf6..1c97a282e8 100644 --- a/test/activitypub/feps.js +++ b/test/activitypub/feps.js @@ -63,20 +63,20 @@ describe('FEPs', () => { activitypub._sent.clear(); }); - it('should have federated out both Announce(Create(Article)) and Announce(Article)', () => { + it('should have federated out both Announce(Create(Note)) and Announce(Note)', () => { const activities = Array.from(activitypub._sent); const test1 = activities.some((activity) => { [, activity] = activity; return activity.type === 'Announce' && activity.object && activity.object.type === 'Create' && - activity.object.object && activity.object.object.type === 'Article'; + activity.object.object && activity.object.object.type === 'Note'; }); const test2 = activities.some((activity) => { [, activity] = activity; return activity.type === 'Announce' && - activity.object && activity.object.type === 'Article'; + activity.object && activity.object.type === 'Note'; }); assert(test1 && test2); diff --git a/test/activitypub/notes.js b/test/activitypub/notes.js index a00116fbb5..b43f2da49f 100644 --- a/test/activitypub/notes.js +++ b/test/activitypub/notes.js @@ -245,7 +245,7 @@ describe('Notes', () => { const { tid } = await api.topics.create({ uid }, { cid, title: utils.generateUUID(), - content: utils.generateUUID(), + content: 'Guaranteed to be more than 500 characters.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. In vel convallis felis. Phasellus porta erat a elit dignissim efficitur. Sed at sollicitudin erat, finibus sodales ante. Nunc ullamcorper, urna a pulvinar tempor, nunc risus venenatis nunc, id aliquam purus dui ut ante. Nulla sit amet risus sem. Praesent sit amet justo finibus, laoreet odio nec, varius diam. Nullam congue rhoncus lorem, eu accumsan leo aliquam sit amet. Suspendisse fringilla nec libero a tincidunt. Phasellus sapien justo, lacinia ac enim sit amet, pellentesque fermentum neque. Proin sit amet felis vitae libero aliquam pharetra at id nisi. Donec vitae mauris est. Sed hendrerit nisi et nibh auctor hendrerit. Praesent feugiat tortor a dignissim sagittis. Cras sit amet ante justo. Cras consectetur magna vitae volutpat placerat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae', }); assert(tid); From 9b00ff1e5202383d0e3e266c76f0a1f3a2bcc43f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 18:42:27 -0400 Subject: [PATCH 60/82] fix(deps): update dependency mongodb to v6.20.0 (#13665) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 13cce76075..0ab55f4641 100644 --- a/install/package.json +++ b/install/package.json @@ -91,7 +91,7 @@ "lru-cache": "11.2.2", "mime": "3.0.0", "mkdirp": "3.0.1", - "mongodb": "6.19.0", + "mongodb": "6.20.0", "morgan": "1.10.1", "mousetrap": "1.6.5", "multer": "2.0.2", From 13ce106b213bf0b614385567f2d5f53aff980887 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:01:50 -0400 Subject: [PATCH 61/82] chore(deps): update dependency lint-staged to v16.2.1 (#13672) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 0ab55f4641..62c2f75f8d 100644 --- a/install/package.json +++ b/install/package.json @@ -171,7 +171,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "8.0.3", "jsdom": "27.0.0", - "lint-staged": "16.1.6", + "lint-staged": "16.2.1", "mocha": "11.7.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From 3370c06472c84fab5d36d4d0668c7d04e9b6ab8b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:18:05 -0400 Subject: [PATCH 62/82] chore(deps): update dependency @stylistic/eslint-plugin to v5.4.0 (#13671) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 62c2f75f8d..cc1bce4433 100644 --- a/install/package.json +++ b/install/package.json @@ -164,7 +164,7 @@ "@commitlint/config-angular": "19.8.1", "coveralls": "3.1.1", "@eslint/js": "9.35.0", - "@stylistic/eslint-plugin": "5.3.1", + "@stylistic/eslint-plugin": "5.4.0", "eslint-config-nodebb": "1.1.11", "eslint-plugin-import": "2.32.0", "grunt": "1.6.1", From 8614d8258d2c2ca6cca9f5809cb21811773903c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 25 Sep 2025 19:20:17 -0400 Subject: [PATCH 63/82] test: show tids on test fail --- test/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/topics.js b/test/topics.js index eaae7d76c7..a29f0a84fc 100644 --- a/test/topics.js +++ b/test/topics.js @@ -1421,7 +1421,7 @@ describe('Topic\'s', () => { const result = await topics.post({ uid: adminUid, title: 'deleted unread', content: 'not unread', cid: categoryObj.cid }); await topics.delete(result.topicData.tid, adminUid); const unreadTids = await topics.getUnreadTids({ cid: 0, uid: uid }); - assert(!unreadTids.includes(result.topicData.tid)); + assert(!unreadTids.includes(result.topicData.tid), { unreadTids, tid: result.topicData.tid }); }); }); From 6dab3f2e6365ee10632862fab04e7b15dd469ae5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:33:52 -0400 Subject: [PATCH 64/82] chore(deps): update commitlint monorepo to v20 (#13678) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index cc1bce4433..5bfc78b537 100644 --- a/install/package.json +++ b/install/package.json @@ -160,8 +160,8 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.1.0", - "@commitlint/cli": "19.8.1", - "@commitlint/config-angular": "19.8.1", + "@commitlint/cli": "20.0.0", + "@commitlint/config-angular": "20.0.0", "coveralls": "3.1.1", "@eslint/js": "9.35.0", "@stylistic/eslint-plugin": "5.4.0", From a4d8619ba39329a0174275db6cfe2f635c637fdd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:47:24 -0400 Subject: [PATCH 65/82] chore(deps): update dependency @eslint/js to v9.36.0 (#13670) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 5bfc78b537..992d1f7c4b 100644 --- a/install/package.json +++ b/install/package.json @@ -163,7 +163,7 @@ "@commitlint/cli": "20.0.0", "@commitlint/config-angular": "20.0.0", "coveralls": "3.1.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@stylistic/eslint-plugin": "5.4.0", "eslint-config-nodebb": "1.1.11", "eslint-plugin-import": "2.32.0", From 30ca00002ac3758979641d0983060d6aad271359 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 20:49:28 -0400 Subject: [PATCH 66/82] chore(deps): update actions/download-artifact action to v5 (#13646) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a5ce6a5d56..fb2bd3ccce 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -96,7 +96,7 @@ jobs: echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV echo "CURRENT_DATE_NST=$(date +'%Y%m%d-%H%M%S' -d '-3 hours -30 minutes')" >> $GITHUB_ENV - name: Download digests - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: path: ${{ runner.temp }}/digests pattern: digests-* From d6e7e168bae945c13fb7004cacc0e590918688c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 25 Sep 2025 21:35:01 -0400 Subject: [PATCH 67/82] test: fix message --- test/topics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/topics.js b/test/topics.js index a29f0a84fc..7136280339 100644 --- a/test/topics.js +++ b/test/topics.js @@ -1421,7 +1421,7 @@ describe('Topic\'s', () => { const result = await topics.post({ uid: adminUid, title: 'deleted unread', content: 'not unread', cid: categoryObj.cid }); await topics.delete(result.topicData.tid, adminUid); const unreadTids = await topics.getUnreadTids({ cid: 0, uid: uid }); - assert(!unreadTids.includes(result.topicData.tid), { unreadTids, tid: result.topicData.tid }); + assert(!unreadTids.includes(result.topicData.tid), JSON.stringify({ unreadTids, tid: result.topicData.tid })); }); }); From 160907d0fa843279c9b9c36884fd77af8011cf01 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Fri, 26 Sep 2025 09:20:35 +0000 Subject: [PATCH 68/82] Latest translations and fallbacks --- public/language/vi/admin/manage/categories.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 915e334af3..d5775e1fe0 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -4,7 +4,7 @@ "add-local-category": "Thêm danh mục Cục Bộ", "add-remote-category": "Thêm danh mục Từ Xa", "remove": "Xóa", - "rename": "Rename", + "rename": "Đổi tên", "jump-to": "Chuyển tới...", "settings": "Cài Đặt Chuyên Mục", "edit-category": "Sửa Danh Mục", @@ -112,9 +112,9 @@ "alert.create": "Tạo Chuyên Mục", "alert.add": "Thêm Danh Mục", "alert.add-help": "Các danh mục từ xa có thể được thêm vào danh sách danh sách bằng cách chỉ định cách xử lý của chúng.

    Ghi chú — Danh mục từ xa có thể không phản ánh tất cả các chủ đề được xuất bản trừ khi có ít nhất một người dùng cục bộ theo dõi/xem nó.", - "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", - "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", + "alert.rename": "Đổi tên Danh Mục Từ Xa", + "alert.rename-help": "Nhập tên mới cho danh mục này. Để trống để khôi phục tên gốc.", + "alert.confirm-remove": "Bạn có chắc muốn xóa danh mục này? Bạn có thể thêm nó trở lại bất kỳ lúc nào.", "alert.confirm-purge": "

    Bạn có chắc muốn loại bỏ danh mục \"%1\" này không?

    Cảnh báo! Tất cả chủ đề và bài đăng trong danh mục này sẽ bị xóa!

    Xóa danh mục sẽ xóa tất cả các chủ đề và bài đăng, đồng thời xóa danh mục khỏi cơ sở dữ liệu. Nếu bạn muốn xóa một danh mụctạm thời, thay vào đó bạn sẽ muốn \"vô hiệu hóa\" danh mục.

    ", "alert.purge-success": "Đã loại bỏ chuyên mục!", "alert.copy-success": "Đã Sao Chép Cài Đặt!", From 675bec331c4fe4749fb372d2fa49a034c46ccc84 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Sat, 27 Sep 2025 09:20:16 +0000 Subject: [PATCH 69/82] Latest translations and fallbacks --- public/language/pl/admin/manage/categories.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 34d5839353..ba3cc5a058 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -4,7 +4,7 @@ "add-local-category": "Dodaj lokalną kategorię", "add-remote-category": "Dodaj zdalną kategorię", "remove": "Usuń", - "rename": "Rename", + "rename": "Przemianuj", "jump-to": "Skocz do...", "settings": "Ustawienia kategorii", "edit-category": "Edytuj kategorię", @@ -112,9 +112,9 @@ "alert.create": "Utwórz kategorię", "alert.add": "Dodaj do kategorii", "alert.add-help": "Zdalne kategorie mogą zostać przypisane do kategorii po ich wskazaniu.

    Uwaga — Zdalna kategoria może nie być w pełni wypełniona wątkami do czasu gdy jeden z lokalnych użytkowników zacznie ją śledzić/obserwować.", - "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", - "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", + "alert.rename": "Nazwij kategorię zdalną", + "alert.rename-help": "Proszę wprowadź nazwę nowej kategorii. Pozostaw puste aby przywrócić pierwotną nazwę.", + "alert.confirm-remove": "Czy chcesz usunąć tę kategorię? Możesz dodać ją ponownie w dowolnym czasie.", "alert.confirm-purge": "

    Czy na pewno chcesz wymazać tą kategorię \"%1\"?

    Uwaga! Wszystkie tematy oraz posty z tej kategorii zostaną wymazane!

    Wymazanie kategorii skasuje wszystkie tematy, posty oraz skasuję kategorię z bazy danych. Jeśli chcesz tymczasowousunąć kategorię, będziesz musiał \"wyłączyć\" kategorię.

    ", "alert.purge-success": "Kategoria wymazana!", "alert.copy-success": "Ustawienie skopiowane!", From f644974a9b49fdd6b20514e11b9a3b99f5d3193a Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Sun, 28 Sep 2025 09:20:03 +0000 Subject: [PATCH 70/82] Latest translations and fallbacks --- .../language/it/admin/manage/categories.json | 12 +++++----- public/language/it/admin/manage/users.json | 2 +- .../it/admin/settings/activitypub.json | 24 +++++++++---------- public/language/it/error.json | 6 ++--- public/language/it/topic.json | 6 ++--- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index dd4562df02..d88533b81a 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -4,7 +4,7 @@ "add-local-category": "Aggiungi categoria locale", "add-remote-category": "Aggiungi categoria remota", "remove": "Rimuovi", - "rename": "Rename", + "rename": "Rinomina", "jump-to": "Vai a...", "settings": "Impostazioni Categoria", "edit-category": "Modifica categoria", @@ -18,8 +18,8 @@ "federatedDescription": "Descrizione federazione", "federatedDescription.help": "Questo testo sarà aggiunto alla descrizione della categoria quando interrogato da altri siti web/app.", "federatedDescription.default": "Questa è una categoria del forum che contiene discussioni di attualità. Puoi iniziare nuove discussioni menzionando questa categoria.", - "topic-template": "Topic Template", - "topic-template.help": "Define a template for new topics created in this category.", + "topic-template": "Modello discussione", + "topic-template.help": "Definisci un modello per le nuove discussioni create in questa categoria.", "bg-color": "Colore sfondo", "text-color": "Colore testo", "bg-image-size": "Dimensione dell'immagine di sfondo", @@ -112,9 +112,9 @@ "alert.create": "Crea una Categoria", "alert.add": "Aggiungi una categoria", "alert.add-help": "Le categorie remote possono essere aggiunte all'elenco delle categorie specificando il loro identificatore.

    Nota — La categoria remota potrebbe non riflettere tutte le discussioni pubblicate a meno che almeno un utente locale non ne tenga traccia.", - "alert.rename": "Rename a Remote Category", - "alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.", - "alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.", + "alert.rename": "Rinomina una categoria remota", + "alert.rename-help": "Inserisci un nuovo nome per questa categoria. Lascialo vuoto per ripristinare il nome originale.", + "alert.confirm-remove": "Vuoi davvero rimuovere questa categoria? Puoi aggiungerla di nuovo in qualsiasi momento.", "alert.confirm-purge": "

    Vuoi davvero eliminare definitivamente questa categoria \"%1\"?

    Attenzione!Tutte le discussioni e i post in questa categoria saranno eliminati definitivamente!

    Eliminare definitivamente una categoria rimuoverà tutte le discussioni e i post ed eliminerà la categoria dal database. Se vuoi rimuovere una categoria temporaneamente, puoi invece \"disabilitare\" la categoria.", "alert.purge-success": "Categoria eliminata definitivamente!", "alert.copy-success": "Impostazioni copiate!", diff --git a/public/language/it/admin/manage/users.json b/public/language/it/admin/manage/users.json index 689d129570..9f6a986e84 100644 --- a/public/language/it/admin/manage/users.json +++ b/public/language/it/admin/manage/users.json @@ -59,7 +59,7 @@ "users.no-email": "(nessuna email)", "users.validated": "Convalidato", "users.not-validated": "Non convalidato", - "users.validation-pending": "In attesa di convalida", + "users.validation-pending": "Validazione in sospeso", "users.validation-expired": "Convalida scaduta", "users.ip": "IP", "users.postcount": "numero di post", diff --git a/public/language/it/admin/settings/activitypub.json b/public/language/it/admin/settings/activitypub.json index 764085b800..faaf555e92 100644 --- a/public/language/it/admin/settings/activitypub.json +++ b/public/language/it/admin/settings/activitypub.json @@ -23,22 +23,22 @@ "rules.modal.title": "Come funziona", "rules.modal.instructions": "Tutti i contenuti in arrivo sono controllati in base a queste regole di categorizzazione e i contenuti corrispondenti sono automaticamente spostati nella categoria scelta.

    N.B. Contenuti già categorizzati (ad es. in una categoria remota) non passerà attraverso queste regole.", "rules.add": "Aggiungi nuova regola", - "rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the # symbol", - "rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. bob@example.org or https://example.org/users/bob.", + "rules.help-hashtag": "Le discussioni contenenti questo hashtag senza distinzione tra maiuscole e minuscole corrisponderanno. Non inserire il simbolo #", + "rules.help-user": "Le discussioni create dall'utente inserito corrisponderanno. Inserisci un nome utente o un ID completo (ad es. bob@example.org or https://example.org/users/bob.", "rules.type": "Tipo", "rules.value": "Valore", "rules.cid": "Categoria", - "relays": "Relays", - "relays.intro": "A relay improves discovery of content to and from your NodeBB. Subscribing to a relay means content received by the relay is forwarded here, and content posted here is syndicated outward by the relay.", - "relays.warning": "Note: Relays can send larges amounts of traffic in, and may increase storage and processing costs.", - "relays.litepub": "NodeBB follows the LitePub-style relay standard. The URL you enter here should end with /actor.", - "relays.add": "Add New Relay", - "relays.relay": "Relay", - "relays.state": "State", - "relays.state-0": "Pending", - "relays.state-1": "Receiving only", - "relays.state-2": "Active", + "relays": "Relè", + "relays.intro": "Un relè migliora la scoperta dei contenuti da e verso il tuo NodeBB. Iscriversi a un relè significa che i contenuti ricevuti dal relè vengono inoltrati qui, e i contenuti pubblicati qui vengono distribuiti all'esterno dal relè.", + "relays.warning": "Nota: I relè possono inviare grandi quantità di traffico e potrebbero far aumentare i costi di archiviazione ed elaborazione.", + "relays.litepub": "NodeBB segue lo standard del relè in stile LitePub. L'URL inserito deve terminare con /actor.", + "relays.add": "Aggiungi nuovo relè", + "relays.relay": "Relè", + "relays.state": "Stato", + "relays.state-0": "In sospeso", + "relays.state-1": "Solo ricezione", + "relays.state-2": "Attivo", "server-filtering": "Filtraggio", "count": "Questo NodeBB è attualmente a conoscenza di %1 server", diff --git a/public/language/it/error.json b/public/language/it/error.json index 0fb310b196..1c4a16adf9 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -9,7 +9,7 @@ "search-requires-login": "La ricerca richiede un account! Si prega di effettuare l'accesso o registrarsi!", "goback": "Premi indietro per tornare alla pagina precedente", "invalid-cid": "ID Categoria non valido", - "invalid-tid": "ID Topic non valido", + "invalid-tid": "ID discussione non valido", "invalid-pid": "ID Post non valido", "invalid-uid": "ID Utente non valido", "invalid-mid": "ID messaggio chat non valido", @@ -145,8 +145,8 @@ "gorup-user-not-invited": "L'utente non è stato invitato a far parte di questo gruppo.", "post-already-deleted": "Questo post è già stato eliminato", "post-already-restored": "Questo post è già stato ripristinato", - "topic-already-deleted": "Questo topic è già stato eliminato", - "topic-already-restored": "Questo Topic è già stato ripristinato", + "topic-already-deleted": "Questa discussione è già stata eliminata", + "topic-already-restored": "Questa discussione è già stata ripristinata", "cant-purge-main-post": "Non puoi eliminare definitivamente il post principale, per favore elimina invece la discussione", "topic-thumbnails-are-disabled": "Le miniature della Discussione sono disabilitate.", "invalid-file": "File non valido", diff --git a/public/language/it/topic.json b/public/language/it/topic.json index bf3382d63a..35a3644c44 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -16,7 +16,7 @@ "one-reply-to-this-post": "1 Risposta", "last-reply-time": "Ultima Risposta", "reply-options": "Opzioni di risposta", - "reply-as-topic": "Topic risposta", + "reply-as-topic": "Risposta alla discussione", "guest-login-reply": "Effettua l'accesso per rispondere", "login-to-view": "Accedi per visualizzare", "edit": "Modifica", @@ -151,7 +151,7 @@ "x-posts-selected": "%1 post selezionato(i)", "x-posts-will-be-moved-to-y": "%1 post sarà(anno) spostato(i) in \"%2\"", "fork-pid-count": "%1 post selezionati", - "fork-success": "Topic Diviso con successo ! Clicca qui per andare al Topic Diviso.", + "fork-success": "Discussione divisa con successo ! Clicca qui per andare alla discussione divisa.", "delete-posts-instruction": "Clicca sui post che vuoi eliminare/eliminare definitivamente", "merge-topics-instruction": "Clicca sulle discussioni che vuoi unire o cercare", "merge-topic-list-title": "Elenco delle discussioni da unire", @@ -194,7 +194,7 @@ "most-posts": "Più Post", "most-views": "Più visualizzazioni", "stale.title": "Preferisci creare una nuova discussione?", - "stale.warning": "Il topic al quale stai rispondendo è abbastanza vecchio. Vorresti piuttosto creare un nuovo topic in riferimento a questo nella tua risposta?", + "stale.warning": "La discussione alla quale stai rispondendo è piuttosto vecchia. Vorresti invece creare una nuova discussione e fare riferimento a questa nella tua risposta?", "stale.create": "Crea una nuova discussione", "stale.reply-anyway": "Rispondi comunque a questa discussione", "link-back": "Re: [%1](%2)", From 30ba8e82476e992dcaf228c41083a68f89d28314 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Mon, 29 Sep 2025 14:04:07 +0000 Subject: [PATCH 71/82] chore: incrementing version number - v4.5.2 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index f9e5b8b0ed..ea5908ca1d 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "4.5.1", + "version": "4.5.2", "homepage": "https://www.nodebb.org", "repository": { "type": "git", @@ -201,4 +201,4 @@ "url": "https://github.com/barisusakli" } ] -} +} \ No newline at end of file From 9a596d67f34153cbd0cdaf8443fbcce7cbdee7d3 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Mon, 29 Sep 2025 14:04:08 +0000 Subject: [PATCH 72/82] chore: update changelog for v4.5.2 --- CHANGELOG.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index beaab4c40c..c35feb4d24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,75 @@ +#### v4.5.2 (2025-09-29) + +##### Chores + +* remove obsolete deprecation (52fec493) +* up persona (405d2172) +* incrementing version number - v4.5.1 (69f4b61f) +* update changelog for v4.5.1 (a9fffd7c) +* incrementing version number - v4.5.0 (f05c5d06) +* incrementing version number - v4.4.6 (074043ad) +* incrementing version number - v4.4.5 (6f106923) +* incrementing version number - v4.4.4 (d323af44) +* incrementing version number - v4.4.3 (d354c2eb) +* incrementing version number - v4.4.2 (55c510ae) +* incrementing version number - v4.4.1 (5ae79b4e) +* incrementing version number - v4.4.0 (0a75eee3) +* incrementing version number - v4.3.2 (b92b5d80) +* incrementing version number - v4.3.1 (308e6b9f) +* incrementing version number - v4.3.0 (bff291db) +* incrementing version number - v4.2.2 (17fecc24) +* incrementing version number - v4.2.1 (852a270c) +* incrementing version number - v4.2.0 (87581958) +* incrementing version number - v4.1.1 (b2afbb16) +* incrementing version number - v4.1.0 (36c80850) +* incrementing version number - v4.0.6 (4a52fb2e) +* incrementing version number - v4.0.5 (1792a62b) +* incrementing version number - v4.0.4 (b1125cce) +* incrementing version number - v4.0.3 (2b65c735) +* incrementing version number - v4.0.2 (73fe5fcf) +* incrementing version number - v4.0.1 (a461b758) +* incrementing version number - v4.0.0 (c1eaee45) + +##### New Features + +* add a term param to recent controller so it can be controller without req.query.term (9c18c6fe) +* add a new hook to override generateUrl in navigator.js (68a8db85) +* add topic templates per category, closes #13649 (0311b98e) + +##### Bug Fixes + +* skip header checking during note assertion if test runner is active (7abdfd86) +* update note assertion topic members check to simpler posts.exists check (d0c05826) +* re-jig handling of ap tag values so that only hashtags are considered (not Piefed community tags, etc.) (4d68e3fe) +* missing actor assertion on 1b12 announced upboat (f9edb13f) +* use parameterized query for key lookup (6cca55e3) +* add pre-processing step to title generation logic so sbd doesn't fall over so badly (f7c47429) +* switch to action (f7bbec7c) +* handle cases where incoming ap object tag can be a non-array (b66c30a2) +* local pids not always converted to absolute URLs on topic actor controller (f67942ca) +* #13657, fix remote category data inconsistency in `sendNotificationToPostOwner` (225bf85e) +* don't show votes on unread if rep system disabled (dfe19a98) +* if reputation is disabled hide votes on /recent (8a786c71) +* favicon path (e2dc592c) +* check brand:touchIcon for correct path (56fad0be) +* remove .auth call (f9ddbeba) +* port the try/catch for notes.assert from develop (f9688b36) +* perform Link header check on note assertion only when skipChecks is falsy (953c051c) +* make auto-categorization logic case-insensitive (527f27af) +* closes #13641, log test email sending errors server side (b3ffa007) +* pass object to.auth (290a9395) +* **deps:** bump 2factor to 7.6.0 (d1f5060f) + +##### Other Changes + +* remove unused (a6674f67) +* fix (a37521b0) + +##### Performance Improvements + +* update upgrade script to use bulk methods (0a2fa45d) +* update old upgrade scripts to use bulkSet/Add (32d0ee48) + #### v4.5.1 (2025-09-04) ##### Chores From c3df68f2ed34cca590946a19182bd29c924f5075 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 30 Sep 2025 11:05:42 -0400 Subject: [PATCH 73/82] fix: don\'t begin processing local login if the passed-in username isn't even valid --- src/controllers/authentication.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index fef6f088b6..d5a0965d7b 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -420,6 +420,10 @@ authenticationController.localLogin = async function (req, username, password, n } const userslug = slugify(username); + if (!utils.isUserNameValid(username) || !userslug) { + return next(new Error('[[error:invalid-username]]')); + } + const uid = await user.getUidByUserslug(userslug); try { const [userData, isAdminOrGlobalMod, canLoginIfBanned] = await Promise.all([ From 4776d012812f1b250fe24687c51128dc5c752ad8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Oct 2025 11:00:03 -0400 Subject: [PATCH 74/82] sec: disallow checkHeader from returning a URL from a different origin than the passed-in URL --- src/activitypub/index.js | 80 ++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 11f16322e2..1c0f4ce13d 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -565,42 +565,58 @@ ActivityPub.buildRecipients = async function (object, { pid, uid, cid }) { ActivityPub.checkHeader = async (url, timeout) => { timeout = timeout || meta.config.activitypubProbeTimeout || 2000; - const { response } = await request.head(url, { - timeout, - }); - const { headers } = response; - if (headers && headers.link) { - // Multiple link headers could be combined - const links = headers.link.split(','); - let apLink = false; - links.forEach((link) => { - let parts = link.split(';'); - const url = parts.shift().match(/<(.+)>/)[1]; - if (!url || apLink) { - return; - } - - parts = parts - .map(p => p.trim()) - .reduce((memo, cur) => { - cur = cur.split('='); - if (cur.length < 2) { - cur.push(''); - } - memo[cur[0]] = cur[1].slice(1, -1); - return memo; - }, {}); - - if (parts.rel === 'alternate' && parts.type === 'application/activity+json') { - apLink = url; - } + try { + const { hostname } = new URL(url); + const { response } = await request.head(url, { + timeout, }); + const { headers } = response; - return apLink; + // headers.link = + if (headers && headers.link) { + // Multiple link headers could be combined + const links = headers.link.split(','); + let apLink = false; + + links.forEach((link) => { + let parts = link.split(';'); + const url = parts.shift().match(/<(.+)>/)[1]; + if (!url || apLink) { + return; + } + + parts = parts + .map(p => p.trim()) + .reduce((memo, cur) => { + cur = cur.split('='); + if (cur.length < 2) { + cur.push(''); + } + memo[cur[0]] = cur[1].slice(1, -1); + return memo; + }, {}); + + if (parts.rel === 'alternate' && parts.type === 'application/activity+json') { + apLink = url; + } + }); + + if (apLink) { + const { hostname: compare } = new URL(apLink); + if (hostname !== compare) { + apLink = false; + } + } + + return apLink; + } + + return false; + } catch (e) { + ActivityPub.helpers.log(`[activitypub/checkHeader] Failed on ${url}: ${e.message}`); + return false; } - - return false; }; ActivityPub.probe = async ({ uid, url }) => { From 17dba0b0385e1156f413ed929a05a4051e559b83 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:12:42 -0400 Subject: [PATCH 75/82] fix(deps): update dependency webpack to v5.102.0 (#13683) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 992d1f7c4b..77966f994c 100644 --- a/install/package.json +++ b/install/package.json @@ -149,7 +149,7 @@ "tough-cookie": "6.0.0", "undici": "^7.10.0", "validator": "13.15.15", - "webpack": "5.101.3", + "webpack": "5.102.0", "webpack-merge": "6.0.1", "winston": "3.17.0", "workerpool": "9.3.4", From d7e93a5d757853f9e9d847e0b458545b9344cabf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:31:16 -0400 Subject: [PATCH 76/82] chore(deps): update dependency lint-staged to v16.2.3 (#13681) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 77966f994c..a609ed462d 100644 --- a/install/package.json +++ b/install/package.json @@ -171,7 +171,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "8.0.3", "jsdom": "27.0.0", - "lint-staged": "16.2.1", + "lint-staged": "16.2.3", "mocha": "11.7.2", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From 954e7bc8e3034baaa159366c55482c42155809f3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Oct 2025 11:43:23 -0400 Subject: [PATCH 77/82] fix: update outgoing page to match 404 design --- src/controllers/index.js | 1 + src/views/outgoing.tpl | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 879774c17f..831619fc9e 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -8,6 +8,7 @@ const user = require('../user'); const plugins = require('../plugins'); const privilegesHelpers = require('../privileges/helpers'); const helpers = require('./helpers'); +const { secureRandom } = require('../utils'); const Controllers = module.exports; diff --git a/src/views/outgoing.tpl b/src/views/outgoing.tpl index 5f5b45a77d..8d52b1d3b3 100644 --- a/src/views/outgoing.tpl +++ b/src/views/outgoing.tpl @@ -1,7 +1,16 @@ -

    -

    - [[notifications:outgoing-link-message, {title}]] -

    - [[notifications:continue-to, {outgoing}]] - [[notifications:return-to, {title}]] -
    +
    +

    [[notifications:outgoing-link-message, {title}]]

    + + +
    \ No newline at end of file From 9cee799937c369acb300c37e702a7779f8e80f9f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Oct 2025 11:53:57 -0400 Subject: [PATCH 78/82] fix: force outgoing page on direct access to `/ap` handler --- src/controllers/activitypub/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/controllers/activitypub/index.js b/src/controllers/activitypub/index.js index 121c8536aa..c64ef9ef57 100644 --- a/src/controllers/activitypub/index.js +++ b/src/controllers/activitypub/index.js @@ -48,6 +48,11 @@ Controller.fetch = async (req, res, next) => { } } + // Force outgoing links page on direct access + if (!res.locals.isAPI) { + url = new URL(`outgoing?url=${encodeURIComponent(url.href)}`, nconf.get('url')); + } + helpers.redirect(res, url.href, false); } catch (e) { if (!url || !url.href) { From 675178aca4ed41f70c7be069526214a5a8fb300f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Oct 2025 12:13:57 -0400 Subject: [PATCH 79/82] fix: allow quote-inline class in mocks sanitizer so quote-post fallback elements can be detected and removed during title generation, fixes #13688 --- src/activitypub/mocks.js | 1 + src/activitypub/notes.js | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/activitypub/mocks.js b/src/activitypub/mocks.js index 5cbd7876a7..a88fed09dc 100644 --- a/src/activitypub/mocks.js +++ b/src/activitypub/mocks.js @@ -33,6 +33,7 @@ const sanitizeConfig = { allowedTags: sanitize.defaults.allowedTags.concat(['img', 'picture', 'source']), allowedClasses: { '*': [], + 'p': ['quote-inline'], }, allowedAttributes: { a: ['href', 'rel'], diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 1418e412ec..c7e7b332c3 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -156,7 +156,10 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { // mainPid ok to leave as-is if (!title) { - const prettified = pretty(content || sourceContent); + let prettified = pretty(content || sourceContent); + + // Remove any lines that contain quote-post fallbacks + prettified = prettified.split('\n').filter(line => !line.startsWith('

    Date: Wed, 1 Oct 2025 12:15:07 -0400 Subject: [PATCH 80/82] chore: remove unneeded secureRandom require --- src/controllers/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 831619fc9e..879774c17f 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -8,7 +8,6 @@ const user = require('../user'); const plugins = require('../plugins'); const privilegesHelpers = require('../privileges/helpers'); const helpers = require('./helpers'); -const { secureRandom } = require('../utils'); const Controllers = module.exports; From 56a9336611cc19788686c63b5d2768e37859fd9e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Oct 2025 12:52:09 -0400 Subject: [PATCH 81/82] docs: update openapi schema to refer to try.nodebb.org instead of example.org --- public/openapi/read/ap.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/openapi/read/ap.yaml b/public/openapi/read/ap.yaml index 0704cc6dab..89bee103c5 100644 --- a/public/openapi/read/ap.yaml +++ b/public/openapi/read/ap.yaml @@ -14,8 +14,8 @@ get: name: resource schema: type: string - description: A URL to query for potential ActivityPub resource - example: 'https://example.org/ap' + description: A URL-encoded address to query for potential ActivityPub resource + example: 'https://try.nodebb.org/uid/1' responses: "200": description: Sent if the `/api` prefix is used. The `X-Redirect` header is sent with the redirection target. @@ -24,7 +24,7 @@ get: schema: type: string "307": - description: Redirect the user to the local representation or original URL. + description: Redirect the user to the local representation or /outgoing interstitial page for original URL. headers: Location: schema: From 5ed19ef8a9372453a89c73140d10944bc46090a1 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 1 Oct 2025 13:51:04 -0400 Subject: [PATCH 82/82] fix: login handler to handle if non-confirmed email is entered --- src/controllers/authentication.js | 2 ++ test/authentication.js | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index d5a0965d7b..581f7d931c 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -262,6 +262,8 @@ authenticationController.login = async (req, res, next) => { const username = await user.getUsernameByEmail(req.body.username); if (username !== '[[global:guest]]') { req.body.username = username; + } else { + return errorHandler(req, res, '[[error:invalid-email]]', 400); } } if (isEmailLogin || isUsernameLogin) { diff --git a/test/authentication.js b/test/authentication.js index 193d617435..4f72a9a705 100644 --- a/test/authentication.js +++ b/test/authentication.js @@ -5,8 +5,8 @@ const assert = require('assert'); const url = require('url'); const nconf = require('nconf'); -const request = require('../src/request'); const db = require('./mocks/databasemock'); +const request = require('../src/request'); const user = require('../src/user'); const utils = require('../src/utils'); const meta = require('../src/meta'); @@ -52,8 +52,8 @@ describe('authentication', () => { meta.config.allowLoginWith = 'username-email'; const uid = await user.create({ username: '2nduser', password: '2ndpassword', email: '2nduser@nodebb.org' }); const { response, body } = await helpers.loginUser('2nduser@nodebb.org', '2ndpassword'); - assert.strictEqual(response.statusCode, 403); - assert.strictEqual(body, '[[error:invalid-login-credentials]]'); + assert.strictEqual(response.statusCode, 400); + assert.strictEqual(body, '[[error:invalid-email]]'); meta.config.allowLoginWith = oldValue; });