diff --git a/CHANGELOG.md b/CHANGELOG.md index 912eb3b51e..9a5a08358a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,62 @@ +#### v1.19.1 (2022-01-21) + +##### Chores + +* **deps:** + * bump compare-versions from 4.1.2 to 4.1.3 in /install (#10154) (4a5182e4) + * update dependency lint-staged to v12.2.2 (f090de36) + * update dependency @commitlint/cli to v16.1.0 (44d81a95) + * update dependency lint-staged to v12.2.1 (857ac480) + * update dependency @commitlint/cli to v16.0.3 (9c63d076) + * update dependency lint-staged to v12.2.0 (1a0c117d) + * update dependency eslint to v8.7.0 (8abaf3f6) + * update dependency mocha to v9.1.4 (f5ad173b) +* up persona (89871d71) +* add test.sh to gitignore (d7796f0b) +* delete test script (250274c7) +* remove unused lang key #10180 (2fe91e36) +* incrementing version number - v1.19.0 (18b0a29f) +* update changelog for v1.19.0 (c8f1bc53) +* **i18n:** + * fallback strings for new resources: nodebb.admin-settings-user (78cd6de7) + * fallback strings for new resources: nodebb.user (3ec9197c) + * fallback strings for new resources: nodebb.email (354aa1a5) + +##### New Features + +* revert label js change (1c80adf1) +* hide all categories link on flags filters (e9d0db28) +* nicer error handling for bad jwt in unsubscribe template (31ea2266) + +##### Bug Fixes + +* **deps:** + * update dependency jquery-ui to v1.13.1 (#10186) (55b3a355) + * update dependency multiparty to v4.2.3 (#10188) (7fa2ba70) + * update dependency nodebb-theme-persona to v11.3.15 (#10155) (e03d4747) + * update dependency mongodb to v4.3.1 (#10178) (693ca1f1) + * update dependency nodebb-plugin-composer-default to v7.0.18 (#10164) (2c75cce6) +* urls used when recent/unread/popular/top is used as the homepage (28359665) +* mark unread button showing the selected category (fdfafb44) +* catch exceptions from sendNotifications (c1ec2047) +* multiple cid filter on flags page (3e8cb732) +* post indices if there is a blocked user in topic (f9279b63) +* dont add duplicate link backs (3b72ff87) +* #10175, fix topic linkbacks duplicating on post edit (b06c6329) +* #10173, don't show optional message if email is required (d1eb21c5) +* #10172, fix postqueue accept/reject notification text (6a75ed50) +* #10167, fix regression prevent guest post (4799efc7) +* CSRF handler to go back to saving in session (#10159) (e9ee843b) +* #10158, fix extra padding (03f5cbcc) + +##### Refactors + +* add method to error messages (c9fabb0e) + +##### Tests + +* add failing guest csrf test (#10169) (10949184) + #### v1.19.0 (2022-01-13) ##### Breaking Changes diff --git a/install/data/defaults.json b/install/data/defaults.json index 6bf502abe1..2eb0a15bb1 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -141,11 +141,14 @@ "sendValidationEmail": 1, "includeUnverifiedEmails": 0, "emailPrompt": 1, + "sendEmailToBanned": 0, "requireEmailAddress": 0, "inviteExpiration": 7, "dailyDigestFreq": "off", "digestHour": 17, "passwordExpiryDays": 0, + "cross-origin-embedder-policy": 0, + "cross-origin-resource-policy": "same-origin", "hsts-maxage": 31536000, "hsts-subdomains": 0, "hsts-preload": 0, diff --git a/install/package.json b/install/package.json index 0a7faddce1..ff4aa39eb3 100644 --- a/install/package.json +++ b/install/package.json @@ -29,7 +29,7 @@ }, "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", - "ace-builds": "1.4.13", + "ace-builds": "1.4.14", "archiver": "5.3.0", "async": "3.2.3", "autoprefixer": "10.4.2", @@ -38,9 +38,10 @@ "body-parser": "1.19.1", "bootbox": "5.5.2", "bootstrap": "3.4.1", + "chalk": "4.1.2", "chart.js": "2.9.4", "cli-graph": "3.2.2", - "clipboard": "2.0.8", + "clipboard": "2.0.10", "colors": "1.4.0", "commander": "7.2.0", "compare-versions": "4.1.3", @@ -49,7 +50,7 @@ "connect-mongo": "4.6.0", "connect-multiparty": "2.2.0", "connect-pg-simple": "7.0.0", - "connect-redis": "6.0.0", + "connect-redis": "6.1.1", "cookie-parser": "1.4.6", "cron": "1.8.2", "cropperjs": "1.5.12", @@ -60,7 +61,7 @@ "express-session": "1.17.2", "express-useragent": "1.0.15", "graceful-fs": "4.2.9", - "helmet": "4.6.0", + "helmet": "5.0.2", "html-to-text": "8.1.0", "ipaddr.js": "2.0.1", "jquery": "3.6.0", @@ -85,40 +86,41 @@ "@nodebb/bootswatch": "3.4.2", "nconf": "0.11.3", "nodebb-plugin-2factor": "3.0.4", - "nodebb-plugin-composer-default": "7.0.18", + "nodebb-plugin-composer-default": "7.0.20", "nodebb-plugin-dbsearch": "5.1.1", - "nodebb-plugin-emoji": "3.5.4", + "nodebb-plugin-emoji": "3.5.9", "nodebb-plugin-emoji-android": "2.0.5", - "nodebb-plugin-markdown": "8.14.6", + "nodebb-plugin-markdown": "9.0.5", "nodebb-plugin-mentions": "3.0.4", "nodebb-plugin-spam-be-gone": "0.7.12", "nodebb-rewards-essentials": "0.2.1", "nodebb-theme-lavender": "5.3.2", - "nodebb-theme-persona": "11.3.18", + "nodebb-theme-persona": "11.3.38", "nodebb-theme-slick": "1.4.23", - "nodebb-theme-vanilla": "12.1.16", - "nodebb-widget-essentials": "5.0.4", + "nodebb-theme-vanilla": "12.1.17", + "nodebb-widget-essentials": "5.0.7", "nodemailer": "6.7.2", "nprogress": "0.2.0", "passport": "0.5.2", "passport-http-bearer": "1.0.1", "passport-local": "1.0.0", - "pg": "8.7.1", - "pg-cursor": "2.7.1", - "postcss": "8.4.5", + "pg": "8.7.3", + "pg-cursor": "2.7.3", + "postcss": "8.4.6", "postcss-clean": "1.2.0", "prompt": "1.2.1", - "ioredis": "4.28.3", + "punycode": "2.1.1", + "ioredis": "4.28.5", "request": "2.88.2", "request-promise-native": "1.0.9", "requirejs": "2.3.6", "rimraf": "3.0.2", "rss": "1.2.2", - "sanitize-html": "2.6.1", + "sanitize-html": "2.7.0", "semver": "7.3.5", "serve-favicon": "2.5.0", - "sharp": "0.29.3", - "sitemap": "7.1.0", + "sharp": "0.30.1", + "sitemap": "7.1.1", "slideout": "1.0.1", "socket.io": "4.4.1", "socket.io-adapter-cluster": "1.0.1", @@ -135,7 +137,7 @@ "uglify-es": "3.3.9", "validator": "13.7.0", "visibilityjs": "2.0.2", - "winston": "3.4.0", + "winston": "3.5.1", "xml": "1.0.1", "xregexp": "5.1.0", "yargs": "17.3.1", @@ -146,15 +148,15 @@ "@commitlint/cli": "16.1.0", "@commitlint/config-angular": "16.0.0", "coveralls": "3.1.1", - "eslint": "8.7.0", + "eslint": "8.8.0", "eslint-config-nodebb": "0.1.1", "eslint-plugin-import": "2.25.4", "grunt": "1.4.1", "grunt-contrib-watch": "1.1.0", "husky": "7.0.4", "jsdom": "19.0.0", - "lint-staged": "12.2.2", - "mocha": "9.1.4", + "lint-staged": "12.3.3", + "mocha": "9.2.0", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", "nyc": "15.1.0", @@ -183,4 +185,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} diff --git a/public/language/ar/admin/settings/advanced.json b/public/language/ar/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/ar/admin/settings/advanced.json +++ b/public/language/ar/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/ar/admin/settings/email.json b/public/language/ar/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/ar/admin/settings/email.json +++ b/public/language/ar/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/ar/global.json b/public/language/ar/global.json index 54556a2eaf..a9205b9dfd 100644 --- a/public/language/ar/global.json +++ b/public/language/ar/global.json @@ -56,6 +56,7 @@ "posts": "المشاركات", "x-posts": "%1 posts", "best": "الأفضل", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/ar/modules.json b/public/language/ar/modules.json index 4202bf0ecd..588a0eeb5c 100644 --- a/public/language/ar/modules.json +++ b/public/language/ar/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "أكتب رسالة دردشة هنا، اضغط ENTER للإرسال", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "أرسل", "chat.no_active": "لا يوجد لديك دردشات نشطة.", diff --git a/public/language/ar/pages.json b/public/language/ar/pages.json index 356ec54c2b..0810992571 100644 --- a/public/language/ar/pages.json +++ b/public/language/ar/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/ar/users.json b/public/language/ar/users.json index 23e893d228..e7e1990e2f 100644 --- a/public/language/ar/users.json +++ b/public/language/ar/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "بحث", "enter_username": "أدخل اسم مستخدم للبحث", + "search-user-for-chat": "ابحث عن مستخدم لبدء محادثة ", "load_more": "حمل المزيد", "users-found-search-took": "تم إيجاد %1 مستخدمـ(ين)! استغرق البحث %2 ثانية.", "filter-by": "Filter By", diff --git a/public/language/bg/admin/settings/advanced.json b/public/language/bg/admin/settings/advanced.json index 03f075ade7..4a4baa8bc8 100644 --- a/public/language/bg/admin/settings/advanced.json +++ b/public/language/bg/admin/settings/advanced.json @@ -8,13 +8,16 @@ "headers.csp-frame-ancestors": "Задайте заглавката „Content-Security-Policy frame-ancestors“ за да поставите NodeBB „iFrame“", "headers.csp-frame-ancestors-help": "„none“ (нищо), „self“ (себе си – по подразбиране) или списък от позволени адреси.", "headers.powered-by": "Персонализиране на заглавната част „Захранван от“, която се изпраща от NodeBB", - "headers.acao": "Произход за разрешаване на управлението на достъпа", - "headers.acao-regex": "Регулярен израз за произхода за разрешаване на управлението на достъпа", + "headers.acao": "Access-Control-Allow-Origin", + "headers.acao-regex": "Регулярен израз за „Access-Control-Allow-Origin“", "headers.acao-help": "За да забраните достъпа до всички уеб сайтове, оставете празно", "headers.acao-regex-help": "Въведете регулярен израз за съвпадение с динамичните произходи. За да забраните достъпа на всички уеб сайтове, оставете това празно.", - "headers.acac": "Удостоверителни данни за разрешаване на управлението на достъпа", + "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Методи за разрешаване на управлението на достъпа", - "headers.acah": "Заглавки за разрешаване на управлението на достъпа", + "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "Когато е включено (по подразбиране), стойността на заглавката ще бъде require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Стриктна транспортна сигурност", "hsts.enabled": "Включване на HSTS (препоръчително)", "hsts.maxAge": "Максимална възраст на HSTS", diff --git a/public/language/bg/admin/settings/email.json b/public/language/bg/admin/settings/email.json index d6b284551d..e278278e06 100644 --- a/public/language/bg/admin/settings/email.json +++ b/public/language/bg/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Изпращане на е-писма към получатели, които не са потвърдили изрично е-пощата си", "include-unverified-warning": "За потребителите, които имат свързана е-поща с регистрацията си, тя се смята за потвърдена. Но има ситуации, в които това не е така (например при ползване на регистрация от друга система, но и в други случаи), Включете тази настройка на собствен риск – изпращането на е-писма към непотвърдени адреси може да нарушава определени местни закони против нежеланата поща.", "prompt": "Подсещане на потребителите да въведат или потвърдят е-пощата си", - "prompt-help": "Ако потребител няма зададена е-поща, или ако тя не е потвърдена, на екрана му ще се покаже предупредително съобщение." + "prompt-help": "Ако потребител няма зададена е-поща, или ако тя не е потвърдена, на екрана му ще се покаже предупредително съобщение.", + "sendEmailToBanned": "Изпращане на е-писма дори до блокираните потребители" } diff --git a/public/language/bg/global.json b/public/language/bg/global.json index 9b92a798e3..87aa5c7190 100644 --- a/public/language/bg/global.json +++ b/public/language/bg/global.json @@ -56,6 +56,7 @@ "posts": "Публ.", "x-posts": "%1 публикации", "best": "Най-добри", + "controversial": "Противоречиви", "votes": "Гласове", "x-votes": "%1 гласа", "voters": "Гласували", diff --git a/public/language/bg/modules.json b/public/language/bg/modules.json index 88ba1f5dfd..514d1dbe4b 100644 --- a/public/language/bg/modules.json +++ b/public/language/bg/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Разговор с", - "chat.placeholder": "Въведете съобщението тук и натиснете Ентер за изпращане", + "chat.placeholder": "Въведете съобщение тук или пуснете снимки и натиснете Ентер за изпращане", "chat.scroll-up-alert": "В момента разглеждате по-стари съобщения. Щракнете тук, за да се прехвърлите към най-новото съобщение.", "chat.send": "Изпращане", "chat.no_active": "Нямате текущи разговори.", diff --git a/public/language/bg/pages.json b/public/language/bg/pages.json index 0aea3e499a..cf22a19cdb 100644 --- a/public/language/bg/pages.json +++ b/public/language/bg/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Публикации, получили положителен глас от %1", "account/downvoted": "Публикации, получили отрицателен глас от %1", "account/best": "Най-добрите публикации от %1", + "account/controversial": "Противоречиви публикации от %1", "account/blocks": "Блокирани потребители за %1", "account/uploads": "Качвания от %1", "account/sessions": "Сесии на вписване", diff --git a/public/language/bg/users.json b/public/language/bg/users.json index 1d747cd9cb..9cd2dbb5ed 100644 --- a/public/language/bg/users.json +++ b/public/language/bg/users.json @@ -5,6 +5,7 @@ "most_flags": "С най-много доклади", "search": "Търсене", "enter_username": "Въведете потребителско име, което да потърсите", + "search-user-for-chat": "Потърсете потребител, с когото да започнете разговор", "load_more": "Зареждане на още", "users-found-search-took": "Намерени са %1 потребител(и)! Търсенето отне %2 секунди.", "filter-by": "Филтриране", diff --git a/public/language/bn/admin/settings/advanced.json b/public/language/bn/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/bn/admin/settings/advanced.json +++ b/public/language/bn/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/bn/admin/settings/email.json b/public/language/bn/admin/settings/email.json index df2081c946..a91248b70b 100644 --- a/public/language/bn/admin/settings/email.json +++ b/public/language/bn/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/bn/global.json b/public/language/bn/global.json index fdb9eab18f..b4035b3f5f 100644 --- a/public/language/bn/global.json +++ b/public/language/bn/global.json @@ -56,6 +56,7 @@ "posts": "পোস্টগুলি", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/bn/modules.json b/public/language/bn/modules.json index 2cdf1a7174..4680d67ba8 100644 --- a/public/language/bn/modules.json +++ b/public/language/bn/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "এখানে আপনার বার্তা লিখুন। পাঠানোর জন্য Enter চাপুন", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "প্রেরন করুন", "chat.no_active": "আপনার কোন সচল কথোপকথন নেই", diff --git a/public/language/bn/pages.json b/public/language/bn/pages.json index fa2e9ca03d..bb4887abc8 100644 --- a/public/language/bn/pages.json +++ b/public/language/bn/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/bn/users.json b/public/language/bn/users.json index 5ad81d1aa9..98fe38b601 100644 --- a/public/language/bn/users.json +++ b/public/language/bn/users.json @@ -5,6 +5,7 @@ "most_flags": "সর্বোচ্চ অভিযোগ", "search": "খুঁজুন", "enter_username": "ইউজারনেম এর ভিত্তিতে সার্চ করুন", + "search-user-for-chat": "Search a user to start chat", "load_more": "আরো লোড করুন", "users-found-search-took": "%1 জন সদস্য(দের) খুঁজে পাওয়া গেছে। খুঁজতে সময় লেগেছে %2 সেকেন্ড ", "filter-by": "ফিল্টার করার ধরন", diff --git a/public/language/cs/admin/settings/advanced.json b/public/language/cs/admin/settings/advanced.json index b9dafadf1e..5d55bdfc23 100644 --- a/public/language/cs/admin/settings/advanced.json +++ b/public/language/cs/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Přísné zabezpečení přenosu", "hsts.enabled": "Povolit HSTS (doporučeno)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/cs/admin/settings/email.json b/public/language/cs/admin/settings/email.json index 682a5ad311..f85fb11734 100644 --- a/public/language/cs/admin/settings/email.json +++ b/public/language/cs/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/cs/global.json b/public/language/cs/global.json index 8f227beb12..2c4ff54a80 100644 --- a/public/language/cs/global.json +++ b/public/language/cs/global.json @@ -56,6 +56,7 @@ "posts": "Příspěvky", "x-posts": "%1 posts", "best": "Nejlepší", + "controversial": "Controversial", "votes": "Počet hlasů", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index cb6feed8fe..bdd6e117ad 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Konverzace s", - "chat.placeholder": "Konverzační zprávu napište zde, pro odeslání stiskněte klávesu Enter", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Odeslat", "chat.no_active": "Nemáte žádné aktivní konverzace.", diff --git a/public/language/cs/pages.json b/public/language/cs/pages.json index c4bda3dd32..8b3e38baa0 100644 --- a/public/language/cs/pages.json +++ b/public/language/cs/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Souhlasí s příspěvkem %1", "account/downvoted": "Nesouhlasí s příspěvkem %1", "account/best": "Nejlepší příspěvky od %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Zablokovaní uživatelé z %1", "account/uploads": "Nahráno od %1", "account/sessions": "Relace s přihlášením", diff --git a/public/language/cs/users.json b/public/language/cs/users.json index b70ffdff7b..3ef1b712cf 100644 --- a/public/language/cs/users.json +++ b/public/language/cs/users.json @@ -5,6 +5,7 @@ "most_flags": "Nejoznačovanější", "search": "Hledat", "enter_username": "Zadej uživatelské jméno k hledání", + "search-user-for-chat": "Search a user to start chat", "load_more": "Načíst další", "users-found-search-took": "Nalezeno %1 uživatel(ů) za %2 vteřiny.", "filter-by": "Filtrovat dle", diff --git a/public/language/da/admin/settings/advanced.json b/public/language/da/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/da/admin/settings/advanced.json +++ b/public/language/da/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/da/admin/settings/email.json b/public/language/da/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/da/admin/settings/email.json +++ b/public/language/da/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/da/global.json b/public/language/da/global.json index 7f4864eff6..4f05e26e39 100644 --- a/public/language/da/global.json +++ b/public/language/da/global.json @@ -56,6 +56,7 @@ "posts": "Indlæg", "x-posts": "%1 posts", "best": "Bedste", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/da/modules.json b/public/language/da/modules.json index 332d16fdd3..bf5d0c18a5 100644 --- a/public/language/da/modules.json +++ b/public/language/da/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Skriv din chatbesked her, tryk enter for at sende", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Send", "chat.no_active": "Du har ingen aktive chats.", diff --git a/public/language/da/pages.json b/public/language/da/pages.json index d0403eea84..70d679b9e7 100644 --- a/public/language/da/pages.json +++ b/public/language/da/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Indlæg syntes godt om af %1", "account/downvoted": "Indlæg syntes ikke godt om af %1", "account/best": "Bedste indlæg skrevet af %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/da/users.json b/public/language/da/users.json index d9db1f8fcc..3f1781572f 100644 --- a/public/language/da/users.json +++ b/public/language/da/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Søg", "enter_username": "Indtast brugernavn for at søge", + "search-user-for-chat": "Search a user to start chat", "load_more": "Indlæs mere", "users-found-search-took": "%1 bruger(e) fundet! Søgning tog %2 sekunder.", "filter-by": "Filtre Efter", diff --git a/public/language/de/admin/dashboard.json b/public/language/de/admin/dashboard.json index 5b4bcf4bf5..97906ea076 100644 --- a/public/language/de/admin/dashboard.json +++ b/public/language/de/admin/dashboard.json @@ -56,8 +56,8 @@ "active-users.total": "Gesamt", "active-users.connections": "Verbindungen", - "guest-registered-users": "Guest vs Registered Users", - "guest": "Guest", + "guest-registered-users": "Gast vs. registrierte Benutzer", + "guest": "Gast", "registered": "Registriert", "user-presence": "Benutzerpräsenz", @@ -68,7 +68,7 @@ "unread": "Ungelesen", "high-presence-topics": "Meist besuchte Themen", - "popular-searches": "Popular Searches", + "popular-searches": "Beliebte Suchanfragen", "graphs.page-views": "Seitenaufrufe", "graphs.page-views-registered": "Registrierte Seitenaufrufe", @@ -76,14 +76,14 @@ "graphs.page-views-bot": "Seitenaufrufe von Bots", "graphs.unique-visitors": "Verschiedene Besucher", "graphs.registered-users": "Registrierte Benutzer", - "graphs.guest-users": "Guest Users", + "graphs.guest-users": "Gast-Benutzer", "last-restarted-by": "Zuletzt Neugestartet von: ", "no-users-browsing": "Keine aktiven Benutzer", "back-to-dashboard": "Zurück zur Übersicht", "details.no-users": "Keine Benutzer sind im gewählten Zeitraum beigetreten", "details.no-topics": "Keine Themen wurden im gewählten Zeitraum beigetreten", - "details.no-searches": "No searches have been made yet", + "details.no-searches": "Es wurden noch keine Suchen durchgeführt", "details.no-logins": "Keine Logins wurden im gewählten Zeitraum festgestellt", "details.logins-static": "NodeBB speichert Sitzungsdaten nur für %1 Tage, deshalb zeigt die untere Tabelle nur die neuesten, aktiven Sitzungen", "details.logins-login-time": "Anmelde Zeit" diff --git a/public/language/de/admin/development/info.json b/public/language/de/admin/development/info.json index c0b65f6781..082f1b212c 100644 --- a/public/language/de/admin/development/info.json +++ b/public/language/de/admin/development/info.json @@ -8,11 +8,11 @@ "nodejs": "Node.js Version", "online": "Online", "git": "git", - "process-memory": "process memory", - "system-memory": "system memory", - "used-memory-process": "Used memory by process", - "used-memory-os": "Used system memory", - "total-memory-os": "Total system memory", + "process-memory": "Prozess-Speicher", + "system-memory": "System-Speicher", + "used-memory-process": "Verwendeter Prozess-Speicher", + "used-memory-os": "Verwendeter System-Speicher", + "total-memory-os": "Gesamter System-Speicher", "load": "Systemlast", "cpu-usage": "CPU Benutzung", "uptime": "Uptime", diff --git a/public/language/de/admin/manage/privileges.json b/public/language/de/admin/manage/privileges.json index 818fc0bfce..777cb8404f 100644 --- a/public/language/de/admin/manage/privileges.json +++ b/public/language/de/admin/manage/privileges.json @@ -52,9 +52,9 @@ "alert.confirm-discard": "Bist du sicher, dass du die Änderungen an den Rechten verwerfen möchtest?", "alert.discarded": "Änderungen an Rechten verworfen", "alert.confirm-copyToAll": "Bist Du dir sicher, dass Du die Rechte von %1 auf alle Kategorien anwenden möchtest?", - "alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's set of %1 to all categories?", - "alert.confirm-copyToChildren": "Are you sure you wish to apply this set of %1 to all descendant (child) categories?", - "alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's set of %1 to all descendant (child) categories?", + "alert.confirm-copyToAllGroup": "Bist Du dir sicher, dass Du diesen Gruppen-Satz %1 auf alle Kategorien anwenden möchtest?", + "alert.confirm-copyToChildren": "Bist Du dir sicher, dass Du diesen Satz von %1 auf alle (untergeordneten) Kategorien anwenden möchtest?", + "alert.confirm-copyToChildrenGroup": "Bist Du dir sicher, dass Du den Gruppen-Satz von %1 auf alle (untergeordneten) Kategorien anwenden möchten?", "alert.no-undo": "Dieser Vorgang kann nicht rückgängig gemacht werden.", "alert.admin-warning": "Administratoren erhalten implizit alle Berechtigungen", "alert.copyPrivilegesFrom-title": "Wähle eine Kategorie aus, aus der kopiert werden soll", diff --git a/public/language/de/admin/manage/users.json b/public/language/de/admin/manage/users.json index d426fdedfe..ec5fe6807a 100644 --- a/public/language/de/admin/manage/users.json +++ b/public/language/de/admin/manage/users.json @@ -93,8 +93,8 @@ "alerts.confirm-delete": "Warning!

Do you really want to delete user(s)?

This action is not reversible! Only the user account will be deleted, their posts and topics will remain.

", "alerts.delete-success": "Benutzer gelöscht!", "alerts.confirm-delete-content": "Warning!

Do you really want to delete these user(s) content?

This action is not reversible! The users' accounts will remain, but their posts and topics will be deleted.

", - "alerts.delete-content-success": "User(s) Content Deleted!", - "alerts.confirm-purge": "Warning!

Do you really want to delete user(s) and their content?

This action is not reversible! All user data and content will be erased!

", + "alerts.delete-content-success": "Beiträge des/der Nutzer(s) gelöscht!", + "alerts.confirm-purge": "Warnung!

Bist du sicher, dass Du den/die Nutzer und deren Beiträge löschen möchtest?

Diese Aktion kann nicht rückgängig gemacht werden! Alle Nutzerdaten und Beiträge werden dabei gelöscht!

