From 3aae92341cf33d4a56bdcc144df3a7c05ba9872a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 2 Apr 2024 11:32:41 -0400 Subject: [PATCH 01/80] fix: change digest to use posts sorting first to use the new popular ranking algo. also fixes empty digests if there are no new topics created in the past 24 hours but there are topics with posts --- src/user/digest.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/user/digest.js b/src/user/digest.js index b07f54d1c3..61f4b2f12f 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -183,20 +183,23 @@ async function getTermTopics(term, uid) { start: 0, stop: 199, term: term, - sort: 'votes', + sort: 'posts', teaserPost: 'first', }); data.topics = data.topics.filter(topic => topic && !topic.deleted); - const top = data.topics.filter(t => t.votes > 0).slice(0, 10); - const topTids = top.map(t => t.tid); - const popular = data.topics - .filter(t => t.postcount > 1 && !topTids.includes(t.tid)) + .filter(t => t.postcount > 1) .sort((a, b) => b.postcount - a.postcount) .slice(0, 10); const popularTids = popular.map(t => t.tid); + const top = data.topics + .filter(t => t.votes > 0 && !popularTids.includes(t.tid)) + .sort((a, b) => b.votes - a.votes) + .slice(0, 10); + const topTids = top.map(t => t.tid); + const recent = data.topics .filter(t => !topTids.includes(t.tid) && !popularTids.includes(t.tid)) .sort((a, b) => b.lastposttime - a.lastposttime) From ab95b606970e6f2b05b183b2969d345a870af59f Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 3 Apr 2024 13:59:29 +0000 Subject: [PATCH 02/80] chore: incrementing version number - v3.7.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ff40e5decb..eedae6903e 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "3.7.2", + "version": "3.7.3", "homepage": "https://www.nodebb.org", "repository": { "type": "git", From 8d450eea6ab8d1e248d90de09d52f6d2727133b4 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 3 Apr 2024 13:59:29 +0000 Subject: [PATCH 03/80] chore: update changelog for v3.7.3 --- CHANGELOG.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e41c2eec9e..9dde4f436a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,57 @@ +#### v3.7.3 (2024-04-03) + +##### Chores + +* up ntfy (0058ca68) +* incrementing version number - v3.7.2 (cc257e7e) +* update changelog for v3.7.2 (277e1787) +* incrementing version number - v3.7.1 (712365a5) +* incrementing version number - v3.7.0 (9a6153d7) +* incrementing version number - v3.6.7 (86a17e38) +* incrementing version number - v3.6.6 (6604bf37) +* incrementing version number - v3.6.5 (6c653625) +* incrementing version number - v3.6.4 (83d131b4) +* incrementing version number - v3.6.3 (fc7d2bfd) +* incrementing version number - v3.6.2 (0f577a57) +* incrementing version number - v3.6.1 (f1a69468) +* incrementing version number - v3.6.0 (4cdf85f8) +* incrementing version number - v3.5.3 (ed0e8783) +* incrementing version number - v3.5.2 (52fbb2da) +* incrementing version number - v3.5.1 (4c543488) +* incrementing version number - v3.5.0 (d06fb4f0) +* incrementing version number - v3.4.3 (5c984250) +* incrementing version number - v3.4.2 (3f0dac38) +* incrementing version number - v3.4.1 (01e69574) +* incrementing version number - v3.4.0 (fd9247c5) +* incrementing version number - v3.3.9 (5805e770) +* incrementing version number - v3.3.8 (a5603565) +* incrementing version number - v3.3.7 (b26f1744) +* incrementing version number - v3.3.6 (7fb38792) +* incrementing version number - v3.3.4 (a67f84ea) +* incrementing version number - v3.3.3 (f94d239b) +* incrementing version number - v3.3.2 (ec9dac97) +* incrementing version number - v3.3.1 (151cc68f) +* incrementing version number - v3.3.0 (fc1ad70f) +* incrementing version number - v3.2.3 (b06d3e63) +* incrementing version number - v3.2.2 (758ecfcd) +* incrementing version number - v3.2.1 (20145074) +* incrementing version number - v3.2.0 (9ecac38e) +* incrementing version number - v3.1.7 (0b4e81ab) +* incrementing version number - v3.1.6 (b3a3b130) +* incrementing version number - v3.1.5 (ec19343a) +* incrementing version number - v3.1.4 (2452783c) +* incrementing version number - v3.1.3 (3b4e9d3f) +* incrementing version number - v3.1.2 (40fa3489) +* incrementing version number - v3.1.1 (40250733) +* incrementing version number - v3.1.0 (0cb386bd) +* incrementing version number - v3.0.1 (26f6ea49) +* incrementing version number - v3.0.0 (224e08cd) + +##### Bug Fixes + +* change digest to use posts sorting first (3aae9234) +* #12452, fix admin/mod image change (c206ccdd) + #### v3.7.2 (2024-03-27) ##### Chores From 5d8a557199de6a607b4b9fbee27441657a69cbb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 3 Apr 2024 14:11:38 -0400 Subject: [PATCH 04/80] chore: up themes --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index eedae6903e..28e20ebb0a 100644 --- a/install/package.json +++ b/install/package.json @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.44", + "nodebb-theme-harmony": "1.2.45", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.11", + "nodebb-theme-persona": "13.3.12", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.11", "nprogress": "0.2.0", From 7a20681120bb1b35070692c7d238243eae88f176 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 4 Apr 2024 09:18:43 +0000 Subject: [PATCH 05/80] Latest translations and fallbacks --- public/language/ko/admin/advanced/events.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/language/ko/admin/advanced/events.json b/public/language/ko/admin/advanced/events.json index d5e9738454..492fd6e895 100644 --- a/public/language/ko/admin/advanced/events.json +++ b/public/language/ko/admin/advanced/events.json @@ -9,9 +9,9 @@ "filter-type": "이벤트 유형", "filter-start": "시작 날짜", "filter-end": "종료 날짜", - "filter-user": "Filter by User", - "filter-user.placeholder": "Type user name to filter...", - "filter-group": "Filter by Group", - "filter-group.placeholder": "Type group name to filter...", + "filter-user": "사용자명으로 필터링", + "filter-user.placeholder": "필터링할 사용자명 입력...", + "filter-group": "그룹명으로 필터링", + "filter-group.placeholder": "필터링할 그룹명 입력...", "filter-per-page": "페이지 당" } \ No newline at end of file From 8f771b6fe6e83d14afb990a2db0555ae073d013b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:38:04 -0400 Subject: [PATCH 06/80] fix(deps): update dependency sass to v1.74.1 (#12469) 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 1e50efcee4..885a974ead 100644 --- a/install/package.json +++ b/install/package.json @@ -124,7 +124,7 @@ "rss": "1.2.2", "rtlcss": "4.1.1", "sanitize-html": "2.13.0", - "sass": "1.72.0", + "sass": "1.74.1", "semver": "7.6.0", "serve-favicon": "2.5.0", "sharp": "0.32.6", From 97a649e35d3a3a0a98e7b10a6d6ee2279805033a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:38:19 -0400 Subject: [PATCH 07/80] chore(deps): update dependency sass-embedded to v1.74.1 (#12468) 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 885a974ead..0842c00321 100644 --- a/install/package.json +++ b/install/package.json @@ -172,7 +172,7 @@ "smtp-server": "3.13.3" }, "optionalDependencies": { - "sass-embedded": "1.72.0" + "sass-embedded": "1.74.1" }, "resolutions": { "*/jquery": "3.7.1" From 1fef883ba33e39fc2767f43a2a028a37a484bb61 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:38:37 -0400 Subject: [PATCH 08/80] fix(deps): update dependency nodebb-theme-harmony to v1.2.45 (#12466) 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 0842c00321..155a65b02c 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.44", + "nodebb-theme-harmony": "1.2.45", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", "nodebb-theme-persona": "13.3.11", From 0f209fa49bb52765b1003e1f24e66208313e091b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:38:45 -0400 Subject: [PATCH 09/80] fix(deps): update dependency nodebb-theme-persona to v13.3.12 (#12467) 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 155a65b02c..6995005723 100644 --- a/install/package.json +++ b/install/package.json @@ -106,7 +106,7 @@ "nodebb-theme-harmony": "1.2.45", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.11", + "nodebb-theme-persona": "13.3.12", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.13", "nprogress": "0.2.0", From 3d775c3e79bc523cfe20cdf2d6ae73bad2cf020f Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Sun, 7 Apr 2024 09:18:36 +0000 Subject: [PATCH 10/80] Latest translations and fallbacks --- public/language/fr/admin/dashboard.json | 2 +- public/language/fr/user.json | 4 +- .../language/th/admin/advanced/database.json | 16 ++-- public/language/th/admin/advanced/events.json | 22 ++--- public/language/th/aria.json | 12 +-- public/language/th/category.json | 30 +++---- public/language/th/email.json | 60 ++++++------- public/language/th/error.json | 86 +++++++++---------- public/language/th/login.json | 2 +- public/language/th/user.json | 38 ++++---- 10 files changed, 136 insertions(+), 136 deletions(-) diff --git a/public/language/fr/admin/dashboard.json b/public/language/fr/admin/dashboard.json index 386d0d9124..eb7bc530e3 100644 --- a/public/language/fr/admin/dashboard.json +++ b/public/language/fr/admin/dashboard.json @@ -96,6 +96,6 @@ "clear-search-history": "Effacer l'historique", "clear-search-history-confirm": "Êtes-vous sûr de vouloir effacer tout l'historique de recherche ?", "search-term": "Terme", - "search-count": "Count", + "search-count": "Nombre", "view-all": "Voir tout" } diff --git a/public/language/fr/user.json b/public/language/fr/user.json index a38cfdf87c..c50c44ca01 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -144,8 +144,8 @@ "group-order-help": "Sélectionner un groupe et utiliser les flèches pour organiser les titres", "show-group-title": "Afficher le titre du groupe", "hide-group-title": "Masquer le titre du groupe", - "order-group-up": "Order group up", - "order-group-down": "Order group down", + "order-group-up": "Classer vers le haut", + "order-group-down": "Classer vers le bas", "no-group-title": "Aucun titre de groupe", "select-skin": "Sélectionner un habillage", "default": "Défaut (%1)", diff --git a/public/language/th/admin/advanced/database.json b/public/language/th/admin/advanced/database.json index e01bf5d723..936a986c31 100644 --- a/public/language/th/admin/advanced/database.json +++ b/public/language/th/admin/advanced/database.json @@ -17,18 +17,18 @@ "mongo.file-size": "ขนาดไฟล์", "mongo.resident-memory": "หน่วยความจำถาวร", "mongo.virtual-memory": "หน่วยความจำเสมือน", - "mongo.mapped-memory": "Mapped Memory", - "mongo.bytes-in": "Bytes In", - "mongo.bytes-out": "Bytes Out", - "mongo.num-requests": "Number of Requests", + "mongo.mapped-memory": "หน่วยความจำที่ถูกแมป", + "mongo.bytes-in": "จำนวนไบต์ที่รับเข้า", + "mongo.bytes-out": "จำนวนไบต์ที่ส่งออก", + "mongo.num-requests": "จำนวนการร้องขอ", "mongo.raw-info": "ข้อมูลดิบของ MongoDB", - "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", + "mongo.unauthorized": "NodeBB ไม่สามารถดึงข้อมูลจากฐานข้อมูล MongoDB เพื่อคำนวนสถิติที่เกี่ยวข้อง โปรดตรวจสอบว่าชื่อผู้ใช้งานที่ใช้โดย NodeBB ได้สิทธิ์ "clusterMonitor" สำหรับฐานข้อมูล "admin"", "redis": "Redis", "redis.version": "Redis เวอร์ชั่น", - "redis.keys": "Keys", - "redis.expires": "Expires", - "redis.avg-ttl": "Average TTL", + "redis.keys": "จำนวนคีย์", + "redis.expires": "หมดอายุ", + "redis.avg-ttl": "TTL เฉลี่ย", "redis.connected-clients": "ไคลเอ็นท์ที่เชื่อมต่อแล้ว", "redis.connected-slaves": "Slaves ที่เชื่อมต่อแล้ว", "redis.blocked-clients": "ไคลเอ็นท์ที่ถูกบล็อค", diff --git a/public/language/th/admin/advanced/events.json b/public/language/th/admin/advanced/events.json index 57efa22730..1475475e67 100644 --- a/public/language/th/admin/advanced/events.json +++ b/public/language/th/admin/advanced/events.json @@ -2,16 +2,16 @@ "events": "อีเวนท์", "no-events": "ไม่มีอีเวนท์", "control-panel": "แผงควบคุมอีเวนท์", - "delete-events": "Delete Events", - "confirm-delete-all-events": "Are you sure you want to delete all logged events?", - "filters": "Filters", - "filters-apply": "Apply Filters", - "filter-type": "Event Type", - "filter-start": "Start Date", - "filter-end": "End Date", - "filter-user": "Filter by User", - "filter-user.placeholder": "Type user name to filter...", - "filter-group": "Filter by Group", - "filter-group.placeholder": "Type group name to filter...", + "delete-events": "ลบอีเว้นท์", + "confirm-delete-all-events": "คุณต้องการจะลบอีเว้นท์ที่เก็บไว้ทั้งหมดหรือไม่?", + "filters": "ฟิลเตอร์", + "filters-apply": "ใช้งานฟิลเตอร์", + "filter-type": "ประเภทอีเว้นท์", + "filter-start": "วันที่เริ่มต้น", + "filter-end": "วันที่สิ้นสุด", + "filter-user": "ฟิลเตอร์โดยผู้ใช้", + "filter-user.placeholder": "พิมพ์ชื่อผู้ใช้เพื่อฟิลเตอร์", + "filter-group": "ฟิลเตอร์โดยกลุ่ม", + "filter-group.placeholder": "พิมพ์ชื่อกลุ่มเพื่อฟิลเตอร์", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/th/aria.json b/public/language/th/aria.json index 6f023dcae0..85aa375bfc 100644 --- a/public/language/th/aria.json +++ b/public/language/th/aria.json @@ -1,8 +1,8 @@ { - "post-sort-option": "Post sort option, %1", - "topic-sort-option": "Topic sort option, %1", - "user-avatar-for": "User avatar for %1", - "user-watched-tags": "User watched tags", - "delete-upload-button": "Delete upload button", - "group-page-link-for": "Group page link for %1" + "post-sort-option": "ตัวเลือกการจัดเรียงโพสต์ %1", + "topic-sort-option": "ตัวเลือกการจัดเรียงกระทู้ %1", + "user-avatar-for": "อวาตาร์ผู้ใช้สำหรับ %1", + "user-watched-tags": "แท็กที่ผู้ใช้เฝ้าดู", + "delete-upload-button": "ลบปุ่มอัพโหลด", + "group-page-link-for": "ลิงก์ไปหน้ากลุ่มสำหรับ %1" } \ No newline at end of file diff --git a/public/language/th/category.json b/public/language/th/category.json index 81de3410b5..e4afe62cbf 100644 --- a/public/language/th/category.json +++ b/public/language/th/category.json @@ -7,20 +7,20 @@ "browsing": "เรียกดู", "no-replies": "ยังไม่มีใครตอบ", "no-new-posts": "ไม่มีกระทู้ใหม่", - "watch": "ตามดู", + "watch": "เฝ้าดู", "ignore": "ไม่ต้องสนใจอีก", - "watching": "กำลังตามดู", - "tracking": "Tracking", - "not-watching": "Not Watching", - "ignoring": "เมินเฉย", - "watching.description": "Notify me of new topics.
Show topics in unread & recent", - "tracking.description": "Shows topics in unread & recent", - "not-watching.description": "Do not show topics in unread, show in recent", - "ignoring.description": "Do not show topics in unread & recent", - "watching.message": "You are now watching updates from this category and all subcategories", - "tracking.message": "You are now tracking updates from this category and all subcategories", - "notwatching.message": "You are not watching updates from this category and all subcategories", - "ignoring.message": "You are now ignoring updates from this category and all subcategories", - "watched-categories": "หมวดหมู่ที่ดูแล้ว", - "x-more-categories": "%1 more categories" + "watching": "กำลังเฝ้าดู", + "tracking": "กำลังติดตาม", + "not-watching": "ไม่ได้เฝ้าดู", + "ignoring": "ไม่สนใจ", + "watching.description": "แจ้งเตือนฉันเมื่อมีกระทู้ใหม่
แสดงกระทู้ในหน้า ไม่ได้อ่าน และ ล่าสุด", + "tracking.description": "แสดงกระทู้ในหน้า ไม่ได้อ่าน และ ล่าสุด", + "not-watching.description": "ไม่ต้องแสดงกระทู้ในหน้า ไม่ได้อ่าน แต่แสดงในหน้า ล่าสุด", + "ignoring.description": "ไม่ต้องแสดงกระทู้ในหน้า ไม่ได้อ่าน และ ล่าสุด", + "watching.message": "คุณกำลังเฝ้าดูการอัพเดทจากหมวดหมู่นี้และทุกหมวดหมู่ย่อย", + "tracking.message": "คุณกำลังติดตามการอัพเดทจากหมวดหมู่นี้และทุกหมวดหมู่ย่อย", + "notwatching.message": "คุณไม่ได้เฝ้าดูการอัพเดทจากหมวดหมู่นี้และทุกหมวดหมู่ย่อย", + "ignoring.message": "คุณไม่สนใจการอัพเดทจากหมวดหมู่นี้และทุกหมวดหมู่ย่อย", + "watched-categories": "หมวดหมู่ที่เฝ้าดู", + "x-more-categories": "มีอีก %1 หมวดหมู่" } \ No newline at end of file diff --git a/public/language/th/email.json b/public/language/th/email.json index 7daeb735c8..3de3940b11 100644 --- a/public/language/th/email.json +++ b/public/language/th/email.json @@ -1,60 +1,60 @@ { - "test-email.subject": "Test Email", - "password-reset-requested": "Password Reset Requested!", - "welcome-to": "ยินดีต้อนรับ %1", + "test-email.subject": "อีเมลทดสอบ", + "password-reset-requested": "ขอรีเซ็ตรหัสผ่าน!", + "welcome-to": "ยินดีต้อนรับสู่ %1", "invite": "คำเชิญจาก %1", "greeting-no-name": "สวัสดี", "greeting-with-name": "สวัสดี %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "You've requested that we change or confirm your email address", - "email.verify.text2": "For security purposes, we only change or confirm the email address on file once its ownership has been confirmed via email. If you did not request this, no action is required on your part.", - "email.verify.text3": "Once you confirm this email address, we will replace your current email address with this one (%1).", + "email.verify-your-email.subject": "โปรดยืนยันอีเมลของคุณ", + "email.verify.text1": "คุณได้ร้องขอให้เราเปลี่ยนหรือยืนยันอีเมลของคุณ", + "email.verify.text2": "ด้วยเหตุผลของความปลอดภัย เราจะเปลี่ยนหรือยืนยันอีเมลที่เก็บไว้ก็ต่อเมื่อได้รับการยืนยันความเป็นเจ้าของด้วยอีเมล ถ้าคุณไม่ได้ร้องขอนี้ คุณไม่ต้องทำอะไร", + "email.verify.text3": "ทันทีที่คุณยืนยันที่อยู่อีเมลนี้ เราจะเปลี่ยนอีเมลปัจจุบันของคุณเป็นอีเมลนี้แทน (%1).", "welcome.text1": "ขอบคุณที่ลงทะเบียนกับ %1", "welcome.text2": "เพื่อให้การบัญชีของคุณใช้งานได้อย่างเสร็จสมบูรณ์ เราจำเป็นต้องยืนยันว่าคุณเป็นเจ้าของที่แท้จริงของอีเมล์ที่ใช้สมัครสมาชิก", "welcome.text3": "ผู้ดูแลระบบได้ทำการยอมรับการสมัครสมาชิกของคุณแล้ว คุณสามารถเข้าสู่ระบบด้วย ชื่อผู้ใช้/รหัสผ่าน ได้แล้วตอนนี้", "welcome.cta": "กดตรงนี้เพื่อยืนยันอีเมลของคุณ", "invitation.text1": "%1 ได้เชิญคุณให้เข้าร่วม %2", - "invitation.text2": "Your invitation will expire in %1 days.", - "invitation.cta": "Click here to create your account.", + "invitation.text2": "คำเชิญของคุณจะหมดอายุใน %1 วัน", + "invitation.cta": "คลิกที่นี่เพื่อสร้างบัญชีของคุณ", "reset.text1": "เราได้รับคำร้องให้ตั้งค่ารหัสผ่านใหม่ของคุณ อาจจะเป็นเพราะว่าคุณลืมรหัสผ่านและได้ทำการส่งคำขอเข้ามา หากไม่ใช่ กรุณาเพิกเฉยต่ออีเมล์นี้และไม่ต้องดำเนินการใดๆทั้งสิ้น", "reset.text2": "เพื่อดำเนินการตั้งรหัสผ่านใหม่ต่อไป, โปรดกดที่ลิ้งค์นี้:", "reset.cta": "กดตรงนี้เพื่อตั้งรหัสผ่านใหม่", "reset.notify.subject": "ตั้งค่ารหัสผ่านใหม่เรียบร้อยแล้ว", "reset.notify.text1": "เรากำลังแจ้งคุณว่าตอน %1 รหัสผ่านของคุณถูกเปลี่ยนเรียบร้อยแล้ว", "reset.notify.text2": "หากคุณไม่ได้เป็นคนอนุญาตสิ่งนี้ กรุณาแจ้งไปยังผู้ดูแลระบบโดยทันที", - "digest.unread-rooms": "Unread rooms", - "digest.room-name-unreadcount": "%1 (%2 unread)", + "digest.unread-rooms": "ห้องที่ยังไม่ได้อ่าน", + "digest.room-name-unreadcount": "%1 (ยังไม่ได้อ่าน %2)", "digest.latest-topics": "หัวข้อสนทนาล่าสุดจาก %1", - "digest.top-topics": "Top topics from %1", - "digest.popular-topics": "Popular topics from %1", + "digest.top-topics": "หัวข้อสนทนาอันดับต้นๆจาก %1", + "digest.popular-topics": "หัวข้อสนทนายอดนิยมจาก %1", "digest.cta": "กดตรงนี้เพื่อเข้าดู %1", "digest.unsub.info": "คำชี้แจงถูกส่งไปให้คุณแล้ว เนื่องมาจากการตั้งค่าสมาชิกของคุณ", "digest.day": "วัน", "digest.week": "สัปดาห์", "digest.month": "เดือน", - "digest.subject": "คำชี้แจงสำหรับ %1", - "digest.title.day": "Your Daily Digest", - "digest.title.week": "Your Weekly Digest", - "digest.title.month": "Your Monthly Digest", - "notif.chat.new-message-from-user": "New message from \"%1\"", - "notif.chat.new-message-from-user-in-room": "New message from %1 in room %2", + "digest.subject": "สรุปเนื้อหาสำหรับ %1", + "digest.title.day": "สรุปเนื้อหารายวันของคุณ", + "digest.title.week": "สรุปเนื้อหารายสัปดาห์ของคุณ", + "digest.title.month": "สรุปเนื้อหารายเดือนของคุณ", + "notif.chat.new-message-from-user": "ข้อความใหม่จาก \"%1\"", + "notif.chat.new-message-from-user-in-room": "ข้อความใหม่จาก %1 ในห้อง %2", "notif.chat.cta": "กดตรงนี้เพื่อกลับไปยังบทสนทนา", "notif.chat.unsub.info": "การแจ้งเตือนแชทนี้ถูกส่งไปหาคุณเนื่องจากการตั้งค่าสมาชิกของคุณ", "notif.post.unsub.info": "การแจ้งเตือนกระทู้นี้ถูกส่งไปยังคุณเนื่องการตั้งค่าสมาชิกของคุณ", - "notif.post.unsub.one-click": "Alternatively, unsubscribe from future emails like this, by clicking", - "notif.cta": "To the forum", - "notif.cta-new-reply": "View Post", - "notif.cta-new-chat": "View Chat", - "notif.test.short": "Testing Notifications", - "notif.test.long": "This is a test of the notifications email. Send help!", + "notif.post.unsub.one-click": "อีกทางเลือกหนึ่ง ยกเลิกการรับอีเมลแบบนี้ในอนาคตโดยการกด", + "notif.cta": "ไปยังฟอรั่ม", + "notif.cta-new-reply": "ดูกระทู้", + "notif.cta-new-chat": "ดูแชท", + "notif.test.short": "การทดสอบการแจ้งเตือน", + "notif.test.long": "นี่เป็นการทดสอบอีเมลแจ้งเตือน โปรดส่งความช่วยเหลือ!", "test.text1": "นี่คืออีเมลทดสอบเพื่อยืนยันว่าระบบอีเมลมีการตั้งค่าที่ถูกต้องสำหรับ NodeBB ของคุณ", "unsub.cta": "กดตรงนี้เพื่อเปลี่ยนแปลงการตั้งค่า", - "unsubscribe": "unsubscribe", - "unsub.success": "You will no longer receive emails from the %1 mailing list", - "unsub.failure.title": "Unable to unsubscribe", - "unsub.failure.message": "Unfortunately, we were not able to unsubscribe you from the mailing list, as there was an issue with the link. However, you can alter your email preferences by going to your user settings.

(error: %1)", + "unsubscribe": "ยกเลิกการติดตาม", + "unsub.success": "คุณจะไม่ได้รับอีเมลจากกลุ่มอีเมล %1", + "unsub.failure.title": "ไม่สามารถยกเลิกการติดตามได้", + "unsub.failure.message": "โชคไม่ดี เราไม่สามารถยกเลิกคุณจากกลุ่มอีเมล เนื่องจากปัญหาของลิงก์ แต่คุณสามารถเปลี่ยนการตั้งค่าอีเมลโดยไปที่ ตั้งค่า ของคุณ.

(ข้อผิดพลาด: %1)", "banned.subject": "คุณถูกแบนจาก %1 แล้ว", - "banned.text1": "ผู้ใช้ %1 ได้ถูกแบนจาก %2", + "banned.text1": "ผู้ใช้ %1 ได้ถูกแบนจาก %2", "banned.text2": "การแบนนี้จะใช้เวลาจนถึง %1", "banned.text3": "นี่คือเหตุผลที่ทำไมคุณถึงถูกแบน", "closing": "ขอบคุณ!" diff --git a/public/language/th/error.json b/public/language/th/error.json index 607e91d450..7060b9a1d4 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -1,8 +1,8 @@ { "invalid-data": "ข้อมูลไม่ถูกต้อง", "invalid-json": "รูปแบบ JSON ไม่ถูกต้อง", - "wrong-parameter-type": "A value of type %3 was expected for property `%1`, but %2 was received instead", - "required-parameters-missing": "Required parameters were missing from this API call: %1", + "wrong-parameter-type": "ต้องการข้อมูลประเภท %3 สำหรับค่า `%1` แต่ได้รับค่า %2 แทน", + "required-parameters-missing": "ขาดพารามิเตอร์ที่จำเป็นต่อการเรียก API นี้: %1", "not-logged-in": "คุณยังไม่ได้ลงชื่อเข้าระบบ", "account-locked": "บัญชีของคุณถูกระงับการใช้งานชั่วคราว", "search-requires-login": "\"ฟังก์ชั่นการค้นหา\" ต้องการบัญชีผู้ใช้ กรุณาเข้าสู่ระบบหรือสมัครสมาชิก", @@ -11,51 +11,51 @@ "invalid-tid": "Topic ID ไม่ถูกต้อง", "invalid-pid": "Post ID ไม่ถูกต้อง", "invalid-uid": "User ID ไม่ถูกต้อง", - "invalid-mid": "Invalid Chat Message ID", - "invalid-date": "A valid date must be provided", + "invalid-mid": "Chat Message ID ไม่ถูกต้อง", + "invalid-date": "จำเป็นต้องมีวันที่ที่ถูกต้อง", "invalid-username": "ชื่อผู้ใช้ไม่ถูกต้อง", "invalid-email": "อีเมลไม่ถูกต้อง", - "invalid-fullname": "Invalid Fullname", - "invalid-location": "Invalid Location", - "invalid-birthday": "Invalid Birthday", - "invalid-title": "Invalid title", + "invalid-fullname": "ชื่อเต็มไม่ถูกต้อง", + "invalid-location": "ตำแหน่งไม่ถูกต้อง", + "invalid-birthday": "วันเกิดไม่ถูกต้อง", + "invalid-title": "คำนำหน้าชื่อไม่ถูกต้อง", "invalid-user-data": "User Data ไม่ถูกต้อง", "invalid-password": "รหัสผ่านไม่ถูกต้อง", "invalid-login-credentials": "session login หมดอายุ", "invalid-username-or-password": "กรุณาระบุชื่อผู้ใช้และรหัสผ่าน", "invalid-search-term": "ข้อความค้นหาไม่ถูกต้อง", - "invalid-url": "Invalid URL", - "invalid-event": "Invalid event: %1", - "local-login-disabled": "Local login system has been disabled for non-privileged accounts.", + "invalid-url": "URL ไม่ถูกต้อง", + "invalid-event": "อีเว้นต์ไม่ถูกต้องt: %1", + "local-login-disabled": "ระบบล็อกอินแบบโลคอลไม่เปิดสำหรับบัญชีธรรมดา", "csrf-invalid": "เราไม่สามารถนำท่านเข้าสู่ระบบได้ เหมือนกับว่าเซสชั่นหมดอายุแล้ว กรุณาลองใหม่อีกครั้ง", - "invalid-path": "Invalid path", - "folder-exists": "Folder exists", + "invalid-path": "พาทไม่ถูกต้อง", + "folder-exists": "มีโฟลเดอร์อยู่แล้ว", "invalid-pagination-value": "หมายเลขหน้าไม่ถูกต้อง จำเป็นต้องเป็นตัวเลขอย่างน้อย %1 และอย่างมาก %2", "username-taken": "ชื่อผู้ใช้นี้มีการใช้แล้ว", - "email-taken": "Email address is already taken.", - "email-nochange": "The email entered is the same as the email already on file.", - "email-invited": "Email was already invited", - "email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.", + "email-taken": "ที่อยู่อีเมลถูกใช้ไปแล้ว", + "email-nochange": "อีเมลที่ใส่เหมือนกับอีเมลที่จัดเก็บไว้แล้ว", + "email-invited": "อีเมลถูกเชิญอยู่ก่อนแล้ว", + "email-not-confirmed": "จะเปิดโพสต์ในหมวดหมู่หรือกระทู้ทันทีที่อีเมลได้รับการยืนยัน โปรดคลิกที่นี่เพื่อส่งอีเมลยืนยัน", "email-not-confirmed-chat": "คุณไม่สามารถแชทได้จนกว่าอีเมล์ของคุณจะได้รับการยืนยัน กรุณาคลิกที่นี่เพื่อยืนยันอีกมเมล์ของคุณ", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You may not be able to post in some categories or chat until your email is confirmed.", - "no-email-to-confirm": "Your account does not have an email set. An email is necessary for account recovery, and may be necessary for chatting and posting in some categories. Please click here to enter an email.", - "user-doesnt-have-email": "User \"%1\" does not have an email set.", + "email-not-confirmed-email-sent": "อีเมลของคุณยังไม่ได้รับการยืนยัน โปรดตรวจสอบกล่องอินบ็อกของคุณสำหรับอีเมลยืนยัน คุณยังไม่สามารถโพสต์ลงในบางหมวดหมู่หรือแชทได้จนกว่าอีเมลของคุณจะได้รับการยืนยัน", + "no-email-to-confirm": "บัญชีของคุณยังไม่ได้ตั้งค่าอีเมล อีเมลจำเป็นสำหรับการกู้บัญชี และอาจจำเป็นสำหรับการแชทและโพสต์ลงบางหมวดหมู่ โปรดคลิกที่นี่เพื่อใส่ค่าอีเมล", + "user-doesnt-have-email": "ผู้ใช้ \"%1\" ยังไม่ได้ตั้งค่าอีเมล", "email-confirm-failed": "เราไม่สามารถยืนยันอีเมลของคุณ ณ ขณะนี้ กรุณาลองใหม่อีกครั้งภายหลัง", "confirm-email-already-sent": "อีเมล์ยืนยันตัวตนถูกส่งไปยังคุณเรียบร้อยแล้ว กรุณารอ %1 นาที(s) ก่อนการตัดสินใจส่งอีกครั้ง", - "confirm-email-expired": "Confirmation email expired", + "confirm-email-expired": "อีเมลยืนยันหมดอายุแล้ว", "sendmail-not-found": "ไม่พบการประมวลผลสำหรับการส่งอีเมล์ กรุณาตรวจสอบให้แน่ใจว่าได้มีการติดตั้งโปรแกรมการประมวลผลแล้วโดยผู้ใช้ที่กำลังใช้ NodeBB", - "digest-not-enabled": "This user does not have digests enabled, or the system default is not configured to send digests", + "digest-not-enabled": "ผู้ใช้รายนี้ไม่ได้เปิดใช้ สรุปเนื้อหา หรือระบบไม่ได้ตั้งค่าให้ส่งสรุปเนื้อหา", "username-too-short": "ชื่อบัญชีผู้ใช้ สั้นเกินไป", "username-too-long": "ชื่อบัญชีผู้ใช้ ยาวเกินไป", "password-too-long": "รหัสผ่านยาวเกินไป", - "reset-rate-limited": "Too many password reset requests (rate limited)", - "reset-same-password": "Please use a password that is different from your current one", + "reset-rate-limited": "มีคำขอให้รีเซ็ตรหัสผ่านมากเกินไป (เกินขีดจำกัด)", + "reset-same-password": "โปรดใช้รหัสผ่านที่แตกต่างจากรหัสปัจจุบัน", "user-banned": "ผู้ใช้ได้รับการแบน", "user-banned-reason": "ขออภัย บัญชีผู้ใช้นี้ได้รับการแบน (เหตุผล : %1)", "user-banned-reason-until": "ขออภัย บัญชีผู้ใช้นี้ได้รับการแบนจนถึง %1 (เหตุผล : %2)", "user-too-new": "ขออภัย คุณจำเป็นต้องรอ %1 วินาที(s) ก่อนการสร้างกระทู้แรกของคุณ", "blacklisted-ip": "ขออภัย IP Address ของคุณถูกแบนจากชุมชนนี้ หากคุณคิดว่านี่เป็นเออเร่อของระบบ กรุณาติดต่อผู้ดูแลระบบ", - "cant-blacklist-self-ip": "You can't blacklist your own IP", + "cant-blacklist-self-ip": "คุณไม่สามารถแบล็กลิสต์ IP ของคุณเองได้", "ban-expiry-missing": "กรุณาระบุวันสิ้นสุดสำหรับการแบนในครั้งนี้", "no-category": "ยังไม่มี Category นี้", "no-topic": "ยังไม่มี Topic นี้", @@ -63,8 +63,8 @@ "no-group": "ยังไม่มี Group นี้", "no-user": "ยังไม่มีผู้ใช้งานนี้", "no-teaser": "ยังไม่มีทีเซอร์นี้", - "no-flag": "Flag does not exist", - "no-chat-room": "Chat room does not exist", + "no-flag": "ยังไม่มี flag นี้", + "no-chat-room": "ยังไม่มีห้องแชทนี้", "no-privileges": "คุณมีสิทธิ์ไม่เพียงพอที่จะทำรายการนี้", "category-disabled": "Category นี้ถูกปิดการใช้งานแล้ว", "topic-locked": "กระทู้ถูกล็อก", @@ -90,24 +90,24 @@ "title-too-long": "กรุณากรอกชื่อให้สั้นลง ชื่อไม่สามารถยาวกว่า %1 ตัวอักษร(s)", "category-not-selected": "ไม่มีการเลือกหมวดหมู่", "too-many-posts": "คุณสามารถโพสต์ได้เพียงครั้งเดียวเท่านั้นในทุกๆ %1 วินาที(s) - โปรดรอสักครู่ก่อนการโพสต์อีกครั้ง", - "too-many-posts-newbie": "เนื่องด้วยการเป็นผู้ใช้งานใหม่ คุณสามารถโพสต์ได้เพียงครั้งเดียวเท่านั้นในทุกๆ %1 วินาที(s) จนกว่าคุณจะได้รับ %2 ชื่อเสียง - โปรดรอสักครู่ก่อนการโพสต์อีกครั้ง", - "too-many-posts-newbie-minutes": "As a new user, you can only post once every %1 minute(s) until you have earned %2 reputation - please wait before posting again", - "already-posting": "You are already posting", + "too-many-posts-newbie": "เนื่องด้วยการเป็นผู้ใช้งานใหม่ คุณสามารถโพสต์ได้เพียงครั้งเดียวเท่านั้นในทุกๆ %1 วินาที จนกว่าคุณจะได้รับ %2 ชื่อเสียง - โปรดรอสักครู่ก่อนการโพสต์อีกครั้ง", + "too-many-posts-newbie-minutes": "เนื่องด้วยการเป็นผู้ใช้งานใหม่ คุณสปรโามารถโพสต์ได้หนึ่งครั้งทุกๆ %1 นาทีจนกว่าคุณจะได้รับ %2 ชื่อเสียง - โปรดรอสักครู่ก่อนการโพสต์อีกครั้ง", + "already-posting": "คุณกำลังโพสต์อยู่แล้ว", "tag-too-short": "กรุณากรอกแท็กให้ยาวขึ้น แท็กควรมีข้อความอย่างน้อย %1 ตัวอักษร(s)", "tag-too-long": "กรุณากรอกแท็กให้สั้นลง แท็กไม่สามารถยาวกว่า %1 ตัวอักษร(s)", - "tag-not-allowed": "Tag not allowed", - "not-enough-tags": "จำนวนแท็กไม่พอ กระทู้ต้องมีอย่างน้อย %1 แท็ก(s)", - "too-many-tags": "แท็กเยอะเกินไป กระทู้ไม่สามารถมีแท็กมากกว่า %1 แท็ก(s)", - "cant-use-system-tag": "You can not use this system tag.", - "cant-remove-system-tag": "You can not remove this system tag.", + "tag-not-allowed": "ไม่อนุญาตแท็ก", + "not-enough-tags": "จำนวนแท็กไม่พอ กระทู้ต้องมีอย่างน้อย %1 แท็ก", + "too-many-tags": "แท็กเยอะเกินไป กระทู้ไม่สามารถมีแท็กมากกว่า %1 แท็ก", + "cant-use-system-tag": "คุณไม่สามารถใช้แท็กระบบอันนี้", + "cant-remove-system-tag": "คุณไม่สามารถลบแท็กระบบอันนี้", "still-uploading": "กรุณารอการอัพโหลดเพื่อเสร็จสิ้น", "file-too-big": "ขนาดไฟล์ที่ใหญ่ที่สุดที่ได้รับการอนุญาตคือ %1 kB - กรุณาอัพโหลดไฟล์ที่เล็กลง", "guest-upload-disabled": "การอัพโหลดของ Guest ถูกปิด", - "cors-error": "Unable to upload image due to misconfigured CORS", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", - "upload-error-fallback": "Unable to upload image — %1", - "scheduling-to-past": "Please select a date in the future.", - "invalid-schedule-date": "Please enter a valid date and time.", + "cors-error": "ไม่สามารถอัพโหลดรูปได้เนื่องจากการตั้งค่า CORS ผิดพลาด", + "upload-ratelimit-reached": "คุณอัพโหลดไฟล์มากเกินในพร้อมกัน โปรดลองอีกครั้งภายหลัง", + "upload-error-fallback": "ไม่สามารถอัพโหลดรูปภาพ — %1", + "scheduling-to-past": "โปรดเลือกวันที่ในอนาคต", + "invalid-schedule-date": "โปรดใส่วันที่และเวลาที่ถูกต้อง", "cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.", "cant-merge-scheduled": "Scheduled topics cannot be merged.", "cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.", @@ -122,12 +122,12 @@ "cant-remove-last-admin": "คุณเป็นแอดมินเพียงคนเดียว กรุณาเพิ่มผู้ใช้คนอื่นเป็นแอดมิน ก่อนการลบตัวเองออกจากแอดมิน", "account-deletion-disabled": "Account deletion is disabled", "cant-delete-admin": "ลบสิทธิพิเศษของแอดมินจากบัญชีผู้ใช้นี้ ก่อนทำการลบ", - "already-deleting": "Already deleting", - "invalid-image": "Invalid image", + "already-deleting": "กำลังลบอยู่แล้ว", + "invalid-image": "ภาพไม่ถูกต้อง", "invalid-image-type": "ประเภทรูปภาพไม่ถูกต้อง ประเภทที่ได้รับการอนุญาติคือ : %1", "invalid-image-extension": "นามสกุลรูปภาพไม่ถูกต้อง", "invalid-file-type": "ประเภทไฟล์ไม่ถูกต้อง ประเภทที่ได้รับการอนุญาติคือ : %1", - "invalid-image-dimensions": "Image dimensions are too big", + "invalid-image-dimensions": "ภาพขนาดใหญ่เกินไป", "group-name-too-short": "ชื่อกลุ่มสั้นเกินไป", "group-name-too-long": "ชื่อกลุ่มยาวเกินไป", "group-already-exists": "มีกลุ่มนี้อยู่แล้ว", diff --git a/public/language/th/login.json b/public/language/th/login.json index d880087f94..73b80f08e4 100644 --- a/public/language/th/login.json +++ b/public/language/th/login.json @@ -8,5 +8,5 @@ "login-successful": "คุณเข้าสู่ระบบเรียบร้อยแล้ว", "dont-have-account": "คุณยังไม่มีบัญชีเข้าระบบ?", "logged-out-due-to-inactivity": "คุณได้ออกจากระบบ Admin Control Panel แล้ว เนื่องจากว่าไม่มีกิจกรรมใดๆมาสักระยะ", - "caps-lock-enabled": "Caps Lock is enabled" + "caps-lock-enabled": "ปุ่ม Caps Lock เปิดอยู่" } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index 3690fe6304..42ce438282 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -17,15 +17,15 @@ "mute-account": "Mute Account", "unmute-account": "Unmute Account", "delete-account": "ลบบัญชี", - "delete-account-as-admin": "Delete Account", - "delete-content": "Delete Account Content", - "delete-all": "Delete Account and Content", + "delete-account-as-admin": "ลบบัญชี", + "delete-content": "ลบเนื้อหาบัญชี", + "delete-all": "ลบบัญชีและเนื้อหา", "delete-account-confirm": "Are you sure you want to anonymize your posts and delete your account?
This action is irreversible and you will not be able to recover any of your data

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

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

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

", "account-deleted": "บัญชีถูกลบแล้ว", - "account-content-deleted": "Account content deleted", + "account-content-deleted": "เนื้อหาของบัญชีถูกลบแล้ว", "fullname": "ชื่อเต็ม", "website": "เว็บไซต์", "location": "สถานที่", @@ -36,9 +36,9 @@ "profile-views": "ดูข้อมูลส่วนตัว", "reputation": "ชื่อเสียง", "bookmarks": "ที่คั่นหน้า", - "watched-categories": "Watched categories", - "watched-tags": "Watched tags", - "change-all": "Change All", + "watched-categories": "หมวดหมู่ที่เฝ้าดู", + "watched-tags": "แท็กที่เฝ้าดู", + "change-all": "เปลี่ยนทั้งหมด", "watched": "ดูแล้ว", "ignored": "ยกเว้นแล้ว", "default-category-watch-state": "Default category watch state", @@ -72,7 +72,7 @@ "upload-new-picture": "อัพโหลดรูปใหม่", "upload-new-picture-from-url": "อัปโหลดรูปจาก URL", "current-password": "รหัสผ่านปัจจุบัน", - "new-password": "New Password", + "new-password": "รหัสผ่านใหม่", "change-password": "เปลี่ยนรหัสผ่าน", "change-password-error": "รหัสผ่านใช้ไม่ได้", "change-password-error-wrong-current": "รหัสผ่านปัจจุบันไม่ถูกต้อง", @@ -92,7 +92,7 @@ "remove-cover-picture-confirm": "คุณต้องการลบภาพหน้าปกใช่หรือไม่?", "crop-picture": "ตัดภาพ", "upload-cropped-picture": "ตัดภาพและอัพโหลด", - "avatar-background-colour": "Avatar background colour", + "avatar-background-colour": "สีพื้นของรูปอวาตาร์", "settings": "ตั้งค่า", "show-email": "แสดงอีเมลของฉัน", "show-fullname": "แสดงชื่อจริงของฉัน", @@ -102,7 +102,7 @@ "digest-off": "ปิด", "digest-daily": "รายวัน", "digest-weekly": "รายสัปดาห์", - "digest-biweekly": "Bi-Weekly", + "digest-biweekly": "รายสองสัปดาห์", "digest-monthly": "รายเดือน", "has-no-follower": "ผู้ใช้รายนี้ไม่มีใครติดตาม :(", "follows-no-one": "ผู้ใช้รายนี้ไม่ติดตามใคร :(", @@ -142,14 +142,14 @@ "follow-topics-you-create": "ดูกระทู้ที่คุณตั้ง", "grouptitle": "ชื่อกลุ่ม", "group-order-help": "Select a group and use the arrows to order titles", - "show-group-title": "Show group title", - "hide-group-title": "Hide group title", - "order-group-up": "Order group up", - "order-group-down": "Order group down", + "show-group-title": "แสดงชื่อกลุ่ม", + "hide-group-title": "ซ่อนชื่อกลุ่ม", + "order-group-up": "เรียงลำดับกลุ่มจากน้อยไปหามาก", + "order-group-down": "เรียงลำดับกลุ่มจากมากไปหาน้อย", "no-group-title": "ไม่มีชื่อกลุ่ม", "select-skin": "เลือกสกิน", "default": "Default (%1)", - "no-skin": "No Skin", + "no-skin": "ไม่มีสกิน", "select-homepage": "เลือกหน้าแรก", "homepage": "หน้าแรก", "homepage-description": "เลือกหน้าที่จะใช้เป็นหน้าแรกของฟอรั่ม หรือเลือก None เพื่อใช้ค่าเริ่มต้น", @@ -166,15 +166,15 @@ "info.ban-history": "ประวัติแบนล่าสุด", "info.no-ban-history": "ผู้ใช้นี้ถูกแบนแล้ว", "info.banned-until": "แบนจนกว่า %1", - "info.banned-expiry": "Expiry", + "info.banned-expiry": "หมดอายุ", "info.banned-permanently": "แบนอย่างถาวร", "info.banned-reason-label": "เหตุผล", - "info.banned-no-reason": "ไม่มีเหตุผล", + "info.banned-no-reason": "ไม่ได้ให้เหตุผลไว้", "info.mute-history": "Recent Mute History", "info.no-mute-history": "This user has never been muted", "info.muted-until": "Muted until %1", - "info.muted-expiry": "Expiry", - "info.muted-no-reason": "No reason given.", + "info.muted-expiry": "หมดอายุ", + "info.muted-no-reason": "ไม่ได้ให้เหตุผลไว้", "info.username-history": "ประวัติผู้ใช้", "info.email-history": "ประวัติอีเมล์", "info.moderation-note": "โน๊ตของ Moderation", From 0b1f2546c84da19596981897f4b29348686bdf67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 7 Apr 2024 11:10:15 -0400 Subject: [PATCH 11/80] fix: #12471, remove readable strings they are not localized properly --- public/openapi/components/schemas/UserObject.yaml | 4 +--- public/openapi/read/user/userslug/info.yaml | 2 -- src/user/info.js | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/public/openapi/components/schemas/UserObject.yaml b/public/openapi/components/schemas/UserObject.yaml index bdd52bc2d1..9b217cee8b 100644 --- a/public/openapi/components/schemas/UserObject.yaml +++ b/public/openapi/components/schemas/UserObject.yaml @@ -743,9 +743,7 @@ BanMuteArray: example: "#f44336" until: type: number - untilReadable: - type: string - timestampReadable: + untilISO: type: string timestampISO: type: string diff --git a/public/openapi/read/user/userslug/info.yaml b/public/openapi/read/user/userslug/info.yaml index afec9bc2bd..110e252be5 100644 --- a/public/openapi/read/user/userslug/info.yaml +++ b/public/openapi/read/user/userslug/info.yaml @@ -35,8 +35,6 @@ get: timestampISO: type: string description: An ISO 8601 formatted date string (complementing `timestamp`) - timestampReadable: - type: string additionalProperties: description: Contextual data is added to this object (such as topic data, etc.) bans: diff --git a/src/user/info.js b/src/user/info.js index 3abd580d02..d4667bd83f 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -86,7 +86,6 @@ module.exports = function (User) { flagObj.pid = flagObj.value; flagObj.timestamp = flagObj.score; flagObj.timestampISO = new Date(flagObj.score).toISOString(); - flagObj.timestampReadable = new Date(flagObj.score).toString(); delete flagObj.value; delete flagObj.score; @@ -105,8 +104,7 @@ module.exports = function (User) { return data.map((banObj, index) => { banObj.user = usersData[index]; banObj.until = parseInt(banObj.expire, 10); - banObj.untilReadable = new Date(banObj.until).toString(); - banObj.timestampReadable = new Date(parseInt(banObj.timestamp, 10)).toString(); + banObj.untilISO = utils.toISOString(banObj.until); banObj.timestampISO = utils.toISOString(banObj.timestamp); banObj.reason = validator.escape(String(banObj.reason || '')) || noReasonLangKey; return banObj; From ba86740a6a40d6f7cc884222f70c6812b94e3304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 7 Apr 2024 11:12:10 -0400 Subject: [PATCH 12/80] chore: up themes --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 28e20ebb0a..b5ad0febe5 100644 --- a/install/package.json +++ b/install/package.json @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.45", + "nodebb-theme-harmony": "1.2.46", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.12", + "nodebb-theme-persona": "13.3.13", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.11", "nprogress": "0.2.0", From 499514a85c6c6136bc8db15d316f457aaa6be452 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 7 Apr 2024 11:16:13 -0400 Subject: [PATCH 13/80] fix(deps): update dependency nodebb-theme-harmony to v1.2.46 (#12478) 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 6995005723..aec7d4e426 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.45", + "nodebb-theme-harmony": "1.2.46", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", "nodebb-theme-persona": "13.3.12", From 01b3a06a5a138b4085e2721f6090f4a3c69017d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 7 Apr 2024 11:16:21 -0400 Subject: [PATCH 14/80] fix(deps): update dependency nodebb-theme-persona to v13.3.13 (#12479) 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 aec7d4e426..03c936a39b 100644 --- a/install/package.json +++ b/install/package.json @@ -106,7 +106,7 @@ "nodebb-theme-harmony": "1.2.46", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.12", + "nodebb-theme-persona": "13.3.13", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.13", "nprogress": "0.2.0", From b61936294bc4c42a84fd5c223bcac826439e1ca1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 7 Apr 2024 11:16:28 -0400 Subject: [PATCH 15/80] fix(deps): update dependency workerpool to v9.1.1 (#12475) 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 03c936a39b..2b4e958ddc 100644 --- a/install/package.json +++ b/install/package.json @@ -146,7 +146,7 @@ "webpack": "5.91.0", "webpack-merge": "5.10.0", "winston": "3.13.0", - "workerpool": "9.1.0", + "workerpool": "9.1.1", "xml": "1.0.1", "xregexp": "5.1.1", "yargs": "17.7.2", From 7033d11ede2b0ac6f8108de66e1f466c2f9210e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 8 Apr 2024 15:59:17 -0400 Subject: [PATCH 16/80] fix: #12481, remove priv groups from groupslug:groupname mapping (#12482) this will cause a 404 when trying to access /group/cid-1-privilige-groups-find as an admin --- src/controllers/admin/groups.js | 3 ++ src/groups/create.js | 15 ++++++++-- src/groups/delete.js | 6 ++-- src/groups/update.js | 6 ++-- src/upgrades/3.8.0/remove-privilege-slugs.js | 31 ++++++++++++++++++++ 5 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 src/upgrades/3.8.0/remove-privilege-slugs.js diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js index a1a7c6fd1c..a43afa9c17 100644 --- a/src/controllers/admin/groups.js +++ b/src/controllers/admin/groups.js @@ -34,6 +34,9 @@ groupsController.list = async function (req, res) { groupsController.get = async function (req, res, next) { const slug = slugify(req.params.name); const groupName = await groups.getGroupNameByGroupSlug(slug); + if (!groupName) { + return next(); + } const [groupNames, group] = await Promise.all([ getGroupNames(), groups.get(groupName, { uid: req.uid, truncateUserList: true, userListCount: 20 }), diff --git a/src/groups/create.js b/src/groups/create.js index 74ef56a41f..5172038052 100644 --- a/src/groups/create.js +++ b/src/groups/create.js @@ -18,8 +18,11 @@ module.exports = function (Groups) { Groups.validateGroupName(data.name); - const exists = await meta.userOrGroupExists(data.name); - if (exists) { + const [exists, privGroupExists] = await Promise.all([ + meta.userOrGroupExists(data.name), + privilegeGroupExists(data.name), + ]); + if (exists || privGroupExists) { throw new Error('[[error:group-already-exists]]'); } @@ -58,7 +61,9 @@ module.exports = function (Groups) { ]); } - await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name); + if (!Groups.isPrivilegeGroup(groupData.name)) { + await db.setObjectField('groupslug:groupname', groupData.slug, groupData.name); + } groupData = await Groups.getGroupData(groupData.name); plugins.hooks.fire('action:group.create', { group: groupData }); @@ -71,6 +76,10 @@ module.exports = function (Groups) { Groups.isPrivilegeGroup(data.name); } + async function privilegeGroupExists(name) { + return Groups.isPrivilegeGroup(name) && await db.isSortedSetMember('groups:createtime', name); + } + Groups.validateGroupName = function (name) { if (!name) { throw new Error('[[error:group-name-too-short]]'); diff --git a/src/groups/delete.js b/src/groups/delete.js index 1fc8beef02..449640c190 100644 --- a/src/groups/delete.js +++ b/src/groups/delete.js @@ -28,7 +28,9 @@ module.exports = function (Groups) { ); }); const sets = groupNames.map(groupName => `${groupName.toLowerCase()}:${groupName}`); - const fields = groupNames.map(groupName => slugify(groupName)); + const groupSlugs = groupNames + .filter(groupName => !Groups.isPrivilegeGroup(groupName)) + .map(groupName => slugify(groupName)); await Promise.all([ db.deleteAll(keys), @@ -38,7 +40,7 @@ module.exports = function (Groups) { 'groups:visible:memberCount', ], groupNames), db.sortedSetRemove('groups:visible:name', sets), - db.deleteObjectFields('groupslug:groupname', fields), + db.deleteObjectFields('groupslug:groupname', groupSlugs), removeGroupsFromPrivilegeGroups(groupNames), ]); Groups.cache.reset(); diff --git a/src/groups/update.js b/src/groups/update.js index 9da76c9180..804268c587 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -191,8 +191,10 @@ module.exports = function (Groups) { await updateConfig(oldName, newName); await updateChatRooms(oldName, newName); await db.setObject(`group:${oldName}`, { name: newName, slug: slugify(newName) }); - await db.deleteObjectField('groupslug:groupname', group.slug); - await db.setObjectField('groupslug:groupname', slugify(newName), newName); + if (!Groups.isPrivilegeGroup(oldName) && !Groups.isPrivilegeGroup(newName)) { + await db.deleteObjectField('groupslug:groupname', group.slug); + await db.setObjectField('groupslug:groupname', slugify(newName), newName); + } const allGroups = await db.getSortedSetRange('groups:createtime', 0, -1); const keys = allGroups.map(group => `group:${group}:members`); diff --git a/src/upgrades/3.8.0/remove-privilege-slugs.js b/src/upgrades/3.8.0/remove-privilege-slugs.js new file mode 100644 index 0000000000..bfd589f6fc --- /dev/null +++ b/src/upgrades/3.8.0/remove-privilege-slugs.js @@ -0,0 +1,31 @@ +/* eslint-disable no-await-in-loop */ + +'use strict'; + +const db = require('../../database'); +const groups = require('../../groups'); +const batch = require('../../batch'); + +module.exports = { + name: 'Remove privilege groups from groupslug:groupname object', + timestamp: Date.UTC(2024, 3, 8), + method: async function () { + const { progress } = this; + + const slugsToNames = await db.getObject(`groupslug:groupname`); + const privilegeGroups = []; + for (const [slug, name] of Object.entries(slugsToNames)) { + if (groups.isPrivilegeGroup(name)) { + privilegeGroups.push(slug); + } + } + + progress.total = privilegeGroups.length; + await batch.processArray(privilegeGroups, async (slugs) => { + progress.incr(slugs.length); + await db.deleteObjectFields(`groupslug:groupname`, slugs); + }, { + batch: 500, + }); + }, +}; From ee5c021c4714e091f60657cc82248a790ee36735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 8 Apr 2024 16:18:26 -0400 Subject: [PATCH 17/80] refactor: use groupslug:groupname for search and acp page dont need to load all names which includes privilege groups --- src/controllers/admin/groups.js | 7 +++---- src/groups/search.js | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js index a43afa9c17..8c6ca96e6c 100644 --- a/src/controllers/admin/groups.js +++ b/src/controllers/admin/groups.js @@ -62,14 +62,13 @@ groupsController.get = async function (req, res, next) { }; async function getGroupNames() { - const groupNames = await db.getSortedSetRange('groups:createtime', 0, -1); + const groupNames = Object.values(await db.getObject('groupslug:groupname')); return groupNames.filter(name => ( name !== 'registered-users' && name !== 'verified-users' && name !== 'unverified-users' && - name !== groups.BANNED_USERS && - !groups.isPrivilegeGroup(name) - )); + name !== groups.BANNED_USERS + )).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); } groupsController.getCSV = async function (req, res) { diff --git a/src/groups/search.js b/src/groups/search.js index d1fd8892be..3e0dfd2def 100644 --- a/src/groups/search.js +++ b/src/groups/search.js @@ -9,13 +9,13 @@ module.exports = function (Groups) { return []; } query = String(query).toLowerCase(); - let groupNames = await db.getSortedSetRange('groups:createtime', 0, -1); + let groupNames = Object.values(await db.getObject('groupslug:groupname')); if (!options.hideEphemeralGroups) { groupNames = Groups.ephemeralGroups.concat(groupNames); } - groupNames = groupNames.filter(name => name.toLowerCase().includes(query) && - name !== Groups.BANNED_USERS && // hide banned-users in searches - !Groups.isPrivilegeGroup(name)); + groupNames = groupNames.filter( + name => name.toLowerCase().includes(query) && name !== Groups.BANNED_USERS // hide banned-users in searches + ); groupNames = groupNames.slice(0, 100); let groupsData; From 6237d5fe0f84c6234134c0cb81c11deb1ca86718 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:49:34 -0400 Subject: [PATCH 18/80] fix(deps): update dependency cron to v3.1.7 (#12484) 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 2b4e958ddc..e6409a8ded 100644 --- a/install/package.json +++ b/install/package.json @@ -58,7 +58,7 @@ "connect-pg-simple": "9.0.1", "connect-redis": "7.1.1", "cookie-parser": "1.4.6", - "cron": "3.1.6", + "cron": "3.1.7", "cropperjs": "1.6.1", "csrf-sync": "4.0.3", "daemon": "1.1.0", From d72567964818274a1f511332b8fde32dcf661b56 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 Apr 2024 10:54:45 -0400 Subject: [PATCH 19/80] fix: #12485, resolve flags on a topics posts on topic delete --- src/posts/delete.js | 2 +- src/topics/delete.js | 33 +++++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/posts/delete.js b/src/posts/delete.js index 66c8269334..94f73cf494 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -236,7 +236,7 @@ module.exports = function (Posts) { } async function resolveFlags(postData, uid) { - const flaggedPosts = postData.filter(p => parseInt(p.flagId, 10)); + const flaggedPosts = postData.filter(p => p && parseInt(p.flagId, 10)); await Promise.all(flaggedPosts.map(p => flags.update(p.flagId, uid, { state: 'resolved' }))); } }; diff --git a/src/topics/delete.js b/src/topics/delete.js index 5190afd1ff..4e7f5d1400 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -5,25 +5,38 @@ const db = require('../database'); const user = require('../user'); const posts = require('../posts'); const categories = require('../categories'); +const flags = require('../flags'); const plugins = require('../plugins'); const batch = require('../batch'); module.exports = function (Topics) { Topics.delete = async function (tid, uid) { - const cid = await Topics.getTopicField(tid, 'cid'); - await removeTopicPidsFromCid(tid, cid); - await Topics.setTopicFields(tid, { - deleted: 1, - deleterUid: uid, - deletedTimestamp: Date.now(), - }); + const [cid, pids] = await Promise.all([ + Topics.getTopicField(tid, 'cid'), + Topics.getPids(tid), + ]); + await Promise.all([ + db.sortedSetRemove(`cid:${cid}:pids`, pids), + resolveTopicPostFlags(pids, uid), + Topics.setTopicFields(tid, { + deleted: 1, + deleterUid: uid, + deletedTimestamp: Date.now(), + }), + ]); + await categories.updateRecentTidForCid(cid); }; - async function removeTopicPidsFromCid(tid, cid) { - const pids = await Topics.getPids(tid); - await db.sortedSetRemove(`cid:${cid}:pids`, pids); + async function resolveTopicPostFlags(pids, uid) { + await batch.processArray(pids, async (pids) => { + const postData = await posts.getPostsFields(pids, ['pid', 'flagId']); + const flaggedPosts = postData.filter(p => p && parseInt(p.flagId, 10)); + await Promise.all(flaggedPosts.map(p => flags.update(p.flagId, uid, { state: 'resolved' }))); + }, { + batch: 500, + }); } async function addTopicPidsToCid(tid, cid) { From c2465a16921d86e3c338990d437baca0f8afefaf 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 Apr 2024 11:19:20 -0400 Subject: [PATCH 20/80] chore: up harmony --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b5ad0febe5..efce2d924e 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.46", + "nodebb-theme-harmony": "1.2.47", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", "nodebb-theme-persona": "13.3.13", From 2bcd5239fbbcd8094b46addee959d88138f27bd4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:03:34 -0400 Subject: [PATCH 21/80] fix(deps): update dependency nodebb-theme-harmony to v1.2.47 (#12487) 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 e6409a8ded..2f31780b88 100644 --- a/install/package.json +++ b/install/package.json @@ -103,7 +103,7 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.46", + "nodebb-theme-harmony": "1.2.47", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", "nodebb-theme-persona": "13.3.13", From b804a3519db7ad32ae721b98a45772c0449b8d4e Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 10 Apr 2024 09:18:48 +0000 Subject: [PATCH 22/80] Latest translations and fallbacks --- public/language/fr/admin/advanced/events.json | 8 ++++---- public/language/fr/admin/settings/post.json | 6 +++--- public/language/fr/aria.json | 12 ++++++------ public/language/fr/themes/harmony.json | 4 ++-- public/language/th/users.json | 10 +++++----- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/public/language/fr/admin/advanced/events.json b/public/language/fr/admin/advanced/events.json index f7e2f944bb..d5e1a1461d 100644 --- a/public/language/fr/admin/advanced/events.json +++ b/public/language/fr/admin/advanced/events.json @@ -9,9 +9,9 @@ "filter-type": "Évènements", "filter-start": "Date de début", "filter-end": "Date de fin", - "filter-user": "Filter by User", - "filter-user.placeholder": "Type user name to filter...", - "filter-group": "Filter by Group", - "filter-group.placeholder": "Type group name to filter...", + "filter-user": "Filtrer par Utilisateur", + "filter-user.placeholder": "Tapez le nom d'utilisateur à filtrer...", + "filter-group": "Filtrer par groupe", + "filter-group.placeholder": "Tapez le nom du groupe à filtrer...", "filter-per-page": "Par page" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/post.json b/public/language/fr/admin/settings/post.json index cdf8f11baa..af324eb412 100644 --- a/public/language/fr/admin/settings/post.json +++ b/public/language/fr/admin/settings/post.json @@ -4,11 +4,11 @@ "sorting.post-default": "Tri des messages par défaut", "sorting.oldest-to-newest": "Du plus ancien au plus récent", "sorting.newest-to-oldest": "Du plus récent au plus ancien", - "sorting.recently-replied": "Recently Replied", - "sorting.recently-created": "Recently Created", + "sorting.recently-replied": "Répondu récemment ", + "sorting.recently-created": "Créé récemment ", "sorting.most-votes": "Avec le plus de votes", "sorting.most-posts": "Avec le plus de messages", - "sorting.most-views": "Most Views", + "sorting.most-views": "Les plus vus", "sorting.topic-default": "Tri des sujets par défaut", "length": "Longueur de message", "post-queue": "File d'attente", diff --git a/public/language/fr/aria.json b/public/language/fr/aria.json index 6f023dcae0..2274e862be 100644 --- a/public/language/fr/aria.json +++ b/public/language/fr/aria.json @@ -1,8 +1,8 @@ { - "post-sort-option": "Post sort option, %1", - "topic-sort-option": "Topic sort option, %1", - "user-avatar-for": "User avatar for %1", - "user-watched-tags": "User watched tags", - "delete-upload-button": "Delete upload button", - "group-page-link-for": "Group page link for %1" + "post-sort-option": "Option de tri des messages, %1", + "topic-sort-option": "Option de tri des sujets, %1", + "user-avatar-for": "Avatar de l'utilisateur pour %1", + "user-watched-tags": "L'utilisateur a regardé les tags", + "delete-upload-button": "Supprimer le bouton de téléchargement", + "group-page-link-for": "Lien vers la page de groupe pour %1" } \ No newline at end of file diff --git a/public/language/fr/themes/harmony.json b/public/language/fr/themes/harmony.json index 5e979ff6d2..2957f7ac04 100644 --- a/public/language/fr/themes/harmony.json +++ b/public/language/fr/themes/harmony.json @@ -3,11 +3,11 @@ "skins": "Habillages", "collapse": "Réduire", "expand": "Développer", - "sidebar-toggle": "Sidebar Toggle", + "sidebar-toggle": "Réduire la barre latérale", "login-register-to-search": "Connectez-vous ou inscrivez-vous pour faire une recherche.", "settings.title": "Configuration du thème", "settings.enableQuickReply": "Activer les réponses rapides", - "settings.enableBreadcrumbs": "Enable breadcrumbs", + "settings.enableBreadcrumbs": "Activer le fil d'Ariane", "settings.centerHeaderElements": "Centrer les éléments d'en-tête", "settings.mobileTopicTeasers": "Afficher les teasers de sujet sur mobile", "settings.stickyToolbar": "Barre d'outils", diff --git a/public/language/th/users.json b/public/language/th/users.json index e16d7f8522..1627abde9d 100644 --- a/public/language/th/users.json +++ b/public/language/th/users.json @@ -1,19 +1,19 @@ { - "all-users": "All Users", + "all-users": "ผู้ใช้งานทั้งหมด", "latest-users": "ผู้ใช้งานล่าสุด", "top-posters": "ผู้ที่โพสต์มากที่สุด", "most-reputation": "ผู้ที่มีชื่อเสียงมากที่สุด", "most-flags": "ผู้ที่ถูกรายงานมากที่สุด", "search": "ค้นหา", "enter-username": "กรอกชื่อผู้ใช้เพื่อค้นหา", - "search-user-for-chat": "Search for a user to start chat", + "search-user-for-chat": "ค้นหาผู้ใช้เพื่อเริ่มต้นแชท", "load-more": "โหลดเพิ่มเติม", - "users-found-search-took": "พบ %1 ผู้ใช้(s)! การค้นหาใช้เวลาทั้งหมด %2 วินาที", + "users-found-search-took": "พบผู้ใช้ %1 คน! การค้นหาใช้เวลาทั้งหมด %2 วินาที", "filter-by": "การกรอง", "online-only": "กำลังออนไลน์เท่านั้น", "invite": "เชิญ", - "prompt-email": "Emails:", - "groups-to-join": "Groups to be joined when invite is accepted:", + "prompt-email": "อีเมล:", + "groups-to-join": "กลุ่มที่จะได้เข้าร่วมเมื่อคำเชิญได้รับการตอบรับ:", "invitation-email-sent": "อีเมลคำเชิญถูกส่งไปยัง %1 เรียบร้อย", "user-list": "รายการผู้ใช้", "recent-topics": "กระทู้ล่าสุด", From cfd29db061baf6ada7a98338bbf2a38b34164a4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 10 Apr 2024 09:38:01 -0400 Subject: [PATCH 23/80] refactor: better label for show to groups --- public/language/en-GB/admin/settings/navigation.json | 2 +- src/views/admin/settings/navigation.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/language/en-GB/admin/settings/navigation.json b/public/language/en-GB/admin/settings/navigation.json index 931ac5f4ba..3a71061ecf 100644 --- a/public/language/en-GB/admin/settings/navigation.json +++ b/public/language/en-GB/admin/settings/navigation.json @@ -10,7 +10,7 @@ "id": "ID: optional", "properties": "Properties:", - "groups": "Groups:", + "show-to-groups": "Show to Groups:", "open-new-window": "Open in a new window", "dropdown": "Dropdown", "dropdown-placeholder": "Place your dropdown menu items below, ie:
<li><a class="dropdown-item" href="https://myforum.com">Link 1</a></li>", diff --git a/src/views/admin/settings/navigation.tpl b/src/views/admin/settings/navigation.tpl index 431b052361..6af7e60511 100644 --- a/src/views/admin/settings/navigation.tpl +++ b/src/views/admin/settings/navigation.tpl @@ -75,7 +75,7 @@
- +
+ +

[[topic:merge-topic-list-title]]

[[topic:merge-options]] @@ -34,9 +39,9 @@

From f28923858ecd6cbbd3457d2460fae58d52280c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 22 Apr 2024 10:58:42 -0400 Subject: [PATCH 61/80] fix: topic selection in merge if merge was started from inside the topic --- public/src/client/topic/merge.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/public/src/client/topic/merge.js b/public/src/client/topic/merge.js index a2d1131365..7c96f0b9e7 100644 --- a/public/src/client/topic/merge.js +++ b/public/src/client/topic/merge.js @@ -66,11 +66,7 @@ define('forum/topic/merge', ['search', 'alerts', 'api'], function (search, alert callback = callback || function () {}; api.get(`/topics/${tid}`, {}).then(function (topicData) { const title = topicData ? topicData.title : 'No title'; - if (selectedTids[tid]) { - delete selectedTids[tid]; - } else { - selectedTids[tid] = title; - } + selectedTids[tid] = title; checkButtonEnable(); showTopicsSelected(); callback(); @@ -89,8 +85,14 @@ define('forum/topic/merge', ['search', 'alerts', 'api'], function (search, alert if (!modal) { return; } - const tid = $(this).parents('[component="category/topic"]').attr('data-tid'); - Merge.addTopic(tid); + const topicEl = $(this).parents('[component="category/topic"]'); + const isSelected = topicEl.hasClass('selected'); + const tid = topicEl.attr('data-tid'); + if (isSelected) { + Merge.addTopic(tid); + } else { + Merge.removeTopic(tid); + } ev.preventDefault(); ev.stopPropagation(); From 5e7ec5b6b8e10a2dddee2a9550b8dd4002ff3eae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:08:35 -0400 Subject: [PATCH 62/80] fix(deps): update dependency cropperjs to v1.6.2 (#12524) 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 1fadb0fc7c..ca47638483 100644 --- a/install/package.json +++ b/install/package.json @@ -59,7 +59,7 @@ "connect-redis": "7.1.1", "cookie-parser": "1.4.6", "cron": "3.1.7", - "cropperjs": "1.6.1", + "cropperjs": "1.6.2", "csrf-sync": "4.0.3", "daemon": "1.1.0", "diff": "5.2.0", From d6d0ebd592a7d6fa6cc242e03d7a1b51e9aefee6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:08:46 -0400 Subject: [PATCH 63/80] fix(deps): update dependency ipaddr.js to v2.2.0 (#12522) 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 ca47638483..cf28d4149b 100644 --- a/install/package.json +++ b/install/package.json @@ -74,7 +74,7 @@ "helmet": "7.1.0", "html-to-text": "9.0.5", "imagesloaded": "5.0.0", - "ipaddr.js": "2.1.0", + "ipaddr.js": "2.2.0", "jquery": "3.7.1", "jquery-deserialize": "2.0.0", "jquery-form": "4.3.0", From bde9136b924046805ae5d891a66f9ab3a06dfac5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:08:55 -0400 Subject: [PATCH 64/80] fix(deps): update fontsource monorepo (#12523) 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 cf28d4149b..69c030ce2f 100644 --- a/install/package.json +++ b/install/package.json @@ -29,8 +29,8 @@ }, "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", - "@fontsource/inter": "5.0.17", - "@fontsource/poppins": "5.0.13", + "@fontsource/inter": "5.0.18", + "@fontsource/poppins": "5.0.14", "@fortawesome/fontawesome-free": "6.5.2", "@isaacs/ttlcache": "1.4.1", "@popperjs/core": "2.11.8", From 985663faae13dccd0f2cc62a5502dfc5ef351aff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Apr 2024 11:16:04 -0400 Subject: [PATCH 65/80] feat: closes #12491, add unban & unmute history to account/info page --- install/package.json | 4 +- public/language/en-GB/user.json | 3 + public/src/admin/manage/users.js | 41 +++++-- public/src/modules/accounts/moderate.js | 137 +++++++++++++----------- src/api/users.js | 18 +++- src/user/bans.js | 28 +++-- src/user/data.js | 2 +- src/user/info.js | 8 +- src/views/modals/unban.tpl | 10 ++ src/views/modals/unmute.tpl | 10 ++ 10 files changed, 176 insertions(+), 85 deletions(-) create mode 100644 src/views/modals/unban.tpl create mode 100644 src/views/modals/unmute.tpl diff --git a/install/package.json b/install/package.json index 69c030ce2f..9846de45ce 100644 --- a/install/package.json +++ b/install/package.json @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.2", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.50", + "nodebb-theme-harmony": "1.2.51", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.15", + "nodebb-theme-persona": "13.3.16", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.13", "nprogress": "0.2.0", diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index 1b338268bf..cd9b17cd0a 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banned", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Deleted", "username": "User Name", @@ -184,6 +186,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 740a8478dc..0f8dffaa29 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -259,11 +259,11 @@ define('admin/manage/users', [ } Benchpress.render('modals/temporary-ban', {}).then(function (html) { - bootbox.dialog({ - className: 'ban-modal', + const modal = bootbox.dialog({ title: '[[user:ban-account]]', message: html, show: true, + onEscape: true, buttons: { close: { label: '[[global:close]]', @@ -272,7 +272,7 @@ define('admin/manage/users', [ submit: { label: '[[admin/manage/users:alerts.button-ban-x, ' + uids.length + ']]', callback: function () { - const formData = $('.ban-modal form').serializeArray().reduce(function (data, cur) { + const formData = modal.find('form').serializeArray().reduce(function (data, cur) { data[cur.name] = cur.value; return data; }, {}); @@ -302,10 +302,37 @@ define('admin/manage/users', [ return false; // specifically to keep the menu open } - Promise.all(uids.map(function (uid) { - return api.del('/users/' + uid + '/ban'); - })).then(() => { - onSuccess('[[admin/manage/users:alerts.unban-success]]', '.ban', false); + Benchpress.render('modals/unban', {}).then(function (html) { + const modal = bootbox.dialog({ + title: '[[user:unban-account]]', + message: html, + show: true, + onEscape: true, + buttons: { + close: { + label: '[[global:close]]', + className: 'btn-link', + }, + submit: { + label: '[[user:unban-account]]', + callback: function () { + const formData = modal.find('form').serializeArray().reduce(function (data, cur) { + data[cur.name] = cur.value; + return data; + }, {}); + + + Promise.all(uids.map(function (uid) { + return api.del('/users/' + uid + '/ban', { + reason: formData.reason || '', + }); + })).then(() => { + onSuccess('[[admin/manage/users:alerts.unban-success]]', '.ban', false); + }).catch(alerts.error); + }, + }, + }, + }); }); }); diff --git a/public/src/modules/accounts/moderate.js b/public/src/modules/accounts/moderate.js index 3a230f098a..9b1308a8e1 100644 --- a/public/src/modules/accounts/moderate.js +++ b/public/src/modules/accounts/moderate.js @@ -11,98 +11,105 @@ define('forum/account/moderate', [ AccountModerate.banAccount = function (theirid, onSuccess) { theirid = theirid || ajaxify.data.theirid; - Benchpress.render('modals/temporary-ban', {}).then(function (html) { - bootbox.dialog({ - className: 'ban-modal', - title: '[[user:ban-account]]', - message: html, - show: true, - buttons: { - close: { - label: '[[global:close]]', - className: 'btn-link', - }, - submit: { - label: '[[user:ban-account]]', - callback: function () { - const formData = $('.ban-modal form').serializeArray().reduce(function (data, cur) { - data[cur.name] = cur.value; - return data; - }, {}); + throwModal({ + tpl: 'modals/temporary-ban', + title: '[[user:ban-account]]', + onSubmit: function (formData) { + const until = formData.length > 0 ? ( + Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) + ) : 0; + api.put('/users/' + theirid + '/ban', { + until: until, + reason: formData.reason || '', + }).then(() => { + if (typeof onSuccess === 'function') { + return onSuccess(); + } - const until = formData.length > 0 ? ( - Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) - ) : 0; - - api.put('/users/' + theirid + '/ban', { - until: until, - reason: formData.reason || '', - }).then(() => { - if (typeof onSuccess === 'function') { - return onSuccess(); - } - - ajaxify.refresh(); - }).catch(alerts.error); - }, - }, - }, - }); + ajaxify.refresh(); + }).catch(alerts.error); + }, }); }; AccountModerate.unbanAccount = function (theirid) { - api.del('/users/' + theirid + '/ban').then(() => { - ajaxify.refresh(); - }).catch(alerts.error); + throwModal({ + tpl: 'modals/unban', + title: '[[user:unban-account]]', + onSubmit: function (formData) { + api.del('/users/' + theirid + '/ban', { + reason: formData.reason || '', + }).then(() => { + ajaxify.refresh(); + }).catch(alerts.error); + }, + }); }; AccountModerate.muteAccount = function (theirid, onSuccess) { theirid = theirid || ajaxify.data.theirid; - Benchpress.render('modals/temporary-mute', {}).then(function (html) { - bootbox.dialog({ - className: 'mute-modal', - title: '[[user:mute-account]]', + throwModal({ + tpl: 'modals/temporary-mute', + title: '[[user:mute-account]]', + onSubmit: function (formData) { + const until = formData.length > 0 ? ( + Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) + ) : 0; + + api.put('/users/' + theirid + '/mute', { + until: until, + reason: formData.reason || '', + }).then(() => { + if (typeof onSuccess === 'function') { + return onSuccess(); + } + ajaxify.refresh(); + }).catch(alerts.error); + }, + }); + }; + + AccountModerate.unmuteAccount = function (theirid) { + throwModal({ + tpl: 'modals/unmute', + title: '[[user:unmute-account]]', + onSubmit: function (formData) { + api.del('/users/' + theirid + '/mute', { + reason: formData.reason || '', + }).then(() => { + ajaxify.refresh(); + }).catch(alerts.error); + }, + }); + }; + + function throwModal(options) { + Benchpress.render(options.tpl, {}).then(function (html) { + const modal = bootbox.dialog({ + title: options.title, message: html, show: true, + onEscape: true, buttons: { close: { label: '[[global:close]]', className: 'btn-link', }, submit: { - label: '[[user:mute-account]]', + label: options.title, callback: function () { - const formData = $('.mute-modal form').serializeArray().reduce(function (data, cur) { + const formData = modal.find('form').serializeArray().reduce(function (data, cur) { data[cur.name] = cur.value; return data; }, {}); - const until = formData.length > 0 ? ( - Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1)) - ) : 0; - - api.put('/users/' + theirid + '/mute', { - until: until, - reason: formData.reason || '', - }).then(() => { - if (typeof onSuccess === 'function') { - return onSuccess(); - } - ajaxify.refresh(); - }).catch(alerts.error); + options.onSubmit(formData); }, }, }, }); }); - }; - - AccountModerate.unmuteAccount = function (theirid) { - api.del('/users/' + theirid + '/mute').then(() => { - ajaxify.refresh(); - }).catch(alerts.error); - }; + } return AccountModerate; }); diff --git a/src/api/users.js b/src/api/users.js index b2fcb7b38e..1f44bb4372 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -252,7 +252,8 @@ usersAPI.unban = async function (caller, data) { throw new Error('[[error:no-privileges]]'); } - await user.bans.unban(data.uid); + const unbanData = await user.bans.unban(data.uid, data.reason); + await db.setObjectField(`uid:${data.uid}:unban:${unbanData.timestamp}`, 'fromUid', caller.uid); sockets.in(`uid_${data.uid}`).emit('event:unbanned'); @@ -283,6 +284,7 @@ usersAPI.mute = async function (caller, data) { const now = Date.now(); const muteKey = `uid:${data.uid}:mute:${now}`; const muteData = { + type: 'mute', fromUid: caller.uid, uid: data.uid, timestamp: now, @@ -315,7 +317,19 @@ usersAPI.unmute = async function (caller, data) { } await db.deleteObjectFields(`user:${data.uid}`, ['mutedUntil', 'mutedReason']); - + const now = Date.now(); + const unmuteKey = `uid:${data.uid}:unmute:${now}`; + const unmuteData = { + type: 'unmute', + fromUid: caller.uid, + uid: data.uid, + timestamp: now, + }; + if (data.reason) { + unmuteData.reason = data.reason; + } + await db.sortedSetAdd(`uid:${data.uid}:unmutes:timestamp`, now, unmuteKey); + await db.setObject(unmuteKey, unmuteData); await events.log({ type: 'user-unmute', uid: caller.uid, diff --git a/src/user/bans.js b/src/user/bans.js index 8a7352d29e..465f6300e6 100644 --- a/src/user/bans.js +++ b/src/user/bans.js @@ -26,6 +26,7 @@ module.exports = function (User) { const banKey = `uid:${uid}:ban:${now}`; const banData = { + type: 'ban', uid: uid, timestamp: now, expire: until > now ? until : 0, @@ -63,24 +64,39 @@ module.exports = function (User) { return banData; }; - User.bans.unban = async function (uids) { - uids = Array.isArray(uids) ? uids : [uids]; + User.bans.unban = async function (uids, reason = '') { + const isArray = Array.isArray(uids); + uids = isArray ? uids : [uids]; const userData = await User.getUsersFields(uids, ['email:confirmed']); await db.setObject(uids.map(uid => `user:${uid}`), { 'banned:expire': 0 }); - + const now = Date.now(); + const unbanDataArray = []; /* eslint-disable no-await-in-loop */ for (const user of userData) { const systemGroupsToJoin = [ 'registered-users', (parseInt(user['email:confirmed'], 10) === 1 ? 'verified-users' : 'unverified-users'), ]; - await groups.leave(groups.BANNED_USERS, user.uid); - // An unbanned user would lost its previous "Global Moderator" status - await groups.join(systemGroupsToJoin, user.uid); + const unbanKey = `uid:${user.uid}:unban:${now}`; + const unbanData = { + type: 'unban', + uid: user.uid, + reason, + timestamp: now, + }; + await Promise.all([ + db.sortedSetAdd(`uid:${user.uid}:unbans:timestamp`, now, unbanKey), + db.setObject(unbanKey, unbanData), + groups.leave(groups.BANNED_USERS, user.uid), + // An unbanned user would lost its previous "Global Moderator" status + groups.join(systemGroupsToJoin, user.uid), + ]); + unbanDataArray.push(unbanData); } await db.sortedSetRemove(['users:banned', 'users:banned:expire'], uids); + return isArray ? unbanDataArray : unbanDataArray[0]; }; User.bans.isBanned = async function (uids) { diff --git a/src/user/data.js b/src/user/data.js index e21cf92921..c7e2d8b828 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -258,7 +258,7 @@ module.exports = function (User) { user.banned_until = unban ? 0 : user['banned:expire']; user.banned_until_readable = user.banned_until && !unban ? utils.toISOString(user.banned_until) : 'Not Banned'; if (unban) { - await User.bans.unban(user.uid); + await User.bans.unban(user.uid, '[[user:info.ban-expired]]'); user.banned = false; } } diff --git a/src/user/info.js b/src/user/info.js index d4667bd83f..1c62f3f875 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -32,8 +32,12 @@ module.exports = function (User) { User.getModerationHistory = async function (uid) { let [flags, bans, mutes] = await Promise.all([ db.getSortedSetRevRangeWithScores(`flags:byTargetUid:${uid}`, 0, 19), - db.getSortedSetRevRange(`uid:${uid}:bans:timestamp`, 0, 19), - db.getSortedSetRevRange(`uid:${uid}:mutes:timestamp`, 0, 19), + db.getSortedSetRevRange([ + `uid:${uid}:bans:timestamp`, `uid:${uid}:unbans:timestamp`, + ], 0, 19), + db.getSortedSetRevRange([ + `uid:${uid}:mutes:timestamp`, `uid:${uid}:unmutes:timestamp`, + ], 0, 19), ]); // Get pids from flag objects diff --git a/src/views/modals/unban.tpl b/src/views/modals/unban.tpl new file mode 100644 index 0000000000..4a3ab69896 --- /dev/null +++ b/src/views/modals/unban.tpl @@ -0,0 +1,10 @@ +

+
+
+
+ + +
+
+
+
diff --git a/src/views/modals/unmute.tpl b/src/views/modals/unmute.tpl new file mode 100644 index 0000000000..4a3ab69896 --- /dev/null +++ b/src/views/modals/unmute.tpl @@ -0,0 +1,10 @@ +
+
+
+
+ + +
+
+
+
From 7ad477af9c908410dddbaac0aa663fb570f5ee23 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Tue, 23 Apr 2024 15:16:29 +0000 Subject: [PATCH 66/80] chore(i18n): fallback strings for new resources: nodebb.user --- public/language/ar/user.json | 3 +++ public/language/bg/user.json | 3 +++ public/language/bn/user.json | 3 +++ public/language/cs/user.json | 3 +++ public/language/da/user.json | 3 +++ public/language/de/user.json | 3 +++ public/language/el/user.json | 3 +++ public/language/en-US/user.json | 3 +++ public/language/en-x-pirate/user.json | 3 +++ public/language/es/user.json | 3 +++ public/language/et/user.json | 3 +++ public/language/fa-IR/user.json | 3 +++ public/language/fi/user.json | 3 +++ public/language/fr/user.json | 3 +++ public/language/gl/user.json | 3 +++ public/language/he/user.json | 3 +++ public/language/hr/user.json | 3 +++ public/language/hu/user.json | 3 +++ public/language/hy/user.json | 3 +++ public/language/id/user.json | 3 +++ public/language/it/user.json | 3 +++ public/language/ja/user.json | 3 +++ public/language/ko/user.json | 3 +++ public/language/lt/user.json | 3 +++ public/language/lv/user.json | 3 +++ public/language/ms/user.json | 3 +++ public/language/nb/user.json | 3 +++ public/language/nl/user.json | 3 +++ public/language/pl/user.json | 3 +++ public/language/pt-BR/user.json | 3 +++ public/language/pt-PT/user.json | 3 +++ public/language/ro/user.json | 3 +++ public/language/ru/user.json | 3 +++ public/language/rw/user.json | 3 +++ public/language/sc/user.json | 3 +++ public/language/sk/user.json | 3 +++ public/language/sl/user.json | 3 +++ public/language/sq-AL/user.json | 3 +++ public/language/sr/user.json | 3 +++ public/language/sv/user.json | 3 +++ public/language/th/user.json | 3 +++ public/language/tr/user.json | 3 +++ public/language/uk/user.json | 3 +++ public/language/vi/user.json | 3 +++ public/language/zh-CN/user.json | 3 +++ public/language/zh-TW/user.json | 3 +++ 46 files changed, 138 insertions(+) diff --git a/public/language/ar/user.json b/public/language/ar/user.json index cd9ebd292b..b5e3c32185 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "محظور", + "unbanned": "Unbanned", "muted": "كتم", + "unmuted": "Unmuted", "offline": "غير متصل", "deleted": "محذوف", "username": "إسم المستخدم", @@ -167,6 +169,7 @@ "info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا", "info.banned-until": "محظور حتى %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "محظور بشكل دائم", "info.banned-reason-label": "سبب", "info.banned-no-reason": "لم يتم إعطاء سبب.", diff --git a/public/language/bg/user.json b/public/language/bg/user.json index 687ea013a4..abc0edfcb1 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -1,7 +1,9 @@ { "user-menu": "Потребителско меню", "banned": "Блокиран", + "unbanned": "Unbanned", "muted": "Заглушен", + "unmuted": "Unmuted", "offline": "Извън линия", "deleted": "Изтрит", "username": "Потребителско име", @@ -167,6 +169,7 @@ "info.no-ban-history": "Този потребител никога не е бил блокиран", "info.banned-until": "Блокиран до %1", "info.banned-expiry": "Давност", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Блокиран за постоянно", "info.banned-reason-label": "Причина", "info.banned-no-reason": "Няма посочена причина.", diff --git a/public/language/bn/user.json b/public/language/bn/user.json index 3d52e32c20..c65af4440f 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "নিষিদ্ধ", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "অফলাইন", "deleted": "Deleted", "username": "সদস্যের নাম", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index e88135c71c..e5db1de9a8 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Zablokován", + "unbanned": "Unbanned", "muted": "Ztlumen", + "unmuted": "Unmuted", "offline": "Nepřipojen", "deleted": "Odstraněno", "username": "Uživatelské jméno", @@ -167,6 +169,7 @@ "info.no-ban-history": "Tento uživatel nebyl nikdy zablokován", "info.banned-until": "Zablokován do %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Trvale zablokován", "info.banned-reason-label": "Důvod", "info.banned-no-reason": "Bez důvodu", diff --git a/public/language/da/user.json b/public/language/da/user.json index a9479b0181..d6e25ba154 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banlyst", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Deleted", "username": "Brugernavn", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/de/user.json b/public/language/de/user.json index 875c9aeb75..379da7e6fa 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Gesperrt", + "unbanned": "Unbanned", "muted": "Stummgeschaltet", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Gelöscht", "username": "Benutzername", @@ -167,6 +169,7 @@ "info.no-ban-history": "Dieser Benutzer wurde noch nie gesperrt", "info.banned-until": "Gesperrt bis zum %1", "info.banned-expiry": "Ablauf", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Permanent gesperrt", "info.banned-reason-label": "Grund", "info.banned-no-reason": "Kein Grund angegeben.", diff --git a/public/language/el/user.json b/public/language/el/user.json index ed2e05ac00..b027d6a265 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Αποκλεισμένος/η", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Εκτός Σύνδεσης", "deleted": "Deleted", "username": "Όνομα Χρήστη", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/en-US/user.json b/public/language/en-US/user.json index b1a19d7ecd..f83fe41f07 100644 --- a/public/language/en-US/user.json +++ b/public/language/en-US/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banned", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Deleted", "username": "User Name", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/en-x-pirate/user.json b/public/language/en-x-pirate/user.json index a2e50e1384..8bedf1815f 100644 --- a/public/language/en-x-pirate/user.json +++ b/public/language/en-x-pirate/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Blackmarked", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Asleep at the wheel", "deleted": "Deleted", "username": "User Name", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/es/user.json b/public/language/es/user.json index 996dfd3986..8b67c376cc 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Baneado", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Desconectado", "deleted": "Borrado", "username": "Nombre de usuario", @@ -167,6 +169,7 @@ "info.no-ban-history": "Este usuario nunca ha sido baneado", "info.banned-until": "Baneado hasta %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Baneado permanentemente", "info.banned-reason-label": "Motivo", "info.banned-no-reason": "Motivo no especificado", diff --git a/public/language/et/user.json b/public/language/et/user.json index 97f65ad637..0603f45816 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banned", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Väljas", "deleted": "Deleted", "username": "Kasutajanimi", @@ -167,6 +169,7 @@ "info.no-ban-history": "Seda kasutajat pole kunagi keelustatud", "info.banned-until": "Keelustatud kuni %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Igavesti keelustatud", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 8e7d43a40c..624337c45d 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "اخراج شده", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "آفلاین", "deleted": "حذف شده", "username": "نام کاربری", @@ -167,6 +169,7 @@ "info.no-ban-history": "این کاربر هرگز مسدود نشده است", "info.banned-until": "مسدود شده تا %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "مسدود شده به طور دائم", "info.banned-reason-label": "دلیل", "info.banned-no-reason": "هیچ دلیلی ارایه نشد.", diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 37ed2e6286..170f401695 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Bannattu", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Poistettu", "username": "Käyttäjän nimi", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Syy", "info.banned-no-reason": "Syytä ei ole annettu", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index c50c44ca01..cfb9d54bf9 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -1,7 +1,9 @@ { "user-menu": "Menu de l'utilisateur", "banned": "Banni", + "unbanned": "Unbanned", "muted": "Muet", + "unmuted": "Unmuted", "offline": "Hors-ligne", "deleted": "Effacé", "username": "Nom d'utilisateur", @@ -167,6 +169,7 @@ "info.no-ban-history": "Cet utilisateur n'a jamais été banni", "info.banned-until": "Banni jusqu'au %1", "info.banned-expiry": "Expiration", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banni de façon permanente", "info.banned-reason-label": "Raison", "info.banned-no-reason": "Aucune raison donnée", diff --git a/public/language/gl/user.json b/public/language/gl/user.json index d4ec222e5c..cfd18d3834 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Expulsado", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Desconectado", "deleted": "Deleted", "username": "Nome de usuario", @@ -167,6 +169,7 @@ "info.no-ban-history": "Este usuario nunca foi baneado", "info.banned-until": "Baneado hasta %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Baneado permanentemente", "info.banned-reason-label": "Motivo", "info.banned-no-reason": "Motivo non especificado", diff --git a/public/language/he/user.json b/public/language/he/user.json index 3f40f1f417..83ec0f9eb8 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -1,7 +1,9 @@ { "user-menu": "תפריט משתמש", "banned": "מורחק", + "unbanned": "Unbanned", "muted": "מושתק", + "unmuted": "Unmuted", "offline": "לא מחובר", "deleted": "נמחק", "username": "שם משתמש", @@ -167,6 +169,7 @@ "info.no-ban-history": "משתמש זה לא הורחק מעולם", "info.banned-until": "הורחק עד %1", "info.banned-expiry": "פג תוקף", + "info.ban-expired": "Ban expired", "info.banned-permanently": "הורחק לצמיתות", "info.banned-reason-label": "סיבה", "info.banned-no-reason": "לא ניתנה סיבה.", diff --git a/public/language/hr/user.json b/public/language/hr/user.json index a006735356..41e56b78c0 100644 --- a/public/language/hr/user.json +++ b/public/language/hr/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Blokiran", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Nije na mreži", "deleted": "Deleted", "username": "Korisničko ime", @@ -167,6 +169,7 @@ "info.no-ban-history": "Ovaj korisnik nikad nije bio blokiran", "info.banned-until": "Blokiran do %1!", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Trajno blokiran", "info.banned-reason-label": "Razlog", "info.banned-no-reason": "Razlog nije dan.", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 8455aef483..26a0c5777a 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -1,7 +1,9 @@ { "user-menu": "Felhasználói menü", "banned": "Kitiltva", + "unbanned": "Unbanned", "muted": "Némítva", + "unmuted": "Unmuted", "offline": "Nem elérhető", "deleted": "Törölve", "username": "Felhasználónév", @@ -167,6 +169,7 @@ "info.no-ban-history": "A felhasználó sosem volt kitiltva", "info.banned-until": "Kitiltás lejárata: %1", "info.banned-expiry": "Lejárat", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Végleges kitiltás", "info.banned-reason-label": "Oka", "info.banned-no-reason": "Az oka nincs megadva.", diff --git a/public/language/hy/user.json b/public/language/hy/user.json index 0461c15bfd..c4f7858444 100644 --- a/public/language/hy/user.json +++ b/public/language/hy/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Բլոկավորված", + "unbanned": "Unbanned", "muted": "Ձայն անջատված", + "unmuted": "Unmuted", "offline": "Օֆլայն", "deleted": "Ջնջված", "username": "Օգտատիրոջ անունը", @@ -167,6 +169,7 @@ "info.no-ban-history": "Այս օգտատերը երբեք չի արգելափակվել", "info.banned-until": "Արգելված է մինչև %1", "info.banned-expiry": "Ժամկետը", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Ընդմիշտ արգելված է", "info.banned-reason-label": "Պատճառ", "info.banned-no-reason": "Ոչ մի պատճառ չի նշվում:", diff --git a/public/language/id/user.json b/public/language/id/user.json index 2bbe3b831b..3f3b4e3b9e 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banned", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Deleted", "username": "Nama Pengguna", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/it/user.json b/public/language/it/user.json index 3a60e6e7c6..a00cfc2098 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -1,7 +1,9 @@ { "user-menu": "Menu utente", "banned": "Bannato", + "unbanned": "Unbanned", "muted": "Silenziato", + "unmuted": "Unmuted", "offline": "Non in linea", "deleted": "Eliminato", "username": "Nome Utente", @@ -167,6 +169,7 @@ "info.no-ban-history": "Questo utente non è mai stato bannato", "info.banned-until": "Bannato fino %1", "info.banned-expiry": "Scadenza", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Bannato permanentemente", "info.banned-reason-label": "Motivo", "info.banned-no-reason": "Non è stata data nessuna motivazione.", diff --git a/public/language/ja/user.json b/public/language/ja/user.json index ed85c32353..1ad42a1ca1 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "BANされた", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "オフライン", "deleted": "削除されました", "username": "ユーザー名", @@ -167,6 +169,7 @@ "info.no-ban-history": "このユーザーは停止されていません", "info.banned-until": "%1まで停止", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "永久に停止", "info.banned-reason-label": "理由", "info.banned-no-reason": "理由なし。", diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 28a31795e6..5fd9c5b0cd 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -1,7 +1,9 @@ { "user-menu": "사용자 메뉴", "banned": "차단됨", + "unbanned": "Unbanned", "muted": "음소거됨", + "unmuted": "Unmuted", "offline": "오프라인", "deleted": "삭제됨", "username": "사용자 이름", @@ -167,6 +169,7 @@ "info.no-ban-history": "이 사용자는 현재까지 차단된 적이 없습니다.", "info.banned-until": "%1까지 차단됨", "info.banned-expiry": "만료", + "info.ban-expired": "Ban expired", "info.banned-permanently": "영구 차단됨", "info.banned-reason-label": "사유", "info.banned-no-reason": "사유를 제공하지 않았습니다.", diff --git a/public/language/lt/user.json b/public/language/lt/user.json index 2ccef87c25..c719c752c0 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Užblokuotas", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Atsijungęs", "deleted": "Ištrinti", "username": "Vartotojo vardas", @@ -167,6 +169,7 @@ "info.no-ban-history": "Šis narys nebuvo užblokuotas.", "info.banned-until": "Užblokuotas iki %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Užblokuotas visam laikui", "info.banned-reason-label": "Priežastis", "info.banned-no-reason": "Be priežasties", diff --git a/public/language/lv/user.json b/public/language/lv/user.json index 3b7e69c34d..b649ea2b72 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Bloķētie", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Bezsaistē", "deleted": "Izdzēstie", "username": "Vārds", @@ -167,6 +169,7 @@ "info.no-ban-history": "Šis lietotājs nekad nav bijis bloķēts", "info.banned-until": "Bloķēts līdz %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Bloķēts pastāvīgi", "info.banned-reason-label": "Iemesls", "info.banned-no-reason": "Bez iemesla.", diff --git a/public/language/ms/user.json b/public/language/ms/user.json index 5e53e71cd9..d874389b40 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Diharamkan", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Luar talian", "deleted": "Deleted", "username": "Nama pengguna", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index e04784c87d..764199b4dc 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Utestengt", + "unbanned": "Unbanned", "muted": "Dempet", + "unmuted": "Unmuted", "offline": "Frakoblet", "deleted": "Slettet", "username": "Brukernavn", @@ -167,6 +169,7 @@ "info.no-ban-history": "Denne brukeren har aldri blitt utestengt", "info.banned-until": "Utestengt til %1", "info.banned-expiry": "Utløp", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Utestengt permanent", "info.banned-reason-label": "Årsak", "info.banned-no-reason": "ingen årsak oppgitt", diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 5788ab8150..0abfd0ab12 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Verbannen", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Verwijderd", "username": "Gebruikersnaam", @@ -167,6 +169,7 @@ "info.no-ban-history": "Deze gebruiker is nooit eerder verbannen", "info.banned-until": "Verbannen tot %1", "info.banned-expiry": "Verloopt", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Voor altijd verbannen", "info.banned-reason-label": "Reden", "info.banned-no-reason": "Geen reden opgegeven", diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 67d6c9092f..9c5348e432 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -1,7 +1,9 @@ { "user-menu": "Menu użytkownika", "banned": "Zbanowany", + "unbanned": "Unbanned", "muted": "Wyciszony", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Usunięty", "username": "Nazwa użytkownika", @@ -167,6 +169,7 @@ "info.no-ban-history": "Ten użytkownik nigdy nie był zbanowany", "info.banned-until": "Zbanowany do %1", "info.banned-expiry": "Wygaśnięcie", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Zbanowany permanentnie", "info.banned-reason-label": "Powód", "info.banned-no-reason": "Nie podano powodu.", diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 9c30b86584..a171d38d88 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banido", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Deletado", "username": "Nome de Usuário", @@ -167,6 +169,7 @@ "info.no-ban-history": "Este usuário nunca foi banido", "info.banned-until": "Banido até %1", "info.banned-expiry": "Validade", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banido permanentemente", "info.banned-reason-label": "Motivo", "info.banned-no-reason": "Sem motivo escolhido.", diff --git a/public/language/pt-PT/user.json b/public/language/pt-PT/user.json index 73f5b44094..a0be2b156f 100644 --- a/public/language/pt-PT/user.json +++ b/public/language/pt-PT/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banido", + "unbanned": "Unbanned", "muted": "Silenciado", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Apagar", "username": "Nome de utilizador", @@ -167,6 +169,7 @@ "info.no-ban-history": "Este utilizador nunca foi banido", "info.banned-until": "Banido até %1", "info.banned-expiry": "Expiração", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banido permanentemente", "info.banned-reason-label": "Razão", "info.banned-no-reason": "Sem razão atribuida.", diff --git a/public/language/ro/user.json b/public/language/ro/user.json index b64c4b3047..d44cdf16bc 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Banat", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Deconectat", "deleted": "Deleted", "username": "Nume utilizator", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 0b4228a68d..feabc67c64 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Заблокирован", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Не в сети", "deleted": "Удалён", "username": "Имя пользователя", @@ -167,6 +169,7 @@ "info.no-ban-history": "Этот пользователь никогда не был заблокирован", "info.banned-until": "Заблокирован до %1", "info.banned-expiry": "Истечение", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Заблокирован навсегда", "info.banned-reason-label": "Причина", "info.banned-no-reason": "Без объяснения причин.", diff --git a/public/language/rw/user.json b/public/language/rw/user.json index 84f689bf6d..dce04600a6 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Yarirukanwe", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Ntari ku Murongo", "deleted": "Deleted", "username": "Izina ry'Umuntu", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 6c54f489fc..48af65b2cf 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Blocadu", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Non in lìnia", "deleted": "Deleted", "username": "Nùmene de Impitadore", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Reason", "info.banned-no-reason": "No reason given.", diff --git a/public/language/sk/user.json b/public/language/sk/user.json index bef921e67d..57042cc06f 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Zablokovaný", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Nepripojený", "deleted": "Odstránené", "username": "Používateľské meno", @@ -167,6 +169,7 @@ "info.no-ban-history": "Tento člen nebol nikdy zablokovaný", "info.banned-until": "Zablokovaný až do %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Zablokovaný natrvalo", "info.banned-reason-label": "Dôvod", "info.banned-no-reason": "Neboli uvedené žiadne dôvody.", diff --git a/public/language/sl/user.json b/public/language/sl/user.json index 719a55e30e..c32e250fb6 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Izločen", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Odjavljeni", "deleted": "Izbrisano", "username": "Uporabniško ime", @@ -167,6 +169,7 @@ "info.no-ban-history": "This user has never been banned", "info.banned-until": "Banned until %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Banned permanently", "info.banned-reason-label": "Razlog", "info.banned-no-reason": "Razlog ni podan.", diff --git a/public/language/sq-AL/user.json b/public/language/sq-AL/user.json index 39ad28303b..76dcb9f713 100644 --- a/public/language/sq-AL/user.json +++ b/public/language/sq-AL/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "I ndaluar", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Jashtë linje", "deleted": "Fshirë", "username": "Emri i përdoruesit", @@ -167,6 +169,7 @@ "info.no-ban-history": "Ky përdorues nuk është ndaluar kurrë", "info.banned-until": "Ndaluar deri në %1", "info.banned-expiry": "Skadimi", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Ndaluar përgjithmonë", "info.banned-reason-label": "Arsye", "info.banned-no-reason": "Asnjë arsye e dhënë.", diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 9c35c037ed..385b346acc 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Забрањен", + "unbanned": "Unbanned", "muted": "Привремено искључен", + "unmuted": "Unmuted", "offline": "Ван мреже", "deleted": "Избрисано", "username": "Корисничко име", @@ -167,6 +169,7 @@ "info.no-ban-history": "Овај корисник никада није био забрањен", "info.banned-until": "Забрањен до %1", "info.banned-expiry": "Истиче", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Забрањен трајно", "info.banned-reason-label": "Разлог", "info.banned-no-reason": "Није дат разлог.", diff --git a/public/language/sv/user.json b/public/language/sv/user.json index c73f5f3897..f77c46315d 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Bannlyst", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Offline", "deleted": "Raderad", "username": "Användarnamn", @@ -167,6 +169,7 @@ "info.no-ban-history": "Den här användaren har aldrig varit bannad", "info.banned-until": "Bannad tills %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Permanent bannad", "info.banned-reason-label": "Anledning", "info.banned-no-reason": "Ingen anledning angiven", diff --git a/public/language/th/user.json b/public/language/th/user.json index 87541bf08e..89b129f11d 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -1,7 +1,9 @@ { "user-menu": "เมนูผู้ใช้งาน", "banned": "ถูกแบน", + "unbanned": "Unbanned", "muted": "ถูกจำกัดการโพสต์", + "unmuted": "Unmuted", "offline": "ออฟไลน์", "deleted": "ลบแล้ว", "username": "ชื่อผู้ใช้", @@ -167,6 +169,7 @@ "info.no-ban-history": "ผู้ใช้นี้ถูกแบนแล้ว", "info.banned-until": "แบนจนกว่า %1", "info.banned-expiry": "หมดอายุ", + "info.ban-expired": "Ban expired", "info.banned-permanently": "แบนอย่างถาวร", "info.banned-reason-label": "เหตุผล", "info.banned-no-reason": "ไม่ได้ให้เหตุผลไว้", diff --git a/public/language/tr/user.json b/public/language/tr/user.json index bb52457c35..332805f4f4 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -1,7 +1,9 @@ { "user-menu": "Kullanıcı menüsü", "banned": "Yasaklı", + "unbanned": "Unbanned", "muted": "Sessiz", + "unmuted": "Unmuted", "offline": "Çevrimdışı", "deleted": "Silindi", "username": "Kullanıcı Adı", @@ -167,6 +169,7 @@ "info.no-ban-history": "Bu kullanıcı daha önce hiç yasaklanmadı", "info.banned-until": "Yasaklama süresi %1", "info.banned-expiry": "Bitiş", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Kalıcı şekilde yasakla", "info.banned-reason-label": "Gerekçe", "info.banned-no-reason": "Gerekçe belirtilmedi.", diff --git a/public/language/uk/user.json b/public/language/uk/user.json index ece07e838e..65b2893f93 100644 --- a/public/language/uk/user.json +++ b/public/language/uk/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Заблокований", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "Не в мережі", "deleted": "Видалено", "username": "Ім'я користувача", @@ -167,6 +169,7 @@ "info.no-ban-history": "Цього користувача ніколи не банили", "info.banned-until": "Забанений до %1", "info.banned-expiry": "Expiry", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Забанений назавжди", "info.banned-reason-label": "Причина", "info.banned-no-reason": "Причина не вказана", diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 7d8b201b38..9601ae97e8 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "Bị cấm", + "unbanned": "Unbanned", "muted": "Đã Im Lặng", + "unmuted": "Unmuted", "offline": "Ngoại tuyến", "deleted": "Đã xoá", "username": "Tên Đăng Nhập", @@ -167,6 +169,7 @@ "info.no-ban-history": "Người dùng này chưa bao giờ bị cấm", "info.banned-until": "Bị cấm cho đến %1", "info.banned-expiry": "Hết hạn", + "info.ban-expired": "Ban expired", "info.banned-permanently": "Bị cấm vĩnh viễn", "info.banned-reason-label": "Lý do", "info.banned-no-reason": "Không có lí do.", diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 088e7d3668..569cb6ffe3 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -1,7 +1,9 @@ { "user-menu": "用户菜单", "banned": "已封禁", + "unbanned": "Unbanned", "muted": "禁言", + "unmuted": "Unmuted", "offline": "离线", "deleted": "已删除", "username": "用户名", @@ -167,6 +169,7 @@ "info.no-ban-history": "该用户从未被封禁", "info.banned-until": "封禁到 %1", "info.banned-expiry": "到期", + "info.ban-expired": "Ban expired", "info.banned-permanently": "永久封禁", "info.banned-reason-label": "原因", "info.banned-no-reason": "没有原因", diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index e87f23c83e..aa80585d6d 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -1,7 +1,9 @@ { "user-menu": "User menu", "banned": "已停權", + "unbanned": "Unbanned", "muted": "Muted", + "unmuted": "Unmuted", "offline": "離線", "deleted": "已刪除", "username": "使用者名", @@ -167,6 +169,7 @@ "info.no-ban-history": "該使用者從未被停權", "info.banned-until": "停權直到 %1", "info.banned-expiry": "過期", + "info.ban-expired": "Ban expired", "info.banned-permanently": "永久禁用", "info.banned-reason-label": "原因", "info.banned-no-reason": "沒有原因", From 18a843bc1efa1f5ad2700af9bf391eb0fb16c29b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 11:26:30 -0400 Subject: [PATCH 67/80] fix(deps): update dependency ace-builds to v1.33.1 (#12527) 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 9846de45ce..e8521a4fe1 100644 --- a/install/package.json +++ b/install/package.json @@ -34,7 +34,7 @@ "@fortawesome/fontawesome-free": "6.5.2", "@isaacs/ttlcache": "1.4.1", "@popperjs/core": "2.11.8", - "ace-builds": "1.33.0", + "ace-builds": "1.33.1", "archiver": "7.0.1", "async": "3.2.5", "autoprefixer": "10.4.19", From b429045ff6712e484ca46d6c8fa42d0c3aea60a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Apr 2024 12:39:51 -0400 Subject: [PATCH 68/80] feat: closes #12490, show profile flags on account info page --- install/package.json | 4 ++-- public/language/en-GB/flags.json | 2 +- public/language/en-GB/user.json | 4 ++++ src/flags.js | 2 +- src/user/info.js | 39 +++++++++++++------------------- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/install/package.json b/install/package.json index e8521a4fe1..8ff948229b 100644 --- a/install/package.json +++ b/install/package.json @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.2", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.51", + "nodebb-theme-harmony": "1.2.52", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.16", + "nodebb-theme-persona": "13.3.17", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.13", "nprogress": "0.2.0", diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/en-GB/flags.json +++ b/public/language/en-GB/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/en-GB/user.json b/public/language/en-GB/user.json index cd9b17cd0a..b010898322 100644 --- a/public/language/en-GB/user.json +++ b/public/language/en-GB/user.json @@ -181,6 +181,10 @@ "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/src/flags.js b/src/flags.js index e3932f3bd8..00bce1d9bd 100644 --- a/src/flags.js +++ b/src/flags.js @@ -914,7 +914,7 @@ Flags.notify = async function (flagObj, uid, notifySelf = false) { }); uids = uids.concat(modUids[0]); } else if (flagObj.type === 'user') { - const targetDisplayname = flagObj.target && flagObj.target.user ? flagObj.target.user.displayname : '[[global:guest]]'; + const targetDisplayname = flagObj.target && flagObj.target.displayname ? flagObj.target.displayname : '[[global:guest]]'; notifObj = await notifications.create({ type: 'new-user-flag', bodyShort: `[[notifications:user-flagged-user, ${displayname}, ${targetDisplayname}]]`, diff --git a/src/user/info.js b/src/user/info.js index 1c62f3f875..ff67dbd3cb 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -7,6 +7,7 @@ const db = require('../database'); const posts = require('../posts'); const topics = require('../topics'); const utils = require('../utils'); +const Flags = require('../flags'); module.exports = function (User) { User.getLatestBanInfo = async function (uid) { @@ -40,24 +41,11 @@ module.exports = function (User) { ], 0, 19), ]); - // Get pids from flag objects const keys = flags.map(flagObj => `flag:${flagObj.value}`); - const payload = await db.getObjectsFields(keys, ['type', 'targetId']); - - // Only pass on flag ids from posts - flags = payload.reduce((memo, cur, idx) => { - if (cur.type === 'post') { - memo.push({ - value: parseInt(cur.targetId, 10), - score: flags[idx].score, - }); - } - - return memo; - }, []); + const payload = await db.getObjectsFields(keys, ['flagId', 'type', 'targetId', 'datetime']); [flags, bans, mutes] = await Promise.all([ - getFlagMetadata(flags), + getFlagMetadata(payload), formatBanMuteData(bans, '[[user:info.banned-no-reason]]'), formatBanMuteData(mutes, '[[user:info.muted-no-reason]]'), ]); @@ -81,18 +69,23 @@ module.exports = function (User) { }; async function getFlagMetadata(flags) { - const pids = flags.map(flagObj => parseInt(flagObj.value, 10)); + const postFlags = flags.filter(flag => flag && flag.type === 'post'); + const reports = await Promise.all(flags.map(flag => Flags.getReports(flag.flagId))); + + flags.forEach((flag, idx) => { + if (flag) { + flag.timestampISO = new Date(flag.datetime).toISOString(); + flag.reports = reports[idx]; + } + }); + + const pids = postFlags.map(flagObj => parseInt(flagObj.targetId, 10)); const postData = await posts.getPostsFields(pids, ['tid']); const tids = postData.map(post => post.tid); const topicData = await topics.getTopicsFields(tids, ['title']); - flags = flags.map((flagObj, idx) => { - flagObj.pid = flagObj.value; - flagObj.timestamp = flagObj.score; - flagObj.timestampISO = new Date(flagObj.score).toISOString(); - - delete flagObj.value; - delete flagObj.score; + postFlags.forEach((flagObj, idx) => { + flagObj.pid = flagObj.targetId; if (!tids[idx]) { flagObj.targetPurged = true; } From 19f8a77ce28f7b31d8aaa7609559b22e14abe280 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Tue, 23 Apr 2024 16:40:29 +0000 Subject: [PATCH 69/80] chore(i18n): fallback strings for new resources: nodebb.flags, nodebb.user --- public/language/ar/flags.json | 2 +- public/language/ar/user.json | 4 ++++ public/language/bg/flags.json | 2 +- public/language/bg/user.json | 4 ++++ public/language/bn/flags.json | 2 +- public/language/bn/user.json | 4 ++++ public/language/cs/flags.json | 2 +- public/language/cs/user.json | 4 ++++ public/language/da/flags.json | 2 +- public/language/da/user.json | 4 ++++ public/language/de/flags.json | 2 +- public/language/de/user.json | 4 ++++ public/language/el/flags.json | 2 +- public/language/el/user.json | 4 ++++ public/language/en-US/flags.json | 2 +- public/language/en-US/user.json | 4 ++++ public/language/en-x-pirate/flags.json | 2 +- public/language/en-x-pirate/user.json | 4 ++++ public/language/es/flags.json | 2 +- public/language/es/user.json | 4 ++++ public/language/et/flags.json | 2 +- public/language/et/user.json | 4 ++++ public/language/fa-IR/flags.json | 2 +- public/language/fa-IR/user.json | 4 ++++ public/language/fi/flags.json | 2 +- public/language/fi/user.json | 4 ++++ public/language/fr/flags.json | 2 +- public/language/fr/user.json | 4 ++++ public/language/gl/flags.json | 2 +- public/language/gl/user.json | 4 ++++ public/language/he/flags.json | 2 +- public/language/he/user.json | 4 ++++ public/language/hr/flags.json | 2 +- public/language/hr/user.json | 4 ++++ public/language/hu/flags.json | 2 +- public/language/hu/user.json | 4 ++++ public/language/hy/flags.json | 2 +- public/language/hy/user.json | 4 ++++ public/language/id/flags.json | 2 +- public/language/id/user.json | 4 ++++ public/language/it/flags.json | 2 +- public/language/it/user.json | 4 ++++ public/language/ja/flags.json | 2 +- public/language/ja/user.json | 4 ++++ public/language/ko/flags.json | 2 +- public/language/ko/user.json | 4 ++++ public/language/lt/flags.json | 2 +- public/language/lt/user.json | 4 ++++ public/language/lv/flags.json | 2 +- public/language/lv/user.json | 4 ++++ public/language/ms/flags.json | 2 +- public/language/ms/user.json | 4 ++++ public/language/nb/flags.json | 2 +- public/language/nb/user.json | 4 ++++ public/language/nl/flags.json | 2 +- public/language/nl/user.json | 4 ++++ public/language/pl/flags.json | 2 +- public/language/pl/user.json | 10 +++++++--- public/language/pt-BR/flags.json | 2 +- public/language/pt-BR/user.json | 4 ++++ public/language/pt-PT/flags.json | 2 +- public/language/pt-PT/user.json | 4 ++++ public/language/ro/flags.json | 2 +- public/language/ro/user.json | 4 ++++ public/language/ru/flags.json | 2 +- public/language/ru/user.json | 4 ++++ public/language/rw/flags.json | 2 +- public/language/rw/user.json | 4 ++++ public/language/sc/flags.json | 2 +- public/language/sc/user.json | 4 ++++ public/language/sk/flags.json | 2 +- public/language/sk/user.json | 4 ++++ public/language/sl/flags.json | 2 +- public/language/sl/user.json | 4 ++++ public/language/sq-AL/flags.json | 2 +- public/language/sq-AL/user.json | 4 ++++ public/language/sr/flags.json | 2 +- public/language/sr/user.json | 4 ++++ public/language/sv/flags.json | 2 +- public/language/sv/user.json | 4 ++++ public/language/th/flags.json | 2 +- public/language/th/user.json | 4 ++++ public/language/tr/flags.json | 2 +- public/language/tr/user.json | 4 ++++ public/language/uk/flags.json | 2 +- public/language/uk/user.json | 4 ++++ public/language/vi/flags.json | 2 +- public/language/vi/user.json | 4 ++++ public/language/zh-CN/flags.json | 2 +- public/language/zh-CN/user.json | 4 ++++ public/language/zh-TW/flags.json | 2 +- public/language/zh-TW/user.json | 4 ++++ 92 files changed, 233 insertions(+), 49 deletions(-) diff --git a/public/language/ar/flags.json b/public/language/ar/flags.json index 68de95b4e4..7c8f9a1e0d 100644 --- a/public/language/ar/flags.json +++ b/public/language/ar/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/ar/user.json b/public/language/ar/user.json index b5e3c32185..ff6035449c 100644 --- a/public/language/ar/user.json +++ b/public/language/ar/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "تأكيد الفصل", "sso.dissociate-confirm": "هل تريد بالتأكيد فصل حسابك عن %1؟", "info.latest-flags": "أحدث العلامات", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "لم يتم العثور على مشاركات معلمة", "info.ban-history": "سجل الحظر الأحدث", "info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا", diff --git a/public/language/bg/flags.json b/public/language/bg/flags.json index 4f5cf13bf6..57bb987197 100644 --- a/public/language/bg/flags.json +++ b/public/language/bg/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Групови действия", "bulk-resolve": "Разрешаване на доклад(и)", "bulk-success": "%1 доклада са обновени", - "flagged-timeago-readable": "Докладвано (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Авт. докладвано] Получени %1 отрицателни гласа." } \ No newline at end of file diff --git a/public/language/bg/user.json b/public/language/bg/user.json index abc0edfcb1..f2d228b54b 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Потвърждаване на прекъсването", "sso.dissociate-confirm": "Наистина ли искате да прекъснете връзката на акаунта си от „%1“?", "info.latest-flags": "Последни доклади", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Не са намерени докладвани публикации", "info.ban-history": "Скорошна история на блокиранията", "info.no-ban-history": "Този потребител никога не е бил блокиран", diff --git a/public/language/bn/flags.json b/public/language/bn/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/bn/flags.json +++ b/public/language/bn/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/bn/user.json b/public/language/bn/user.json index c65af4440f..3498f5c101 100644 --- a/public/language/bn/user.json +++ b/public/language/bn/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/cs/flags.json b/public/language/cs/flags.json index 04f13634b9..3e65c52caf 100644 --- a/public/language/cs/flags.json +++ b/public/language/cs/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/cs/user.json b/public/language/cs/user.json index e5db1de9a8..d2d2e04ea9 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Potvrdit odloučení", "sso.dissociate-confirm": "Jste si jist/a, že chcete odloučit váš účet z %1?", "info.latest-flags": "Poslední označené", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nebyly nalezeny žádné označené příspěvky", "info.ban-history": "Poslední historie blokovaných", "info.no-ban-history": "Tento uživatel nebyl nikdy zablokován", diff --git a/public/language/da/flags.json b/public/language/da/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/da/flags.json +++ b/public/language/da/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/da/user.json b/public/language/da/user.json index d6e25ba154..c60d54fbba 100644 --- a/public/language/da/user.json +++ b/public/language/da/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/de/flags.json b/public/language/de/flags.json index 4c2f29fca6..339df24292 100644 --- a/public/language/de/flags.json +++ b/public/language/de/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Massenaktionen", "bulk-resolve": "Meldung(en) bereiningen", "bulk-success": "%1 Meldungen aktualisiert", - "flagged-timeago-readable": "Gemeldet (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Automatisch gemeldet] %1 Abwertungen erhalten." } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 379da7e6fa..86be2c274f 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Trennung bestätigen", "sso.dissociate-confirm": "Bist du sicher, dass du dein Konto von %1 trennen willst?", "info.latest-flags": "Neuste Meldungen", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Keine gemeldeten Beiträge gefunden", "info.ban-history": "Sperrungsverlauf", "info.no-ban-history": "Dieser Benutzer wurde noch nie gesperrt", diff --git a/public/language/el/flags.json b/public/language/el/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/el/flags.json +++ b/public/language/el/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/el/user.json b/public/language/el/user.json index b027d6a265..07f3fb63ac 100644 --- a/public/language/el/user.json +++ b/public/language/el/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/en-US/flags.json b/public/language/en-US/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/en-US/flags.json +++ b/public/language/en-US/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/en-US/user.json b/public/language/en-US/user.json index f83fe41f07..8fba89a9de 100644 --- a/public/language/en-US/user.json +++ b/public/language/en-US/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/en-x-pirate/flags.json b/public/language/en-x-pirate/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/en-x-pirate/flags.json +++ b/public/language/en-x-pirate/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/en-x-pirate/user.json b/public/language/en-x-pirate/user.json index 8bedf1815f..8653a1e096 100644 --- a/public/language/en-x-pirate/user.json +++ b/public/language/en-x-pirate/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/es/flags.json b/public/language/es/flags.json index 7abed4fbf4..0bffeb16ee 100644 --- a/public/language/es/flags.json +++ b/public/language/es/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/es/user.json b/public/language/es/user.json index 8b67c376cc..de0d5f59c2 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirmar Disociación", "sso.dissociate-confirm": "Está seguro de que desea disociar su cuenta de %1?", "info.latest-flags": "Ultimos reportes", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Ningun mensaje reportado encontrado", "info.ban-history": "Histórico reciente de bans", "info.no-ban-history": "Este usuario nunca ha sido baneado", diff --git a/public/language/et/flags.json b/public/language/et/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/et/flags.json +++ b/public/language/et/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/et/user.json b/public/language/et/user.json index 0603f45816..dc531559d9 100644 --- a/public/language/et/user.json +++ b/public/language/et/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Viimased raporteerimised", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Raporteeritud postitusi ei leitud", "info.ban-history": "Hiljutiste keeldude ajalugu", "info.no-ban-history": "Seda kasutajat pole kunagi keelustatud", diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index 0ad056c4c8..4a268bb030 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "عملیات گروهی", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 گزارش بروزرسانی شد", - "flagged-timeago-readable": "گزارش شده (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/fa-IR/user.json b/public/language/fa-IR/user.json index 624337c45d..a55866ce70 100644 --- a/public/language/fa-IR/user.json +++ b/public/language/fa-IR/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "آیا مطمئنی می خواهی اتصال %1 به حسابت را لغو کنی؟", "info.latest-flags": "آخرین نشانه گذاری‌ها", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "پست گزارش شده ای یافت نشد", "info.ban-history": "تاریخچه مسدودیت های اخیر", "info.no-ban-history": "این کاربر هرگز مسدود نشده است", diff --git a/public/language/fi/flags.json b/public/language/fi/flags.json index 73eade3503..2132e64f13 100644 --- a/public/language/fi/flags.json +++ b/public/language/fi/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/fi/user.json b/public/language/fi/user.json index 170f401695..6522417524 100644 --- a/public/language/fi/user.json +++ b/public/language/fi/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Estohistorian viimeisimmät", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/fr/flags.json b/public/language/fr/flags.json index beb5e3046f..ccf2565f6e 100644 --- a/public/language/fr/flags.json +++ b/public/language/fr/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Actions en vrac", "bulk-resolve": "Signalement(s) résolu(s)", "bulk-success": "%1 signalements mis à jour", - "flagged-timeago-readable": "Signalé (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Signalement] A reçu %1 votes négatifs." } \ No newline at end of file diff --git a/public/language/fr/user.json b/public/language/fr/user.json index cfb9d54bf9..9bbc717fb1 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirmer la dissociation", "sso.dissociate-confirm": "Êtes-vous sûr de vouloir dissocier votre compte de %1 ?", "info.latest-flags": "Derniers signalements", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Aucun signalement trouvé", "info.ban-history": "Historique de bannissement récent", "info.no-ban-history": "Cet utilisateur n'a jamais été banni", diff --git a/public/language/gl/flags.json b/public/language/gl/flags.json index 295e7a1f1a..2dd293a0dd 100644 --- a/public/language/gl/flags.json +++ b/public/language/gl/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/gl/user.json b/public/language/gl/user.json index cfd18d3834..f07ed633df 100644 --- a/public/language/gl/user.json +++ b/public/language/gl/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Últimos reportes", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Non se atopou ninguna mensaxe reportada", "info.ban-history": "Histórico recente de bans", "info.no-ban-history": "Este usuario nunca foi baneado", diff --git a/public/language/he/flags.json b/public/language/he/flags.json index d6a8a8e9c5..a4d4eccb90 100644 --- a/public/language/he/flags.json +++ b/public/language/he/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "פעולות כלליות", "bulk-resolve": "השלמת דיווחים", "bulk-success": "%1 דיווחים עודכנו", - "flagged-timeago-readable": "מדווחים (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[דיווח אוטומטי] פוסט זה קיבל %1 הצבעות למטה." } \ No newline at end of file diff --git a/public/language/he/user.json b/public/language/he/user.json index 83ec0f9eb8..7b91ca75d9 100644 --- a/public/language/he/user.json +++ b/public/language/he/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "אשר ביטול שיוך", "sso.dissociate-confirm": "האם אתה בטוח שאתה רוצה לבטל שיוך חשבונך מ%1?", "info.latest-flags": "דיווחים אחרונים", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "לא נמצאו פוסטים מדווחים", "info.ban-history": "היסטוריית הרחקות", "info.no-ban-history": "משתמש זה לא הורחק מעולם", diff --git a/public/language/hr/flags.json b/public/language/hr/flags.json index 467feb9f00..e9ea1ab90c 100644 --- a/public/language/hr/flags.json +++ b/public/language/hr/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/hr/user.json b/public/language/hr/user.json index 41e56b78c0..5bc99ceadc 100644 --- a/public/language/hr/user.json +++ b/public/language/hr/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Zadnja zastava", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nema objava sa zastavama", "info.ban-history": "Povijest nedavno blokiranih", "info.no-ban-history": "Ovaj korisnik nikad nije bio blokiran", diff --git a/public/language/hu/flags.json b/public/language/hu/flags.json index 2c38151dba..8cfcca9f6a 100644 --- a/public/language/hu/flags.json +++ b/public/language/hu/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Tömeges műveletek", "bulk-resolve": "Megoldott jelölés", "bulk-success": "%1 jelölő frissítve", - "flagged-timeago-readable": "Megjelölve (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Automatikus Megjelölés] %1 negatív szavazatot kapott." } \ No newline at end of file diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 26a0c5777a..083785c9e3 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Leválasztás megerősítése", "sso.dissociate-confirm": "Biztos le akarod választani a fiókod (%1) ?", "info.latest-flags": "Legutóbbi megjelölések", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nem található megjelölt hozzászólás", "info.ban-history": "Kitiltási előzmény", "info.no-ban-history": "A felhasználó sosem volt kitiltva", diff --git a/public/language/hy/flags.json b/public/language/hy/flags.json index 68ea85b320..e7eaa204e1 100644 --- a/public/language/hy/flags.json +++ b/public/language/hy/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Զանգվածային գործողություններ", "bulk-resolve": "Լուծել դրոշակ(ներ)ը", "bulk-success": "%1 դրոշները թարմացվել են", - "flagged-timeago-readable": "Նշված (% 2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Ստացել է %1 դեմ ձայն:" } \ No newline at end of file diff --git a/public/language/hy/user.json b/public/language/hy/user.json index c4f7858444..27c5e0b5af 100644 --- a/public/language/hy/user.json +++ b/public/language/hy/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Հաստատեք տարանջատումը", "sso.dissociate-confirm": "Վստա՞հ եք, որ ցանկանում եք անջատել ձեր հաշիվը %1-ից:", "info.latest-flags": "Վերջին դրոշները", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Դրոշակավորված գրառումներ չեն գտնվել", "info.ban-history": "Արգելքի վերջին պատմությունը", "info.no-ban-history": "Այս օգտատերը երբեք չի արգելափակվել", diff --git a/public/language/id/flags.json b/public/language/id/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/id/flags.json +++ b/public/language/id/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/id/user.json b/public/language/id/user.json index 3f3b4e3b9e..a8e0f29e1e 100644 --- a/public/language/id/user.json +++ b/public/language/id/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/it/flags.json b/public/language/it/flags.json index 3ce3929f4f..dc4dff0f12 100644 --- a/public/language/it/flags.json +++ b/public/language/it/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Azioni in blocco", "bulk-resolve": "Risolvi segnalazione(i)", "bulk-success": "%1 segnalazioni aggiornate", - "flagged-timeago-readable": "Segnalato (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Contrassegnato automaticamente] Ha ricevuto %1 voti negativi." } \ No newline at end of file diff --git a/public/language/it/user.json b/public/language/it/user.json index a00cfc2098..09ab6fee63 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Conferma dissociazione", "sso.dissociate-confirm": "Sei sicuro di voler dissociare il tuo account da %1?", "info.latest-flags": "Ultime segnalazioni", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Non è stato trovato nessun post segnalato", "info.ban-history": "Storico dei Ban recenti", "info.no-ban-history": "Questo utente non è mai stato bannato", diff --git a/public/language/ja/flags.json b/public/language/ja/flags.json index a9c04bbefc..f3d3297224 100644 --- a/public/language/ja/flags.json +++ b/public/language/ja/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/ja/user.json b/public/language/ja/user.json index 1ad42a1ca1..bba4d3a261 100644 --- a/public/language/ja/user.json +++ b/public/language/ja/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "離脱の際に確認する", "sso.dissociate-confirm": "アカウントと %1 の関連付けを解除しますか?", "info.latest-flags": "最近のフラグ", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "フラグのついた投稿はありません", "info.ban-history": "最近停止した履歴", "info.no-ban-history": "このユーザーは停止されていません", diff --git a/public/language/ko/flags.json b/public/language/ko/flags.json index 24fab65245..7ad1688255 100644 --- a/public/language/ko/flags.json +++ b/public/language/ko/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "대량 작업", "bulk-resolve": "신고 해결", "bulk-success": "%1개의 신고가 업데이트되었습니다", - "flagged-timeago-readable": "에 신고됨 (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[자동 신고] %1개의 반대를 받았습니다." } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 5fd9c5b0cd..6c95172b49 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "분리 확인", "sso.dissociate-confirm": "계정을 %1에서 분리하시겠습니까?", "info.latest-flags": "최신 신고", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "신고된 게시물이 없습니다", "info.ban-history": "최근 차단 기록", "info.no-ban-history": "이 사용자는 현재까지 차단된 적이 없습니다.", diff --git a/public/language/lt/flags.json b/public/language/lt/flags.json index 2bce567011..af84a9ca82 100644 --- a/public/language/lt/flags.json +++ b/public/language/lt/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/lt/user.json b/public/language/lt/user.json index c719c752c0..1d9d72c74a 100644 --- a/public/language/lt/user.json +++ b/public/language/lt/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nerasta pažymėtų pranešimų", "info.ban-history": "Blokavimų istorija", "info.no-ban-history": "Šis narys nebuvo užblokuotas.", diff --git a/public/language/lv/flags.json b/public/language/lv/flags.json index 52abe02493..471948c0a5 100644 --- a/public/language/lv/flags.json +++ b/public/language/lv/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/lv/user.json b/public/language/lv/user.json index b649ea2b72..d64918c487 100644 --- a/public/language/lv/user.json +++ b/public/language/lv/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Apstiprināt atsaistīšanu", "sso.dissociate-confirm": "Vai tiešām vēlies atsaistīt Tavu kontu no %1?", "info.latest-flags": "Jaunākās atzīmes", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nav atzīmēto rakstu", "info.ban-history": "Nesenā bloķēšanas vēsture", "info.no-ban-history": "Šis lietotājs nekad nav bijis bloķēts", diff --git a/public/language/ms/flags.json b/public/language/ms/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/ms/flags.json +++ b/public/language/ms/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/ms/user.json b/public/language/ms/user.json index d874389b40..f2ae132b26 100644 --- a/public/language/ms/user.json +++ b/public/language/ms/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/nb/flags.json b/public/language/nb/flags.json index c20ce424ef..29000dec26 100644 --- a/public/language/nb/flags.json +++ b/public/language/nb/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Massehandlinger", "bulk-resolve": "Løse Flagg(ene).", "bulk-success": "%1 flagg er oppdaterte ", - "flagged-timeago-readable": "Flaggede 11 (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 764199b4dc..ee7ab00a19 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Bekreft seperasjon", "sso.dissociate-confirm": "Er du sikker på at du vil separere kontoen din fra %1?", "info.latest-flags": "Seneste flagg", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Ingen flaggede innlegg funnet", "info.ban-history": "Nylig utestengingshistorikk", "info.no-ban-history": "Denne brukeren har aldri blitt utestengt", diff --git a/public/language/nl/flags.json b/public/language/nl/flags.json index 758ad2d54c..7faecd1af0 100644 --- a/public/language/nl/flags.json +++ b/public/language/nl/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk acties", "bulk-resolve": "Los markering(en) op", "bulk-success": "%1 markeringen aangepast", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/nl/user.json b/public/language/nl/user.json index 0abfd0ab12..98daec6848 100644 --- a/public/language/nl/user.json +++ b/public/language/nl/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Bevestig ontkoppeling", "sso.dissociate-confirm": "Weet u zeker dat u uw account wilt ontkoppelen van %1?", "info.latest-flags": "Laatste markeringen", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Geen gemarkeerde berichten gevonden", "info.ban-history": "Recente verban-geschiedenis", "info.no-ban-history": "Deze gebruiker is nooit eerder verbannen", diff --git a/public/language/pl/flags.json b/public/language/pl/flags.json index 4a35a6e3b4..98105b291f 100644 --- a/public/language/pl/flags.json +++ b/public/language/pl/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Operacje masowe", "bulk-resolve": "Oznacz flagi jako rozwiązane", "bulk-success": "Zaktualizowano %1 flag", - "flagged-timeago-readable": "Oflagowano (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Automatyczna Flaga] Otrzymano %1 głosów przeciw." } \ No newline at end of file diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 9c5348e432..482dbc8378 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -1,9 +1,9 @@ { "user-menu": "Menu użytkownika", "banned": "Zbanowany", - "unbanned": "Unbanned", + "unbanned": "Odblokowane", "muted": "Wyciszony", - "unmuted": "Unmuted", + "unmuted": "Wyciszenie anulowane", "offline": "Offline", "deleted": "Usunięty", "username": "Nazwa użytkownika", @@ -164,12 +164,16 @@ "sso.dissociate-confirm-title": "Potwierdź odwiązanie", "sso.dissociate-confirm": "Czy na pewno odwiązać Twoje konto od %1?", "info.latest-flags": "Ostatnie flagi", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Brak oflagowanych postów", "info.ban-history": "Historia ostatnich banów", "info.no-ban-history": "Ten użytkownik nigdy nie był zbanowany", "info.banned-until": "Zbanowany do %1", "info.banned-expiry": "Wygaśnięcie", - "info.ban-expired": "Ban expired", + "info.ban-expired": "Blokada wygasła", "info.banned-permanently": "Zbanowany permanentnie", "info.banned-reason-label": "Powód", "info.banned-no-reason": "Nie podano powodu.", diff --git a/public/language/pt-BR/flags.json b/public/language/pt-BR/flags.json index 7a76c15595..2ad5e9499d 100644 --- a/public/language/pt-BR/flags.json +++ b/public/language/pt-BR/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Ações em Massa", "bulk-resolve": "Resolver Sinalização(ões)", "bulk-success": "%1 sinalizações atualizadas", - "flagged-timeago-readable": "Sinalizado (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index a171d38d88..07e8be4f25 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirmar Desassociação", "sso.dissociate-confirm": "Tem certeza de que deseja desassociar a sua conta de %1?", "info.latest-flags": "Últimas Sinalizações", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nenhum Post Sinalizado Encontrado", "info.ban-history": "Histórico de Banimentos Recentes", "info.no-ban-history": "Este usuário nunca foi banido", diff --git a/public/language/pt-PT/flags.json b/public/language/pt-PT/flags.json index 14a80cd665..58f5327900 100644 --- a/public/language/pt-PT/flags.json +++ b/public/language/pt-PT/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/pt-PT/user.json b/public/language/pt-PT/user.json index a0be2b156f..cc5f1654ba 100644 --- a/public/language/pt-PT/user.json +++ b/public/language/pt-PT/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirmar Dissociação", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Denúncias Recentes", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Não foram encontradas publicações denunciadas", "info.ban-history": "Histórico de expulsões recentes", "info.no-ban-history": "Este utilizador nunca foi banido", diff --git a/public/language/ro/flags.json b/public/language/ro/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/ro/flags.json +++ b/public/language/ro/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/ro/user.json b/public/language/ro/user.json index d44cdf16bc..1eb8ceb61d 100644 --- a/public/language/ro/user.json +++ b/public/language/ro/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index 3be16016df..b812c9fa7e 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Жалоба %1 обновлена", "bulk-resolve": "Решить жалобы", "bulk-success": "Жалоба %1 обновлена", - "flagged-timeago-readable": "Получена жалоба (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Автожалоба] Получено %1 голосов против." } \ No newline at end of file diff --git a/public/language/ru/user.json b/public/language/ru/user.json index feabc67c64..309cd62e5c 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Подтверждение открепления", "sso.dissociate-confirm": "Вы уверены, что хотите открепить свою учётную запись от %1?", "info.latest-flags": "Последние жалобы", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Жалоб не найдено", "info.ban-history": "История блокировок", "info.no-ban-history": "Этот пользователь никогда не был заблокирован", diff --git a/public/language/rw/flags.json b/public/language/rw/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/rw/flags.json +++ b/public/language/rw/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/rw/user.json b/public/language/rw/user.json index dce04600a6..bacfa18089 100644 --- a/public/language/rw/user.json +++ b/public/language/rw/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/sc/flags.json b/public/language/sc/flags.json index 996e027833..0a42e3877f 100644 --- a/public/language/sc/flags.json +++ b/public/language/sc/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/sc/user.json b/public/language/sc/user.json index 48af65b2cf..8bcc7db6ca 100644 --- a/public/language/sc/user.json +++ b/public/language/sc/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/sk/flags.json b/public/language/sk/flags.json index d55b9e5827..e06be6f7e5 100644 --- a/public/language/sk/flags.json +++ b/public/language/sk/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/sk/user.json b/public/language/sk/user.json index 57042cc06f..d20fa88acd 100644 --- a/public/language/sk/user.json +++ b/public/language/sk/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Potvrdiť odlúčenie", "sso.dissociate-confirm": "Ste si istý, že chcete odlúčiť Váš účet z %1?", "info.latest-flags": "Najnovšie príznaky", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Neboli nájdené žiadne označené príspevky", "info.ban-history": "Nedávna história zablokovania", "info.no-ban-history": "Tento člen nebol nikdy zablokovaný", diff --git a/public/language/sl/flags.json b/public/language/sl/flags.json index 4b9a03f6eb..07e544aef2 100644 --- a/public/language/sl/flags.json +++ b/public/language/sl/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/sl/user.json b/public/language/sl/user.json index c32e250fb6..2c72679d73 100644 --- a/public/language/sl/user.json +++ b/public/language/sl/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", "info.latest-flags": "Latest Flags", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "No Flagged Posts Found", "info.ban-history": "Recent Ban History", "info.no-ban-history": "This user has never been banned", diff --git a/public/language/sq-AL/flags.json b/public/language/sq-AL/flags.json index db14cae57d..ceb5b91d94 100644 --- a/public/language/sq-AL/flags.json +++ b/public/language/sq-AL/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Veprime në mas", "bulk-resolve": "Zgjidhja e raportim(eve)", "bulk-success": "%1 raportime u përditësuan", - "flagged-timeago-readable": "I raportuar (% 2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[I vetë Raportuar] Mori %1 vota kundër." } \ No newline at end of file diff --git a/public/language/sq-AL/user.json b/public/language/sq-AL/user.json index 76dcb9f713..a5904e748b 100644 --- a/public/language/sq-AL/user.json +++ b/public/language/sq-AL/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Konfirmo shkëputjen", "sso.dissociate-confirm": "Jeni i sigurt që dëshironi të shkëputni llogarinë tuaj nga %1?", "info.latest-flags": "Raportimet më të fundit", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Nuk u gjet asnjë postim i shënuar", "info.ban-history": "Historia e fundit e ndalimit", "info.no-ban-history": "Ky përdorues nuk është ndaluar kurrë", diff --git a/public/language/sr/flags.json b/public/language/sr/flags.json index 67168e53f5..759dc847ba 100644 --- a/public/language/sr/flags.json +++ b/public/language/sr/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Масовне радње", "bulk-resolve": "Реши заставицу/е", "bulk-success": "Ажурираних заставица: %1", - "flagged-timeago-readable": "Означено заставицом (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Аутоматски означено заставицом] Примљено је %1 негативних гласова." } \ No newline at end of file diff --git a/public/language/sr/user.json b/public/language/sr/user.json index 385b346acc..4f53352bb8 100644 --- a/public/language/sr/user.json +++ b/public/language/sr/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Потврди одвајање", "sso.dissociate-confirm": "Да ли сте сигурни да желите да одвојите овај налог од %1?", "info.latest-flags": "Најновији означени заставицом", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Нема пронађених порука означених заставицом", "info.ban-history": "Историја недавно забрањених налога", "info.no-ban-history": "Овај корисник никада није био забрањен", diff --git a/public/language/sv/flags.json b/public/language/sv/flags.json index eb9a6520b0..edf03a3e44 100644 --- a/public/language/sv/flags.json +++ b/public/language/sv/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/sv/user.json b/public/language/sv/user.json index f77c46315d..ca6c60fc6d 100644 --- a/public/language/sv/user.json +++ b/public/language/sv/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Bekräfta frånkoppling", "sso.dissociate-confirm": "Är du säker att du vill koppla bort ditt konto från %1?", "info.latest-flags": "Senaste flaggade", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Inga flaggade inlägg hittades", "info.ban-history": "Ban historik", "info.no-ban-history": "Den här användaren har aldrig varit bannad", diff --git a/public/language/th/flags.json b/public/language/th/flags.json index ee734f96b8..f2f49f383c 100644 --- a/public/language/th/flags.json +++ b/public/language/th/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "จัดการทีละมากๆ", "bulk-resolve": "แก้ปัญหารายงาน", "bulk-success": "รายงาน %1 อันถูกอัพเดท", - "flagged-timeago-readable": "ถูกรายงานเมื่อ (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[รายงานอัตโนมัติ] ถูกโหวดลง %1 ครั้ง" } \ No newline at end of file diff --git a/public/language/th/user.json b/public/language/th/user.json index 89b129f11d..74d67f8a15 100644 --- a/public/language/th/user.json +++ b/public/language/th/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "ยืนยันการแยกตัวออก", "sso.dissociate-confirm": "คุณแน่ใจหรือไม่ว่าต้องการแยกบัญชีออกจาก %1?", "info.latest-flags": "รายงานล่าสุด", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "ไม่พบโพสต์ที่ถูกรายงาน", "info.ban-history": "ประวัติแบนล่าสุด", "info.no-ban-history": "ผู้ใช้นี้ถูกแบนแล้ว", diff --git a/public/language/tr/flags.json b/public/language/tr/flags.json index c5ca32a7ed..36ba7251f3 100644 --- a/public/language/tr/flags.json +++ b/public/language/tr/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Toplu Aksiyonlar", "bulk-resolve": "Şikayetleri Çözümle", "bulk-success": "%1 şikayet güncellendi", - "flagged-timeago-readable": "Şikayet Edilme Zamanı (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Otomatik Şikayet] %1 tane eksi oy aldı." } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 332805f4f4..8ea9fb9385 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Ayrışmayı Onayla", "sso.dissociate-confirm": "%1 'den ayrışmak istediğinizden emin misiniz?", "info.latest-flags": "Son Şikayetler", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Şikayet edilen bir ileti bulunamadı", "info.ban-history": "Yasaklama Geçmişi", "info.no-ban-history": "Bu kullanıcı daha önce hiç yasaklanmadı", diff --git a/public/language/uk/flags.json b/public/language/uk/flags.json index 985718c01e..38800b17e7 100644 --- a/public/language/uk/flags.json +++ b/public/language/uk/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/uk/user.json b/public/language/uk/user.json index 65b2893f93..8f712b26e1 100644 --- a/public/language/uk/user.json +++ b/public/language/uk/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Підтвердьте від'єднання", "sso.dissociate-confirm": "Ви впевнені, що хочете від'єднати свій акаунт від %1?", "info.latest-flags": "Останні скарги", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Не знайдено постів зі скаргами", "info.ban-history": "Історія банів", "info.no-ban-history": "Цього користувача ніколи не банили", diff --git a/public/language/vi/flags.json b/public/language/vi/flags.json index ef370696ee..9ab84ccb33 100644 --- a/public/language/vi/flags.json +++ b/public/language/vi/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "‎Hành động hàng loạt‎", "bulk-resolve": "Xử Lý Cờ", "bulk-success": "%1 cờ đã cập nhật", - "flagged-timeago-readable": "Đã Gắn Cờ (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Tự động được gắn cờ] Đã nhận được %1 phiếu phản đối." } \ No newline at end of file diff --git a/public/language/vi/user.json b/public/language/vi/user.json index 9601ae97e8..1480a91a23 100644 --- a/public/language/vi/user.json +++ b/public/language/vi/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "Xác nhận việc tách khỏi", "sso.dissociate-confirm": "Bạn có chắc chắn muốn tách tài khoản của mình khỏi %1?", "info.latest-flags": "Gắn cờ mới nhất", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "Không Tìm Thấy Bài Bị Gắn Cờ", "info.ban-history": "Lịch Sử Cấm Gần Đây", "info.no-ban-history": "Người dùng này chưa bao giờ bị cấm", diff --git a/public/language/zh-CN/flags.json b/public/language/zh-CN/flags.json index a0891c0768..9f215e5643 100644 --- a/public/language/zh-CN/flags.json +++ b/public/language/zh-CN/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "批量操作", "bulk-resolve": "处理举报", "bulk-success": "已更新%1个举报", - "flagged-timeago-readable": "被举报于 (%2) ", + "flagged-timeago": "Flagged ", "auto-flagged": "【自动举报】收到 %1 个踩" } \ No newline at end of file diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 569cb6ffe3..5ce0e61c62 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "确认解除关联", "sso.dissociate-confirm": "您确定您要将您的账号与 %1 解除关联吗?", "info.latest-flags": "最新举报", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "没有找到被举报的帖子", "info.ban-history": "最近封禁历史", "info.no-ban-history": "该用户从未被封禁", diff --git a/public/language/zh-TW/flags.json b/public/language/zh-TW/flags.json index b361076616..090984504c 100644 --- a/public/language/zh-TW/flags.json +++ b/public/language/zh-TW/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Bulk Actions", "bulk-resolve": "Resolve Flag(s)", "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)", + "flagged-timeago": "Flagged ", "auto-flagged": "[Auto Flagged] Received %1 downvotes." } \ No newline at end of file diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index aa80585d6d..5a08fe71d9 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -164,6 +164,10 @@ "sso.dissociate-confirm-title": "確認解除關聯", "sso.dissociate-confirm": "您確定要將您的帳戶與 %1 解除關聯嗎?", "info.latest-flags": "最新舉報", + "info.profile": "Profile", + "info.post": "Post", + "info.view-flag": "View flag", + "info.reported-by": "Reported by:", "info.no-flags": "沒有找到被舉報的貼文", "info.ban-history": "最近停權紀錄", "info.no-ban-history": "該使用者從未被停權", From 7d24b04b3b722dde92def5ef1760cfd68a1c590e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Apr 2024 13:00:47 -0400 Subject: [PATCH 70/80] feat: parse moderation notes as markdown https://github.com/NodeBB/NodeBB/issues/12477 --- public/src/client/account/info.js | 13 +++---------- src/socket.io/user.js | 1 + src/user/info.js | 13 ++++++------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/public/src/client/account/info.js b/public/src/client/account/info.js index 71adca7b11..f99bd7c36d 100644 --- a/public/src/client/account/info.js +++ b/public/src/client/account/info.js @@ -13,20 +13,13 @@ define('forum/account/info', ['forum/account/header', 'alerts', 'forum/account/s function handleModerationNote() { $('[component="account/save-moderation-note"]').on('click', function () { const note = $('[component="account/moderation-note"]').val(); - socket.emit('user.setModerationNote', { uid: ajaxify.data.uid, note: note }, function (err) { + socket.emit('user.setModerationNote', { uid: ajaxify.data.uid, note: note }, function (err, notes) { if (err) { return alerts.error(err); } $('[component="account/moderation-note"]').val(''); - alerts.success('[[user:info.moderation-note.success]]'); - const timestamp = Date.now(); - const data = [{ - note: utils.escapeHTML(note), - user: app.user, - timestamp: timestamp, - timestampISO: utils.toISOString(timestamp), - }]; - app.parseAndTranslate('account/info', 'moderationNotes', { moderationNotes: data }, function (html) { + + app.parseAndTranslate('account/info', 'moderationNotes', { moderationNotes: notes }, function (html) { $('[component="account/moderation-note/list"]').prepend(html); html.find('.timeago').timeago(); }); diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 443e73678f..63620247f9 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -152,6 +152,7 @@ SocketUser.setModerationNote = async function (socket, data) { } await user.appendModerationNote({ uid: data.uid, noteData }); + return await user.getModerationNotes(data.uid, 0, 0); }; SocketUser.deleteUpload = async function (socket, data) { diff --git a/src/user/info.js b/src/user/info.js index ff67dbd3cb..a013f746ff 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -7,6 +7,7 @@ const db = require('../database'); const posts = require('../posts'); const topics = require('../topics'); const utils = require('../utils'); +const plugins = require('../plugins'); const Flags = require('../flags'); module.exports = function (User) { @@ -114,22 +115,20 @@ module.exports = function (User) { const notes = await db.getObjects(keys); const uids = []; - const noteData = notes.map((note) => { + notes.forEach((note) => { if (note) { uids.push(note.uid); note.timestampISO = utils.toISOString(note.timestamp); - note.note = validator.escape(String(note.note)); } - return note; }); - const userData = await User.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture']); - noteData.forEach((note, index) => { + await Promise.all(notes.map(async (note, index) => { if (note) { + note.note = await plugins.hooks.fire('filter:parse.raw', String(note.note)); note.user = userData[index]; } - }); - return noteData; + })); + return notes; }; User.appendModerationNote = async ({ uid, noteData }) => { From ce9e1cf19b9cef5a4d18d9b8db9c508e35beff86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Apr 2024 13:17:50 -0400 Subject: [PATCH 71/80] cap number of posts checked activity pub returns 40k :lantern: --- src/topics/sorted.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/topics/sorted.js b/src/topics/sorted.js index 92cc2f6ed6..c2f916718e 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -85,7 +85,7 @@ module.exports = function (Topics) { } async function getTidsWithMostPostsInTerm(term) { - const pids = await db.getSortedSetRevRangeByScore('posts:pid', 0, -1, '+inf', Date.now() - Topics.getSinceFromTerm(term)); + const pids = await db.getSortedSetRevRangeByScore('posts:pid', 0, 1000, '+inf', Date.now() - Topics.getSinceFromTerm(term)); const postObjs = await db.getObjectsFields(pids.map(pid => `post:${pid}`), ['tid']); const tidToCount = {}; postObjs.forEach((post) => { From c73f759cf1bef9fe90a9a516c84d271778468949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Apr 2024 13:23:20 -0400 Subject: [PATCH 72/80] test: add back timestamp --- src/user/info.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/user/info.js b/src/user/info.js index a013f746ff..3fd1f725bb 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -75,6 +75,7 @@ module.exports = function (User) { flags.forEach((flag, idx) => { if (flag) { + flag.timestamp = flag.datetime; flag.timestampISO = new Date(flag.datetime).toISOString(); flag.reports = reports[idx]; } From fed5165ffb6fb1ed1f5613bd3179281101764ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 23 Apr 2024 13:31:35 -0400 Subject: [PATCH 73/80] test: fix moderation note test --- test/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/user.js b/test/user.js index 4d65ffaa64..668ec4ec8b 100644 --- a/test/user.js +++ b/test/user.js @@ -1683,7 +1683,7 @@ describe('User', () => { await setTimeout(50); await socketUser.setModerationNote({ uid: adminUid }, { uid: testUid, note: ' Date: Tue, 23 Apr 2024 13:42:14 -0400 Subject: [PATCH 74/80] test: fix redis tests --- src/user/info.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/user/info.js b/src/user/info.js index 3fd1f725bb..0fd4d756aa 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -75,8 +75,8 @@ module.exports = function (User) { flags.forEach((flag, idx) => { if (flag) { - flag.timestamp = flag.datetime; - flag.timestampISO = new Date(flag.datetime).toISOString(); + flag.timestamp = parseInt(flag.datetime, 10); + flag.timestampISO = utils.toISOString(flag.datetime); flag.reports = reports[idx]; } }); From d2175c6de3c45b1e06a17c5c345da97a047ba412 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 24 Apr 2024 09:19:15 +0000 Subject: [PATCH 75/80] Latest translations and fallbacks --- public/language/bg/flags.json | 2 +- public/language/bg/user.json | 14 +++++++------- public/language/pl/flags.json | 2 +- public/language/pl/user.json | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/language/bg/flags.json b/public/language/bg/flags.json index 57bb987197..e643d375dc 100644 --- a/public/language/bg/flags.json +++ b/public/language/bg/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Групови действия", "bulk-resolve": "Разрешаване на доклад(и)", "bulk-success": "%1 доклада са обновени", - "flagged-timeago": "Flagged ", + "flagged-timeago": "Докладвано ", "auto-flagged": "[Авт. докладвано] Получени %1 отрицателни гласа." } \ No newline at end of file diff --git a/public/language/bg/user.json b/public/language/bg/user.json index f2d228b54b..e7b3229bad 100644 --- a/public/language/bg/user.json +++ b/public/language/bg/user.json @@ -1,9 +1,9 @@ { "user-menu": "Потребителско меню", "banned": "Блокиран", - "unbanned": "Unbanned", + "unbanned": "Деблокиран", "muted": "Заглушен", - "unmuted": "Unmuted", + "unmuted": "Премахнато заглушаване", "offline": "Извън линия", "deleted": "Изтрит", "username": "Потребителско име", @@ -164,16 +164,16 @@ "sso.dissociate-confirm-title": "Потвърждаване на прекъсването", "sso.dissociate-confirm": "Наистина ли искате да прекъснете връзката на акаунта си от „%1“?", "info.latest-flags": "Последни доклади", - "info.profile": "Profile", - "info.post": "Post", - "info.view-flag": "View flag", - "info.reported-by": "Reported by:", + "info.profile": "Профил", + "info.post": "Публикация", + "info.view-flag": "Преглед на доклада", + "info.reported-by": "Докладвано от:", "info.no-flags": "Не са намерени докладвани публикации", "info.ban-history": "Скорошна история на блокиранията", "info.no-ban-history": "Този потребител никога не е бил блокиран", "info.banned-until": "Блокиран до %1", "info.banned-expiry": "Давност", - "info.ban-expired": "Ban expired", + "info.ban-expired": "Блокирането е изтекло", "info.banned-permanently": "Блокиран за постоянно", "info.banned-reason-label": "Причина", "info.banned-no-reason": "Няма посочена причина.", diff --git a/public/language/pl/flags.json b/public/language/pl/flags.json index 98105b291f..c85dab16da 100644 --- a/public/language/pl/flags.json +++ b/public/language/pl/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Operacje masowe", "bulk-resolve": "Oznacz flagi jako rozwiązane", "bulk-success": "Zaktualizowano %1 flag", - "flagged-timeago": "Flagged ", + "flagged-timeago": "Oznaczone ", "auto-flagged": "[Automatyczna Flaga] Otrzymano %1 głosów przeciw." } \ No newline at end of file diff --git a/public/language/pl/user.json b/public/language/pl/user.json index 482dbc8378..3a9018a475 100644 --- a/public/language/pl/user.json +++ b/public/language/pl/user.json @@ -164,10 +164,10 @@ "sso.dissociate-confirm-title": "Potwierdź odwiązanie", "sso.dissociate-confirm": "Czy na pewno odwiązać Twoje konto od %1?", "info.latest-flags": "Ostatnie flagi", - "info.profile": "Profile", - "info.post": "Post", - "info.view-flag": "View flag", - "info.reported-by": "Reported by:", + "info.profile": "Profil", + "info.post": "Wpis", + "info.view-flag": "Zobacz flagę", + "info.reported-by": "Zgłoszenie dodał:", "info.no-flags": "Brak oflagowanych postów", "info.ban-history": "Historia ostatnich banów", "info.no-ban-history": "Ten użytkownik nigdy nie był zbanowany", From af205cc48aa71c55b427a88cca14b7f756cfce1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 24 Apr 2024 11:10:04 -0400 Subject: [PATCH 76/80] feat: closes #12477, allow editing moderation notes --- install/package.json | 4 +-- public/src/client/account/info.js | 58 +++++++++++++++++++++++++++++-- src/socket.io/user.js | 20 +++++++++++ src/user/info.js | 12 ++++++- 4 files changed, 88 insertions(+), 6 deletions(-) diff --git a/install/package.json b/install/package.json index 8ff948229b..8f4aa6c862 100644 --- a/install/package.json +++ b/install/package.json @@ -103,10 +103,10 @@ "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.2", "nodebb-rewards-essentials": "1.0.0", - "nodebb-theme-harmony": "1.2.52", + "nodebb-theme-harmony": "1.2.53", "nodebb-theme-lavender": "7.1.8", "nodebb-theme-peace": "2.2.4", - "nodebb-theme-persona": "13.3.17", + "nodebb-theme-persona": "13.3.18", "nodebb-widget-essentials": "7.0.15", "nodemailer": "6.9.13", "nprogress": "0.2.0", diff --git a/public/src/client/account/info.js b/public/src/client/account/info.js index f99bd7c36d..f044860cd6 100644 --- a/public/src/client/account/info.js +++ b/public/src/client/account/info.js @@ -12,12 +12,16 @@ define('forum/account/info', ['forum/account/header', 'alerts', 'forum/account/s function handleModerationNote() { $('[component="account/save-moderation-note"]').on('click', function () { - const note = $('[component="account/moderation-note"]').val(); - socket.emit('user.setModerationNote', { uid: ajaxify.data.uid, note: note }, function (err, notes) { + const noteEl = $('[component="account/moderation-note"]'); + const note = noteEl.val(); + socket.emit('user.setModerationNote', { + uid: ajaxify.data.uid, + note: note, + }, function (err, notes) { if (err) { return alerts.error(err); } - $('[component="account/moderation-note"]').val(''); + noteEl.val(''); app.parseAndTranslate('account/info', 'moderationNotes', { moderationNotes: notes }, function (html) { $('[component="account/moderation-note/list"]').prepend(html); @@ -25,6 +29,54 @@ define('forum/account/info', ['forum/account/header', 'alerts', 'forum/account/s }); }); }); + + + $('[component="account/moderation-note/edit"]').on('click', function () { + const parent = $(this).parents('[data-id]'); + const contentArea = parent.find('[component="account/moderation-note/content-area"]'); + const editArea = parent.find('[component="account/moderation-note/edit-area"]'); + contentArea.addClass('hidden'); + editArea.removeClass('hidden'); + editArea.find('textarea').trigger('focus').putCursorAtEnd(); + }); + + $('[component="account/moderation-note/save-edit"]').on('click', function () { + const parent = $(this).parents('[data-id]'); + const contentArea = parent.find('[component="account/moderation-note/content-area"]'); + const editArea = parent.find('[component="account/moderation-note/edit-area"]'); + contentArea.removeClass('hidden'); + const textarea = editArea.find('textarea'); + + socket.emit('user.editModerationNote', { + uid: ajaxify.data.uid, + id: parent.attr('data-id'), + note: textarea.val(), + }, function (err, notes) { + if (err) { + return alerts.error(err); + } + textarea.css({ + height: textarea.prop('scrollHeight') + 'px', + }); + editArea.addClass('hidden'); + contentArea.find('.content').html(notes[0].note); + }); + }); + + $('[component="account/moderation-note/cancel-edit"]').on('click', function () { + const parent = $(this).parents('[data-id]'); + const contentArea = parent.find('[component="account/moderation-note/content-area"]'); + const editArea = parent.find('[component="account/moderation-note/edit-area"]'); + contentArea.removeClass('hidden'); + editArea.addClass('hidden'); + }); + + $('[component="account/moderation-note/edit-area"] textarea').each((i, el) => { + const $el = $(el); + $el.css({ + height: $el.prop('scrollHeight') + 'px', + }).parent().addClass('hidden'); + }); } return Info; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 63620247f9..51e5dc9f71 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -155,6 +155,26 @@ SocketUser.setModerationNote = async function (socket, data) { return await user.getModerationNotes(data.uid, 0, 0); }; +SocketUser.editModerationNote = async function (socket, data) { + if (!socket.uid || !data || !data.uid || !data.note || !data.id) { + throw new Error('[[error:invalid-data]]'); + } + const noteData = { + note: data.note, + timestamp: data.id, + }; + let canEdit = await privileges.users.canEdit(socket.uid, data.uid); + if (!canEdit) { + canEdit = await user.isModeratorOfAnyCategory(socket.uid); + } + if (!canEdit) { + throw new Error('[[error:no-privileges]]'); + } + + await user.setModerationNote({ uid: data.uid, noteData }); + return await user.getModerationNotesByIds(data.uid, [data.id]); +}; + SocketUser.deleteUpload = async function (socket, data) { if (!data || !data.name || !data.uid) { throw new Error('[[error:invalid-data]]'); diff --git a/src/user/info.js b/src/user/info.js index 0fd4d756aa..47de1154fb 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -112,12 +112,17 @@ module.exports = function (User) { User.getModerationNotes = async function (uid, start, stop) { const noteIds = await db.getSortedSetRevRange(`uid:${uid}:moderation:notes`, start, stop); + return await User.getModerationNotesByIds(uid, noteIds); + }; + + User.getModerationNotesByIds = async (uid, noteIds) => { const keys = noteIds.map(id => `uid:${uid}:moderation:note:${id}`); const notes = await db.getObjects(keys); const uids = []; - notes.forEach((note) => { + notes.forEach((note, idx) => { if (note) { + note.id = noteIds[idx]; uids.push(note.uid); note.timestampISO = utils.toISOString(note.timestamp); } @@ -125,6 +130,7 @@ module.exports = function (User) { const userData = await User.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture']); await Promise.all(notes.map(async (note, index) => { if (note) { + note.rawNote = validator.escape(String(note.note)); note.note = await plugins.hooks.fire('filter:parse.raw', String(note.note)); note.user = userData[index]; } @@ -136,4 +142,8 @@ module.exports = function (User) { await db.sortedSetAdd(`uid:${uid}:moderation:notes`, noteData.timestamp, noteData.timestamp); await db.setObject(`uid:${uid}:moderation:note:${noteData.timestamp}`, noteData); }; + + User.setModerationNote = async ({ uid, noteData }) => { + await db.setObject(`uid:${uid}:moderation:note:${noteData.timestamp}`, noteData); + }; }; From 19bd3eea5a0f00f2d83750fb112211c5fbbd4f55 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Thu, 25 Apr 2024 09:19:30 +0000 Subject: [PATCH 77/80] Latest translations and fallbacks --- public/language/tr/admin/advanced/events.json | 8 ++++---- public/language/tr/admin/manage/users.json | 2 +- public/language/tr/admin/settings/navigation.json | 2 +- public/language/tr/flags.json | 2 +- public/language/tr/user.json | 14 +++++++------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/language/tr/admin/advanced/events.json b/public/language/tr/admin/advanced/events.json index 4b626ccfd7..57cad49c65 100644 --- a/public/language/tr/admin/advanced/events.json +++ b/public/language/tr/admin/advanced/events.json @@ -9,9 +9,9 @@ "filter-type": "Aktivite türü", "filter-start": "Başlangıç zamanı", "filter-end": "Bitiş zamanı", - "filter-user": "Filter by User", - "filter-user.placeholder": "Type user name to filter...", - "filter-group": "Filter by Group", - "filter-group.placeholder": "Type group name to filter...", + "filter-user": "Kullanıcı ismine göre filtrele", + "filter-user.placeholder": "Filtrelemek için kullanıcı adı girin...", + "filter-group": "Gruba göre filtrele", + "filter-group.placeholder": "Filtrelemek için grup adı girin...", "filter-per-page": "Sayfa Başına" } \ No newline at end of file diff --git a/public/language/tr/admin/manage/users.json b/public/language/tr/admin/manage/users.json index 1c8111dab4..b383cb167c 100644 --- a/public/language/tr/admin/manage/users.json +++ b/public/language/tr/admin/manage/users.json @@ -122,7 +122,7 @@ "alerts.x-users-found": "%1 kullanıcı bulundu, (%2 saniye)", "alerts.select-a-single-user-to-change-email": "Select a single user to change email", "export": "Dışa Aktar", - "export-users-fields-title": "Select CSV Fields", + "export-users-fields-title": "CSV Alanlarını seçin", "export-field-email": "E-posta adresi", "export-field-username": "Kullanıcı Adı", "export-field-uid": "UID", diff --git a/public/language/tr/admin/settings/navigation.json b/public/language/tr/admin/settings/navigation.json index 53ad5ec5e2..f9c62511a6 100644 --- a/public/language/tr/admin/settings/navigation.json +++ b/public/language/tr/admin/settings/navigation.json @@ -10,7 +10,7 @@ "id": "ID: opsiyonel", "properties": "Özellikler:", - "show-to-groups": "Show to Groups:", + "show-to-groups": "Bu gruplara göster:", "open-new-window": "Yeni pencerede aç", "dropdown": "Açılır liste", "dropdown-placeholder": "Place your dropdown menu items below, ie:
<li><a class="dropdown-item" href="https://myforum.com">Link 1</a></li>", diff --git a/public/language/tr/flags.json b/public/language/tr/flags.json index 36ba7251f3..b0664c3c5e 100644 --- a/public/language/tr/flags.json +++ b/public/language/tr/flags.json @@ -90,6 +90,6 @@ "bulk-actions": "Toplu Aksiyonlar", "bulk-resolve": "Şikayetleri Çözümle", "bulk-success": "%1 şikayet güncellendi", - "flagged-timeago": "Flagged ", + "flagged-timeago": "Şikayet edildi ", "auto-flagged": "[Otomatik Şikayet] %1 tane eksi oy aldı." } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index 8ea9fb9385..19ff16fc21 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -1,9 +1,9 @@ { "user-menu": "Kullanıcı menüsü", "banned": "Yasaklı", - "unbanned": "Unbanned", + "unbanned": "Yasağı kaldırıldı", "muted": "Sessiz", - "unmuted": "Unmuted", + "unmuted": "Sesi açıldı", "offline": "Çevrimdışı", "deleted": "Silindi", "username": "Kullanıcı Adı", @@ -164,16 +164,16 @@ "sso.dissociate-confirm-title": "Ayrışmayı Onayla", "sso.dissociate-confirm": "%1 'den ayrışmak istediğinizden emin misiniz?", "info.latest-flags": "Son Şikayetler", - "info.profile": "Profile", - "info.post": "Post", - "info.view-flag": "View flag", - "info.reported-by": "Reported by:", + "info.profile": "Profil", + "info.post": "İleti", + "info.view-flag": "Şikayeti görüntüle", + "info.reported-by": "Şikayet eden:", "info.no-flags": "Şikayet edilen bir ileti bulunamadı", "info.ban-history": "Yasaklama Geçmişi", "info.no-ban-history": "Bu kullanıcı daha önce hiç yasaklanmadı", "info.banned-until": "Yasaklama süresi %1", "info.banned-expiry": "Bitiş", - "info.ban-expired": "Ban expired", + "info.ban-expired": "Yasak süresi bitti", "info.banned-permanently": "Kalıcı şekilde yasakla", "info.banned-reason-label": "Gerekçe", "info.banned-no-reason": "Gerekçe belirtilmedi.", From bc51968eaf1161a3721d7ab281fd9c9a6a1cde73 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 10:08:57 -0400 Subject: [PATCH 78/80] fix(deps): update dependency nodebb-plugin-composer-default to v10.2.34 (#12530) 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 8f4aa6c862..38814b7a43 100644 --- a/install/package.json +++ b/install/package.json @@ -94,7 +94,7 @@ "multiparty": "4.2.3", "nconf": "0.12.1", "nodebb-plugin-2factor": "7.5.0", - "nodebb-plugin-composer-default": "10.2.33", + "nodebb-plugin-composer-default": "10.2.34", "nodebb-plugin-dbsearch": "6.2.3", "nodebb-plugin-emoji": "5.1.15", "nodebb-plugin-emoji-android": "4.0.0", From dad57e04dea9d1f7dcb14a370cb4861abfbb632a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 10:09:15 -0400 Subject: [PATCH 79/80] chore(deps): update commitlint monorepo to v19.3.0 (#12526) 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 38814b7a43..5512653791 100644 --- a/install/package.json +++ b/install/package.json @@ -154,8 +154,8 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.1.0", - "@commitlint/cli": "19.2.2", - "@commitlint/config-angular": "19.2.2", + "@commitlint/cli": "19.3.0", + "@commitlint/config-angular": "19.3.0", "coveralls": "3.1.1", "eslint": "8.57.0", "eslint-config-nodebb": "0.2.1", From f764a3ea5c018db9686ef6c8a77804db793ba076 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 Apr 2024 11:15:23 -0400 Subject: [PATCH 80/80] use `cid::pids` instead of posts:pid --- src/topics/sorted.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/topics/sorted.js b/src/topics/sorted.js index c2f916718e..98292f0ddb 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -45,7 +45,7 @@ module.exports = function (Topics) { let tids = []; if (params.term !== 'alltime') { if (params.sort === 'posts') { - tids = await getTidsWithMostPostsInTerm(params.term); + tids = await getTidsWithMostPostsInTerm(params.cids, params.uid, params.term); } else { tids = await Topics.getLatestTidsFromSet('topics:tid', 0, -1, params.term); } @@ -84,8 +84,20 @@ module.exports = function (Topics) { return 'topics:recent'; } - async function getTidsWithMostPostsInTerm(term) { - const pids = await db.getSortedSetRevRangeByScore('posts:pid', 0, 1000, '+inf', Date.now() - Topics.getSinceFromTerm(term)); + async function getTidsWithMostPostsInTerm(cids, uid, term) { + if (Array.isArray(cids)) { + cids = await privileges.categories.filterCids('topics:read', cids, uid); + } else { + cids = await categories.getCidsByPrivilege('categories:cid', uid, 'topics:read'); + } + + const pids = await db.getSortedSetRevRangeByScore( + cids.map(cid => `cid:${cid}:pids`), + 0, + 1000, + '+inf', + Date.now() - Topics.getSinceFromTerm(term) + ); const postObjs = await db.getObjectsFields(pids.map(pid => `post:${pid}`), ['tid']); const tidToCount = {}; postObjs.forEach((post) => { @@ -93,7 +105,8 @@ module.exports = function (Topics) { tidToCount[post.tid] += 1; }); - return _.uniq(postObjs.map(post => String(post.tid))).sort((t1, t2) => tidToCount[t2] - tidToCount[t1]); + return _.uniq(postObjs.map(post => String(post.tid))) + .sort((t1, t2) => tidToCount[t2] - tidToCount[t1]); } async function getWatchedTopics(params) {