", "alerts.create": "Nutzer Erstellen", "alerts.button-create": "Erstellen", "alerts.button-cancel": "Abbrechen", @@ -104,7 +104,7 @@ "alerts.prompt-email": "E-Mails:", "alerts.email-sent-to": "Eine Einladungsemail wurde an %1 gesendet", - "alerts.x-users-found": "%1 user(s) found, (%2 seconds)", + "alerts.x-users-found": "%1 Benutzer gefunden, (%2 Sekunden)", "export-users-started": "Der Export von Benutzern als CSV kann eine Weile dauern. Sie erhalten eine Benachrichtigung, wenn es abgeschlossen ist.", "export-users-completed": "Benutzer wurden als CSV exportiert, klicken Sie hier, um sie herunterzuladen." } \ No newline at end of file diff --git a/public/language/de/admin/menu.json b/public/language/de/admin/menu.json index ec21748e22..22374645f0 100644 --- a/public/language/de/admin/menu.json +++ b/public/language/de/admin/menu.json @@ -1,10 +1,10 @@ { "section-dashboard": "Dashboards", - "dashboard/overview": "Overview", - "dashboard/logins": "Logins", - "dashboard/users": "Users", - "dashboard/topics": "Topics", - "dashboard/searches": "Searches", + "dashboard/overview": "Übersicht", + "dashboard/logins": "Anmeldungen", + "dashboard/users": "Benutzer", + "dashboard/topics": "Themen", + "dashboard/searches": "Suchen", "section-general": "Allgemein", "section-manage": "Verwalten", @@ -76,7 +76,7 @@ "logout": "Abmelden", "view-forum": "Forum anzeigen", - "search.placeholder": "Press "/" to search for settings", + "search.placeholder": "Drücke "/" um nach Einstellungen zu suchen", "search.no-results": "Keine Ergebnisse...", "search.search-forum": "Suche im Forum nach ", "search.keep-typing": "Gib mehr ein, um die Ergebnisse zu sehen...", diff --git a/public/language/de/admin/settings/advanced.json b/public/language/de/admin/settings/advanced.json index 3dbfb99e11..48930e5cf7 100644 --- a/public/language/de/admin/settings/advanced.json +++ b/public/language/de/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "HSTS Aktivieren (empfohlen)", "hsts.maxAge": "HSTS Maximales Alter", diff --git a/public/language/de/admin/settings/email.json b/public/language/de/admin/settings/email.json index 7467e2ca3f..a16fda4bde 100644 --- a/public/language/de/admin/settings/email.json +++ b/public/language/de/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/de/global.json b/public/language/de/global.json index 629ed5497c..7b54201cd5 100644 --- a/public/language/de/global.json +++ b/public/language/de/global.json @@ -56,6 +56,7 @@ "posts": "Beiträge", "x-posts": "%1 Beiträge", "best": "Bestbewertet", + "controversial": "Controversial", "votes": "Stimmen", "x-votes": "%1 Stimmen", "voters": "Wähler", diff --git a/public/language/de/modules.json b/public/language/de/modules.json index 9de41e4370..91f74cb118 100644 --- a/public/language/de/modules.json +++ b/public/language/de/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat mit", - "chat.placeholder": "Schreibe hier etwas, und drücke Enter zum Absenden.", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Diese Nachrichten sind möglicherweise veraltet, klicke hier um neuere Nachrichten anzuzeigen.", "chat.send": "Senden", "chat.no_active": "Du hast keine aktiven Chats.", diff --git a/public/language/de/pages.json b/public/language/de/pages.json index dcfa752e46..566a9dbb0f 100644 --- a/public/language/de/pages.json +++ b/public/language/de/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Von %1 positiv bewertete Beiträge", "account/downvoted": "Von %1 negativ bewertete Beiträge", "account/best": "Bestbewertete Beiträge von %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Für %1 geblockte Benutzer", "account/uploads": "Uploads von %1", "account/sessions": "Login-Sitzungen", diff --git a/public/language/de/tags.json b/public/language/de/tags.json index a2b6225376..b4f3f56d71 100644 --- a/public/language/de/tags.json +++ b/public/language/de/tags.json @@ -4,5 +4,5 @@ "enter_tags_here": "Hier Schlagworte eingeben. Jeweils %1 bis %2 Zeichen.", "enter_tags_here_short": "Schlagworte eingeben...", "no_tags": "Es gibt noch keine Schlagworte.", - "select_tags": "Schlagwort auswählen" + "select_tags": "Schlagworte auswählen" } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index bbff0a941b..56e77395ae 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -15,7 +15,7 @@ "delete_account": "Konto löschen", "delete_account_as_admin": "Konto löschen", "delete_content": "Konto-Inhalt löschen", - "delete_all": "Konto undInhalt löschen", + "delete_all": "Konto und Inhalt löschen", "delete_account_confirm": "Bist du sicher, dass du diesen Account löschen und deine Beiträge anonymisieren mnöchtest?
Diese Aktion kann nicht rückgängig gemacht werden und die Daten können nicht wiederhergestellt werden.

Gib dein Passwort ein um das Löschen des Accounts zu bestätigen.", "delete_this_account_confirm": "Bist du sicher, dass du diesen Account löschen und seine Inhalte beibehalten möchstes?
Diese Aktion kann nicht rückgängig gemacht werden. Beiträge werden anonymisiert und können nicht wieder mit dem gelöschten Account verknüpft werden.

", "delete_account_content_confirm": "Bist du sicher, dass du die Inhalte dieses Accounts (Beiträge/Themen/Uploads) löschen möchtest?
Diese Aktion ist irreversibel und die Daten können nicht wiederhergestellt werden.

", diff --git a/public/language/de/users.json b/public/language/de/users.json index 95f5a9f549..3a5fb66bbc 100644 --- a/public/language/de/users.json +++ b/public/language/de/users.json @@ -5,6 +5,7 @@ "most_flags": "Meiste Meldungen", "search": "Suchen", "enter_username": "Benutzer durchsuchen", + "search-user-for-chat": "Search a user to start chat", "load_more": "Mehr laden", "users-found-search-took": "%1 Benutzer gefunden! Die Suche dauerte %2 s.", "filter-by": "Filtern nach", diff --git a/public/language/el/admin/settings/advanced.json b/public/language/el/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/el/admin/settings/advanced.json +++ b/public/language/el/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/el/admin/settings/email.json b/public/language/el/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/el/admin/settings/email.json +++ b/public/language/el/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/el/global.json b/public/language/el/global.json index 3aa4da23d7..9e07313feb 100644 --- a/public/language/el/global.json +++ b/public/language/el/global.json @@ -56,6 +56,7 @@ "posts": "Δημοσιεύσεις", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/el/modules.json b/public/language/el/modules.json index 27597124e4..bf7a310839 100644 --- a/public/language/el/modules.json +++ b/public/language/el/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Send", "chat.no_active": "You have no active chats.", diff --git a/public/language/el/pages.json b/public/language/el/pages.json index 634b0dcea2..1f878dc456 100644 --- a/public/language/el/pages.json +++ b/public/language/el/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/el/users.json b/public/language/el/users.json index a9fd6501e5..cef10bde03 100644 --- a/public/language/el/users.json +++ b/public/language/el/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Αναζήτηση", "enter_username": "Γράψε ένα όνομα χρήστη προς αναζήτηση", + "search-user-for-chat": "Search a user to start chat", "load_more": "Φόρτωση περισσότερων", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", diff --git a/public/language/en-GB/admin/settings/advanced.json b/public/language/en-GB/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/en-GB/admin/settings/advanced.json +++ b/public/language/en-GB/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/en-GB/admin/settings/email.json b/public/language/en-GB/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/en-GB/admin/settings/email.json +++ b/public/language/en-GB/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/en-GB/global.json b/public/language/en-GB/global.json index afcb01d792..3f974d70dc 100644 --- a/public/language/en-GB/global.json +++ b/public/language/en-GB/global.json @@ -70,6 +70,7 @@ "posts": "Posts", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/en-GB/modules.json b/public/language/en-GB/modules.json index 02fa2adc97..7284732b10 100644 --- a/public/language/en-GB/modules.json +++ b/public/language/en-GB/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Send", "chat.no_active": "You have no active chats.", diff --git a/public/language/en-GB/pages.json b/public/language/en-GB/pages.json index 9de2a50eb1..6586bf499c 100644 --- a/public/language/en-GB/pages.json +++ b/public/language/en-GB/pages.json @@ -60,6 +60,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/en-GB/users.json b/public/language/en-GB/users.json index 87c7d1b4fc..0da5fb8e49 100644 --- a/public/language/en-GB/users.json +++ b/public/language/en-GB/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Search", "enter_username": "Enter a username to search", + "search-user-for-chat": "Search a user to start chat", "load_more": "Load More", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", diff --git a/public/language/en-US/admin/settings/advanced.json b/public/language/en-US/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/en-US/admin/settings/advanced.json +++ b/public/language/en-US/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/en-US/admin/settings/email.json b/public/language/en-US/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/en-US/admin/settings/email.json +++ b/public/language/en-US/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/en-US/global.json b/public/language/en-US/global.json index e4a7f1e984..029ca874bf 100644 --- a/public/language/en-US/global.json +++ b/public/language/en-US/global.json @@ -56,6 +56,7 @@ "posts": "Posts", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/en-US/modules.json b/public/language/en-US/modules.json index 27597124e4..bf7a310839 100644 --- a/public/language/en-US/modules.json +++ b/public/language/en-US/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Send", "chat.no_active": "You have no active chats.", diff --git a/public/language/en-US/pages.json b/public/language/en-US/pages.json index c9e3ac41d2..a885434c71 100644 --- a/public/language/en-US/pages.json +++ b/public/language/en-US/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/en-US/users.json b/public/language/en-US/users.json index f5bfcc38ea..8ddd34e5d7 100644 --- a/public/language/en-US/users.json +++ b/public/language/en-US/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Search", "enter_username": "Enter a username to search", + "search-user-for-chat": "Search a user to start chat", "load_more": "Load More", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", diff --git a/public/language/en-x-pirate/admin/settings/advanced.json b/public/language/en-x-pirate/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/en-x-pirate/admin/settings/advanced.json +++ b/public/language/en-x-pirate/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/en-x-pirate/admin/settings/email.json b/public/language/en-x-pirate/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/en-x-pirate/admin/settings/email.json +++ b/public/language/en-x-pirate/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/en-x-pirate/global.json b/public/language/en-x-pirate/global.json index 1db7726cb0..188018fdd1 100644 --- a/public/language/en-x-pirate/global.json +++ b/public/language/en-x-pirate/global.json @@ -56,6 +56,7 @@ "posts": "Messages", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/en-x-pirate/modules.json b/public/language/en-x-pirate/modules.json index 90fdb94046..66544e884f 100644 --- a/public/language/en-x-pirate/modules.json +++ b/public/language/en-x-pirate/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Send Parrot", "chat.no_active": "Ye be a lonely sailor.", diff --git a/public/language/en-x-pirate/pages.json b/public/language/en-x-pirate/pages.json index c9e3ac41d2..a885434c71 100644 --- a/public/language/en-x-pirate/pages.json +++ b/public/language/en-x-pirate/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/en-x-pirate/users.json b/public/language/en-x-pirate/users.json index d5b60eaf9a..748f41943a 100644 --- a/public/language/en-x-pirate/users.json +++ b/public/language/en-x-pirate/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Search", "enter_username": "Gimme y'er handle", + "search-user-for-chat": "Search a user to start chat", "load_more": "Load More", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", diff --git a/public/language/es/admin/settings/advanced.json b/public/language/es/admin/settings/advanced.json index 76157e1a98..b93a737502 100644 --- a/public/language/es/admin/settings/advanced.json +++ b/public/language/es/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Credenciales-Control-Permitir-Acceso", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Seguridad estricta del transporte", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/es/admin/settings/email.json b/public/language/es/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/es/admin/settings/email.json +++ b/public/language/es/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/es/global.json b/public/language/es/global.json index 378f9ca1c4..70e2d4a9dd 100644 --- a/public/language/es/global.json +++ b/public/language/es/global.json @@ -56,6 +56,7 @@ "posts": "Mensajes", "x-posts": "%1 posts", "best": "Mejor valorados", + "controversial": "Controversial", "votes": "Votos", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/es/modules.json b/public/language/es/modules.json index 4124998f7f..6be64081ad 100644 --- a/public/language/es/modules.json +++ b/public/language/es/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chatear con", - "chat.placeholder": "Introduce tu mensaje aquí, pulsa intro para enviar", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Enviar", "chat.no_active": "No tiene conversaciones activas.", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index 08384bdae8..a7767236c0 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Publicaciones votadas positivamente %1", "account/downvoted": "Publicaciones votadas negativamente %1", "account/best": "Mejores publicaciones hechas por %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Usuarios bloqueados por %1", "account/uploads": "Subidas por %1", "account/sessions": "Login Sessions", diff --git a/public/language/es/users.json b/public/language/es/users.json index e190880bb2..f16dcf326e 100644 --- a/public/language/es/users.json +++ b/public/language/es/users.json @@ -5,6 +5,7 @@ "most_flags": "Más Reportados", "search": "Buscar", "enter_username": "Ingresa el nombre de usuario que quieres buscar", + "search-user-for-chat": "Search a user to start chat", "load_more": "Cargar más", "users-found-search-took": "¡%1 usuario(s) encontrado! La búsqueda ha llevado %2 segundos.", "filter-by": "Filtrar Por", diff --git a/public/language/et/admin/settings/advanced.json b/public/language/et/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/et/admin/settings/advanced.json +++ b/public/language/et/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/et/admin/settings/email.json b/public/language/et/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/et/admin/settings/email.json +++ b/public/language/et/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/et/global.json b/public/language/et/global.json index cf4e090f43..cf7d910806 100644 --- a/public/language/et/global.json +++ b/public/language/et/global.json @@ -56,6 +56,7 @@ "posts": "Postitust", "x-posts": "%1 posts", "best": "Parim", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/et/modules.json b/public/language/et/modules.json index e9f8f07823..4b39c7ed7e 100644 --- a/public/language/et/modules.json +++ b/public/language/et/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Kirjuta sõnum siia ning vajuta enterit sõnumi saatmiseks", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Saada", "chat.no_active": "Sul ei ole hetkel aktiivseid vestlusi.", diff --git a/public/language/et/pages.json b/public/language/et/pages.json index b0dbf656ab..6aa52b6726 100644 --- a/public/language/et/pages.json +++ b/public/language/et/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Postitused %1 poolt heaks kiidetud", "account/downvoted": "Postitused %1 poolt vastu hääletatud", "account/best": "Parimad postitused %1 poolt", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/et/users.json b/public/language/et/users.json index 8b602fda9a..0579549097 100644 --- a/public/language/et/users.json +++ b/public/language/et/users.json @@ -5,6 +5,7 @@ "most_flags": "Enim raporteerimisi", "search": "Otsi", "enter_username": "Sisesta kasutajanimi, keda soovid otsida", + "search-user-for-chat": "Search a user to start chat", "load_more": "Lae veel", "users-found-search-took": "%1 kasutaja(t) leiti! Otsing kestis %2 sekundit.", "filter-by": "Filtreeri", diff --git a/public/language/fa-IR/admin/settings/advanced.json b/public/language/fa-IR/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/fa-IR/admin/settings/advanced.json +++ b/public/language/fa-IR/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/fa-IR/admin/settings/email.json b/public/language/fa-IR/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/fa-IR/admin/settings/email.json +++ b/public/language/fa-IR/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/fa-IR/global.json b/public/language/fa-IR/global.json index 3df82224e6..5350a2ee54 100644 --- a/public/language/fa-IR/global.json +++ b/public/language/fa-IR/global.json @@ -56,6 +56,7 @@ "posts": "دیدگاه‌ها", "x-posts": "%1 posts", "best": "بهترین", + "controversial": "Controversial", "votes": "رای ها", "x-votes": "%1 votes", "voters": "رای دهندگان", diff --git a/public/language/fa-IR/modules.json b/public/language/fa-IR/modules.json index 06c4a94852..6cb1ac3ac0 100644 --- a/public/language/fa-IR/modules.json +++ b/public/language/fa-IR/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "چت با", - "chat.placeholder": "پیام گفتگو را اینجا بنویسید، دکمه Enter را بزنید تا فرستاده شود.", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "شما در حال مشاهده پیام های قدیمی هستید، برای دیدن پیام های اخیر کلیک کنید.", "chat.send": "ارسال", "chat.no_active": "شما هیچ گفتگوی فعالی ندارید.", diff --git a/public/language/fa-IR/pages.json b/public/language/fa-IR/pages.json index 12ce224b3f..4b7a4f977d 100644 --- a/public/language/fa-IR/pages.json +++ b/public/language/fa-IR/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "رای مثبت داده شده به پست ها توسط %1", "account/downvoted": "رای منفی داده شده به پست ها توسط %1", "account/best": "بهترین پست های %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "کاربران مسدود شده توسط %1", "account/uploads": "آپلود های %1", "account/sessions": "Session های ورود", diff --git a/public/language/fa-IR/users.json b/public/language/fa-IR/users.json index 099afc2ebb..165b25b0a9 100644 --- a/public/language/fa-IR/users.json +++ b/public/language/fa-IR/users.json @@ -5,6 +5,7 @@ "most_flags": "بیشترین پرچم‌ها", "search": "جستجو", "enter_username": "یک نام کاربری برای جستجو وارد کنید", + "search-user-for-chat": "Search a user to start chat", "load_more": "بارگذاری بیش‌تر", "users-found-search-took": "%1 کاربر(ها) یافت شد! جستجو %2 ثانیه زمان گرفت.", "filter-by": "فیلتر با", diff --git a/public/language/fi/admin/settings/advanced.json b/public/language/fi/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/fi/admin/settings/advanced.json +++ b/public/language/fi/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/fi/admin/settings/email.json b/public/language/fi/admin/settings/email.json index f712942d72..86020e5240 100644 --- a/public/language/fi/admin/settings/email.json +++ b/public/language/fi/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/fi/global.json b/public/language/fi/global.json index 746bcec7e9..ad0a856b76 100644 --- a/public/language/fi/global.json +++ b/public/language/fi/global.json @@ -56,6 +56,7 @@ "posts": "Viestit", "x-posts": "%1 posts", "best": "Paras", + "controversial": "Controversial", "votes": "Ääniä", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/fi/modules.json b/public/language/fi/modules.json index 1f678a4398..9c15616e70 100644 --- a/public/language/fi/modules.json +++ b/public/language/fi/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Kirjoita viestisi tähän ja paina enter lähettääksesi", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Lähetä", "chat.no_active": "Sinulla ei ole aktiivisia keskusteluita.", diff --git a/public/language/fi/pages.json b/public/language/fi/pages.json index f304200c54..52c4ac8cf3 100644 --- a/public/language/fi/pages.json +++ b/public/language/fi/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "%1 tykkäämät viestit", "account/downvoted": "Posts downvoted by %1", "account/best": "%1 tekemät parhaat viestit", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "%1 lähetykset", "account/sessions": "Login Sessions", diff --git a/public/language/fi/users.json b/public/language/fi/users.json index 882c93c184..13b22e8808 100644 --- a/public/language/fi/users.json +++ b/public/language/fi/users.json @@ -5,6 +5,7 @@ "most_flags": "Eniten ", "search": "Hae", "enter_username": "Syötä käyttäjätunnus hakeaksesi", + "search-user-for-chat": "Search a user to start chat", "load_more": "Lataa lisää", "users-found-search-took": "%1 käyttäjä(ä) löytyi! Haku kesti %2 sekuntia.", "filter-by": "Suodata", diff --git a/public/language/fr/admin/settings/advanced.json b/public/language/fr/admin/settings/advanced.json index 15f35e18d2..e367f59727 100644 --- a/public/language/fr/admin/settings/advanced.json +++ b/public/language/fr/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "\nAccess-Control-Allow-Methods", "headers.acah": "\nAccess-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "Lorsqu'il est activé (par défaut), définira l'en-tête sur require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Activer HSTS (recommandé)", "hsts.maxAge": "HSTS Age Max", diff --git a/public/language/fr/admin/settings/email.json b/public/language/fr/admin/settings/email.json index 4868e72be3..38ec252178 100644 --- a/public/language/fr/admin/settings/email.json +++ b/public/language/fr/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Envoyer des mails aux destinataires qui n'ont pas explicitement confirmé leurs mails", "include-unverified-warning": "Par défaut, les utilisateurs dont les mails sont associés à leur compte ont déjà été vérifiés, mais il existe des situations où ce n'est pas le cas (par exemple, les connexions SSO, les utilisateurs bénéficiant de droits acquis, etc.). Activez ce paramètre à vos risques et périls – l'envoi de mails à des adresses non vérifiées peut constituer une violation des lois anti-spam régionales.", "prompt": "Inviter les utilisateurs à saisir ou à confirmer leurs emails", - "prompt-help": "Si un utilisateur n'a pas défini d'email ou si son email n'est pas confirmé, un avertissement s'affichera à l'écran." + "prompt-help": "Si un utilisateur n'a pas défini d'email ou si son email n'est pas confirmé, un avertissement s'affichera à l'écran.", + "sendEmailToBanned": "Envoyer des e-mails aux utilisateurs même s'ils ont été bannis" } diff --git a/public/language/fr/global.json b/public/language/fr/global.json index 276eeef52e..533b1b73d1 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -56,6 +56,7 @@ "posts": "Messages", "x-posts": "%1 messages", "best": "Meilleur sujets", + "controversial": "Contesté", "votes": "Votes", "x-votes": "%1 votes", "voters": "Votants", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index c9f1805e8d..ec0331d56e 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Discuter avec", - "chat.placeholder": "Écrivez votre message ici et appuyez sur entrée pour envoyer", + "chat.placeholder": "Écrivez vos message ici, faites glisser / déposez les images, validez sur entrée pour envoyer", "chat.scroll-up-alert": "Vous consultez des messages plus anciens, cliquez ici pour accéder au message le plus récent.", "chat.send": "Envoyer", "chat.no_active": "Vous n'avez aucune discussion en cours.", diff --git a/public/language/fr/pages.json b/public/language/fr/pages.json index 262b211b4f..35fcbf2367 100644 --- a/public/language/fr/pages.json +++ b/public/language/fr/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Avis positifs de %1", "account/downvoted": "Avis négatifs de %1", "account/best": "Meilleurs messages postés par %1", + "account/controversial": "Messages contestés de %1", "account/blocks": "Utilisateurs bloqués pour %1", "account/uploads": "Envoyé par %1", "account/sessions": "Sessions des connexions", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 6d461d486c..7540c0da6a 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -184,7 +184,7 @@ "consent.export_posts": "Exporter vos messages (.csv)", "consent.export-posts-success": "Exportation des messages, vous recevrez une notification lorsqu'elle sera terminée.", "emailUpdate.intro": "Veuillez renseigner votre adresse mails. Ce forum utilise votre adresse mail pour suivre l'activité et les notifications programmés, ainsi que pour la récupération de compte en cas de perte de mot de passe.", - "emailUpdate.optional": "This field is optional. You are not obligated to provide your email address, but without a validated email you will not be able to recover your account or login with your email.", - "emailUpdate.required": "This field is required.", + "emailUpdate.optional": "Ce champ est facultatif. Vous n'êtes pas obligé de fournir votre adresse e-mail, mais sans e-mail validé, vous ne pourrez pas récupérer votre compte ou vous connecter avec votre e-mail.", + "emailUpdate.required": "Ce champ est requis.", "emailUpdate.change-instructions": "Un mail de confirmation sera envoyé à l'adresse mail saisie avec un lien unique. L'accès à ce lien confirmera votre propriété de mail et elle deviendra active sur votre compte. À tout moment, vous pouvez mettre à jour votre mail enregistré depuis la page de votre compte." } \ No newline at end of file diff --git a/public/language/fr/users.json b/public/language/fr/users.json index f0742dbb06..526f188f75 100644 --- a/public/language/fr/users.json +++ b/public/language/fr/users.json @@ -5,6 +5,7 @@ "most_flags": "Les plus signalés", "search": "Rechercher", "enter_username": "Entrez le nom d'un utilisateur", + "search-user-for-chat": "chercher un utilisateur pour commencer une discussion", "load_more": "Charger la suite", "users-found-search-took": "%1 utilisateur(s) trouvé(s)! La recherche a pris %2 secondes.", "filter-by": "Filtrer par", diff --git a/public/language/gl/admin/settings/advanced.json b/public/language/gl/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/gl/admin/settings/advanced.json +++ b/public/language/gl/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/gl/admin/settings/email.json b/public/language/gl/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/gl/admin/settings/email.json +++ b/public/language/gl/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/gl/global.json b/public/language/gl/global.json index 2fe325a7e6..12ff5d51f3 100644 --- a/public/language/gl/global.json +++ b/public/language/gl/global.json @@ -56,6 +56,7 @@ "posts": "Publicacións", "x-posts": "%1 posts", "best": "Mellor", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/gl/modules.json b/public/language/gl/modules.json index 28e1931ed2..7f5472a84b 100644 --- a/public/language/gl/modules.json +++ b/public/language/gl/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Escribe aquí a mensaxe, pulsa intro para enviar", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Enviar", "chat.no_active": "Non tes charlas activas.", diff --git a/public/language/gl/pages.json b/public/language/gl/pages.json index 899d75e6d1..b540b26e72 100644 --- a/public/language/gl/pages.json +++ b/public/language/gl/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Mensaxes votadas positivamente por %1", "account/downvoted": "Mensaxes votadas negativamente por %1", "account/best": "Mellores mensaxes escritas por %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/gl/users.json b/public/language/gl/users.json index 5e22c3aa36..d79d568af9 100644 --- a/public/language/gl/users.json +++ b/public/language/gl/users.json @@ -5,6 +5,7 @@ "most_flags": "Máis reportados", "search": "Busca", "enter_username": "Introduce o nome de usuario a procurar", + "search-user-for-chat": "Search a user to start chat", "load_more": "Cargar máis", "users-found-search-took": "%1 usuario(s) atopado! A procura tomou %2 segundos.", "filter-by": "Filtrar por", diff --git a/public/language/he/admin/settings/advanced.json b/public/language/he/admin/settings/advanced.json index 621a94adb3..86f3267f11 100644 --- a/public/language/he/admin/settings/advanced.json +++ b/public/language/he/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "אתרים אשר אל בקשות אליהם, יתווספו גם נתוני כניסה כגוןCookie וכו'. ( Access-Control-Allow-Credentials)", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/he/admin/settings/email.json b/public/language/he/admin/settings/email.json index e2f6c16059..d86b43e815 100644 --- a/public/language/he/admin/settings/email.json +++ b/public/language/he/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/he/global.json b/public/language/he/global.json index 475ef8b95a..6efda815bb 100644 --- a/public/language/he/global.json +++ b/public/language/he/global.json @@ -56,6 +56,7 @@ "posts": "פוסטים", "x-posts": "%1 פוסטים", "best": "הגבוה ביותר", + "controversial": "Controversial", "votes": "הצבעות", "x-votes": "%1 הצבעות", "voters": "מצביעים", diff --git a/public/language/he/modules.json b/public/language/he/modules.json index 3d83dcba43..7f88bbba95 100644 --- a/public/language/he/modules.json +++ b/public/language/he/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "שוחח עם", - "chat.placeholder": "הקלד את הודעת הצ'אט כאן, לחץ אנטר לשליחה", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "אתה מסתכל על הודעות ישנות. לחץ כאן למעבר להודעה האחרונה.", "chat.send": "שלח", "chat.no_active": "אין לך צ'אטים פעילים", diff --git a/public/language/he/pages.json b/public/language/he/pages.json index 458c49db6c..0ef1af98b9 100644 --- a/public/language/he/pages.json +++ b/public/language/he/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "פוסטים שהוצבעו לטובה על ידי %1", "account/downvoted": "פוסטים שהוצבעו לרעה על ידי %1", "account/best": "הפוסטים הטובים ביותר שנוצרו על ידי %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "המשתמשים ש-%1 חסם", "account/uploads": "העלאות של %1", "account/sessions": "סשני התחברות", diff --git a/public/language/he/users.json b/public/language/he/users.json index eb9adf7bea..4200448b7c 100644 --- a/public/language/he/users.json +++ b/public/language/he/users.json @@ -5,6 +5,7 @@ "most_flags": "הכי הרבה דיווחי משתמשים", "search": "חיפוש", "enter_username": "הכנס שם משתמש לחיפוש", + "search-user-for-chat": "Search a user to start chat", "load_more": "טען עוד", "users-found-search-took": "%1 משתמשים נמצאו! החיפוש ערך %2 שניות.", "filter-by": "פלטר על-פי", diff --git a/public/language/hr/admin/settings/advanced.json b/public/language/hr/admin/settings/advanced.json index a858fa246c..e13ff8510a 100644 --- a/public/language/hr/admin/settings/advanced.json +++ b/public/language/hr/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/hr/admin/settings/email.json b/public/language/hr/admin/settings/email.json index 036689b3f3..af77a23140 100644 --- a/public/language/hr/admin/settings/email.json +++ b/public/language/hr/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/hr/global.json b/public/language/hr/global.json index 76ce0b9634..2409238471 100644 --- a/public/language/hr/global.json +++ b/public/language/hr/global.json @@ -56,6 +56,7 @@ "posts": "Objave", "x-posts": "%1 posts", "best": "Najbolje", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/hr/modules.json b/public/language/hr/modules.json index e467780404..126c0e9256 100644 --- a/public/language/hr/modules.json +++ b/public/language/hr/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Upišite poruku ovdje, ENTER za slanje", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Pošalji", "chat.no_active": "Nemate aktivnih razgovora.", diff --git a/public/language/hr/pages.json b/public/language/hr/pages.json index e942b88d5f..26d36c96a1 100644 --- a/public/language/hr/pages.json +++ b/public/language/hr/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "%1 glasao za", "account/downvoted": "%1 glasao protiv", "account/best": "Najbolje objave od %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/hr/users.json b/public/language/hr/users.json index a6e4dba223..d19e05f8f8 100644 --- a/public/language/hr/users.json +++ b/public/language/hr/users.json @@ -5,6 +5,7 @@ "most_flags": "Najviše zastava", "search": "Pretraga", "enter_username": "Unesi korisničko ime za pretragu", + "search-user-for-chat": "Search a user to start chat", "load_more": "Učitaj više", "users-found-search-took": "%1user(s) pronađeni! Pretraga je trajala %2 sekundi.", "filter-by": "Filtriraj po", diff --git a/public/language/hu/admin/settings/advanced.json b/public/language/hu/admin/settings/advanced.json index 186004f19a..fb5d7cf04c 100644 --- a/public/language/hu/admin/settings/advanced.json +++ b/public/language/hu/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Szigorú HTTP biztonság (HSTS)", "hsts.enabled": "Szigorú HTTP biztonság (HSTS) bekapcsolása (ajánlott)", "hsts.maxAge": "HSTS maximális kora", diff --git a/public/language/hu/admin/settings/email.json b/public/language/hu/admin/settings/email.json index 63b86ffba4..8f5ee13181 100644 --- a/public/language/hu/admin/settings/email.json +++ b/public/language/hu/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/hu/global.json b/public/language/hu/global.json index be22f1f363..74150e826a 100644 --- a/public/language/hu/global.json +++ b/public/language/hu/global.json @@ -56,6 +56,7 @@ "posts": "Hozzászólások", "x-posts": "%1 posts", "best": "Legjobb", + "controversial": "Controversial", "votes": "Szavazatok", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/hu/modules.json b/public/language/hu/modules.json index affd0c6936..0696f63557 100644 --- a/public/language/hu/modules.json +++ b/public/language/hu/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat vele", - "chat.placeholder": "Ide írd be az üzenetet, majd küldéshez Enter gomb", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Régebbi üzeneteket nézel, kattints ide a legfrissebbekhez.", "chat.send": "Küldés", "chat.no_active": "Nincs aktív csevegésed.", diff --git a/public/language/hu/pages.json b/public/language/hu/pages.json index ecf3bdf87b..4632eb5d20 100644 --- a/public/language/hu/pages.json +++ b/public/language/hu/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "%1 által kedvelt témakörök", "account/downvoted": "%1 által utált témakörök", "account/best": "%1 által írt legjobb hozzászólások", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Felhasználó letiltva erről: %1", "account/uploads": "Feltöltések általa: %1", "account/sessions": "Bejelentkezések munkamenete", diff --git a/public/language/hu/users.json b/public/language/hu/users.json index 8d75cae091..7368d05ea8 100644 --- a/public/language/hu/users.json +++ b/public/language/hu/users.json @@ -5,6 +5,7 @@ "most_flags": "Legtöbb megjelölés", "search": "Keresés", "enter_username": "Írj be egy felhasználónevet kereséshez", + "search-user-for-chat": "Search a user to start chat", "load_more": "További betöltése", "users-found-search-took": "%1 talált felhasználó! A keresés %2 másodpercig tartott.", "filter-by": "Szűrés", diff --git a/public/language/id/admin/settings/advanced.json b/public/language/id/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/id/admin/settings/advanced.json +++ b/public/language/id/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/id/admin/settings/email.json b/public/language/id/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/id/admin/settings/email.json +++ b/public/language/id/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/id/global.json b/public/language/id/global.json index e14fb34847..d195d1b458 100644 --- a/public/language/id/global.json +++ b/public/language/id/global.json @@ -56,6 +56,7 @@ "posts": "Post", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/id/modules.json b/public/language/id/modules.json index ff6ff2587e..80de8d749a 100644 --- a/public/language/id/modules.json +++ b/public/language/id/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Berbincang dengan", - "chat.placeholder": "Tulis pesan percakapan di sini, tekan enter untuk mengirim", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Kirim", "chat.no_active": "Kamu tidak memiliki percakapan yang aktif.", diff --git a/public/language/id/pages.json b/public/language/id/pages.json index 706ae76077..bab11fe375 100644 --- a/public/language/id/pages.json +++ b/public/language/id/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/id/users.json b/public/language/id/users.json index d2965239ab..f78ac6c660 100644 --- a/public/language/id/users.json +++ b/public/language/id/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Pencarian", "enter_username": "Masukkan nama pengguna untuk mencari", + "search-user-for-chat": "Search a user to start chat", "load_more": "Tampilkan Lebih Banyak", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", diff --git a/public/language/it/admin/settings/advanced.json b/public/language/it/admin/settings/advanced.json index 4013084551..fc83d9c165 100644 --- a/public/language/it/admin/settings/advanced.json +++ b/public/language/it/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "Se abilitato (impostazione predefinita), imposterà l'intestazione su require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Rigorosa sicurezza trasporto", "hsts.enabled": "Abilita HSTS (consigliato)", "hsts.maxAge": "Età massima HSTS", diff --git a/public/language/it/admin/settings/email.json b/public/language/it/admin/settings/email.json index 7ba3def26e..05fdfd1951 100644 --- a/public/language/it/admin/settings/email.json +++ b/public/language/it/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Invia email a destinatari che non hanno confermato esplicitamente le loro email", "include-unverified-warning": "Per impostazione predefinita, gli utenti con email associate al loro account sono già stati verificati, ma ci sono situazioni in cui ciò non è vero (ad esempio accessi SSO, vecchi utenti, ecc.). Abilita questa impostazione a tuo rischio e pericolo – l'invio di email a indirizzi non verificati può essere una violazione delle leggi regionali anti-spam.", "prompt": "Chiedi agli utenti di inserire o confermare le loro email", - "prompt-help": "Se un utente non ha impostato un'email, o la sua email non è confermata, sarà mostrato un avviso sullo schermo." + "prompt-help": "Se un utente non ha impostato un'email, o la sua email non è confermata, sarà mostrato un avviso sullo schermo.", + "sendEmailToBanned": "Invia email agli utenti anche se sono stati bannati" } diff --git a/public/language/it/global.json b/public/language/it/global.json index 993e1940d6..de920881c3 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -56,6 +56,7 @@ "posts": "Post", "x-posts": "%1 post", "best": "Migliore", + "controversial": "Controverso", "votes": "Votazioni", "x-votes": "%1 voti", "voters": "Votanti", diff --git a/public/language/it/modules.json b/public/language/it/modules.json index 043c2ce82c..cb9fc921b6 100644 --- a/public/language/it/modules.json +++ b/public/language/it/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Messaggia con", - "chat.placeholder": "Inserisci qui il messaggio, premi invio per mandarlo", + "chat.placeholder": "Digita il messaggio di chat qui, trascina le immagini, premi invio per inviare", "chat.scroll-up-alert": "Stai guardando i messaggi più vecchi, clicca qui per andare al messaggio più recente.", "chat.send": "Invia", "chat.no_active": "Non hai chat attive.", diff --git a/public/language/it/pages.json b/public/language/it/pages.json index a6f5b08e1f..08f38dd5ab 100644 --- a/public/language/it/pages.json +++ b/public/language/it/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Post apprezzati da %1", "account/downvoted": "Post votati negativamente da %1", "account/best": "I migliori post di %1", + "account/controversial": "Post controversi scritti da %1", "account/blocks": "Utenti bloccati per %1", "account/uploads": "Inviati da %1", "account/sessions": "Sessioni di accesso", diff --git a/public/language/it/users.json b/public/language/it/users.json index d18fb9fdfc..c843ef0433 100644 --- a/public/language/it/users.json +++ b/public/language/it/users.json @@ -5,6 +5,7 @@ "most_flags": "Più segnalati", "search": "Cerca", "enter_username": "Inserisci il nome utente da cercare", + "search-user-for-chat": "Cerca un utente per iniziare la chat", "load_more": "Carica di più", "users-found-search-took": "%1 utente(i) trovato! La ricerca ha impiegato %2 secondi.", "filter-by": "Filtra per", diff --git a/public/language/ja/admin/settings/advanced.json b/public/language/ja/admin/settings/advanced.json index 27a8d9dcb3..76d0219cdd 100644 --- a/public/language/ja/admin/settings/advanced.json +++ b/public/language/ja/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "アクセス-制御-有効-メソッド", "headers.acah": "アクセス-制御-有効-ヘッダー", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/ja/admin/settings/email.json b/public/language/ja/admin/settings/email.json index de5faf05d6..ec73aa26ea 100644 --- a/public/language/ja/admin/settings/email.json +++ b/public/language/ja/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/ja/global.json b/public/language/ja/global.json index 6d3a90028a..79abf1cf83 100644 --- a/public/language/ja/global.json +++ b/public/language/ja/global.json @@ -56,6 +56,7 @@ "posts": "投稿", "x-posts": "%1 posts", "best": "ベスト", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/ja/modules.json b/public/language/ja/modules.json index 80507915df..a084bbe4e8 100644 --- a/public/language/ja/modules.json +++ b/public/language/ja/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "とチャット", - "chat.placeholder": "メッセージを入力し、Enterで送信", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "送信", "chat.no_active": "チャットはありません。", diff --git a/public/language/ja/pages.json b/public/language/ja/pages.json index d59bb27095..e75f73c21a 100644 --- a/public/language/ja/pages.json +++ b/public/language/ja/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "%1が投稿を高評価しました", "account/downvoted": "%1が投稿を低評価しました", "account/best": "%1のベストな投稿", + "account/controversial": "Controversial posts made by %1", "account/blocks": "%1のユーザーをブロックしました", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/ja/users.json b/public/language/ja/users.json index b3fcb65cdb..364128e16b 100644 --- a/public/language/ja/users.json +++ b/public/language/ja/users.json @@ -5,6 +5,7 @@ "most_flags": "最も多いフラグ", "search": "検索", "enter_username": "ユーザー名を入力", + "search-user-for-chat": "Search a user to start chat", "load_more": "もっと見る", "users-found-search-took": "%1人のユーザーを見つけました!(検索まで%2秒掛かりました。)", "filter-by": "フィルタ", diff --git a/public/language/ko/admin/settings/advanced.json b/public/language/ko/admin/settings/advanced.json index 2e63ddbd98..4a54688c8e 100644 --- a/public/language/ko/admin/settings/advanced.json +++ b/public/language/ko/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "HSTS 활성화 (권장)", "hsts.maxAge": "HSTS 유효 기간", diff --git a/public/language/ko/admin/settings/email.json b/public/language/ko/admin/settings/email.json index dd61798ffe..2fef547c31 100644 --- a/public/language/ko/admin/settings/email.json +++ b/public/language/ko/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "전자 메일을 명시적으로 확인하지 않은 수신자에게 전자 메일 보내기", "include-unverified-warning": "기본적으로 계정과 연결된 전자 메일이 있는 사용자는 이미 확인되었지만 그렇지 않은 경우가 있습니다(예: SSO 로그인, 약관으로부터 제외된 사용자 등). 사용자가 위험을 감수하고 이 설정을 사용하도록 설정합니다. – 확인되지 않은 주소로 이메일을 보내는 것은 지역별 스팸 방지법을 위반하는 것일 수 있습니다.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/ko/global.json b/public/language/ko/global.json index 1b22d7ce1d..ec2f1cf2f1 100644 --- a/public/language/ko/global.json +++ b/public/language/ko/global.json @@ -56,6 +56,7 @@ "posts": "포스트", "x-posts": "%1 포스트", "best": "베스트", + "controversial": "Controversial", "votes": "투표", "x-votes": "%1 투표", "voters": "투표자", diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index f372190f82..88b2a3a738 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "채팅", - "chat.placeholder": "메시지를 여기에 입력한 후 엔터를 눌러 전송하세요.", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "오래된 메시지를 보고 있습니다. 여기를 눌러 최신 메시지로 이동하세요.", "chat.send": "전송", "chat.no_active": "활성화된 채팅이 없습니다.", diff --git a/public/language/ko/pages.json b/public/language/ko/pages.json index 5bc7a1c9ef..5694735898 100644 --- a/public/language/ko/pages.json +++ b/public/language/ko/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "%1님이 추천한 포스트", "account/downvoted": "%1님이 비추천한 포스트", "account/best": "%1님의 베스트 포스트", + "account/controversial": "Controversial posts made by %1", "account/blocks": "%1님이 차단한 사용자", "account/uploads": "%1님의 업로드", "account/sessions": "로그인 세션", diff --git a/public/language/ko/users.json b/public/language/ko/users.json index 0228c1b3d4..10fc8c116b 100644 --- a/public/language/ko/users.json +++ b/public/language/ko/users.json @@ -5,6 +5,7 @@ "most_flags": "신고순", "search": "검색", "enter_username": "검색할 사용자명을 입력하세요.", + "search-user-for-chat": "Search a user to start chat", "load_more": "더 보기", "users-found-search-took": "%1명의 사용자를 찾았습니다. 검색 소요 시간 %2초", "filter-by": "필터 기준", diff --git a/public/language/lt/admin/settings/advanced.json b/public/language/lt/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/lt/admin/settings/advanced.json +++ b/public/language/lt/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/lt/admin/settings/email.json b/public/language/lt/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/lt/admin/settings/email.json +++ b/public/language/lt/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/lt/global.json b/public/language/lt/global.json index bca0d78fde..a06519ea93 100644 --- a/public/language/lt/global.json +++ b/public/language/lt/global.json @@ -56,6 +56,7 @@ "posts": "Pranešimai", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/lt/modules.json b/public/language/lt/modules.json index 17ba53af98..a38a6b8b65 100644 --- a/public/language/lt/modules.json +++ b/public/language/lt/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Įrašykite žinutę čia ir spauskite \"enter\" norėdami išsiųsti", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Siųsti", "chat.no_active": "Jūs neturite aktyvių susirašinėjimų.", diff --git a/public/language/lt/pages.json b/public/language/lt/pages.json index b9079e69cb..a1f10b4416 100644 --- a/public/language/lt/pages.json +++ b/public/language/lt/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Geriausi pranešimai, kuriuos parašė %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Užblokuoti vartotojai dėl %1", "account/uploads": "%1 Įkėlimai", "account/sessions": "Login Sessions", diff --git a/public/language/lt/users.json b/public/language/lt/users.json index df061c067a..ed03628baf 100644 --- a/public/language/lt/users.json +++ b/public/language/lt/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Ieškoti", "enter_username": "Įrašykite vartotojo vardą paieškai", + "search-user-for-chat": "Search a user to start chat", "load_more": "Įkelti daugiau", "users-found-search-took": "Rasta %1 vartotojas(-ai)! Paieška užtruko %2 sekundes.", "filter-by": "Filtruoti pagal", diff --git a/public/language/lv/admin/settings/advanced.json b/public/language/lv/admin/settings/advanced.json index fc83094e81..8f05539cfa 100644 --- a/public/language/lv/admin/settings/advanced.json +++ b/public/language/lv/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "HTTP Strict Transport Security (HSTS)", "hsts.enabled": "Iespējots HSTS (ieteicams)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/lv/admin/settings/email.json b/public/language/lv/admin/settings/email.json index 29e0674e8e..0321971257 100644 --- a/public/language/lv/admin/settings/email.json +++ b/public/language/lv/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/lv/global.json b/public/language/lv/global.json index 4f8b1193bf..9b26c4db9b 100644 --- a/public/language/lv/global.json +++ b/public/language/lv/global.json @@ -56,6 +56,7 @@ "posts": "Raksti", "x-posts": "%1 posts", "best": "Labākie", + "controversial": "Controversial", "votes": "Balsojumi", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/lv/modules.json b/public/language/lv/modules.json index fab3c7b0ce..c2b505942b 100644 --- a/public/language/lv/modules.json +++ b/public/language/lv/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Sarunāties ar", - "chat.placeholder": "Šeit ierakstīt sarunu, tad nospiest \"Enter\", lai to nosūtītu", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Nosūtīt", "chat.no_active": "Nav aktīvo sarunu.", diff --git a/public/language/lv/pages.json b/public/language/lv/pages.json index 28da139b4d..03d8154b8c 100644 --- a/public/language/lv/pages.json +++ b/public/language/lv/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "%1 balsojis \"par\"", "account/downvoted": "%1 balsojis \"pret\"", "account/best": "%1 labākie raksti", + "account/controversial": "Controversial posts made by %1", "account/blocks": "%1 bloķētie lietotāji", "account/uploads": "%1 augšupielādes", "account/sessions": "Aktīvās sesijas", diff --git a/public/language/lv/users.json b/public/language/lv/users.json index 4cee320aba..5dd31dec5a 100644 --- a/public/language/lv/users.json +++ b/public/language/lv/users.json @@ -5,6 +5,7 @@ "most_flags": "Visvairāk atzīmju", "search": "Meklēt", "enter_username": "Meklējamais lietotājvārds", + "search-user-for-chat": "Search a user to start chat", "load_more": "Ielādēt vairāk", "users-found-search-took": "Atrasti %1 lietotājs(-i)! Meklēšana ilga %2 sekundes.", "filter-by": "Filtrēt pēc", diff --git a/public/language/ms/admin/settings/advanced.json b/public/language/ms/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/ms/admin/settings/advanced.json +++ b/public/language/ms/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/ms/admin/settings/email.json b/public/language/ms/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/ms/admin/settings/email.json +++ b/public/language/ms/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/ms/global.json b/public/language/ms/global.json index f7c2688714..7c19ebea3a 100644 --- a/public/language/ms/global.json +++ b/public/language/ms/global.json @@ -56,6 +56,7 @@ "posts": "Kiriman", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/ms/modules.json b/public/language/ms/modules.json index 20ad2d381c..91b2323834 100644 --- a/public/language/ms/modules.json +++ b/public/language/ms/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Taip pesanan di sini, tekan ENTER untuk hantar", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "hantar", "chat.no_active": "Anda tiada pesanan yang aktif", diff --git a/public/language/ms/pages.json b/public/language/ms/pages.json index 9e85b9f382..5dd04295a5 100644 --- a/public/language/ms/pages.json +++ b/public/language/ms/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Kiriman diundi naik oleh %1", "account/downvoted": "Kiriman dibuang undi oleh %1", "account/best": "Kiriman Terbaik Oleh %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/ms/users.json b/public/language/ms/users.json index 8bf7b1aaaf..0e27f7bbce 100644 --- a/public/language/ms/users.json +++ b/public/language/ms/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Cari", "enter_username": "Masukkan nama pengguna untuk carian", + "search-user-for-chat": "Search a user to start chat", "load_more": "Muat lagi", "users-found-search-took": "%1 pengguna dijumpai! Pencarian ambil masa %2 saat.", "filter-by": "Saring dengan", diff --git a/public/language/nb/admin/settings/advanced.json b/public/language/nb/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/nb/admin/settings/advanced.json +++ b/public/language/nb/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/nb/admin/settings/email.json b/public/language/nb/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/nb/admin/settings/email.json +++ b/public/language/nb/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/nb/category.json b/public/language/nb/category.json index d441bfd637..b605c65ab1 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -19,5 +19,5 @@ "notwatching.message": "Du ser ikke på oppdateringer fra denne kategorien og alle underkategorier", "ignoring.message": "Du ignorerer nå oppdateringer fra denne kategorien og alle underkategorier ", "watched-categories": "Overvåkede kategorier", - "x-more-categories": "% 1 flere kategorier" + "x-more-categories": "%1 flere kategorier" } \ No newline at end of file diff --git a/public/language/nb/email.json b/public/language/nb/email.json index 26390768ef..09e7602a3a 100644 --- a/public/language/nb/email.json +++ b/public/language/nb/email.json @@ -14,7 +14,7 @@ "welcome.text3": "En administrator har akseptert din søknad om registering. Du kan nå logge inn med ditt brukernavn og passord.", "welcome.cta": "Klikk her for å verifisere e-postadressen din", "invitation.text1": "%1 har invitert deg til å bli med i %2", - "invitation.text2": "Invitasjonen din utløper om% 1 dager.", + "invitation.text2": "Invitasjonen din utløper om %1 dager.", "invitation.cta": "Klikk her for å opprette kontoen din.", "reset.text1": "Vi har blitt bedt om å tilbakestille passordet ditt, muligens fordi du har glemt det. Hvis dette ikke stemmer kan du ignorere denne e-posten.", "reset.text2": "Vennligst klikk på følgende lenke for å fortsette med tilbakestillingen:", @@ -23,7 +23,7 @@ "reset.notify.text1": "Vi gjør deg oppmerksom på at du endret passordet ditt den %1.", "reset.notify.text2": "Hvis det ikke var deg som autoriserte dette, vennligst gi beskjed til en administrator umiddelbart.", "digest.latest_topics": "Siste emner fra %1", - "digest.top-topics": "Toppemner fra% 1 ", + "digest.top-topics": "Toppemner fra %1 ", "digest.popular-topics": "Populære emner fra %1", "digest.cta": "Klikk her for å besøke %1", "digest.unsub.info": "Dette sammendraget er sendt til deg basert på dine innstillinger for abonnering.", @@ -50,9 +50,9 @@ "unsub.success": "Du vil ikke lenger motta e-poster fra %1 utsendelseslisten ", "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)", - "banned.subject": "Du har blitt utestengt fra% 1", - "banned.text1": "Brukeren% 1 er utestengt fra% 2.", - "banned.text2": "Dette forbudet varer til% 1.", + "banned.subject": "Du har blitt utestengt fra %1", + "banned.text1": "Brukeren %1 er utestengt fra %2.", + "banned.text2": "Dette forbudet varer til %1.", "banned.text3": "Dette er grunnen til at du har blitt utestengt:", "closing": "Takk!" } \ No newline at end of file diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 700530171e..d5351be4a2 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -147,7 +147,7 @@ "cant-edit-chat-message": "Du har ikke tilgang til å redigere denne meldingen", "cant-delete-chat-message": " Du har ikke lov til å slette denne brukeren", "chat-edit-duration-expired": "Du har kun lov til å redigere meldinger i %1 sekund(er) etter at den er sendt", - "chat-delete-duration-expired": "Du har kun lov til å slette meldinger i % 1 sekund(er) etter den er sendt", + "chat-delete-duration-expired": "Du har kun lov til å slette meldinger i %1 sekund(er) etter den er sendt", "chat-deleted-already": "Denne meldingen har allerede blitt slettet.", "chat-restored-already": "Denne meldingen har allerede blitt gjenopprettet.", "chat-room-does-not-exist": "Dette chatterommet finnes ikke.", diff --git a/public/language/nb/global.json b/public/language/nb/global.json index fd864c5921..db3a528802 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -56,6 +56,7 @@ "posts": "Innlegg", "x-posts": "%1 post", "best": "Best", + "controversial": "Controversial", "votes": "Stemmer", "x-votes": "%1 stemmer", "voters": "Velgere", diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index 00630ad0be..dc37051bdb 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat med", - "chat.placeholder": "Skriv chat-melding her, trykk enter for å sende", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Du ser på eldre meldinger, klikk her for å gå til siste melding", "chat.send": "Send", "chat.no_active": "Du har ingen aktive chatter.", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 40081fd02d..19dffa9be8 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -54,11 +54,12 @@ "account/upvoted": "Innlegg stemt opp av %1", "account/downvoted": "Innlegg nedstemt av %1", "account/best": "Beste innlegg skrevet av %1", - "account/blocks": "Blokkerte brukere for % 1", + "account/controversial": "Controversial posts made by %1", + "account/blocks": "Blokkerte brukere for %1", "account/uploads": "Opplastninger av %1", "account/sessions": "Påloggingsøkter", "confirm": "E-post bekreftet", "maintenance.text": "%1 er for tiden under vedlikehold. Kom tilbake en annen gang.", "maintenance.messageIntro": "I tillegg har administratoren skrevet denne meldingen:", - "throttled.text": "% 1 er for øyeblikket ikke tilgjengelig på grunn av overdreven belastning. Kom tilbake en annen gang." + "throttled.text": "%1 er for øyeblikket ikke tilgjengelig på grunn av overdreven belastning. Kom tilbake en annen gang." } \ No newline at end of file diff --git a/public/language/nb/register.json b/public/language/nb/register.json index 16f5fbc589..0760551a8a 100644 --- a/public/language/nb/register.json +++ b/public/language/nb/register.json @@ -18,8 +18,8 @@ "agree_to_terms_of_use": "Jeg godtar vilkårene for bruk", "terms_of_use_error": "Du må godta vilkårene for bruk", "registration-added-to-queue": "Din registrering har blitt lagt til i godkjenningskøen. Du vil motta en e-post når denne blir akseptert av en administrator.", - "registration-queue-average-time": "Gjennomsnittlig tid for godkjenning av medlemskap er% 1 timer% 2 minutter.", - "registration-queue-auto-approve-time": "Ditt medlemskap i dette forumet vil være fullt aktivert på opptil% 1 timer.", + "registration-queue-average-time": "Gjennomsnittlig tid for godkjenning av medlemskap er %1 timer %2 minutter.", + "registration-queue-auto-approve-time": "Ditt medlemskap i dette forumet vil være fullt aktivert på opptil %1 timer.", "interstitial.intro": "We'd like some additional information in order to update your account…", "interstitial.intro-new": "We'd like some additional information before we can create your account…", "interstitial.errors-found": "Please review the entered information:", diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 8759ea34d6..3841ff4918 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -47,7 +47,7 @@ "signature": "Signatur", "birthday": "Bursdag", "chat": "Chat", - "chat_with": "Fortsett å chatte med % 1", + "chat_with": "Fortsett å chatte med %1", "new_chat_with": "Start ny chatt med %1", "flag-profile": "Flagg profil", "follow": "Følg", @@ -144,7 +144,7 @@ "sso.not-associated": "Klikk her for å assosiere med", "sso.dissociate": "Separer", "sso.dissociate-confirm-title": "Bekreft seperasjon", - "sso.dissociate-confirm": "Er du sikker på at du vil separere kontoen din fra% 1?", + "sso.dissociate-confirm": "Er du sikker på at du vil separere kontoen din fra %1?", "info.latest-flags": "Seneste flagg", "info.no-flags": "Ingen flaggede innlegg funnet", "info.ban-history": "Nylig utestengingshistorikk", @@ -164,7 +164,7 @@ "consent.lead": "This community forum collects and processes your personal information.", "consent.intro": "Vi bruker denne informasjonen for å tilpasse brukeropplevelsen din i dette nettforumet, samt for å knytte innleggene du lager til brukerkontoen din. Under registreringstrinnet i Felles brukerhåndtering ble du bedt om å oppgi fullt navn og en e-postadresse. Du kan også velge å oppgi tilleggsinformasjon for å fullføre brukerprofilen din på dette nettstedet.

Vi oppbevarer denne informasjonen i løpet av den tiden du er aktivt på brukerkontoen din, og du kan når som helst trekke tilbake samtykke ved å slette kontoen din. Du kan når som helst be om en kopi av ditt bidrag til dette nettstedet, via dine rettigheter & amp; Samtykke side.

Hvis du har spørsmål eller spørsmål, oppfordrer vi deg til å ta kontakt med dette forumets administrative team.", "consent.email_intro": "Vi kan fra tid til annen sende deg en e-post til din registrerte e-postadresse for å varsle deg om oppdateringer og/eller informere deg om ny aktivitet som er relevant for deg. Du kan endre hvor ofte vi sender forumsammendrag (eller du kan slå det helt av), og endre hvilke typer oppdateringer du vil motta via brukerinnstillingene dine. Med mindre du har endret dette i brukerinnstillingene, sender ikke dette forumet ut sammendrag via e-post.", - "consent.digest_frequency": "Med mindre dette er eksplisitt endret i brukerinnstillingene dine, leverer dette fellesskapet e-postkoder hver% 1.", + "consent.digest_frequency": "Med mindre dette er eksplisitt endret i brukerinnstillingene dine, leverer dette fellesskapet e-postkoder hver %1.", "consent.digest_off": "Med mindre dette er eksplisitt endret i brukerinnstillingene dine, sender ikke dette fellesskapet ut e-postkoder", "consent.received": "Du har gitt samtykke til at dette nettstedet samler inn og behandler informasjonen din. Ingen ytterligere tiltak er nødvendig.", "consent.not_received": "Du har ikke gitt samtykke til datainnsamling og behandling. Når som helst kan derfor nettsidens administrasjon velge å slette kontoen din for å bli kompatibel med personvernforordningen. ", diff --git a/public/language/nb/users.json b/public/language/nb/users.json index fad91fcace..7dbfe44b9f 100644 --- a/public/language/nb/users.json +++ b/public/language/nb/users.json @@ -5,6 +5,7 @@ "most_flags": "Flest flagg", "search": "Søk", "enter_username": "Skriv inn et brukernavn for å søke", + "search-user-for-chat": "Search a user to start chat", "load_more": "Last flere", "users-found-search-took": "%1 bruker(e) funnet. Søket tok %2 sekunder.", "filter-by": "Filtrer etter", diff --git a/public/language/nl/admin/settings/advanced.json b/public/language/nl/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/nl/admin/settings/advanced.json +++ b/public/language/nl/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/nl/admin/settings/email.json b/public/language/nl/admin/settings/email.json index 87151dd85b..346e325c5a 100644 --- a/public/language/nl/admin/settings/email.json +++ b/public/language/nl/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/nl/global.json b/public/language/nl/global.json index 11df02426c..11e43a68b0 100644 --- a/public/language/nl/global.json +++ b/public/language/nl/global.json @@ -56,6 +56,7 @@ "posts": "Berichten", "x-posts": "%1 berichten", "best": "Beste", + "controversial": "Controversial", "votes": "Stemmen", "x-votes": "%1 stemmen", "voters": "Stemmers", diff --git a/public/language/nl/modules.json b/public/language/nl/modules.json index c8d19faa05..f39b925b40 100644 --- a/public/language/nl/modules.json +++ b/public/language/nl/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat met", - "chat.placeholder": "Typ een chatbericht hier, toets enter om te verzenden", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Je kijkt nu naar oudere berichten. Klik hier om naar het meest recente bericht te gaan.", "chat.send": "Verzenden", "chat.no_active": "Er zijn geen actieve chats.", diff --git a/public/language/nl/pages.json b/public/language/nl/pages.json index 31835d4571..83bebf19f8 100644 --- a/public/language/nl/pages.json +++ b/public/language/nl/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Berichten omhoog gestemd door %1", "account/downvoted": "Berichten omlaag gestemd door %1", "account/best": "Beste berichten geplaast door %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Gebruikers geblokkeerd door %1", "account/uploads": "Uploads door %1", "account/sessions": "Login sessies", diff --git a/public/language/nl/users.json b/public/language/nl/users.json index e4c18e0aff..0735b49989 100644 --- a/public/language/nl/users.json +++ b/public/language/nl/users.json @@ -5,6 +5,7 @@ "most_flags": "Meeste vlaggen", "search": "Zoeken", "enter_username": "Vul een gebruikersnaam in om te zoeken", + "search-user-for-chat": "Search a user to start chat", "load_more": "Meer laden...", "users-found-search-took": "%1 gebruiker(s) gevonden! Zoekactie duurde %2 seconden.", "filter-by": "Filter op", diff --git a/public/language/pl/admin/settings/advanced.json b/public/language/pl/admin/settings/advanced.json index 62e71081ec..357e05cecf 100644 --- a/public/language/pl/admin/settings/advanced.json +++ b/public/language/pl/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Kontrola-Dostępu-Zezwól- Dane Logowania", "headers.acam": "Kontrola-Dostępu-Zezwól-Metody", "headers.acah": "Kontrola-Dostępu-Zezwól-Nagłówki", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Włączony HSTS (zalecane)", "hsts.maxAge": "Maksymalny wiek HSTS", diff --git a/public/language/pl/admin/settings/email.json b/public/language/pl/admin/settings/email.json index 9fc29057b7..78a090a22d 100644 --- a/public/language/pl/admin/settings/email.json +++ b/public/language/pl/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/pl/global.json b/public/language/pl/global.json index 2a481e6541..7d741ff85a 100644 --- a/public/language/pl/global.json +++ b/public/language/pl/global.json @@ -56,6 +56,7 @@ "posts": "Posty", "x-posts": "%1 posts", "best": "Najlepsze", + "controversial": "Controversial", "votes": "Głosy", "x-votes": "%1 votes", "voters": "Głosujący", diff --git a/public/language/pl/modules.json b/public/language/pl/modules.json index b92da76206..166e8e50e3 100644 --- a/public/language/pl/modules.json +++ b/public/language/pl/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Czatuj z", - "chat.placeholder": "Wpisz wiadomość tutaj i naciśnij Enter, aby wysłać.", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Przeglądasz starsze wiadomości, naciśnij tutaj by przejść do najnowszych", "chat.send": "Wyślij", "chat.no_active": "Brak aktywnych czatów", diff --git a/public/language/pl/pages.json b/public/language/pl/pages.json index 46571114c0..8d37dcc4cf 100644 --- a/public/language/pl/pages.json +++ b/public/language/pl/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posty, na które zagłosował %1", "account/downvoted": "Posty, przeciw którym zagłosował %1", "account/best": "Najlepsze posty napisane przez %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Użytkownicy zablokowani przez %1", "account/uploads": "Pliki przesłane przez %1", "account/sessions": "Sesje logowania", diff --git a/public/language/pl/users.json b/public/language/pl/users.json index 693ba9d3c3..88a17e2ebf 100644 --- a/public/language/pl/users.json +++ b/public/language/pl/users.json @@ -5,6 +5,7 @@ "most_flags": "Najwięcej flag", "search": "Szukaj", "enter_username": "Wpisz nazwę użytkownika", + "search-user-for-chat": "Search a user to start chat", "load_more": "Wczytaj więcej", "users-found-search-took": "Znaleziono %1 użytkownika(-ów). Szukanie zajęło %2 sek.", "filter-by": "Filtruj", diff --git a/public/language/pt-BR/admin/settings/advanced.json b/public/language/pt-BR/admin/settings/advanced.json index 6439ba1147..a8afd3dbc6 100644 --- a/public/language/pt-BR/admin/settings/advanced.json +++ b/public/language/pt-BR/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Habilitar HSTS (recomendado)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/pt-BR/admin/settings/email.json b/public/language/pt-BR/admin/settings/email.json index 718ca10450..4d516a4055 100644 --- a/public/language/pt-BR/admin/settings/email.json +++ b/public/language/pt-BR/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/pt-BR/global.json b/public/language/pt-BR/global.json index b1711dd755..0924675e72 100644 --- a/public/language/pt-BR/global.json +++ b/public/language/pt-BR/global.json @@ -56,6 +56,7 @@ "posts": "Posts", "x-posts": "%1 posts", "best": "Melhor", + "controversial": "Controversial", "votes": "Votos", "x-votes": "%1 votos", "voters": "Votantes", diff --git a/public/language/pt-BR/modules.json b/public/language/pt-BR/modules.json index 83dad69ce3..6762b6b772 100644 --- a/public/language/pt-BR/modules.json +++ b/public/language/pt-BR/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Conversar com", - "chat.placeholder": "Digite a mensagem de chat aqui, pressione enter para enviar", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Você está vendo mensagens mais antigas, clique aqui para ir para a mensagem mais recente.", "chat.send": "Enviar", "chat.no_active": "Você não tem chats ativos.", diff --git a/public/language/pt-BR/pages.json b/public/language/pt-BR/pages.json index be34ba5fb2..d31f713f16 100644 --- a/public/language/pt-BR/pages.json +++ b/public/language/pt-BR/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts votados positivamente por %1", "account/downvoted": "Posts votados negativamente por %1", "account/best": "Melhores posts de %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Usuários bloqueados para %1", "account/uploads": "Uploads feitos por %1", "account/sessions": "Sessões de Login", diff --git a/public/language/pt-BR/users.json b/public/language/pt-BR/users.json index b16313c1d5..e13553d39a 100644 --- a/public/language/pt-BR/users.json +++ b/public/language/pt-BR/users.json @@ -5,6 +5,7 @@ "most_flags": "Mais Sinalizações", "search": "Pesquisar", "enter_username": "Digite um nome de usuário para pesquisar", + "search-user-for-chat": "Search a user to start chat", "load_more": "Carregar Mais", "users-found-search-took": "%1 usuário(s) encontrado(s)! A pesquisa levou %2 segundos.", "filter-by": "Filtrar Por", diff --git a/public/language/pt-PT/admin/settings/advanced.json b/public/language/pt-PT/admin/settings/advanced.json index 13097b327c..c07f0a201c 100644 --- a/public/language/pt-PT/admin/settings/advanced.json +++ b/public/language/pt-PT/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/pt-PT/admin/settings/email.json b/public/language/pt-PT/admin/settings/email.json index 564991683a..4bdb69a1aa 100644 --- a/public/language/pt-PT/admin/settings/email.json +++ b/public/language/pt-PT/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/pt-PT/global.json b/public/language/pt-PT/global.json index 40dae7db1d..ec4d7699f3 100644 --- a/public/language/pt-PT/global.json +++ b/public/language/pt-PT/global.json @@ -56,6 +56,7 @@ "posts": "Publicações", "x-posts": "%1 posts", "best": "Melhores", + "controversial": "Controversial", "votes": "Votos", "x-votes": "%1 votes", "voters": "Votantes", diff --git a/public/language/pt-PT/modules.json b/public/language/pt-PT/modules.json index 8cadc9224e..91e6b4c244 100644 --- a/public/language/pt-PT/modules.json +++ b/public/language/pt-PT/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Conversar com", - "chat.placeholder": "Escreve a mensagem aqui, pressiona ENTER para enviar", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Enviar", "chat.no_active": "Não tens conversas ativas.", diff --git a/public/language/pt-PT/pages.json b/public/language/pt-PT/pages.json index 8ddcd552a5..3651a0c886 100644 --- a/public/language/pt-PT/pages.json +++ b/public/language/pt-PT/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Publicações votadas favoravelmente por %1", "account/downvoted": "Publicações votadas negativamente por %1", "account/best": "Melhores publicações feitas por %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Utilizadores bloqueados para %1", "account/uploads": "Carregamentos feitos por %1", "account/sessions": "Sessões ativas", diff --git a/public/language/pt-PT/users.json b/public/language/pt-PT/users.json index d4dabc760b..d8ee810a8a 100644 --- a/public/language/pt-PT/users.json +++ b/public/language/pt-PT/users.json @@ -5,6 +5,7 @@ "most_flags": "Mais Denúncias", "search": "Procurar", "enter_username": "Insere um nome de utilizador para pesquisar", + "search-user-for-chat": "Search a user to start chat", "load_more": "Carregar mais", "users-found-search-took": "%1 utilizador(es) encontrados! A pesquisa demorou %2 segundos.", "filter-by": "Filtrar por", diff --git a/public/language/ro/admin/settings/advanced.json b/public/language/ro/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/ro/admin/settings/advanced.json +++ b/public/language/ro/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/ro/admin/settings/email.json b/public/language/ro/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/ro/admin/settings/email.json +++ b/public/language/ro/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/ro/global.json b/public/language/ro/global.json index d986f2f5b9..18001ec1cf 100644 --- a/public/language/ro/global.json +++ b/public/language/ro/global.json @@ -56,6 +56,7 @@ "posts": "Mesaje", "x-posts": "%1 posts", "best": "Cel mai bun", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/ro/modules.json b/public/language/ro/modules.json index a01bae1bc4..78c9b46d19 100644 --- a/public/language/ro/modules.json +++ b/public/language/ro/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "introdu mesajul conversației aici, apasă enter pentru a trimite", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Trimite", "chat.no_active": "Nu ai nici o conversație activă", diff --git a/public/language/ro/pages.json b/public/language/ro/pages.json index 38940f2751..9b5be8f4db 100644 --- a/public/language/ro/pages.json +++ b/public/language/ro/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/ro/users.json b/public/language/ro/users.json index cecbe5971e..bda605e6a8 100644 --- a/public/language/ro/users.json +++ b/public/language/ro/users.json @@ -5,6 +5,7 @@ "most_flags": "Cele mai multe flaguri", "search": "Căutare", "enter_username": "Introdu un nume de utilizator pentru a căuta", + "search-user-for-chat": "Search a user to start chat", "load_more": "Încarcă mai multe", "users-found-search-took": "%1 utilizator(i) găsiți! Căutarea a durat %2 secunde.", "filter-by": "Filtrează după", diff --git a/public/language/ru/admin/admin.json b/public/language/ru/admin/admin.json index 1de373e0f0..256c3aa5f0 100644 --- a/public/language/ru/admin/admin.json +++ b/public/language/ru/admin/admin.json @@ -4,8 +4,8 @@ "acp-title": "%1 | Панель администратора NodeBB", "settings-header-contents": "Содержание", - "changes-saved": "Changes Saved", - "changes-saved-message": "Your changes to the NodeBB configuration have been saved.", - "changes-not-saved": "Changes Not Saved", - "changes-not-saved-message": "NodeBB encountered a problem saving your changes. (%1)" + "changes-saved": "Изменения сохранены", + "changes-saved-message": "Ваши изменения в конфигурации NodeBB были сохранены", + "changes-not-saved": "Изменения не сохранены", + "changes-not-saved-message": "Произошла ошибка NodeBB при сохранении Ваших изменений (%1)" } \ No newline at end of file diff --git a/public/language/ru/admin/advanced/events.json b/public/language/ru/admin/advanced/events.json index a1647e7c6b..f408366f8c 100644 --- a/public/language/ru/admin/advanced/events.json +++ b/public/language/ru/admin/advanced/events.json @@ -3,7 +3,7 @@ "no-events": "Нет событий", "control-panel": "Панель управления событиями", "delete-events": "Удалить события", - "confirm-delete-all-events": "Are you sure you want to delete all logged events?", + "confirm-delete-all-events": "Вы уверены, что хотите удалить все записанные события?", "filters": "Фильтр", "filters-apply": "Применить фильтр", "filter-type": "Тип события", diff --git a/public/language/ru/admin/dashboard.json b/public/language/ru/admin/dashboard.json index f8e093c304..486da5be1c 100644 --- a/public/language/ru/admin/dashboard.json +++ b/public/language/ru/admin/dashboard.json @@ -56,8 +56,8 @@ "active-users.total": "Всего", "active-users.connections": "Соединений", - "guest-registered-users": "Guest vs Registered Users", - "guest": "Guest", + "guest-registered-users": "Гостей относительно Пользователей", + "guest": "Гость", "registered": "Авторизованные", "user-presence": "Присутствие", @@ -68,7 +68,7 @@ "unread": "Просм. непрочитанные", "high-presence-topics": "Популярные темы", - "popular-searches": "Popular Searches", + "popular-searches": "Популярные поисковые запросы", "graphs.page-views": "Просмотры", "graphs.page-views-registered": "Просм. авторизованными", @@ -76,15 +76,15 @@ "graphs.page-views-bot": "Просмотров ботами", "graphs.unique-visitors": "Уникальных посетителей", "graphs.registered-users": "Авторизованных пользователей", - "graphs.guest-users": "Guest Users", + "graphs.guest-users": "Неавторизированных посетителей", "last-restarted-by": "Последний перезапуск:", "no-users-browsing": "Просмотров нет", "back-to-dashboard": "Вернуться на Панель управления", - "details.no-users": "No users have joined within the selected timeframe", - "details.no-topics": "No topics have been posted within the selected timeframe", - "details.no-searches": "No searches have been made yet", - "details.no-logins": "No logins have been recorded within the selected timeframe", - "details.logins-static": "NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions", - "details.logins-login-time": "Login Time" + "details.no-users": "Никто не присоединился за выбранный отрезок времени", + "details.no-topics": "Сообщений за выбранный отрезок времени не было", + "details.no-searches": "Поисковых запросов еще не было", + "details.no-logins": "Попыток входа за выбранный отрезок времени не было", + "details.logins-static": "NodeBB хранит данные о сессиях за %1 дней, так что таблица ниже покажет только недавние активные сессии", + "details.logins-login-time": "Время входа" } diff --git a/public/language/ru/admin/manage/privileges.json b/public/language/ru/admin/manage/privileges.json index 9d0b3188fc..78a444399a 100644 --- a/public/language/ru/admin/manage/privileges.json +++ b/public/language/ru/admin/manage/privileges.json @@ -45,7 +45,7 @@ "admin-tags": "Тэги", "admin-settings": "Настройки", - "alert.confirm-moderate": "Are you sure you wish to grant the moderation privilege to this user group? This group is public, and any users can join at will.", + "alert.confirm-moderate": "Вы уверены, что хотите наделить правами модерации эту группу? Эта группа является публичной, и к ней может присоединиться любой пользователь.", "alert.confirm-admins-mods": "Are you sure you wish to grant the "Admins & Mods" privilege to this user/group? Users with this privilege are able to promote and demote other users into privileged positions, including super administrator", "alert.confirm-save": "Вы действительно хотите сохранить эти права доступа", "alert.saved": "Изменения прав доступа сохранены и применены", diff --git a/public/language/ru/admin/settings/advanced.json b/public/language/ru/admin/settings/advanced.json index 41fde5b0ad..d0603fafd1 100644 --- a/public/language/ru/admin/settings/advanced.json +++ b/public/language/ru/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Строгая политика безопасности транспортного уровня", "hsts.enabled": "Включить HSTS (рекомендуется)", "hsts.maxAge": "Срок действия заголовка HSTS", diff --git a/public/language/ru/admin/settings/email.json b/public/language/ru/admin/settings/email.json index 53f3d2455f..68266cedf3 100644 --- a/public/language/ru/admin/settings/email.json +++ b/public/language/ru/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/ru/global.json b/public/language/ru/global.json index d547c401d0..3ac793b3bf 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -56,6 +56,7 @@ "posts": "Сообщения", "x-posts": "%1 сообщений", "best": "Лучшие сообщения", + "controversial": "Controversial", "votes": "Голоса", "x-votes": "%1 голосов", "voters": "Проголосовавшие", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index e4f6f39026..1d69be8d8e 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Чат с", - "chat.placeholder": "Введите сообщение, нажмите Enter для отправки", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Вы просматриваете старые сообщения, щелкните здесь, чтобы перейти к последнему сообщению.", "chat.send": "Отправить", "chat.no_active": "У вас нет активных чатов.", diff --git a/public/language/ru/pages.json b/public/language/ru/pages.json index 5cc7a11241..fb4df23a3a 100644 --- a/public/language/ru/pages.json +++ b/public/language/ru/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Понравилось пользователю %1", "account/downvoted": "Не понравилось пользователю %1", "account/best": "Лучшие сообщения %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Пользователи, заблокированные %1", "account/uploads": "Загрузки %1", "account/sessions": "Сессии", diff --git a/public/language/ru/users.json b/public/language/ru/users.json index 59743dbcc8..85d3dd0382 100644 --- a/public/language/ru/users.json +++ b/public/language/ru/users.json @@ -5,6 +5,7 @@ "most_flags": "Больше всего жалоб", "search": "Поиск", "enter_username": "Введите имя пользователя для поиска", + "search-user-for-chat": "Search a user to start chat", "load_more": "Загрузить еще", "users-found-search-took": "Найдено пользователей: %1! Поиск занял %2 с.", "filter-by": "Сортировать по", diff --git a/public/language/rw/admin/settings/advanced.json b/public/language/rw/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/rw/admin/settings/advanced.json +++ b/public/language/rw/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/rw/admin/settings/email.json b/public/language/rw/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/rw/admin/settings/email.json +++ b/public/language/rw/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/rw/global.json b/public/language/rw/global.json index 3fe686fcab..532188b2d3 100644 --- a/public/language/rw/global.json +++ b/public/language/rw/global.json @@ -56,6 +56,7 @@ "posts": "Ibyashyizweho", "x-posts": "%1 posts", "best": "Byiza", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/rw/modules.json b/public/language/rw/modules.json index 91ee1120e1..8401e8605d 100644 --- a/public/language/rw/modules.json +++ b/public/language/rw/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Andika ubutumwa bwawe aha. Ushobora gukanda \"Enter\" ngo wohereze.", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Ohereza", "chat.no_active": "Nta biganiro byo mu gikari ufite. ", diff --git a/public/language/rw/pages.json b/public/language/rw/pages.json index 056329e40a..b64927cb55 100644 --- a/public/language/rw/pages.json +++ b/public/language/rw/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Ibiganiro byakunzwe na %1", "account/downvoted": "Ibiganiro byanzwe na %1", "account/best": "Ibihebuje byashyizweho na %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/rw/users.json b/public/language/rw/users.json index b79a5b75a4..37dd4db9d6 100644 --- a/public/language/rw/users.json +++ b/public/language/rw/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Shaka", "enter_username": "Shyiramo izina ryo gushaka", + "search-user-for-chat": "Search a user to start chat", "load_more": "Zana Ibindi", "users-found-search-took": "Habonetse abantu (umuntu) %1! Byatwaye amasegonda %2 gusa.", "filter-by": "Yungurura Ukurikije", diff --git a/public/language/sc/admin/settings/advanced.json b/public/language/sc/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/sc/admin/settings/advanced.json +++ b/public/language/sc/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/sc/admin/settings/email.json b/public/language/sc/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/sc/admin/settings/email.json +++ b/public/language/sc/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/sc/global.json b/public/language/sc/global.json index 654edf352d..43c0fd3a9b 100644 --- a/public/language/sc/global.json +++ b/public/language/sc/global.json @@ -56,6 +56,7 @@ "posts": "Arresonos", "x-posts": "%1 posts", "best": "Best", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/sc/modules.json b/public/language/sc/modules.json index ce33cc9307..414dc8b1b9 100644 --- a/public/language/sc/modules.json +++ b/public/language/sc/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chat with", - "chat.placeholder": "Type chat message here, press enter to send", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Imbia", "chat.no_active": "Non tenes tzarras ativas.", diff --git a/public/language/sc/pages.json b/public/language/sc/pages.json index d5742b2ee1..1f96716f66 100644 --- a/public/language/sc/pages.json +++ b/public/language/sc/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Posts upvoted by %1", "account/downvoted": "Posts downvoted by %1", "account/best": "Best posts made by %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/sc/users.json b/public/language/sc/users.json index fc7da3fa35..f00d892d88 100644 --- a/public/language/sc/users.json +++ b/public/language/sc/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Chirca", "enter_username": "Pone unu nùmene de impitadore de chircare", + "search-user-for-chat": "Search a user to start chat", "load_more": "Càrriga de prus", "users-found-search-took": "%1 user(s) found! Search took %2 seconds.", "filter-by": "Filter By", diff --git a/public/language/sk/admin/settings/advanced.json b/public/language/sk/admin/settings/advanced.json index d695107ed4..06ce4a6331 100644 --- a/public/language/sk/admin/settings/advanced.json +++ b/public/language/sk/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Prísne zabezpečenie prenosu", "hsts.enabled": "Povoliť HSTS (odporúčané)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/sk/admin/settings/email.json b/public/language/sk/admin/settings/email.json index fad4ad3245..5932d772da 100644 --- a/public/language/sk/admin/settings/email.json +++ b/public/language/sk/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/sk/global.json b/public/language/sk/global.json index c319115fe5..d3a468c8c1 100644 --- a/public/language/sk/global.json +++ b/public/language/sk/global.json @@ -56,6 +56,7 @@ "posts": "Príspevky", "x-posts": "%1 posts", "best": "Najlepšie", + "controversial": "Controversial", "votes": "Počet hlasov", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/sk/modules.json b/public/language/sk/modules.json index 0507f16e17..696ccb9897 100644 --- a/public/language/sk/modules.json +++ b/public/language/sk/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Konverzácia s", - "chat.placeholder": "Sem napíšte správu, ktorú odošlete stlačením tlačidla 'Enter'", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Odoslať", "chat.no_active": "Nemáte žiadne aktívne konverzácie.", diff --git a/public/language/sk/pages.json b/public/language/sk/pages.json index 05a0932206..41d1234a8b 100644 --- a/public/language/sk/pages.json +++ b/public/language/sk/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Príspevky, ktorým používateľ %1 dal hlas", "account/downvoted": "Nesúhlasí s príspevkom %1", "account/best": "Najlepšie príspevky vytvorené užívateľom %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Zablokovaní používatelia z %1", "account/uploads": "Nahraté od %1", "account/sessions": "Login Sessions", diff --git a/public/language/sk/users.json b/public/language/sk/users.json index e048857532..1e4fa02c93 100644 --- a/public/language/sk/users.json +++ b/public/language/sk/users.json @@ -5,6 +5,7 @@ "most_flags": "Najviac označované", "search": "Vyhľadať", "enter_username": "Zadajte užívateľa k hľadaniu", + "search-user-for-chat": "Search a user to start chat", "load_more": "Načítať viac", "users-found-search-took": "%1 užívateľ(ia) sa našli! Vyhľadávanie trvalo %2 sekúnd.", "filter-by": "Filtrovať podľa", diff --git a/public/language/sl/admin/settings/advanced.json b/public/language/sl/admin/settings/advanced.json index 1ccc1a4752..58d93e5b7c 100644 --- a/public/language/sl/admin/settings/advanced.json +++ b/public/language/sl/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Omogočen HSTS (priporočeno)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/sl/admin/settings/email.json b/public/language/sl/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/sl/admin/settings/email.json +++ b/public/language/sl/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/sl/global.json b/public/language/sl/global.json index 667eec4304..28006cfc21 100644 --- a/public/language/sl/global.json +++ b/public/language/sl/global.json @@ -56,6 +56,7 @@ "posts": "Objave", "x-posts": "%1 posts", "best": "Najboljše", + "controversial": "Controversial", "votes": "Votes", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/sl/modules.json b/public/language/sl/modules.json index fbad31766c..b24c17fa4f 100644 --- a/public/language/sl/modules.json +++ b/public/language/sl/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Klepetajte z", - "chat.placeholder": "Sem vpišite sporočilo, nato potrdite za pošiljanje.", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Pošlji", "chat.no_active": "Ni aktivnih klepetov.", diff --git a/public/language/sl/pages.json b/public/language/sl/pages.json index dde3a84b82..0c766965ef 100644 --- a/public/language/sl/pages.json +++ b/public/language/sl/pages.json @@ -54,6 +54,7 @@ "account/upvoted": " Objave uporabnika %1 z glasovi za", "account/downvoted": "Objave uporabnika %1 z glasovi proti", "account/best": "Najboljše objave uporabnika %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/sl/users.json b/public/language/sl/users.json index 724ef7edaa..174b2e1916 100644 --- a/public/language/sl/users.json +++ b/public/language/sl/users.json @@ -5,6 +5,7 @@ "most_flags": "Most Flags", "search": "Išči", "enter_username": "Za iskanje vpiši uporabniško ime", + "search-user-for-chat": "Search a user to start chat", "load_more": "Naloži več", "users-found-search-took": "%1 uporabnik(ov) najdenih! Iskanje je potrebovalo %2 sekunde.", "filter-by": "Filtriraj po", diff --git a/public/language/sr/admin/settings/advanced.json b/public/language/sr/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/sr/admin/settings/advanced.json +++ b/public/language/sr/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/sr/admin/settings/email.json b/public/language/sr/admin/settings/email.json index 384c8b03d4..afd072688b 100644 --- a/public/language/sr/admin/settings/email.json +++ b/public/language/sr/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/sr/global.json b/public/language/sr/global.json index 253be8577c..c6073e81fd 100644 --- a/public/language/sr/global.json +++ b/public/language/sr/global.json @@ -56,6 +56,7 @@ "posts": "Поруке", "x-posts": "%1 поруке/а", "best": "Најбоље", + "controversial": "Controversial", "votes": "Гласови", "x-votes": "%1 гласа/ова", "voters": "Гласачи", diff --git a/public/language/sr/modules.json b/public/language/sr/modules.json index da03c59d32..44cd5b6b33 100644 --- a/public/language/sr/modules.json +++ b/public/language/sr/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Ћаскај са", - "chat.placeholder": "Овде унесите текст поруке, притисните ентер за слање", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Гледате старије поруке, кликните овде да бисте прешли на најновију поруку.", "chat.send": "Пошаљи", "chat.no_active": "Нема активних ћаскања.", diff --git a/public/language/sr/pages.json b/public/language/sr/pages.json index 3d1dccba63..ba4f3c4873 100644 --- a/public/language/sr/pages.json +++ b/public/language/sr/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Поруке које је гласао %1", "account/downvoted": "Поруке које је негативно гласао %1", "account/best": "Најбоље поруке од %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Корисници које је блокирао %1", "account/uploads": "Отпремио %1", "account/sessions": "Сесије пријављивања", diff --git a/public/language/sr/users.json b/public/language/sr/users.json index 14cafa137b..45d8f58fd8 100644 --- a/public/language/sr/users.json +++ b/public/language/sr/users.json @@ -5,6 +5,7 @@ "most_flags": "Најчешће означени заставицом", "search": "Претрага", "enter_username": "Унесите корисничко име за претрагу", + "search-user-for-chat": "Search a user to start chat", "load_more": "Учитај више", "users-found-search-took": "Нађено је %1 корисника! Претрага је завршена за %2 секунде.", "filter-by": "Филтрирај према", diff --git a/public/language/sv/admin/settings/advanced.json b/public/language/sv/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/sv/admin/settings/advanced.json +++ b/public/language/sv/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/sv/admin/settings/email.json b/public/language/sv/admin/settings/email.json index a06d4b1a48..0af7cc106d 100644 --- a/public/language/sv/admin/settings/email.json +++ b/public/language/sv/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/sv/global.json b/public/language/sv/global.json index bd9f6f4219..f14fe0afbd 100644 --- a/public/language/sv/global.json +++ b/public/language/sv/global.json @@ -56,6 +56,7 @@ "posts": "Inlägg", "x-posts": "%1 posts", "best": "Bästa", + "controversial": "Controversial", "votes": "Röster", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/sv/modules.json b/public/language/sv/modules.json index c3c35f685f..b95b2ab932 100644 --- a/public/language/sv/modules.json +++ b/public/language/sv/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Chatta med", - "chat.placeholder": "Skriv chattmeddelande här och tryck sen Enter för att skicka ", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "Du tittar på äldre meddelanden. Klicka här för att gå till det senaste meddelandet.", "chat.send": "Skicka", "chat.no_active": "Du har inte några aktiva chattar.", diff --git a/public/language/sv/pages.json b/public/language/sv/pages.json index 6927c93b47..e6145ba0fd 100644 --- a/public/language/sv/pages.json +++ b/public/language/sv/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Inlägg som röstats upp av %1", "account/downvoted": "Inlägg som röstats ned av %1", "account/best": "Bästa inläggen skapade av %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blockerade användare för %1", "account/uploads": "Uppladdningar av %1", "account/sessions": "Inloggningssessioner", diff --git a/public/language/sv/users.json b/public/language/sv/users.json index e65c57cb01..c1247acae0 100644 --- a/public/language/sv/users.json +++ b/public/language/sv/users.json @@ -5,6 +5,7 @@ "most_flags": "Mest flaggade", "search": "Sök", "enter_username": "Ange ett användarnamn för att söka", + "search-user-for-chat": "Search a user to start chat", "load_more": "Ladda fler", "users-found-search-took": "%1 användare hittades! Sökningen tog %2 sekunder.", "filter-by": "Filtrera på", diff --git a/public/language/th/admin/settings/advanced.json b/public/language/th/admin/settings/advanced.json index ce0782be9e..ddf000be64 100644 --- a/public/language/th/admin/settings/advanced.json +++ b/public/language/th/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/th/admin/settings/email.json b/public/language/th/admin/settings/email.json index 17c60daf69..8f5cdf0f95 100644 --- a/public/language/th/admin/settings/email.json +++ b/public/language/th/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/th/global.json b/public/language/th/global.json index abc6bed6d7..8b8bd12fd1 100644 --- a/public/language/th/global.json +++ b/public/language/th/global.json @@ -56,6 +56,7 @@ "posts": "กระทู้", "x-posts": "%1 posts", "best": "ดีที่สุด", + "controversial": "Controversial", "votes": "โหวต", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/th/modules.json b/public/language/th/modules.json index 73237143c6..f7cba24385 100644 --- a/public/language/th/modules.json +++ b/public/language/th/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "คุยกับ", - "chat.placeholder": "พิมพ์ข้อความแชทที่นี่ กด enter เพื่อส่ง", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "ส่ง", "chat.no_active": "คุณไม่มีแชทที่คุยอยู่", diff --git a/public/language/th/pages.json b/public/language/th/pages.json index 2833065622..df7deb0d8a 100644 --- a/public/language/th/pages.json +++ b/public/language/th/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "โพสต์ที่ถูกโหวตขึ้นโดย %1", "account/downvoted": "โพสต์ที่โหวตลงโดย %1", "account/best": "โพสต์ดีที่สุดที่ถูกสร้างโดย %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Blocked users for %1", "account/uploads": "Uploads by %1", "account/sessions": "Login Sessions", diff --git a/public/language/th/users.json b/public/language/th/users.json index 3a70f2ca7c..4ed0e4c87b 100644 --- a/public/language/th/users.json +++ b/public/language/th/users.json @@ -5,6 +5,7 @@ "most_flags": "ผู้ที่ถูกรายงานมากที่สุด", "search": "ค้นหา", "enter_username": "กรอกชื่อผู้ใช้เพื่อค้นหา", + "search-user-for-chat": "Search a user to start chat", "load_more": "โหลดเพิ่มเติม", "users-found-search-took": "พบ %1 ผู้ใช้(s)! การค้นหาใช้เวลาทั้งหมด %2 วินาที", "filter-by": "การกรอง", diff --git a/public/language/tr/admin/settings/advanced.json b/public/language/tr/admin/settings/advanced.json index d8432101d4..ec7362bcfe 100644 --- a/public/language/tr/admin/settings/advanced.json +++ b/public/language/tr/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Erişim-Kontrolü-KimlikBilgileri-İzni", "headers.acam": "Erişim-Kontrolü-Yöntem-İzni", "headers.acah": "Erişim-Kontrolü-Başlık-İzni", + "headers.coep": "Cross-Origin-Embed Politikası", + "headers.coep-help": "Etkinleştirildiğinde (varsayılan), başlığı require-corp olarak ayarlayacaktır.", + "headers.corp": "Cross-Origin Kaynak Politikası", "hsts": "STS", "hsts.enabled": "HSTS'yi etkinleştir (önerilir)", "hsts.maxAge": "HSTS Maksimum Yaş", diff --git a/public/language/tr/admin/settings/email.json b/public/language/tr/admin/settings/email.json index 8f65e96e99..a3b30a3b39 100644 --- a/public/language/tr/admin/settings/email.json +++ b/public/language/tr/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "E-postalarını onaylamayan alıcılara onay e-postası gönderin", "include-unverified-warning": "Varsayılan olarak, hesaplarıyla ilişkili e-postaları olan kullanıcılar (Sosyal Login) zaten doğrulanmıştır, ancak durumun böyle olmadığı durumlar vardır (ör. Riski size ait olmak üzere bu ayarı etkinleştirin – doğrulanmamış adreslere e-posta göndermek, bölgesel istenmeyen posta önleme yasalarının ihlali olabilir.", "prompt": "Kullanıcılardan e-postalarını girmelerini veya onaylamalarını isteyin", - "prompt-help": "Bir kullanıcının e-posta seti yoksa veya e-postası onaylanmadıysa ekranda bir uyarı gösterilir." + "prompt-help": "Bir kullanıcının e-posta seti yoksa veya e-postası onaylanmadıysa ekranda bir uyarı gösterilir.", + "sendEmailToBanned": "Yasaklanmış olsalar bile kullanıcılara e-posta gönder" } diff --git a/public/language/tr/global.json b/public/language/tr/global.json index 6f3816c7c4..981d75bb62 100644 --- a/public/language/tr/global.json +++ b/public/language/tr/global.json @@ -4,7 +4,7 @@ "buttons.close": "Kapat", "403.title": "Erişim Engellendi", "403.message": "Erişim izniniz olmayan bir sayfaya denk gelmiş gibisiniz.", - "403.login": "Belki de tekrar giriş yapmayı denersiniz?", + "403.login": "Belki tekrar giriş yapmalısınız?", "404.title": "Bulunamadı", "404.message": "Erişim izniniz olmayan bir sayfaya denk gelmiş gibisiniz. Anasayfa'ya geri dönün.", "500.title": "Dahili hata.", @@ -56,6 +56,7 @@ "posts": "İleti", "x-posts": "%1 ileti", "best": "En İyi", + "controversial": "Kontrollü", "votes": "Oy", "x-votes": "%1 oy", "voters": "Oy Verenler", @@ -121,5 +122,5 @@ "edited": "Düzenlendi", "disabled": "Devre dışı", "select": "Seç", - "user-search-prompt": "Kullanıcı bulmak için buraya bir şeyler yazın ..." + "user-search-prompt": "Kullanıcı bulmak için buraya yazın ..." } \ No newline at end of file diff --git a/public/language/tr/modules.json b/public/language/tr/modules.json index 76cfd08d0b..502360b4b0 100644 --- a/public/language/tr/modules.json +++ b/public/language/tr/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Sohbet", - "chat.placeholder": "Buraya bir mesaj girin, göndermek için girişe basın", + "chat.placeholder": "Mesajı yazın veya resim sürükleyip bırakın", "chat.scroll-up-alert": "Eski mesajlara bakıyorsunuz, en yeni mesajları görmek için buraya tıklayınız.", "chat.send": "Gönder", "chat.no_active": "Aktif sohbet mevcut değil", diff --git a/public/language/tr/pages.json b/public/language/tr/pages.json index 7790f45f20..27712bf62c 100644 --- a/public/language/tr/pages.json +++ b/public/language/tr/pages.json @@ -44,21 +44,22 @@ "account/followers": "%1 kullanıcısını takip edenler", "account/posts": "%1 tarafından gönderilen iletiler", "account/latest-posts": "%1 tarafından gönderilen son iletiler", - "account/topics": "%1 tarafından oluşturulan konular", + "account/topics": "%1 tarafından oluşturulan başlıklar", "account/groups": "%1 kullanıcısına ait gruplar", "account/watched_categories": "%1 kullanıcısının takip ettiği kategoriler", - "account/bookmarks": "%1' kullanıcısının yer imlerine eklenmiş iletiler", + "account/bookmarks": "%1 kullanıcısının yer imlerine eklenmiş iletiler", "account/settings": "Kullanıcı Ayarları", - "account/watched": "%1 tarafından takip edilen konular", - "account/ignored": "%1 tarafından susturulan konular", + "account/watched": "%1 tarafından takip edilen başlıklar", + "account/ignored": "%1 tarafından yok sayılan başlıklar", "account/upvoted": "%1 tarafından artılanan iletiler", "account/downvoted": "%1 tarafından eksilenen iletiler", "account/best": "%1 tarafından gönderilen en iyi iletiler", + "account/controversial": "%1 tarafından gönderilen tartışmalı iletiler", "account/blocks": "%1 tarafından engellenen kullanıcılar", "account/uploads": "%1 kullanıcısının yüklediği dosyalar", "account/sessions": "Giriş Oturumları", "confirm": "E-posta Onaylandı", "maintenance.text": "%1 şu anda bakımda. Lütfen bir süre sonra tekrar deneyin.", "maintenance.messageIntro": "Ayrıca, yönetici şu mesaji bıraktı:", - "throttled.text": "%1 şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin." + "throttled.text": "%1 şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyiniz." } \ No newline at end of file diff --git a/public/language/tr/user.json b/public/language/tr/user.json index bff6ccbdb1..687ab01032 100644 --- a/public/language/tr/user.json +++ b/public/language/tr/user.json @@ -97,9 +97,9 @@ "digest_biweekly": "İki haftada bir", "digest_monthly": "Aylık", "has_no_follower": "Bu kullanıcının hiç takipçisi yok :(", - "follows_no_one": "Bu kullanıcı kimseyi takip etmiyor :(", + "follows_no_one": "Bu kullanıcı hiçkimseyi takip etmiyor :(", "has_no_posts": "Bu kullanıcı henüz herhangi bir ileti yazmamış :(", - "has_no_best_posts": "Bu kullanıcının herhangi bir gönderisi henüz olumlu oy almadı.", + "has_no_best_posts": "Bu kullanıcının herhangi bir gönderisi henüz artı oy almadı.", "has_no_topics": "Bu kullanıcı henüz hiçbir başlık açmamış :(", "has_no_watched_topics": "Bu kullanıcı henüz hiçbir başlığı takip etmiyor :(", "has_no_ignored_topics": "Bu kullanıcı henüz hiçbir başlığı yok saymamış.", @@ -148,7 +148,7 @@ "info.latest-flags": "Son Bayraklar", "info.no-flags": "Hiç bayraklanan bir ileti bulunamadı", "info.ban-history": "Yasaklama Olayları", - "info.no-ban-history": "Bu kullanıcı hiç yasaklanmadı", + "info.no-ban-history": "Bu kullanıcı daha önce hiç yasaklanmadı", "info.banned-until": "Yasaklama süresi %1", "info.banned-expiry": "Bitiş", "info.banned-permanently": "Kalıcı şekilde yasakla", diff --git a/public/language/tr/users.json b/public/language/tr/users.json index fb539f9bdf..624ab59523 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -5,6 +5,7 @@ "most_flags": "En Fazla Şikayet", "search": "Ara", "enter_username": "Aramak için bir kullanıcı adı girin", + "search-user-for-chat": "Sohbet için bir kullanıcı arayın", "load_more": "Daha Fazla Yükle", "users-found-search-took": "%1 kullanıcı(lar) bulundu! Arama %2 saniye sürdü.", "filter-by": "Şu şekilde filtrele", diff --git a/public/language/uk/admin/settings/advanced.json b/public/language/uk/admin/settings/advanced.json index 00698ca565..3a40be753f 100644 --- a/public/language/uk/admin/settings/advanced.json +++ b/public/language/uk/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Доступ-Контроль-Дозвіл-Права", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Strict Transport Security", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/uk/admin/settings/email.json b/public/language/uk/admin/settings/email.json index 86c1d1c540..1f68589fc1 100644 --- a/public/language/uk/admin/settings/email.json +++ b/public/language/uk/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/uk/global.json b/public/language/uk/global.json index 8416b31cdd..42601de5db 100644 --- a/public/language/uk/global.json +++ b/public/language/uk/global.json @@ -56,6 +56,7 @@ "posts": "Пости", "x-posts": "%1 posts", "best": "Найкращі", + "controversial": "Controversial", "votes": "Голоси", "x-votes": "%1 votes", "voters": "Voters", diff --git a/public/language/uk/modules.json b/public/language/uk/modules.json index a7921e4a8a..6916de541f 100644 --- a/public/language/uk/modules.json +++ b/public/language/uk/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Чат з", - "chat.placeholder": "Надрукуйте повідомлення і натисніть Enter для відправки", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Надіслати", "chat.no_active": "У вас немає активних чатів.", diff --git a/public/language/uk/pages.json b/public/language/uk/pages.json index 88bae4fd9f..d30285edda 100644 --- a/public/language/uk/pages.json +++ b/public/language/uk/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Пости за які проголосував %1", "account/downvoted": "Пости проти яких проголосував %1", "account/best": "Найкращі пости %1", + "account/controversial": "Controversial posts made by %1", "account/blocks": "Заблоковані користувачі для %1", "account/uploads": "Завантаження від %1", "account/sessions": "Логін-сесії", diff --git a/public/language/uk/users.json b/public/language/uk/users.json index 01951b7753..9495f89850 100644 --- a/public/language/uk/users.json +++ b/public/language/uk/users.json @@ -5,6 +5,7 @@ "most_flags": "Найбільше скарг", "search": "Пошук", "enter_username": "Уведіть ім'я користувача для пошуку", + "search-user-for-chat": "Search a user to start chat", "load_more": "Завантажити більше", "users-found-search-took": "%1 користувач(ів) знайдено! Пошук тривав %2 секунди.", "filter-by": "Фільтрувати за", diff --git a/public/language/vi/admin/settings/advanced.json b/public/language/vi/admin/settings/advanced.json index 304f58d8fc..6d3740e6d9 100644 --- a/public/language/vi/admin/settings/advanced.json +++ b/public/language/vi/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "Khi được bật (mặc định), sẽ đặt tiêu đề thành require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "Bảo Vệ Truyền Tải Nghiêm Ngặt", "hsts.enabled": "Đã bật HSTS (đề nghị)", "hsts.maxAge": "HSTS Tuổi Tối Đa", diff --git a/public/language/vi/admin/settings/email.json b/public/language/vi/admin/settings/email.json index 06a5256327..764c06d3d9 100644 --- a/public/language/vi/admin/settings/email.json +++ b/public/language/vi/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Gửi email đến những người nhận chưa xác nhận rõ ràng email của họ", "include-unverified-warning": "Theo mặc định, người dùng có email được liên kết với tài khoản của họ đã được xác minh, nhưng có những trường hợp không phải như vậy (ví dụ: đăng nhập SSO, người dùng phổ thông, v.v.). Bạn tự chịu rủi ro khi bật cài đặt này – gửi email đến các địa chỉ chưa được xác minh có thể vi phạm luật chống thư rác trong khu vực.", "prompt": "Nhắc người dùng nhập hoặc xác nhận email của họ", - "prompt-help": "Nếu người dùng chưa cung cấp email hoặc email của họ chưa được xác nhận, một cảnh báo sẽ được hiển thị trên màn hình." + "prompt-help": "Nếu người dùng chưa cung cấp email hoặc email của họ chưa được xác nhận, một cảnh báo sẽ được hiển thị trên màn hình.", + "sendEmailToBanned": "Gửi email cho người dùng ngay cả khi họ đã bị cấm" } diff --git a/public/language/vi/global.json b/public/language/vi/global.json index 534e5ce59a..bc9a48332a 100644 --- a/public/language/vi/global.json +++ b/public/language/vi/global.json @@ -56,6 +56,7 @@ "posts": "Bài Viết", "x-posts": "%1 bài viết", "best": "Tốt", + "controversial": "Gây tranh cãi", "votes": "Bình chọn", "x-votes": "%1 bình chọn", "voters": "Người Bình Chọn", diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index 093455da02..06e6bf402f 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -1,12 +1,12 @@ { "chat.chatting_with": "Trò chuyện với", - "chat.placeholder": "Nhập tin nhắn trò chuyện ở đây, bấm enter để gửi", + "chat.placeholder": "Nhập tin nhắn trò chuyện tại đây, kéo và thả hình ảnh, nhấn enter để gửi", "chat.scroll-up-alert": "Bạn đang xem các tin nhắn cũ hơn, nhấp vào đây để chuyển đến tin nhắn gần đây nhất.", "chat.send": "Gửi", "chat.no_active": "Bạn không có cuộc trò chuyện đang hoạt động nào.", "chat.user_typing": "%1 đang nhập...", "chat.user_has_messaged_you": "%1 đã nhắn tin cho bạn.", - "chat.see_all": "Xem tất cả các cuộc trò chuyện", + "chat.see_all": "Xem tất cả trò chuyện", "chat.mark_all_read": "Đánh dấu tất cả các cuộc trò chuyện là đã đọc", "chat.no-messages": "Vui lòng chọn người nhận để xem lịch sử tin nhắn trò chuyện", "chat.no-users-in-room": "Không có người nào trong phòng này.", diff --git a/public/language/vi/pages.json b/public/language/vi/pages.json index aa4258fdbc..fc1da7afaf 100644 --- a/public/language/vi/pages.json +++ b/public/language/vi/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "Bài đăng được %1 ủng hộ", "account/downvoted": "Bài viết %1 phản đối", "account/best": "Bài viết hay nhất của %1", + "account/controversial": "Các bài đăng gây tranh cãi được thực hiện bởi %1", "account/blocks": "Người dùng bị chặn vì %1", "account/uploads": "Tải lên bởi %1", "account/sessions": "Phiên Đăng Nhập", diff --git a/public/language/vi/users.json b/public/language/vi/users.json index a7ab102a21..b5caadd441 100644 --- a/public/language/vi/users.json +++ b/public/language/vi/users.json @@ -5,6 +5,7 @@ "most_flags": "Gắn cờ nhiều", "search": "Tìm kiếm", "enter_username": "Nhập tên đăng nhập để tìm", + "search-user-for-chat": "Tìm kiếm người dùng để bắt đầu trò chuyện", "load_more": "Tải thêm", "users-found-search-took": "Đã tìm thấy %1 thành viên! Tìm kiếm mất %2 giây.", "filter-by": "Lọc Bởi", diff --git a/public/language/zh-CN/admin/settings/advanced.json b/public/language/zh-CN/admin/settings/advanced.json index 689ac24327..8b418f7d84 100644 --- a/public/language/zh-CN/admin/settings/advanced.json +++ b/public/language/zh-CN/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "严格安全传输(HSTS)", "hsts.enabled": "启用HSTS(推荐)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/zh-CN/admin/settings/email.json b/public/language/zh-CN/admin/settings/email.json index d753190123..53623e47a3 100644 --- a/public/language/zh-CN/admin/settings/email.json +++ b/public/language/zh-CN/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/zh-CN/global.json b/public/language/zh-CN/global.json index 0545494ea3..1ac52ce361 100644 --- a/public/language/zh-CN/global.json +++ b/public/language/zh-CN/global.json @@ -56,6 +56,7 @@ "posts": "帖子", "x-posts": "%1 个帖子", "best": "最佳", + "controversial": "Controversial", "votes": "赞同", "x-votes": "%1 个投票", "voters": "投票人", diff --git a/public/language/zh-CN/modules.json b/public/language/zh-CN/modules.json index 2e30ae463e..123e275050 100644 --- a/public/language/zh-CN/modules.json +++ b/public/language/zh-CN/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "与聊天", - "chat.placeholder": "在这里输入聊天消息,按回车键发送", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "您正在查看较旧的消息,点击此处转到最新消息。", "chat.send": "发送", "chat.no_active": "暂无聊天", diff --git a/public/language/zh-CN/pages.json b/public/language/zh-CN/pages.json index 2ce33a8948..84ca56da38 100644 --- a/public/language/zh-CN/pages.json +++ b/public/language/zh-CN/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "帖子被 %1 顶过", "account/downvoted": "帖子被 %1 踩过", "account/best": "%1 发布的最佳帖子", + "account/controversial": "Controversial posts made by %1", "account/blocks": "%1 屏蔽的用户", "account/uploads": "%1 上传的文件", "account/sessions": "已登录的会话", diff --git a/public/language/zh-CN/users.json b/public/language/zh-CN/users.json index 9b1f392eb8..c84399c567 100644 --- a/public/language/zh-CN/users.json +++ b/public/language/zh-CN/users.json @@ -5,6 +5,7 @@ "most_flags": "举报最多", "search": "搜索", "enter_username": "输入用户名搜索", + "search-user-for-chat": "Search a user to start chat", "load_more": "加载更多", "users-found-search-took": "找到 %1 位用户!耗时 %2 秒。", "filter-by": "过滤选项", diff --git a/public/language/zh-TW/admin/settings/advanced.json b/public/language/zh-TW/admin/settings/advanced.json index a13c583948..1deb97b0f7 100644 --- a/public/language/zh-TW/admin/settings/advanced.json +++ b/public/language/zh-TW/admin/settings/advanced.json @@ -15,6 +15,9 @@ "headers.acac": "Access-Control-Allow-Credentials", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", + "headers.coep": "Cross-Origin-Embedder-Policy", + "headers.coep-help": "When enabled (default), will set the header to require-corp", + "headers.corp": "Cross-Origin-Resource-Policy", "hsts": "嚴格安全傳輸", "hsts.enabled": "啟用HSTS(推薦)", "hsts.maxAge": "HSTS Max Age", diff --git a/public/language/zh-TW/admin/settings/email.json b/public/language/zh-TW/admin/settings/email.json index 6e6b0416d4..f3c3753373 100644 --- a/public/language/zh-TW/admin/settings/email.json +++ b/public/language/zh-TW/admin/settings/email.json @@ -43,5 +43,6 @@ "include-unverified-emails": "Send emails to recipients who have not explicitly confirmed their emails", "include-unverified-warning": "By default, users with emails associated with their account have already been verified, but there are situations where this is not the case (e.g. SSO logins, grandfathered users, etc). Enable this setting at your own risk – sending emails to unverified addresses may be a violation of regional anti-spam laws.", "prompt": "Prompt users to enter or confirm their emails", - "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen." + "prompt-help": "If a user does not have an email set, or their email is not confirmed, a warning will be shown on screen.", + "sendEmailToBanned": "Send emails to users even if they have been banned" } diff --git a/public/language/zh-TW/global.json b/public/language/zh-TW/global.json index c32df7c888..315e195d8b 100644 --- a/public/language/zh-TW/global.json +++ b/public/language/zh-TW/global.json @@ -56,6 +56,7 @@ "posts": "貼文", "x-posts": "%1 posts", "best": "最佳", + "controversial": "Controversial", "votes": "評價", "x-votes": "%1 votes", "voters": "評價人數", diff --git a/public/language/zh-TW/modules.json b/public/language/zh-TW/modules.json index 66c1f3d41f..be408146ef 100644 --- a/public/language/zh-TW/modules.json +++ b/public/language/zh-TW/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "與聊天", - "chat.placeholder": "在這裡輸入聊天訊息,按返回鍵發送", + "chat.placeholder": "Type chat message here, drag & drop images, press enter to send", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "發送", "chat.no_active": "暫無聊天", diff --git a/public/language/zh-TW/pages.json b/public/language/zh-TW/pages.json index a60198c98d..9516c568cb 100644 --- a/public/language/zh-TW/pages.json +++ b/public/language/zh-TW/pages.json @@ -54,6 +54,7 @@ "account/upvoted": "貼文被 %1 點贊", "account/downvoted": "貼文被 %1 倒讚", "account/best": "%1 發佈的最佳貼文", + "account/controversial": "Controversial posts made by %1", "account/blocks": "%1 封鎖的使用者", "account/uploads": "%1 上傳的檔案", "account/sessions": "已登入的會話", diff --git a/public/language/zh-TW/users.json b/public/language/zh-TW/users.json index 6af6963b18..2e67d9c826 100644 --- a/public/language/zh-TW/users.json +++ b/public/language/zh-TW/users.json @@ -5,6 +5,7 @@ "most_flags": "舉報最多", "search": "搜尋", "enter_username": "輸入使用者名搜索", + "search-user-for-chat": "Search a user to start chat", "load_more": "載入更多", "users-found-search-took": "找到 %1 位使用者!耗時 %2 秒。", "filter-by": "過濾選項", diff --git a/public/less/generics.less b/public/less/generics.less index d7cd2b3ec3..ec8b0c1adf 100644 --- a/public/less/generics.less +++ b/public/less/generics.less @@ -172,4 +172,13 @@ .timeline-badge { padding: 1rem; } +} + +.imagedrop { + position: absolute; + text-align: center; + font-size: 24px; + color: @gray-light; + width: 100%; + display: none; } \ No newline at end of file diff --git a/public/openapi/read.yaml b/public/openapi/read.yaml index a00a5bb27d..31b446d351 100644 --- a/public/openapi/read.yaml +++ b/public/openapi/read.yaml @@ -278,6 +278,8 @@ paths: $ref: 'read/user/userslug/topics.yaml' "/api/user/{userslug}/best": $ref: 'read/user/userslug/best.yaml' + "/api/user/{userslug}/controversial": + $ref: 'read/user/userslug/controversial.yaml' "/api/user/{userslug}/groups": $ref: 'read/user/userslug/groups.yaml' "/api/user/{userslug}/bookmarks": diff --git a/public/openapi/read/user/userslug/best.yaml b/public/openapi/read/user/userslug/best.yaml index ce4a8ffbd2..657e54fdeb 100644 --- a/public/openapi/read/user/userslug/best.yaml +++ b/public/openapi/read/user/userslug/best.yaml @@ -1,7 +1,7 @@ get: tags: - users - summary: Get a user's best performing topics + summary: Get a user's best performing posts parameters: - name: userslug in: path diff --git a/public/openapi/read/user/userslug/controversial.yaml b/public/openapi/read/user/userslug/controversial.yaml new file mode 100644 index 0000000000..c5a7fa2791 --- /dev/null +++ b/public/openapi/read/user/userslug/controversial.yaml @@ -0,0 +1,45 @@ +get: + tags: + - users + summary: Get a user's worse performing posts ("controversial") + parameters: + - name: userslug + in: path + required: true + schema: + type: string + example: admin + responses: + "200": + description: "" + content: + application/json: + schema: + allOf: + - $ref: ../../../components/schemas/UserObject.yaml#/UserObjectFull + - type: object + properties: + posts: + $ref: ../../../components/schemas/PostsObject.yaml#/PostsObject + nextStart: + type: number + noItemsFoundKey: + type: string + title: + type: string + showSort: + type: boolean + sortOptions: + type: array + items: + type: object + properties: + url: + type: string + name: + type: string + selected: + type: boolean + - $ref: ../../../components/schemas/Pagination.yaml#/Pagination + - $ref: ../../../components/schemas/Breadcrumbs.yaml#/Breadcrumbs + - $ref: ../../../components/schemas/CommonProps.yaml#/CommonProps \ No newline at end of file diff --git a/public/src/admin/modules/dashboard-line-graph.js b/public/src/admin/modules/dashboard-line-graph.js index 38f75e62cc..1e11b82e5b 100644 --- a/public/src/admin/modules/dashboard-line-graph.js +++ b/public/src/admin/modules/dashboard-line-graph.js @@ -182,7 +182,8 @@ define('admin/modules/dashboard-line-graph', ['Chart', 'translator', 'benchpress count: amount, }); apiEl.attr('href', `${config.relative_path}/api/v3/admin/analytics/${ajaxify.data.set}?${newHref}`); - ajaxify.updateHistory(`${ajaxify.data.url.slice(1)}?${newHref}`, true); + const url = ajaxify.removeRelativePath(ajaxify.data.url.slice(1)); + ajaxify.updateHistory(`${url}?${newHref}`, true); hooks.fire('action:admin.dashboard.updateGraph', { graph: Graph._current, }); diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 6181af8357..04bcb6949e 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -344,7 +344,7 @@ ajaxify = window.ajaxify || {}; // Require and parse modules let outstanding = data.scripts.length; - data.scripts.map(function (script) { + const scripts = data.scripts.map(function (script) { if (typeof script === 'function') { return function (next) { script(); @@ -369,14 +369,20 @@ ajaxify = window.ajaxify || {}; }; } return null; - }).filter(Boolean).forEach(function (fn) { - fn(function () { - outstanding -= 1; - if (outstanding === 0) { - callback(); - } + }).filter(Boolean); + + if (scripts.length) { + scripts.forEach(function (fn) { + fn(function () { + outstanding -= 1; + if (outstanding === 0) { + callback(); + } + }); }); - }); + } else { + callback(); + } }); }; diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 6ef927d48c..f907e84e63 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -25,6 +25,10 @@ define('forum/account/edit', [ }); }); + if (ajaxify.data.groupTitleArray.length === 1 && ajaxify.data.groupTitleArray[0] === '') { + $('#groupTitle option[value=""]').attr('selected', true); + } + handleImageChange(); handleAccountDelete(); handleEmailConfirm(); @@ -36,6 +40,7 @@ define('forum/account/edit', [ function updateProfile() { const userData = $('form[component="profile/edit/form"]').serializeObject(); userData.uid = ajaxify.data.uid; + userData.groupTitle = userData.groupTitle || ''; userData.groupTitle = JSON.stringify( Array.isArray(userData.groupTitle) ? userData.groupTitle : [userData.groupTitle] ); diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 10e9ec4b52..1c27176959 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -14,11 +14,12 @@ define('forum/chats', [ 'alerts', 'chat', 'api', + 'uploadHelpers', ], function ( components, translator, mousetrap, recentChats, search, messages, autocomplete, hooks, bootbox, alerts, chatModule, - api + api, uploadHelpers ) { const Chats = { initialised: false, @@ -69,12 +70,35 @@ define('forum/chats', [ Chats.addCharactersLeftHandler($('[component="chat/main-wrapper"]')); Chats.addIPHandler($('[component="chat/main-wrapper"]')); Chats.createAutoComplete($('[component="chat/input"]')); + Chats.addUploadHandler({ + dragDropAreaEl: $('.chats-full'), + pasteEl: $('[component="chat/input"]'), + uploadFormEl: $('[component="chat/upload"]'), + inputEl: $('[component="chat/input"]'), + }); $('[data-action="close"]').on('click', function () { Chats.switchChat(); }); }; + Chats.addUploadHandler = function (options) { + uploadHelpers.init({ + dragDropAreaEl: options.dragDropAreaEl, + pasteEl: options.pasteEl, + uploadFormEl: options.uploadFormEl, + route: '/api/post/upload', // using same route as post uploads + callback: function (uploads) { + const inputEl = options.inputEl; + let text = inputEl.val(); + uploads.forEach((upload) => { + text = text + (text ? '\n' : '') + (upload.isImage ? '!' : '') + `[${upload.filename}](${upload.url})`; + }); + inputEl.val(text); + }, + }); + }; + Chats.addIPHandler = function (container) { container.on('click', '.chat-ip-button', function () { const ipEl = $(this).parent(); diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index a09cf9f06d..00961bc883 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -11,7 +11,8 @@ define('forum/topic/postTools', [ 'bootbox', 'alerts', 'hooks', -], function (share, navigator, components, translator, votes, api, bootbox, alerts, hooks) { + 'slugify', +], function (share, navigator, components, translator, votes, api, bootbox, alerts, hooks, slugify) { const PostTools = {}; let staleReplyAnyway = false; @@ -374,7 +375,7 @@ define('forum/topic/postTools', [ } if (post.length) { - slug = post.attr('data-userslug'); + slug = slugify(post.attr('data-username'), true); if (!slug) { if (post.attr('data-uid') !== '0') { slug = '[[global:former_user]]'; @@ -465,67 +466,67 @@ define('forum/topic/postTools', [ warning.modal(); } + const selectionChangeFn = utils.debounce(selectionChange, 100); + function handleSelectionTooltip() { hooks.onPage('action:posts.loaded', delayedTooltip); - $(document).off('mouseup', delayedTooltip).on('mouseup', delayedTooltip); - $(document).off('selectionchange', selectionChange).on('selectionchange', selectionChange); + $(document).off('selectionchange', selectionChangeFn).on('selectionchange', selectionChangeFn); } - let selectionEmpty = true; function selectionChange() { - selectionEmpty = window.getSelection().toString() === ''; + const selectionEmpty = window.getSelection().toString() === ''; if (selectionEmpty) { $('[component="selection/tooltip"]').addClass('hidden'); + } else { + delayedTooltip(); } } - function delayedTooltip() { - setTimeout(async function () { - let selectionTooltip = $('[component="selection/tooltip"]'); - selectionTooltip.addClass('hidden'); - if (selectionTooltip.attr('data-ajaxify') === '1') { - selectionTooltip.remove(); + async function delayedTooltip() { + let selectionTooltip = $('[component="selection/tooltip"]'); + selectionTooltip.addClass('hidden'); + if (selectionTooltip.attr('data-ajaxify') === '1') { + selectionTooltip.remove(); + return; + } + + const selection = window.getSelection(); + if (selection.focusNode && selection.type === 'Range' && ajaxify.data.template.topic) { + const focusNode = $(selection.focusNode); + const anchorNode = $(selection.anchorNode); + const firstPid = anchorNode.parents('[data-pid]').attr('data-pid'); + const lastPid = focusNode.parents('[data-pid]').attr('data-pid'); + if (firstPid !== lastPid || !focusNode.parents('[component="post/content"]').length || !anchorNode.parents('[component="post/content"]').length) { return; } + const postEl = focusNode.parents('[data-pid]'); + const selectionRange = selection.getRangeAt(0); + if (!postEl.length || selectionRange.collapsed) { + return; + } + const rects = selectionRange.getClientRects(); + const lastRect = rects[rects.length - 1]; - const selection = window.getSelection(); - if (selection.focusNode && selection.type === 'Range' && ajaxify.data.template.topic && !selectionEmpty) { - const focusNode = $(selection.focusNode); - const anchorNode = $(selection.anchorNode); - const firstPid = anchorNode.parents('[data-pid]').attr('data-pid'); - const lastPid = focusNode.parents('[data-pid]').attr('data-pid'); - if (firstPid !== lastPid || !focusNode.parents('[component="post/content"]').length || !anchorNode.parents('[component="post/content"]').length) { - return; - } - const postEl = focusNode.parents('[data-pid]'); - const selectionRange = selection.getRangeAt(0); - if (!postEl.length || selectionRange.collapsed) { - return; - } - const rects = selectionRange.getClientRects(); - const lastRect = rects[rects.length - 1]; - - if (!selectionTooltip.length) { - selectionTooltip = await app.parseAndTranslate('partials/topic/selection-tooltip', ajaxify.data); - selectionTooltip.addClass('hidden').appendTo('body'); - } - selectionTooltip.off('click').on('click', '[component="selection/tooltip/quote"]', function () { - selectionTooltip.addClass('hidden'); - onQuoteClicked(postEl.find('[component="post/quote"]'), ajaxify.data.tid); - }); - selectionTooltip.removeClass('hidden'); - $(window).one('action:ajaxify.start', function () { - selectionTooltip.attr('data-ajaxify', 1).addClass('hidden'); - $(document).off('selectionchange', selectionChange); - }); - const tooltipWidth = selectionTooltip.outerWidth(true); - selectionTooltip.css({ - top: lastRect.bottom + $(window).scrollTop(), - left: tooltipWidth > lastRect.width ? lastRect.left : lastRect.left + lastRect.width - tooltipWidth, - }); + if (!selectionTooltip.length) { + selectionTooltip = await app.parseAndTranslate('partials/topic/selection-tooltip', ajaxify.data); + selectionTooltip.addClass('hidden').appendTo('body'); } - }, 0); + selectionTooltip.off('click').on('click', '[component="selection/tooltip/quote"]', function () { + selectionTooltip.addClass('hidden'); + onQuoteClicked(postEl.find('[component="post/quote"]'), ajaxify.data.tid); + }); + selectionTooltip.removeClass('hidden'); + $(window).one('action:ajaxify.start', function () { + selectionTooltip.attr('data-ajaxify', 1).addClass('hidden'); + $(document).off('selectionchange', selectionChangeFn); + }); + const tooltipWidth = selectionTooltip.outerWidth(true); + selectionTooltip.css({ + top: lastRect.bottom + $(window).scrollTop(), + left: tooltipWidth > lastRect.width ? lastRect.left : lastRect.left + lastRect.width - tooltipWidth, + }); + } } return PostTools; diff --git a/public/src/client/unread.js b/public/src/client/unread.js index 13e64deada..9ae0bf7a09 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -122,6 +122,8 @@ define('forum/unread', [ $('a[href="' + config.relative_path + url + '"].navigation-link i') .toggleClass('unread-count', count > 0) .attr('data-content', count > 99 ? '99+' : count); + + $('#mobile-menu [data-unread-url="' + url + '"]').attr('data-content', count > 99 ? '99+' : count); } Unread.initUnreadTopics = function () { diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js index da0fc006e7..a5fbbc8a8d 100644 --- a/public/src/modules/alerts.js +++ b/public/src/modules/alerts.js @@ -89,8 +89,8 @@ define('alerts', ['translator', 'components', 'hooks'], function (translator, co } function updateAlert(alert, params) { - alert.find('strong').html(params.title); - alert.find('p').html(params.message); + alert.find('strong').translateHtml(params.title); + alert.find('p').translateHtml(params.message); alert.attr('class', 'alert alert-dismissable alert-' + params.type + ' clearfix'); clearTimeout(parseInt(alert.attr('timeoutId'), 10)); @@ -98,12 +98,7 @@ define('alerts', ['translator', 'components', 'hooks'], function (translator, co startTimeout(alert, params); } - alert.children().fadeOut(100); - translator.translate(alert.html(), function (translatedHTML) { - alert.children().fadeIn(100); - alert.html(translatedHTML); - hooks.fire('action:alert.update', { alert, params }); - }); + hooks.fire('action:alert.update', { alert, params }); // Handle changes in the clickfn alert.off('click').removeClass('pointer'); diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 78b1e67902..80f22a9b24 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -196,7 +196,9 @@ define('chat', [ module.createModal = function (data, callback) { callback = callback || function () {}; - require(['scrollStop', 'forum/chats', 'forum/chats/messages'], function (scrollStop, Chats, ChatsMessages) { + require([ + 'scrollStop', 'forum/chats', 'forum/chats/messages', + ], function (scrollStop, Chats, ChatsMessages) { app.parseAndTranslate('chat', data, function (chatModal) { if (module.modalExists(data.roomId)) { return callback(module.getModal(data.roomId)); @@ -233,7 +235,7 @@ define('chat', [ taskbar.updateActive(uuid); }, stop: function () { - chatModal.find('#chat-message-input').focus(); + module.focusInput(chatModal); }, distance: 10, handle: '.modal-header', @@ -297,6 +299,14 @@ define('chat', [ Chats.addCharactersLeftHandler(chatModal); Chats.addIPHandler(chatModal); + + Chats.addUploadHandler({ + dragDropAreaEl: chatModal.find('.modal-content'), + pasteEl: chatModal, + uploadFormEl: chatModal.find('[component="chat/upload"]'), + inputEl: chatModal.find('[component="chat/input"]'), + }); + ChatsMessages.addSocketListeners(); taskbar.push('chat', chatModal.attr('data-uuid'), { @@ -318,7 +328,9 @@ define('chat', [ }; module.focusInput = function (chatModal) { - chatModal.find('[component="chat/input"]').focus(); + setTimeout(function () { + chatModal.find('[component="chat/input"]').focus(); + }, 20); }; module.close = function (chatModal) { diff --git a/public/src/modules/search.js b/public/src/modules/search.js index 60a29ee8cc..75ca6f2a69 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -113,7 +113,7 @@ define('search', ['translator', 'storage', 'hooks', 'alerts'], function (transla options.searchOptions.searchOnly = 1; Search.api(options.searchOptions, function (data) { quickSearchResults.find('.loading-indicator').addClass('hidden'); - if (options.hideOnNoMatches && !data.posts.length) { + if (!data.posts || (options.hideOnNoMatches && !data.posts.length)) { return quickSearchResults.addClass('hidden').find('.quick-search-results-container').html(''); } data.posts.forEach(function (p) { diff --git a/public/src/modules/settings/sorted-list.js b/public/src/modules/settings/sorted-list.js index 367999161e..dba5da9bc0 100644 --- a/public/src/modules/settings/sorted-list.js +++ b/public/src/modules/settings/sorted-list.js @@ -26,41 +26,44 @@ define('settings/sorted-list', [ values[key].push(formData); }); }, - get: function ($container, hash) { - const $list = $container.find('[data-type="list"]'); - const key = $container.attr('data-sorted-list'); - const formTpl = $container.attr('data-form-template'); + get: async ($container, hash) => { + const { listEl, key, formTpl, formValues } = await hooks.fire('filter:settings.sorted-list.load', { + listEl: $container.find('[data-type="list"]'), + key: $container.attr('data-sorted-list'), + formTpl: $container.attr('data-form-template'), + formValues: {}, + }); - benchpress.render(formTpl, {}).then(function (formHtml) { - const addBtn = $('[data-sorted-list="' + key + '"] [data-type="add"]'); + const formHtml = await benchpress.render(formTpl, formValues); - addBtn.on('click', function () { - const modal = bootbox.confirm(formHtml, function (save) { - if (save) { - SortedList.addItem(modal.find('form').children(), $container); - } - }); + const addBtn = $('[data-sorted-list="' + key + '"] [data-type="add"]'); + + addBtn.on('click', function () { + const modal = bootbox.confirm(formHtml, function (save) { + if (save) { + SortedList.addItem(modal.find('form').children(), $container); + } }); + }); - const call = $container.parents('form').attr('data-socket-get'); - const list = ajaxify.data[call ? hash : 'settings'][key]; + const call = $container.parents('form').attr('data-socket-get'); + const list = ajaxify.data[call ? hash : 'settings'][key]; - if (Array.isArray(list) && typeof list[0] !== 'string') { - list.forEach(function (item) { - const itemUUID = utils.generateUUID(); - const form = $(formHtml).deserialize(item); - form.attr('data-sorted-list-uuid', itemUUID); - form.attr('data-sorted-list-object', key); - $('#content').append(form.hide()); + if (Array.isArray(list) && typeof list[0] !== 'string') { + list.forEach(function (item) { + const itemUUID = utils.generateUUID(); + const form = $(formHtml).deserialize(item); + form.attr('data-sorted-list-uuid', itemUUID); + form.attr('data-sorted-list-object', key); + $('#content').append(form.hide()); - parse($container, itemUUID, item).then(() => { - hooks.fire('action:settings.sorted-list.loaded', { element: $list.get(0) }); - }); + parse($container, itemUUID, item).then(() => { + hooks.fire('action:settings.sorted-list.loaded', { element: listEl.get(0) }); }); - } - }); + }); + } - $list.sortable().addClass('pointer'); + listEl.sortable().addClass('pointer'); }, addItem: function ($formElements, $target) { const key = $target.attr('data-sorted-list'); diff --git a/public/src/modules/uploadHelpers.js b/public/src/modules/uploadHelpers.js new file mode 100644 index 0000000000..9914dc0a3d --- /dev/null +++ b/public/src/modules/uploadHelpers.js @@ -0,0 +1,199 @@ +'use strict'; + + +define('uploadHelpers', ['alerts'], function (alerts) { + const uploadHelpers = {}; + + uploadHelpers.init = function (options) { + const formEl = options.uploadFormEl; + if (!formEl.length) { + return; + } + formEl.attr('action', config.relative_path + options.route); + + if (options.dragDropAreaEl) { + uploadHelpers.handleDragDrop({ + container: options.dragDropAreaEl, + callback: function (upload) { + uploadHelpers.ajaxSubmit({ + uploadForm: formEl, + upload: upload, + callback: options.callback, + }); + }, + }); + } + + if (options.pasteEl) { + uploadHelpers.handlePaste({ + container: options.pasteEl, + callback: function (upload) { + uploadHelpers.ajaxSubmit({ + uploadForm: formEl, + upload: upload, + callback: options.callback, + }); + }, + }); + } + }; + + uploadHelpers.handleDragDrop = function (options) { + let draggingDocument = false; + const postContainer = options.container; + const drop = options.container.find('.imagedrop'); + + postContainer.on('dragenter', function onDragEnter() { + if (draggingDocument) { + return; + } + drop.css('top', '0px'); + drop.css('height', postContainer.height() + 'px'); + drop.css('line-height', postContainer.height() + 'px'); + drop.show(); + + drop.on('dragleave', function () { + drop.hide(); + drop.off('dragleave'); + }); + }); + + drop.on('drop', function onDragDrop(e) { + e.preventDefault(); + const files = e.originalEvent.dataTransfer.files; + + if (files.length) { + let formData; + if (window.FormData) { + formData = new FormData(); + for (var i = 0; i < files.length; ++i) { + formData.append('files[]', files[i], files[i].name); + } + } + options.callback({ + files: files, + formData: formData, + }); + } + + drop.hide(); + return false; + }); + + function cancel(e) { + e.preventDefault(); + return false; + } + + $(document) + .off('dragstart') + .on('dragstart', function () { + draggingDocument = true; + }) + .off('dragend') + .on('dragend', function () { + draggingDocument = false; + }); + + drop.on('dragover', cancel); + drop.on('dragenter', cancel); + }; + + uploadHelpers.handlePaste = function (options) { + const container = options.container; + container.on('paste', function (event) { + const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items; + const files = []; + const fileNames = []; + let formData = null; + if (window.FormData) { + formData = new FormData(); + } + [].forEach.call(items, function (item) { + const file = item.getAsFile(); + if (file) { + const fileName = utils.generateUUID() + '-' + file.name; + if (formData) { + formData.append('files[]', file, fileName); + } + files.push(file); + fileNames.push(fileName); + } + }); + + if (files.length) { + options.callback({ + files: files, + fileNames: fileNames, + formData: formData, + }); + } + }); + }; + + uploadHelpers.ajaxSubmit = function (options) { + const files = [...options.upload.files]; + + for (let i = 0; i < files.length; ++i) { + const isImage = files[i].type.match(/image./); + if ((isImage && !app.user.privileges['upload:post:image']) || (!isImage && !app.user.privileges['upload:post:file'])) { + return alerts.error('[[error:no-privileges]]'); + } + if (files[i].size > parseInt(config.maximumFileSize, 10) * 1024) { + options.uploadForm[0].reset(); + return alerts.error('[[error:file-too-big, ' + config.maximumFileSize + ']]'); + } + } + const alert_id = Date.now(); + options.uploadForm.off('submit').on('submit', function () { + $(this).ajaxSubmit({ + headers: { + 'x-csrf-token': config.csrf_token, + }, + resetForm: true, + clearForm: true, + formData: options.upload.formData, + error: function (xhr) { + let errorMsg = (xhr.responseJSON && + (xhr.responseJSON.error || (xhr.responseJSON.status && xhr.responseJSON.status.message))) || + '[[error:parse-error]]'; + + if (xhr && xhr.status === 413) { + errorMsg = xhr.statusText || 'Request Entity Too Large'; + } + alerts.error(errorMsg); + alerts.remove(alert_id); + }, + + uploadProgress: function (event, position, total, percent) { + alerts.alert({ + alert_id: alert_id, + message: '[[modules:composer.uploading, ' + percent + '%]]', + }); + }, + + success: function (res) { + const uploads = res.response.images; + if (uploads && uploads.length) { + for (var i = 0; i < uploads.length; ++i) { + uploads[i].filename = files[i].name; + uploads[i].isImage = /image./.test(files[i].type); + } + } + options.callback(uploads); + }, + + complete: function () { + options.uploadForm[0].reset(); + setTimeout(alerts.remove, 100, alert_id); + }, + }); + + return false; + }); + + options.uploadForm.submit(); + }; + + return uploadHelpers; +}); diff --git a/public/src/utils.js b/public/src/utils.js index a505398545..f2f63e219c 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -645,10 +645,10 @@ params.forEach(function (param) { const val = param.split('='); - let key = decodeURI(val[0]); + let key = decodeURIComponent(val[0]); const value = ( options.disableToType || - options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1])) + options.skipToType[key] ? decodeURIComponent(val[1]) : utils.toType(decodeURIComponent(val[1])) ); if (key) { diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index 935ef80642..0e5618b4fe 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -176,7 +176,7 @@ module.exports = function (Categories) { bulkRemove.push([`cid:${oldCid}:uid:${post.uid}:pids`, post.pid]); bulkRemove.push([`cid:${oldCid}:uid:${post.uid}:pids:votes`, post.pid]); bulkAdd.push([`cid:${cid}:uid:${post.uid}:pids`, post.timestamp, post.pid]); - if (post.votes > 0) { + if (post.votes > 0 || post.votes < 0) { bulkAdd.push([`cid:${cid}:uid:${post.uid}:pids:votes`, post.votes, post.pid]); } }); diff --git a/src/cli/colors.js b/src/cli/colors.js index 4ba0012a40..71723ae42f 100644 --- a/src/cli/colors.js +++ b/src/cli/colors.js @@ -4,7 +4,8 @@ // to include color styling in the output // so the CLI looks nice -const { Command, Help } = require('commander'); +const { Command } = require('commander'); +const chalk = require('chalk'); const colors = [ // depth = 0, top-level command @@ -23,6 +24,11 @@ function humanReadableArgName(arg) { return arg.required ? `<${nameOutput}>` : `[${nameOutput}]`; } +function getControlCharacterSpaces(term) { + const matches = term.match(/.\[\d+m/g); + return matches ? matches.length * 5 : 0; +} + // get depth of command // 0 = top, 1 = subcommand of top, etc Command.prototype.depth = function () { @@ -49,38 +55,50 @@ module.exports = { let parentCmd = cmd.parent; let parentDepth = depth - 1; while (parentCmd) { - parentCmdNames = `${parentCmd.name()[colors[parentDepth].command]} ${parentCmdNames}`; + parentCmdNames = `${chalk[colors[parentDepth].command](parentCmd.name())} ${parentCmdNames}`; parentCmd = parentCmd.parent; parentDepth -= 1; } // from Command.prototype.usage() - const args = cmd._args.map(arg => humanReadableArgName(arg)[colors[depth].arg]); + const args = cmd._args.map(arg => chalk[colors[depth].arg](humanReadableArgName(arg))); const cmdUsage = [].concat( - (cmd.options.length || cmd._hasHelpOption ? '[options]'[colors[depth].option] : []), - (cmd.commands.length ? '[command]'[colors[depth + 1].command] : []), + (cmd.options.length || cmd._hasHelpOption ? chalk[colors[depth].option]('[options]') : []), + (cmd.commands.length ? chalk[colors[depth + 1].command]('[command]') : []), (cmd._args.length ? args : []) ).join(' '); - return `${parentCmdNames}${cmdName[colors[depth].command]} ${cmdUsage}`; + return `${parentCmdNames}${chalk[colors[depth].command](cmdName)} ${cmdUsage}`; }, subcommandTerm(cmd) { const depth = cmd.depth(); // Legacy. Ignores custom usage string, and nested commands. const args = cmd._args.map(arg => humanReadableArgName(arg)).join(' '); - return (cmd._name + ( + return chalk[colors[depth].command](cmd._name + ( cmd._aliases[0] ? `|${cmd._aliases[0]}` : '' - ))[colors[depth].command] + - (cmd.options.length ? ' [options]' : '')[colors[depth].option] + // simplistic check for non-help option - (args ? ` ${args}` : '')[colors[depth].arg]; + )) + + chalk[colors[depth].option](cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option + chalk[colors[depth].arg](args ? ` ${args}` : ''); }, longestOptionTermLength(cmd, helper) { - return Help.prototype.longestOptionTermLength.call(this, cmd, helper) + ''.red.length; + return helper.visibleOptions(cmd).reduce((max, option) => Math.max( + max, + helper.optionTerm(option).length - getControlCharacterSpaces(helper.optionTerm(option)) + ), 0); + }, + longestSubcommandTermLength(cmd, helper) { + return helper.visibleCommands(cmd).reduce((max, command) => Math.max( + max, + helper.subcommandTerm(command).length - getControlCharacterSpaces(helper.subcommandTerm(command)) + ), 0); }, longestArgumentTermLength(cmd, helper) { - return Help.prototype.longestArgumentTermLength.call(this, cmd, helper) + ''.red.length; + return helper.visibleArguments(cmd).reduce((max, argument) => Math.max( + max, + helper.argumentTerm(argument).length - getControlCharacterSpaces(helper.argumentTerm(argument)) + ), 0); }, formatHelp(cmd, helper) { const depth = cmd.depth(); @@ -90,8 +108,9 @@ module.exports = { const itemIndentWidth = 2; const itemSeparatorWidth = 2; // between term and description function formatItem(term, description) { + const padding = ' '.repeat((termWidth + itemSeparatorWidth) - (term.length - getControlCharacterSpaces(term))); if (description) { - const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`; + const fullText = `${term}${padding}${description}`; return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth); } return term; @@ -111,7 +130,7 @@ module.exports = { // Arguments const argumentList = helper.visibleArguments(cmd).map(argument => formatItem( - argument.term[colors[depth].arg], + chalk[colors[depth].arg](argument.term), argument.description )); if (argumentList.length > 0) { @@ -120,7 +139,7 @@ module.exports = { // Options const optionList = helper.visibleOptions(cmd).map(option => formatItem( - helper.optionTerm(option)[colors[depth].option], + chalk[colors[depth].option](helper.optionTerm(option)), helper.optionDescription(option) )); if (optionList.length > 0) { diff --git a/src/cli/index.js b/src/cli/index.js index 409b429502..0ed6b449fd 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -22,10 +22,10 @@ try { packageInstall.preserveExtraneousPlugins(); try { - fs.accessSync(path.join(paths.nodeModules, 'colors/package.json'), fs.constants.R_OK); + fs.accessSync(path.join(paths.nodeModules, 'chalk/package.json'), fs.constants.R_OK); - require('colors'); - console.log('OK'.green); + const chalk = require('chalk'); + console.log(chalk.green('OK')); } catch (e) { console.log('OK'); } @@ -52,7 +52,7 @@ try { checkVersion('nconf'); checkVersion('async'); checkVersion('commander'); - checkVersion('colors'); + checkVersion('chalk'); } catch (e) { if (['ENOENT', 'DEP_WRONG_VERSION', 'MODULE_NOT_FOUND'].includes(e.code)) { console.warn('Dependencies outdated or not yet installed.'); @@ -61,14 +61,14 @@ try { packageInstall.updatePackageFile(); packageInstall.installAll(); - require('colors'); - console.log('OK'.green + '\n'.reset); + const chalk = require('chalk'); + console.log(`${chalk.green('OK')}\n`); } else { throw e; } } -require('colors'); +const chalk = require('chalk'); const nconf = require('nconf'); const { program } = require('commander'); const yargs = require('yargs'); @@ -173,7 +173,7 @@ program try { initConfig = JSON.parse(initConfig); } catch (e) { - console.warn('Invalid JSON passed as initial config value.'.red); + console.warn(chalk.red('Invalid JSON passed as initial config value.')); console.log('If you meant to pass in an initial config value, please try again.\n'); throw e; @@ -190,7 +190,7 @@ program }); program .command('build [targets...]') - .description(`Compile static assets ${'(JS, CSS, templates, languages)'.red}`) + .description(`Compile static assets ${chalk.red('(JS, CSS, templates, languages)')}`) .option('-s, --series', 'Run builds in series without extra processes') .action((targets, options) => { if (program.opts().dev) { @@ -240,7 +240,7 @@ resetCommand .action((options) => { const valid = ['theme', 'plugin', 'widgets', 'settings', 'all'].some(x => options[x]); if (!valid) { - console.warn('\n No valid options passed in, so nothing was reset.'.red); + console.warn(`\n${chalk.red('No valid options passed in, so nothing was reset.')}`); resetCommand.help(); } @@ -270,8 +270,9 @@ program console.log(`\n${[ 'When running particular upgrade scripts, options are ignored.', 'By default all options are enabled. Passing any options disables that default.', - `Only package and dependency updates: ${'./nodebb upgrade -mi'.yellow}`, - `Only database update: ${'./nodebb upgrade -s'.yellow}`, + '\nExamples:', + ` Only package and dependency updates: ${chalk.yellow('./nodebb upgrade -mi')}`, + ` Only database update: ${chalk.yellow('./nodebb upgrade -s')}`, ].join('\n')}`); }) .action((scripts, options) => { @@ -289,7 +290,7 @@ program if (err) { throw err; } - console.log('OK'.green); + console.log(chalk.green('OK')); process.exit(); }); }); diff --git a/src/cli/manage.js b/src/cli/manage.js index 326fc22c93..8188b10892 100644 --- a/src/cli/manage.js +++ b/src/cli/manage.js @@ -3,6 +3,7 @@ const winston = require('winston'); const childProcess = require('child_process'); const CliGraph = require('cli-graph'); +const chalk = require('chalk'); const build = require('../meta/build'); const db = require('../database'); @@ -76,9 +77,9 @@ async function listPlugins() { process.stdout.write('Active plugins:\n'); combined.forEach((plugin) => { process.stdout.write(`\t* ${plugin.id}${plugin.version ? `@${plugin.version}` : ''} (`); - process.stdout.write(plugin.installed ? 'installed'.green : 'not installed'.red); + process.stdout.write(plugin.installed ? chalk.green('installed') : chalk.red('not installed')); process.stdout.write(', '); - process.stdout.write(plugin.active ? 'enabled'.green : 'disabled'.yellow); + process.stdout.write(plugin.active ? chalk.green('enabled') : chalk.yellow('disabled')); process.stdout.write(')\n'); }); @@ -88,9 +89,9 @@ async function listPlugins() { async function listEvents(count = 10) { await db.init(); const eventData = await events.getEvents('', 0, count - 1); - console.log((`\nDisplaying last ${count} administrative events...`).bold); + console.log(chalk.bold(`\nDisplaying last ${count} administrative events...`)); eventData.forEach((event) => { - console.log(` * ${String(event.timestampISO).green} ${String(event.type).yellow}${event.text ? ` ${event.text}` : ''}${' (uid: '.reset}${event.uid ? event.uid : 0})`); + console.log(` * ${chalk.green(String(event.timestampISO))} ${chalk.yellow(String(event.type))}${event.text ? ` ${event.text}` : ''} (uid: ${event.uid ? event.uid : 0})`); }); process.exit(); } diff --git a/src/cli/package-install.js b/src/cli/package-install.js index 0a2c8469ac..f2e4e94913 100644 --- a/src/cli/package-install.js +++ b/src/cli/package-install.js @@ -3,10 +3,22 @@ const path = require('path'); const fs = require('fs'); const cproc = require('child_process'); +const _ = require('lodash'); const { paths, pluginNamePattern } = require('../constants'); -function updatePackageFile() { +const pkgInstall = module.exports; + +function sortDependencies(dependencies) { + return Object.entries(dependencies) + .sort((a, b) => (a < b ? -1 : 1)) + .reduce((memo, pkg) => { + memo[pkg[0]] = pkg[1]; + return memo; + }, {}); +} + +pkgInstall.updatePackageFile = () => { let oldPackageContents = {}; try { @@ -26,51 +38,94 @@ function updatePackageFile() { } }); + const { devDependencies } = defaultPackageContents; + // Sort dependencies alphabetically dependencies = sortDependencies({ ...dependencies, ...defaultPackageContents.dependencies }); - const packageContents = { ...oldPackageContents, ...defaultPackageContents, dependencies: dependencies }; - + const packageContents = { ..._.merge(oldPackageContents, defaultPackageContents), dependencies, devDependencies }; fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 2)); -} +}; -exports.updatePackageFile = updatePackageFile; - -exports.supportedPackageManager = [ +pkgInstall.supportedPackageManager = [ 'npm', 'cnpm', 'pnpm', 'yarn', ]; -function installAll() { - const prod = global.env !== 'development'; - let command = 'npm install'; +pkgInstall.getPackageManager = () => { try { fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK); - const supportedPackageManagerList = exports.supportedPackageManager; // load config from src/cli/package-install.js - const packageManager = require('nconf').get('package_manager'); - if (supportedPackageManagerList.indexOf(packageManager) >= 0) { - switch (packageManager) { - case 'yarn': - command = 'yarn'; - break; - case 'pnpm': - command = 'pnpm install'; - break; - case 'cnpm': - command = 'cnpm install'; - break; - default: - break; + const nconf = require('nconf'); + if (!Object.keys(nconf.stores).length) { + // Quick & dirty nconf setup for when you cannot rely on nconf having been required already + const configFile = path.resolve(__dirname, '../../', nconf.any(['config', 'CONFIG']) || 'config.json'); + nconf.env().file({ // not sure why adding .argv() causes the process to terminate + file: configFile, + }); + } + + if (nconf.get('package_manager') && !pkgInstall.supportedPackageManager.includes(nconf.get('package_manager'))) { + nconf.clear('package_manager'); + } + + if (!nconf.get('package_manager')) { + // Best guess based on lockfile detection + try { + // use npm if lockfile present + fs.accessSync(path.resolve(__dirname, '../../package-lock.json'), fs.constants.R_OK); + } catch (e) { + nconf.set('package_manager', [ + // no cnpm detection as it uses same lockfile as npm + 'yarn.lock', 'pnpm-lock.yaml', + ].reduce((result, cur) => { + if (result) { + return result; + } + + try { + fs.accessSync(path.resolve(__dirname, `../../${cur}`), fs.constants.R_OK); + return cur.slice(0, 4); + } catch (e) { + return result; + } + }, undefined)); } } + + return nconf.get('package_manager') || 'npm'; } catch (e) { - // No error handling is required here. - // If nconf is not installed, regular package installation via npm is carried out. + // nconf not install or other unexpected error/exception + return 'npm'; } +}; + +pkgInstall.installAll = () => { + const prod = process.env.NODE_ENV !== 'development'; + let command = 'npm install'; + + const supportedPackageManagerList = exports.supportedPackageManager; // load config from src/cli/package-install.js + const packageManager = pkgInstall.getPackageManager(); + if (supportedPackageManagerList.indexOf(packageManager) >= 0) { + switch (packageManager) { + case 'yarn': + command = `yarn${prod ? ' --production' : ''}`; + break; + case 'pnpm': + command = 'pnpm install'; // pnpm checks NODE_ENV + break; + case 'cnpm': + command = `cnpm install ${prod ? ' --production' : ''}`; + break; + default: + command += prod ? ' --production' : ''; + break; + } + } + try { - cproc.execSync(command + (prod ? ' --production' : ''), { + cproc.execSync(command, { cwd: path.join(__dirname, '../../'), stdio: [0, 1, 2], }); @@ -81,11 +136,9 @@ function installAll() { console.log(`stderr: ${e.stderr}`); throw e; } -} - -exports.installAll = installAll; +}; -function preserveExtraneousPlugins() { +pkgInstall.preserveExtraneousPlugins = () => { // Skip if `node_modules/` is not found or inaccessible try { fs.accessSync(paths.nodeModules, fs.constants.R_OK); @@ -117,15 +170,4 @@ function preserveExtraneousPlugins() { packageContents.dependencies = sortDependencies({ ...packageContents.dependencies, ...extraneous }); fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 2)); -} - -function sortDependencies(dependencies) { - return Object.entries(dependencies) - .sort((a, b) => (a < b ? -1 : 1)) - .reduce((memo, pkg) => { - memo[pkg[0]] = pkg[1]; - return memo; - }, {}); -} - -exports.preserveExtraneousPlugins = preserveExtraneousPlugins; +}; diff --git a/src/cli/reset.js b/src/cli/reset.js index 75daeeb153..b026a22816 100644 --- a/src/cli/reset.js +++ b/src/cli/reset.js @@ -1,9 +1,9 @@ 'use strict'; -require('colors'); const path = require('path'); const winston = require('winston'); const fs = require('fs'); +const chalk = require('chalk'); const db = require('../database'); const events = require('../events'); @@ -57,8 +57,8 @@ exports.reset = async function (options) { if (!tasks.length) { console.log([ - 'No arguments passed in, so nothing was reset.\n'.yellow, - `Use ./nodebb reset ${'{-t|-p|-w|-s|-a}'.red}`, + chalk.yellow('No arguments passed in, so nothing was reset.\n'), + `Use ./nodebb reset ${chalk.red('{-t|-p|-w|-s|-a}')}`, ' -t\tthemes', ' -p\tplugins', ' -w\twidgets', diff --git a/src/cli/running.js b/src/cli/running.js index d52ab20812..d52e6144e4 100644 --- a/src/cli/running.js +++ b/src/cli/running.js @@ -2,6 +2,7 @@ const fs = require('fs'); const childProcess = require('child_process'); +const chalk = require('chalk'); const fork = require('../meta/debugFork'); const { paths } = require('../constants'); @@ -39,17 +40,17 @@ function start(options) { } if (options.log) { console.log(`\n${[ - 'Starting NodeBB with logging output'.bold, - 'Hit '.red + 'Ctrl-C '.bold + 'to exit'.red, + chalk.bold('Starting NodeBB with logging output'), + chalk.red('Hit ') + chalk.bold('Ctrl-C ') + chalk.red('to exit'), 'The NodeBB process will continue to run in the background', - `Use "${'./nodebb stop'.yellow}" to stop the NodeBB server`, + `Use "${chalk.yellow('./nodebb stop')}" to stop the NodeBB server`, ].join('\n')}`); } else if (!options.silent) { console.log(`\n${[ - 'Starting NodeBB'.bold, - ` "${'./nodebb stop'.yellow}" to stop the NodeBB server`, - ` "${'./nodebb log'.yellow}" to view server output`, - ` "${'./nodebb help'.yellow}${'" for more commands\n'.reset}`, + chalk.bold('Starting NodeBB'), + ` "${chalk.yellow('./nodebb stop')}" to stop the NodeBB server`, + ` "${chalk.yellow('./nodebb log')}" to view server output`, + ` "${chalk.yellow('./nodebb help')}" for more commands\n`, ].join('\n')}`); } @@ -82,7 +83,7 @@ function stop() { function restart(options) { getRunningPid((err, pid) => { if (!err) { - console.log('\nRestarting NodeBB'.bold); + console.log(chalk.bold('\nRestarting NodeBB')); process.kill(pid, 'SIGTERM'); options.silent = true; @@ -97,20 +98,20 @@ function status() { getRunningPid((err, pid) => { if (!err) { console.log(`\n${[ - 'NodeBB Running '.bold + (`(pid ${pid.toString()})`).cyan, - `\t"${'./nodebb stop'.yellow}" to stop the NodeBB server`, - `\t"${'./nodebb log'.yellow}" to view server output`, - `\t"${'./nodebb restart'.yellow}" to restart NodeBB\n`, + chalk.bold('NodeBB Running ') + chalk.cyan(`(pid ${pid.toString()})`), + `\t"${chalk.yellow('./nodebb stop')}" to stop the NodeBB server`, + `\t"${chalk.yellow('./nodebb log')}" to view server output`, + `\t"${chalk.yellow('./nodebb restart')}" to restart NodeBB\n`, ].join('\n')}`); } else { - console.log('\nNodeBB is not running'.bold); - console.log(`\t"${'./nodebb start'.yellow}${'" to launch the NodeBB server\n'.reset}`); + console.log(chalk.bold('\nNodeBB is not running')); + console.log(`\t"${chalk.yellow('./nodebb start')}" to launch the NodeBB server\n`); } }); } function log() { - console.log('\nHit '.red + 'Ctrl-C '.bold + 'to exit\n'.red + '\n'.reset); + console.log(`${chalk.red('\nHit ') + chalk.bold('Ctrl-C ') + chalk.red('to exit\n')}\n`); childProcess.spawn('tail', ['-F', './logs/output.log'], { stdio: 'inherit', cwd, diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js index 388e92bd54..9a250ee5c8 100644 --- a/src/cli/upgrade-plugins.js +++ b/src/cli/upgrade-plugins.js @@ -6,15 +6,13 @@ const cproc = require('child_process'); const semver = require('semver'); const fs = require('fs'); const path = require('path'); -const nconf = require('nconf'); +const chalk = require('chalk'); const { paths, pluginNamePattern } = require('../constants'); +const pkgInstall = require('./package-install'); -const packageManager = nconf.get('package_manager'); - -const supportedPackageManagerList = require('./package-install').supportedPackageManager; // load config from src/cli/package-install.js - -let packageManagerExecutable = supportedPackageManagerList.indexOf(packageManager) >= 0 ? packageManager : 'npm'; +const packageManager = pkgInstall.getPackageManager(); +let packageManagerExecutable = packageManager; const packageManagerInstallArgs = packageManager === 'yarn' ? ['add'] : ['install', '--save']; if (process.platform === 'win32') { @@ -96,11 +94,11 @@ async function checkPlugins() { const toCheck = Object.keys(plugins); if (!toCheck.length) { - process.stdout.write(' OK'.green + ''.reset); + process.stdout.write(chalk.green(' OK')); return []; // no extraneous plugins installed } const suggestedModules = await getSuggestedModules(nbbVersion, toCheck); - process.stdout.write(' OK'.green + ''.reset); + process.stdout.write(chalk.green(' OK')); let current; let suggested; @@ -125,12 +123,12 @@ async function upgradePlugins() { try { const found = await checkPlugins(); if (found && found.length) { - process.stdout.write(`\n\nA total of ${String(found.length).bold} package(s) can be upgraded:\n\n`); + process.stdout.write(`\n\nA total of ${chalk.bold(String(found.length))} package(s) can be upgraded:\n\n`); found.forEach((suggestObj) => { - process.stdout.write(`${' * '.yellow + suggestObj.name.reset} (${suggestObj.current.yellow}${' -> '.reset}${suggestObj.suggested.green}${')\n'.reset}`); + process.stdout.write(`${chalk.yellow(' * ') + suggestObj.name} ('${chalk.yellow(suggestObj.current)}' -> '${chalk.green(suggestObj.suggested)}')\n'`); }); } else { - console.log('\nAll packages up-to-date!'.green + ''.reset); + console.log(chalk.green('\nAll packages up-to-date!')); return; } @@ -140,7 +138,7 @@ async function upgradePlugins() { prompt.start(); const result = await prompt.get({ name: 'upgrade', - description: '\nProceed with upgrade (y|n)?'.reset, + description: '\nProceed with upgrade (y|n)?', type: 'string', }); @@ -150,10 +148,10 @@ async function upgradePlugins() { cproc.execFileSync(packageManagerExecutable, args, { stdio: 'ignore' }); } else { - console.log('Package upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade -p'.green + '".'.reset); + console.log(`${chalk.yellow('Package upgrades skipped')}. Check for upgrades at any time by running "${chalk.green('./nodebb upgrade -p')}".`); } } catch (err) { - console.log('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability'.reset); + console.log(`${chalk.yellow('Warning')}: An unexpected error occured when attempting to verify plugin upgradability`); throw err; } } diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js index 2198203b53..5ad7e772e6 100644 --- a/src/cli/upgrade.js +++ b/src/cli/upgrade.js @@ -1,6 +1,7 @@ 'use strict'; const nconf = require('nconf'); +const chalk = require('chalk'); const packageInstall = require('./package-install'); const { upgradePlugins } = require('./upgrade-plugins'); @@ -11,13 +12,13 @@ const steps = { handler: function () { packageInstall.updatePackageFile(); packageInstall.preserveExtraneousPlugins(); - process.stdout.write(' OK\n'.green); + process.stdout.write(chalk.green(' OK\n')); }, }, install: { message: 'Bringing base dependencies up to date...', handler: function () { - process.stdout.write(' started\n'.green); + process.stdout.write(chalk.green(' started\n')); packageInstall.installAll(); }, }, @@ -49,7 +50,7 @@ async function runSteps(tasks) { for (let i = 0; i < tasks.length; i++) { const step = steps[tasks[i]]; if (step && step.message && step.handler) { - process.stdout.write(`\n${(`${i + 1}. `).bold}${step.message.yellow}`); + process.stdout.write(`\n${chalk.bold(`${i + 1}. `)}${chalk.yellow(step.message)}`); /* eslint-disable-next-line */ await step.handler(); } @@ -60,7 +61,7 @@ async function runSteps(tasks) { const { columns } = process.stdout; const spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; - console.log(`\n\n${spaces}${message.green.bold}${'\n'.reset}`); + console.log(`\n\n${spaces}${chalk.green.bold(message)}\n`); process.exit(); } catch (err) { @@ -70,7 +71,7 @@ async function runSteps(tasks) { } async function runUpgrade(upgrades, options) { - console.log('\nUpdating NodeBB...'.cyan); + console.log(chalk.cyan('\nUpdating NodeBB...')); options = options || {}; // disable mongo timeouts during upgrade nconf.set('mongo:options:socketTimeoutMS', 0); diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index e0462ea2e8..d845ebdbb0 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -155,7 +155,8 @@ async function getCounts(userData, callerUID) { const cids = await categories.getCidsByPrivilege('categories:cid', callerUID, 'topics:read'); const promises = { posts: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:pids`)), - best: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:pids:votes`)), + best: Promise.all(cids.map(async c => db.sortedSetCount(`cid:${c}:uid:${uid}:pids:votes`, 1, '+inf'))), + controversial: Promise.all(cids.map(async c => db.sortedSetCount(`cid:${c}:uid:${uid}:pids:votes`, '-inf', -1))), topics: db.sortedSetsCardSum(cids.map(c => `cid:${c}:uid:${uid}:tids`)), }; if (userData.isAdmin || userData.isSelf) { @@ -169,6 +170,8 @@ async function getCounts(userData, callerUID) { promises.blocks = user.getUserField(userData.uid, 'blocksCount'); } const counts = await utils.promiseParallel(promises); + counts.best = counts.best.reduce((sum, count) => sum + count, 0); + counts.controversial = counts.controversial.reduce((sum, count) => sum + count, 0); counts.categoriesWatched = counts.categoriesWatched && counts.categoriesWatched.length; counts.groups = userData.groups.length; counts.following = userData.followingCount; diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index b266a2b185..dabfd8ece8 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -55,6 +55,25 @@ const templateToData = { const cids = await categories.getCidsByPrivilege('categories:cid', callerUid, 'topics:read'); return cids.map(c => `cid:${c}:uid:${userData.uid}:pids:votes`); }, + getTopics: async (sets, req, start, stop) => { + const pids = await db.getSortedSetRevRangeByScore(sets, start, stop - start + 1, '+inf', 1); + const postObjs = await posts.getPostSummaryByPids(pids, req.uid, { stripTags: false }); + return { posts: postObjs, nextStart: stop + 1 }; + }, + }, + 'account/controversial': { + type: 'posts', + noItemsFoundKey: '[[user:has_no_voted_posts]]', + crumb: '[[global:controversial]]', + getSets: async function (callerUid, userData) { + const cids = await categories.getCidsByPrivilege('categories:cid', callerUid, 'topics:read'); + return cids.map(c => `cid:${c}:uid:${userData.uid}:pids:votes`); + }, + getTopics: async (sets, req, start, stop) => { + const pids = await db.getSortedSetRangeByScore(sets, start, stop - start + 1, '-inf', -1); + const postObjs = await posts.getPostSummaryByPids(pids, req.uid, { stripTags: false }); + return { posts: postObjs, nextStart: stop + 1 }; + }, }, 'account/watched': { type: 'topics', @@ -128,6 +147,10 @@ postsController.getBestPosts = async function (req, res, next) { await getPostsFromUserSet('account/best', req, res, next); }; +postsController.getControversialPosts = async function (req, res, next) { + await getPostsFromUserSet('account/controversial', req, res, next); +}; + postsController.getWatchedTopics = async function (req, res, next) { await getPostsFromUserSet('account/watched', req, res, next); }; diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 2fb3d2741f..e0cdb34930 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -87,15 +87,16 @@ async function filesToData(currentDir, files) { } async function getFileData(currentDir, file) { - const stat = await fs.promises.stat(path.join(currentDir, file)); + const pathToFile = path.join(currentDir, file); + const stat = await fs.promises.stat(pathToFile); let filesInDir = []; if (stat.isDirectory()) { - filesInDir = await fs.promises.readdir(path.join(currentDir, file)); + filesInDir = await fs.promises.readdir(pathToFile); } const url = `${nconf.get('upload_url') + currentDir.replace(nconf.get('upload_path'), '')}/${file}`; return { name: file, - path: path.join(currentDir, file).replace(nconf.get('upload_path'), ''), + path: pathToFile.replace(path.join(nconf.get('upload_path'), '/'), ''), url: url, fileCount: Math.max(0, filesInDir.length - 1), // ignore .gitignore size: stat.size, diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index bf0dc70322..a0a5340c7c 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -1,10 +1,10 @@ 'use strict'; -const colors = require('colors/safe'); const nconf = require('nconf'); const validator = require('validator'); const querystring = require('querystring'); const _ = require('lodash'); +const chalk = require('chalk'); const translator = require('../translator'); const user = require('../user'); @@ -451,7 +451,7 @@ helpers.formatApiResponse = async (statusCode, res, payload) => { if (global.env === 'development') { returnPayload.stack = payload.stack; - process.stdout.write(`[${colors.yellow('api')}] Exception caught, error with stack trace follows:\n`); + process.stdout.write(`[${chalk.yellow('api')}] Exception caught, error with stack trace follows:\n`); process.stdout.write(payload.stack); } res.status(statusCode).json(returnPayload); diff --git a/src/controllers/write/users.js b/src/controllers/write/users.js index 5edad764fe..4cea3af1da 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -200,7 +200,7 @@ Users.invite = async (req, res) => { return helpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); } - const inviteGroups = await groups.getUserInviteGroups(req.uid); + const inviteGroups = (await groups.getUserInviteGroups(req.uid)).map(group => group.name); const cannotInvite = groupsToJoin.some(group => !inviteGroups.includes(group)); if (groupsToJoin.length > 0 && cannotInvite) { return helpers.formatApiResponse(403, res, new Error('[[error:no-privileges]]')); @@ -231,7 +231,7 @@ Users.getInviteGroups = async function (req, res) { } const userInviteGroups = await groups.getUserInviteGroups(req.params.uid); - return helpers.formatApiResponse(200, res, userInviteGroups); + return helpers.formatApiResponse(200, res, userInviteGroups.map(group => group.displayName)); }; Users.listEmails = async (req, res) => { @@ -265,16 +265,21 @@ Users.getEmail = async (req, res) => { }; Users.confirmEmail = async (req, res) => { - const [exists, canManage] = await Promise.all([ - db.isSortedSetMember('email:uid', req.params.email.toLowerCase()), + const [pending, current, canManage] = await Promise.all([ + user.email.isValidationPending(req.params.uid, req.params.email), + user.getUserField(req.params.uid, 'email'), privileges.admin.can('admin:users', req.uid), ]); if (!canManage) { - helpers.notAllowed(req, res); + return helpers.notAllowed(req, res); } - if (exists) { + if (pending) { // has active confirmation request + const code = await db.get(`confirm:byUid:${req.params.uid}`); + await user.email.confirmByCode(code, req.session.id); + helpers.formatApiResponse(200, res); + } else if (current && current === req.params.email) { // email in user hash (i.e. email passed into user.create) await user.email.confirmByUid(req.params.uid); helpers.formatApiResponse(200, res); } else { diff --git a/src/database/index.js b/src/database/index.js index b66ab7a8a2..51febea19d 100644 --- a/src/database/index.js +++ b/src/database/index.js @@ -14,7 +14,7 @@ const primaryDB = require(`./${databaseName}`); primaryDB.parseIntFields = function (data, intFields, requestedFields) { intFields.forEach((field) => { - if (!requestedFields.length || requestedFields.includes(field)) { + if (!requestedFields || !requestedFields.length || requestedFields.includes(field)) { data[field] = parseInt(data[field], 10) || 0; } }); diff --git a/src/database/postgres/main.js b/src/database/postgres/main.js index a3f784960a..ebb2c7a0cc 100644 --- a/src/database/postgres/main.js +++ b/src/database/postgres/main.js @@ -17,6 +17,17 @@ module.exports = function (module) { return; } + // Redis/Mongo consider empty zsets as non-existent, match that behaviour + const type = await module.type(key); + if (type === 'zset') { + if (Array.isArray(key)) { + const members = await Promise.all(key.map(key => module.getSortedSetRange(key, 0, 0))); + return members.map(member => member.length > 0); + } + const members = await module.getSortedSetRange(key, 0, 0); + return members.length > 0; + } + if (Array.isArray(key)) { const res = await module.pool.query({ name: 'existsArray', diff --git a/src/emailer.js b/src/emailer.js index 754b794c05..929e737017 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -218,7 +218,7 @@ Emailer.send = async (template, uid, params) => { throw Error('[emailer] App not ready!'); } - let userData = await User.getUserFields(uid, ['email', 'username', 'email:confirmed']); + let userData = await User.getUserFields(uid, ['email', 'username', 'email:confirmed', 'banned']); // 'welcome' and 'verify-email' explicitly used passed-in email address if (['welcome', 'verify-email'].includes(template)) { @@ -226,6 +226,14 @@ Emailer.send = async (template, uid, params) => { } ({ template, userData, params } = await Plugins.hooks.fire('filter:email.prepare', { template, uid, userData, params })); + + if (!meta.config.sendEmailToBanned && template !== 'banned') { + if (userData.banned) { + winston.warn(`[emailer/send] User ${userData.username} (uid: ${uid}) is banned; not sending email due to system config.`); + return; + } + } + if (!userData || !userData.email) { if (process.env.NODE_ENV === 'development') { winston.warn(`uid : ${uid} has no email, not sending "${template}" email.`); diff --git a/src/groups/user.js b/src/groups/user.js index 5255adff1a..4238296a37 100644 --- a/src/groups/user.js +++ b/src/groups/user.js @@ -37,7 +37,10 @@ module.exports = function (Groups) { allGroups = allGroups.filter(group => !Groups.ephemeralGroups.includes(group.name)); const publicGroups = allGroups.filter(group => group.hidden === 0 && group.system === 0 && group.private === 0); - const adminModGroups = [{ name: 'administrators' }, { name: 'Global Moderators' }]; + const adminModGroups = [ + { name: 'administrators', displayName: 'administrators' }, + { name: 'Global Moderators', displayName: 'Global Moderators' }, + ]; // Private (but not hidden) const privateGroups = allGroups.filter(group => group.hidden === 0 && group.system === 0 && group.private === 1); @@ -58,7 +61,6 @@ module.exports = function (Groups) { } return inviteGroups - .concat(publicGroups) - .map(group => group.name); + .concat(publicGroups); }; }; diff --git a/src/image.js b/src/image.js index d1bb1de23e..f1cce078cb 100644 --- a/src/image.js +++ b/src/image.js @@ -46,6 +46,7 @@ image.resizeImage = async function (data) { const buffer = await fs.promises.readFile(data.path); const sharpImage = sharp(buffer, { failOnError: true, + animated: data.path.endsWith('gif'), }); const metadata = await sharpImage.metadata(); diff --git a/src/install.js b/src/install.js index 7016662d05..3067a05ab5 100644 --- a/src/install.js +++ b/src/install.js @@ -222,6 +222,35 @@ async function enableDefaultTheme() { }); } +async function createDefaultUserGroups() { + const groups = require('./groups'); + async function createGroup(name) { + await groups.create({ + name: name, + hidden: 1, + private: 1, + system: 1, + disableLeave: 1, + disableJoinRequests: 1, + }); + } + + const [verifiedExists, unverifiedExists, bannedExists] = await groups.exists([ + 'verified-users', 'unverified-users', 'banned-users', + ]); + if (!verifiedExists) { + await createGroup('verified-users'); + } + + if (!unverifiedExists) { + await createGroup('unverified-users'); + } + + if (!bannedExists) { + await createGroup('banned-users'); + } +} + async function createAdministrator() { const Groups = require('./groups'); const memberCount = await Groups.getMemberCount('administrators'); @@ -498,6 +527,7 @@ install.setup = async function () { await setupDefaultConfigs(); await enableDefaultTheme(); await createCategories(); + await createDefaultUserGroups(); const adminInfo = await createAdministrator(); await createGlobalModeratorsGroup(); await giveGlobalPrivileges(); diff --git a/src/meta/aliases.js b/src/meta/aliases.js index ba3a50fcd1..d393b2e18a 100644 --- a/src/meta/aliases.js +++ b/src/meta/aliases.js @@ -1,6 +1,7 @@ 'use strict'; const _ = require('lodash'); +const chalk = require('chalk'); const aliases = { 'plugin static dirs': ['staticdirs'], @@ -30,12 +31,12 @@ function buildTargets() { } return [name, arr.join(', ')]; - }).map(tuple => ` ${_.padEnd(`"${tuple[0]}"`, length + 2).magenta} | ${tuple[1]}`).join('\n'); - console.log( - `\n\n Build targets:\n${ - (`\n ${_.padEnd('Target', length + 2)} | Aliases`).green - }${'\n ------------------------------------------------------\n'.blue - }${output}\n` + }).map(tuple => ` ${chalk.magenta(_.padEnd(`"${tuple[0]}"`, length + 2))} | ${tuple[1]}`).join('\n'); + process.stdout.write( + '\n\n Build targets:\n' + + `${chalk.green(`\n ${_.padEnd('Target', length + 2)} | Aliases`)}` + + `${chalk.blue('\n ------------------------------------------------------\n')}` + + `${output}\n\n` ); } diff --git a/src/meta/build.js b/src/meta/build.js index fec17df85a..207318fe56 100644 --- a/src/meta/build.js +++ b/src/meta/build.js @@ -6,6 +6,7 @@ const nconf = require('nconf'); const _ = require('lodash'); const path = require('path'); const mkdirp = require('mkdirp'); +const chalk = require('chalk'); const cacheBuster = require('./cacheBuster'); const { aliases } = require('./aliases'); @@ -60,8 +61,7 @@ const aliasMap = Object.keys(aliases).reduce((prev, key) => { async function beforeBuild(targets) { const db = require('../database'); - require('colors'); - process.stdout.write(' started'.green + '\n'.reset); + process.stdout.write(`${chalk.green(' started')}\n`); try { await db.init(); meta = require('./index'); diff --git a/src/meta/dependencies.js b/src/meta/dependencies.js index a5dde21fee..5bb2a73c2a 100644 --- a/src/meta/dependencies.js +++ b/src/meta/dependencies.js @@ -5,7 +5,7 @@ const fs = require('fs'); const semver = require('semver'); const winston = require('winston'); -require('colors'); +const chalk = require('chalk'); const pkg = require('../../package.json'); const { paths, pluginNamePattern } = require('../constants'); @@ -49,7 +49,7 @@ Dependencies.parseModuleData = function (moduleName, pkgData) { try { pkgData = JSON.parse(pkgData); } catch (e) { - winston.warn(`[${'missing'.red}] ${moduleName.bold} is a required dependency but could not be found\n`); + winston.warn(`[${chalk.red('missing')}] ${chalk.bold(moduleName)} is a required dependency but could not be found\n`); depsMissing = true; return null; } @@ -64,7 +64,7 @@ Dependencies.doesSatisfy = function (moduleData, packageJSONVersion) { const githubRepo = moduleData._resolved && moduleData._resolved.includes('//github.com'); const satisfies = versionOk || githubRepo; if (!satisfies) { - winston.warn(`[${'outdated'.yellow}] ${moduleData.name.bold} installed v${moduleData.version}, package.json requires ${packageJSONVersion}\n`); + winston.warn(`[${chalk.yellow('outdated')}] ${chalk.bold(moduleData.name)} installed v${moduleData.version}, package.json requires ${packageJSONVersion}\n`); depsOutdated = true; } return satisfies; diff --git a/src/middleware/header.js b/src/middleware/header.js index 6304f967ba..3c33a3fd93 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -183,6 +183,8 @@ async function appendUnreadCounts({ uid, navigation, unreadData, query }) { newTopic: unreadCounts.new || 0, watchedTopic: unreadCounts.watched || 0, unrepliedTopic: unreadCounts.unreplied || 0, + mobileUnread: 0, + unreadUrl: '/unread', chat: results.unreadChatCount || 0, notification: results.unreadNotificationCount || 0, flags: results.unreadFlagCount || 0, @@ -200,6 +202,8 @@ async function appendUnreadCounts({ uid, navigation, unreadData, query }) { if (item && item.originalRoute === route) { unreadData[filter] = _.zipObject(tidsByFilter[filter], tidsByFilter[filter].map(() => true)); item.content = content; + unreadCount.mobileUnread = content; + unreadCount.unreadUrl = route; if (unreadCounts[filter] > 0) { item.iconClass += ' unread-count'; } diff --git a/src/middleware/helpers.js b/src/middleware/helpers.js index bbf766895f..b4b6fdb188 100644 --- a/src/middleware/helpers.js +++ b/src/middleware/helpers.js @@ -4,6 +4,8 @@ const winston = require('winston'); const validator = require('validator'); const slugify = require('../slugify'); +const meta = require('../meta'); + const helpers = module.exports; helpers.try = function (middleware) { @@ -54,6 +56,8 @@ helpers.buildBodyClass = function (req, res, templateData = {}) { parts.push(`page-status-${res.statusCode}`); + parts.push(`theme-${meta.config['theme:id'].split('-')[2]}`); + if (req.loggedIn) { parts.push('user-loggedin'); } else { diff --git a/src/plugins/index.js b/src/plugins/index.js index 04675f1a45..38110c1fe3 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -5,6 +5,7 @@ const path = require('path'); const winston = require('winston'); const semver = require('semver'); const nconf = require('nconf'); +const chalk = require('chalk'); const request = require('request-promise-native'); const user = require('../user'); @@ -117,7 +118,7 @@ Plugins.reload = async function () { console.log(''); winston.warn('[plugins/load] The following plugins may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing. In the event of an unresponsive NodeBB caused by this plugin, run `./nodebb reset -p PLUGINNAME` to disable it.'); for (let x = 0, numPlugins = Plugins.versionWarning.length; x < numPlugins; x += 1) { - console.log(' * '.yellow + Plugins.versionWarning[x]); + console.log(`${chalk.yellow(' * ') + Plugins.versionWarning[x]}`); } console.log(''); } diff --git a/src/plugins/install.js b/src/plugins/install.js index dcfd7a8c16..05aca08e89 100644 --- a/src/plugins/install.js +++ b/src/plugins/install.js @@ -13,10 +13,9 @@ const db = require('../database'); const meta = require('../meta'); const pubsub = require('../pubsub'); const { paths } = require('../constants'); +const pkgInstall = require('../cli/package-install'); -const supportedPackageManagerList = require('../cli/package-install').supportedPackageManager; -// load config from src/cli/package-install.js -const packageManager = supportedPackageManagerList.indexOf(nconf.get('package_manager')) >= 0 ? nconf.get('package_manager') : 'npm'; +const packageManager = pkgInstall.getPackageManager(); let packageManagerExecutable = packageManager; const packageManagerCommands = { yarn: { diff --git a/src/posts/user.js b/src/posts/user.js index d94e5e7966..c92c197f69 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -158,7 +158,7 @@ module.exports = function (Posts) { bulkAdd.push([`uid:${toUid}:posts`, post.timestamp, post.pid]); bulkAdd.push([`cid:${post.cid}:uid:${toUid}:pids`, post.timestamp, post.pid]); - if (post.votes > 0) { + if (post.votes > 0 || post.votes < 0) { bulkAdd.push([`cid:${post.cid}:uid:${toUid}:pids:votes`, post.votes, post.pid]); } postsByUser[post.uid] = postsByUser[post.uid] || []; diff --git a/src/posts/votes.js b/src/posts/votes.js index 8f3f240314..1a56c4a66d 100644 --- a/src/posts/votes.js +++ b/src/posts/votes.js @@ -258,7 +258,7 @@ module.exports = function (Posts) { const topicData = await topics.getTopicFields(postData.tid, ['mainPid', 'cid', 'pinned']); if (postData.uid) { - if (postData.votes > 0) { + if (postData.votes !== 0) { await db.sortedSetAdd(`cid:${topicData.cid}:uid:${postData.uid}:pids:votes`, postData.votes, postData.pid); } else { await db.sortedSetRemove(`cid:${topicData.cid}:uid:${postData.uid}:pids:votes`, postData.pid); diff --git a/src/prestart.js b/src/prestart.js index 6b1d1dfcc4..55dcb72235 100644 --- a/src/prestart.js +++ b/src/prestart.js @@ -4,6 +4,7 @@ const nconf = require('nconf'); const url = require('url'); const winston = require('winston'); const path = require('path'); +const chalk = require('chalk'); const pkg = require('../package.json'); const { paths } = require('./constants'); @@ -111,7 +112,7 @@ function versionCheck() { if (!compatible) { winston.warn('Your version of Node.js is too outdated for NodeBB. Please update your version of Node.js.'); - winston.warn(`Recommended ${range.green}${', '.reset}${version.yellow}${' provided\n'.reset}`); + winston.warn(`Recommended ${chalk.green(range)}, ${chalk.yellow(version)} provided\n`); } } diff --git a/src/routes/user.js b/src/routes/user.js index 763b8189c4..937997eba5 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -24,6 +24,7 @@ module.exports = function (app, name, middleware, controllers) { setupPageRoute(app, `/${name}/:userslug/posts`, middleware, middlewares, controllers.accounts.posts.getPosts); setupPageRoute(app, `/${name}/:userslug/topics`, middleware, middlewares, controllers.accounts.posts.getTopics); setupPageRoute(app, `/${name}/:userslug/best`, middleware, middlewares, controllers.accounts.posts.getBestPosts); + setupPageRoute(app, `/${name}/:userslug/controversial`, middleware, middlewares, controllers.accounts.posts.getControversialPosts); setupPageRoute(app, `/${name}/:userslug/groups`, middleware, middlewares, controllers.accounts.groups.get); setupPageRoute(app, `/${name}/:userslug/categories`, middleware, accountMiddlewares, controllers.accounts.categories.get); diff --git a/src/topics/delete.js b/src/topics/delete.js index 553a8acb8e..b30889ace8 100644 --- a/src/topics/delete.js +++ b/src/topics/delete.js @@ -94,6 +94,7 @@ module.exports = function (Topics) { deleteTopicFromCategoryAndUser(tid), Topics.deleteTopicTags(tid), Topics.events.purge(tid), + Topics.thumbs.deleteAll(tid), reduceCounters(tid), ]); plugins.hooks.fire('action:topic.purge', { topic: deletedTopic, uid: uid }); diff --git a/src/topics/fork.js b/src/topics/fork.js index 59eb95b783..97b5316656 100644 --- a/src/topics/fork.js +++ b/src/topics/fork.js @@ -146,7 +146,7 @@ module.exports = function (Topics) { db.sortedSetAdd(`cid:${topicData[1].cid}:pids`, postData.timestamp, postData.pid), db.sortedSetAdd(`cid:${topicData[1].cid}:uid:${postData.uid}:pids`, postData.timestamp, postData.pid), ]; - if (postData.votes > 0) { + if (postData.votes > 0 || postData.votes < 0) { tasks.push(db.sortedSetAdd(`cid:${topicData[1].cid}:uid:${postData.uid}:pids:votes`, postData.votes, postData.pid)); } diff --git a/src/topics/thumbs.js b/src/topics/thumbs.js index 48520d4f81..3cb72afe12 100644 --- a/src/topics/thumbs.js +++ b/src/topics/thumbs.js @@ -108,32 +108,54 @@ Thumbs.migrate = async function (uuid, id) { cache.del(set); }; -Thumbs.delete = async function (id, relativePath) { +Thumbs.delete = async function (id, relativePaths) { const isDraft = validator.isUUID(String(id)); const set = `${isDraft ? 'draft' : 'topic'}:${id}:thumbs`; - const absolutePath = path.join(nconf.get('upload_path'), relativePath); + + if (typeof relativePaths === 'string') { + relativePaths = [relativePaths]; + } else if (!Array.isArray(relativePaths)) { + throw new Error('[[error:invalid-data]]'); + } + + const absolutePaths = relativePaths.map(relativePath => path.join(nconf.get('upload_path'), relativePath)); const [associated, existsOnDisk] = await Promise.all([ - db.isSortedSetMember(set, relativePath), - file.exists(absolutePath), + db.isSortedSetMembers(set, relativePaths), + Promise.all(absolutePaths.map(async absolutePath => file.exists(absolutePath))), ]); - if (associated) { - await db.sortedSetRemove(set, relativePath); - cache.del(set); - - if (existsOnDisk) { - await file.delete(absolutePath); + const toRemove = []; + const toDelete = []; + relativePaths.forEach((relativePath, idx) => { + if (associated[idx]) { + toRemove.push(relativePath); } - // Dissociate thumbnails with the main pid - if (!isDraft) { - const topics = require('.'); - const numThumbs = await db.sortedSetCard(set); - if (!numThumbs) { - await db.deleteObjectField(`topic:${id}`, 'numThumbs'); - } - const mainPid = (await topics.getMainPids([id]))[0]; - await posts.uploads.dissociate(mainPid, relativePath.replace('/files/', '')); + if (existsOnDisk[idx]) { + toDelete.push(absolutePaths[idx]); } + }); + + await Promise.all([ + db.sortedSetRemove(set, toRemove), + Promise.all(toDelete.map(async absolutePath => file.delete(absolutePath))), + ]); + + if (toRemove.length && !isDraft) { + const topics = require('.'); + const mainPid = (await topics.getMainPids([id]))[0]; + + await Promise.all([ + db.incrObjectFieldBy(`topic:${id}`, 'numThumbs', -toRemove.length), + Promise.all(toRemove.map(async relativePath => posts.uploads.dissociate(mainPid, relativePath.replace('/files/', '')))), + ]); } }; + +Thumbs.deleteAll = async (id) => { + const isDraft = validator.isUUID(String(id)); + const set = `${isDraft ? 'draft' : 'topic'}:${id}:thumbs`; + + const thumbs = await db.getSortedSetRange(set, 0, -1); + await Thumbs.delete(id, thumbs); +}; diff --git a/src/upgrade.js b/src/upgrade.js index 051747b47b..829a338513 100644 --- a/src/upgrade.js +++ b/src/upgrade.js @@ -6,6 +6,7 @@ const util = require('util'); const semver = require('semver'); const readline = require('readline'); const winston = require('winston'); +const chalk = require('chalk'); const db = require('./database'); const file = require('./file'); @@ -118,7 +119,7 @@ Upgrade.runParticular = async function (names) { }; Upgrade.process = async function (files, skipCount) { - console.log('OK'.green + ' | '.reset + String(files.length).cyan + ' script(s) found'.cyan + (skipCount > 0 ? ', '.cyan + String(skipCount).cyan + ' skipped'.cyan : '')); + console.log(`${chalk.green('OK')} | ${chalk.cyan(`${files.length} script(s) found`)}${skipCount > 0 ? chalk.cyan(`, ${skipCount} skipped`) : ''}`); const [schemaDate, schemaLogCount] = await Promise.all([ db.get('schemaDate'), db.sortedSetCard('schemaLog'), @@ -138,11 +139,11 @@ Upgrade.process = async function (files, skipCount) { date: date, }; - process.stdout.write(`${' → '.white + String(`[${[date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/')}] `).gray + String(scriptExport.name).reset}...`); + process.stdout.write(`${chalk.white(' → ') + chalk.gray(`[${[date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()].join('/')}] `) + scriptExport.name}...`); // For backwards compatibility, cross-reference with schemaDate (if found). If a script's date is older, skip it if ((!schemaDate && !schemaLogCount) || (scriptExport.timestamp <= schemaDate && semver.lt(version, '1.5.0'))) { - process.stdout.write(' skipped\n'.grey); + process.stdout.write(chalk.grey(' skipped\n')); await db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js')); // eslint-disable-next-line no-continue @@ -165,13 +166,13 @@ Upgrade.process = async function (files, skipCount) { throw err; } const upgradeDuration = ((Date.now() - upgradeStart) / 1000).toFixed(2); - process.stdout.write(` OK (${upgradeDuration} seconds)\n`.green); + process.stdout.write(chalk.green(` OK (${upgradeDuration} seconds)\n`)); // Record success in schemaLog await db.sortedSetAdd('schemaLog', Date.now(), path.basename(file, '.js')); } - console.log('Schema update complete!\n'.green); + console.log(chalk.green('Schema update complete!\n')); }; Upgrade.incrementProgress = function (value) { diff --git a/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.js b/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.js new file mode 100644 index 0000000000..c73aa51a1f --- /dev/null +++ b/src/upgrades/1.19.2/remove_leftover_thumbs_after_topic_purge.js @@ -0,0 +1,51 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs').promises; +const nconf = require('nconf'); + +const db = require('../../database'); +const batch = require('../../batch'); +const file = require('../../file'); + +module.exports = { + name: 'Clean up leftover topic thumb sorted sets and files for since-purged topics', + timestamp: Date.UTC(2022, 1, 7), + method: async function () { + const { progress } = this; + const nextTid = await db.getObjectField('global', 'nextTid'); + const tids = []; + for (let x = 1; x < nextTid; x++) { + tids.push(x); + } + + const purgedTids = (await db.isSortedSetMembers('topics:tid', tids)) + .map((exists, idx) => (exists ? false : tids[idx])) + .filter(Boolean); + + const affectedTids = (await db.exists(purgedTids.map(tid => `topic:${tid}:thumbs`))) + .map((exists, idx) => (exists ? purgedTids[idx] : false)) + .filter(Boolean); + + progress.total = affectedTids.length; + + await batch.processArray(affectedTids, async (tids) => { + await Promise.all(tids.map(async (tid) => { + const relativePaths = await db.getSortedSetMembers(`topic:${tid}:thumbs`); + const absolutePaths = relativePaths.map(relativePath => path.join(nconf.get('upload_path'), relativePath)); + + await Promise.all(absolutePaths.map(async (absolutePath) => { + const exists = await file.exists(absolutePath); + if (exists) { + await fs.unlink(absolutePath); + } + })); + await db.delete(`topic:${tid}:thumbs`); + progress.incr(); + })); + }, { + progress, + batch: 100, + }); + }, +}; diff --git a/src/upgrades/1.19.2/store_downvoted_posts_in_zset.js b/src/upgrades/1.19.2/store_downvoted_posts_in_zset.js new file mode 100644 index 0000000000..2ee7aa3dcc --- /dev/null +++ b/src/upgrades/1.19.2/store_downvoted_posts_in_zset.js @@ -0,0 +1,31 @@ +'use strict'; + +const db = require('../../database'); + +module.exports = { + name: 'Store downvoted posts in user votes sorted set', + timestamp: Date.UTC(2022, 1, 4), + method: async function () { + const batch = require('../../batch'); + const posts = require('../../posts'); + const { progress } = this; + + await batch.processSortedSet('posts:pid', async (pids) => { + const postData = await posts.getPostsFields(pids, ['pid', 'uid', 'upvotes', 'downvotes']); + const cids = await posts.getCidsByPids(pids); + + const bulkAdd = []; + postData.forEach((post, index) => { + if (post.votes > 0 || post.votes < 0) { + const cid = cids[index]; + bulkAdd.push([`cid:${cid}:uid:${post.uid}:pids:votes`, post.votes, post.pid]); + } + }); + await db.sortedSetAddBulk(bulkAdd); + progress.incr(postData.length); + }, { + progress, + batch: 500, + }); + }, +}; diff --git a/src/user/picture.js b/src/user/picture.js index 3cc8d2932e..d3d2a22f68 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -9,7 +9,6 @@ const db = require('../database'); const file = require('../file'); const image = require('../image'); const meta = require('../meta'); -const plugins = require('../plugins'); module.exports = function (User) { User.getAllowedProfileImageExtensions = function () { @@ -21,11 +20,7 @@ module.exports = function (User) { }; User.getAllowedImageTypes = function () { - const allowedTypes = ['image/png', 'image/jpeg', 'image/bmp']; - if (plugins.hooks.hasListeners('filter:image.isFileTypeAllowed')) { - allowedTypes.push('image/gif'); - } - return allowedTypes; + return ['image/png', 'image/jpeg', 'image/bmp', 'image/gif']; }; User.updateCoverPosition = async function (uid, position) { diff --git a/src/user/profile.js b/src/user/profile.js index 3c93cb8bd0..6f77806d4f 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -4,6 +4,7 @@ const _ = require('lodash'); const validator = require('validator'); const winston = require('winston'); +const punycode = require('punycode'); const utils = require('../utils'); const slugify = require('../slugify'); @@ -45,14 +46,28 @@ module.exports = function (User) { data[field] = data[field].trim(); - if (field === 'email') { - return await updateEmail(updateUid, data.email); - } else if (field === 'username') { - return await updateUsername(updateUid, data.username); - } else if (field === 'fullname') { - return await updateFullname(updateUid, data.fullname); + switch (field) { + case 'email': { + return await updateEmail(updateUid, data.email); + } + + case 'username': { + return await updateUsername(updateUid, data.username); + } + + case 'fullname': { + return await updateFullname(updateUid, data.fullname); + } + + case 'website': { + updateData[field] = punycode.toASCII(data[field]); + break; + } + + default: { + updateData[field] = data[field]; + } } - updateData[field] = data[field]; })); if (Object.keys(updateData).length) { diff --git a/src/views/admin/settings/advanced.tpl b/src/views/admin/settings/advanced.tpl index b64a631f74..6f997604e6 100644 --- a/src/views/admin/settings/advanced.tpl +++ b/src/views/admin/settings/advanced.tpl @@ -66,6 +66,22 @@
+
+ +
+

[[admin/settings/advanced:headers.coep-help]]

+
+ + +
+
diff --git a/src/views/admin/settings/email.tpl b/src/views/admin/settings/email.tpl index e5b3fab134..d4ef6a52a7 100644 --- a/src/views/admin/settings/email.tpl +++ b/src/views/admin/settings/email.tpl @@ -51,6 +51,13 @@

[[admin/settings/email:prompt-help]]

+
+ +
+