From 4c441a1b0b4d63cef2abdbff964b94bd49dddba1 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 22 Apr 2021 00:37:32 +0000 Subject: [PATCH 001/116] chore: update changelog for v1.17.0 --- CHANGELOG.md | 609 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 609 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1410efb7c5..ca5ca430ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,612 @@ +#### v1.17.0 (2021-04-22) + +##### Breaking Changes + +* add additional flag hooks [breaking] (00a68a95) +* remove deprecated `User.emailConfirm` [breaking] (fb84c785) +* remove deprecated plugin hook `filter:privileges:isUserAllowedTo` [breaking] (5a775e09) +* remove deprecated plugin hook methods [breaking] (d41de481) +* more removals of thumb specific backwards-compatibility [breaking] (cc0d562e) +* remove deprecated `filter:admin/header.build` hook [breaking] (5f9f241e) +* remove deprecated v2 style responses for thumbs upload route [breaking] (84dfdfe6) +* remove deprecated getObject routes [breaking] (2ad0d0d0) +* remove 'filters' and 'categories' from flag details API return [breaking] (8b72479f) +* filtering logic of flags [breaking] (1603566b) +* feature flag for auto-resolving a user's flags on ban [breaking] (6b1c97db) +* allow interstitial callbacks to be async functions [breaking] (280285cd) + +##### Chores + +* **deps:** + * update dependency jsdom to v16.5.3 (0f249aa7) + * update dependency eslint to v7.24.0 (60c0c16f) + * update dependency husky to v6 (f155f326) + * update commitlint monorepo to v12.1.1 (b4d01388) + * update dependency jsdom to v16.5.2 (5e2e7a58) + * update dependency eslint to v7.23.0 (d600cd94) + * update dependency husky to v5.2.0 (77f551a4) + * update dependency jsdom to v16.5.1 (28ed579b) + * update dependency eslint to v7.22.0 (775c3b91) + * update dependency mocha to v8.3.2 (3ce731d8) + * update dependency jsdom to v16.5.0 (fd926d61) + * update dependency mocha to v8.3.1 (651c629f) + * update dependency husky to v5.1.3 (8791b44e) + * update dependency husky to v5.1.2 (5f061b94) + * update commitlint monorepo to v12 (42f7cd52) + * update dependency eslint to v7.21.0 (59518437) + * update dependency husky to v5.1.1 (2551295c) + * update dependency husky to v5.1.0 (dc06fe22) + * update dependency eslint to v7.20.0 (9ec0b2ed) + * update dependency mocha to v8.3.0 (73f07958) + * update dependency husky to v5 (d89ccf26) + * update dependency lint-staged to v10.5.4 (030ecffa) + * update dependency eslint to v7.19.0 (3696a199) +* incrementing version number - v1.17.0-beta.5 (42c4f963) +* fix indent (6406e527) +* benchpress 2.4.1 (3403635c) +* remove log (a1ee1a2a) +* incrementing version number - v1.17.0-beta.4 (91992240) +* bump composer-default (289bfc0b) +* up themes (d14ba1f4) +* remove node 10 (8d3ec234) +* bump composer-default to 6.5.20 (33fbfdfe) +* incrementing version number - v1.17.0-beta.3 (6e8b1bb9) +* add multiparty dep (ef3ec96a) +* incrementing version number - v1.17.0-beta.2 (0c1945dc) +* incrementing version number - v1.17.0-beta.1 (31872aac) +* bump composer (30954789) +* bump deps (#9335) (b9fd2c87) +* incrementing version number - v1.17.0-beta.0 (b61257ef) +* incrementing version number - v1.16.3-beta.0 (477157cc) +* extra console.log (1ae8dda8) +* up composer (1c9acef6) +* eslint max-len (cc9d6fd0) +* eslint no-restricted-syntax (5c2f0f05) +* eslint prefer-rest-params, prefer-spread (115d19e2) +* eslint prefer-destructuring (23f212a4) +* eslint object-curly-newline (8d1462ff) +* eslint function-paren-newline (62869bae) +* eslint no-var, vars-on-top (dab3b235) +* eslint prefer-arrow-callback (b56d9e12) +* eslint prefer-template (707b55b6) +* eslint import/newline-after-import (4ee0f145) +* eslint no-script-url (9f6a682c) +* eslint no-bitwise (dad01e30) +* eslint rules matching existing styles (58528d1a) +* fallbacks (74be1a59) +* deprecation notices for plugins using plugin old hook methods (3052256d) +* add deprecation notice in comments for ajaxify.loadExtraScripts (8b09292e) +* incrementing version number - v1.16.2 (ea7f8381) +* update changelog for v1.16.2 (d3883d4b) + +##### Documentation Changes + +* fixed typo (e7550673) +* added comment re: #9305 (65c57c73) +* update deprecation-removal version for plugin hook helper methods in 1.18.0 (15ba0abb) + +##### New Features + +* lang strings (9b71b087) +* rate limit file uploads (a9978fcf) +* filter flags by username #8489 (#9451) (8faa6e45) +* roll session identifier on login, as security best practice (697ed3bf) +* allow different slugs (4494728c) +* remove sort again (fd3bc605) +* update hook (f65d2162) +* add reverse of recent to getSortedTopics (05f22361) +* allow exists methods to work with arrays and single id (285aa365) +* pass all data to filter:category.get (d16b45fd) +* add action:posts.loaded (dbb59228) +* rescheduling (editing ST) (#9445) (aa0137b1) +* upgrade sharp (#9442) (f7f46e7c) +* optional urlMethod param for loginStrategies (9e1f72a4) +* add hooks to language loading (#9426) (344575dd) +* doggy.gif (b06f0ea2) +* allow adding sorted-list items from forms outside of modal (a3e95e79) +* scheduled topics (#9399) (077330b7) +* show link if category is a link (a94d9651) +* make info page full width (dd12c83f) +* allow optional fields argument on db.getObject(s) (#9385) (4327a09d) +* closes #9380, add category filtering and topic tools to tag page (668508cc) +* allow sync function (#9379) (34b9aaed) +* allow filter functions that return promises or the data directly (e6c52cf2) +* add resolve flag to post tools (52082e12) +* hide revert button in ACP > Privileges until privileges change (4cbd13fd) +* bring back static hook timeout (46270f9f) +* upgrade connect-mongo, closes https://github.com/NodeBB/NodeBB/pull/9367 (3c60ccfd) +* pass interstital errors to individual partials as well as to registerComplete (f71cb0e4) +* add filter:plugins.firehook (5eb3132d) +* copy default favicon if it doesn't exist (754283d3) +* add missing translation keys (17184bfa) +* allow missing (or non-array) middlewares argument in route helper methods (4b545085) +* pass modified params, only affects filter hooks (e74df539) +* add back topic id input (696c4895) +* expose username validation logic to user lib, new hook `filter:username.check` (bfd512b9) +* add $.deserialize to client side (e5133a78) +* allow for settings.save/settings.load on client side (66196d2c) +* remove promise-pollyfil (902a88c2) +* category privilege API routes (c1b3079d) +* change uploadCroppedPicture to use updateProfile as well (0af9d26f) +* use updateProfile for picture change (a598abcd) +* allow payload to be passed to emailer test method (1155b0c4) +* add uid of user who created flag to action:flags.create (069ac60f) +* new client-side hook `filter:api.options` to allow plugins to modify api requests (7d391d47) +* keep notifs for one month, load 50 notifications instead of 30 (02f08111) +* also pass in uid to `filter:email.prepare` (86b0c57d) +* new hook `filter:email.prepare` (27ea3dcb) +* new hook static:email.send (bf90d158) +* show time info for upgrade scripts (14a6c349) +* add dashboard sub-pages to ACP menu (73dc64d9) +* recent logins sessions table in dashbaord subpage (2f89b0d7) +* topics dashboard details subpage (e1ed514b) +* update user list in dashboard/users on graph update (c57c7703) +* show list of recent users in dashboard/users (cc938224) +* req.query parsing and dynamically loading data instead (6fdcae73) +* new hooks for notifications get/getCount (079a13d4) +* allow hook unregistration, and temporary page-based hooks (d0136074) +* report login statistics from analytics data, instead of its own zset (16d3c457) +* track login sessions for admin dashboard reporting (9a9f366d) +* track successful logins in analytics (504fd107) +* pass user picture object into change_picture_modal (c96fd3b1) +* add logout to invalid session (beb14273) +* category search test (a592ebd1) +* pass post object to filter:post.tools (ed3d9dcb) +* allow defining a list of system tags (0e07f3c9) +* add category search test, #9307 (bbaaead0) +* add tag filter to getSortedTopics (9ce6f8ad) +* ability to re-order topic thumbnails (7223074f) +* add close button to topic thumbnail modal (db027170) +* #9304, add category/topic/username to post queue notification emails (0738dae8) +* add failing test for list append/prepend with list (#9303) (8f0386d9) +* link to post-queue from topic event (a4b4a556) +* post-queue topic event (8fd78ce5) +* add post-queue cache (3f35fd33) +* newsletter opt-in/out in UCP, closes #21 (3c7cd9a6) +* load user posts/topics via xhr on infinitescroll (35954734) +* #9294, put new categories at top (4b2bf12f) +* add invalid event name to error message (670cde78) +* new notifications load/loaded hooks on client side (7edc8f45) +* pass req.session into buildReqObject (a6fa351b) +* new hook `action:login.continue` (4f976390) +* banned-users group (53e0d4d2) +* #9109, ability to delete a post's diffs (eb642f40) +* add .delete() method to api module (501441b7) +* doc add description (cc560ca3) +* add doc for query param (ed11e171) +* #9234, add pagination to /api/recent/posts/:term? (fffdc4e0) +* allow sorted-lists on multiple pages (d5d24594) +* #9232, add profile picture into exported zip (f6cd2862) +* new hook `filter:login.override`, deprecate `action:auth.overrideLogin` (b820d234) +* guard password fields in login/register against accidental caps lock (4bb3b032) +* ability to search categories, #8813 (34c42c6f) +* restore action:script.load, allow modifying loaded module via static:script.init (05be1c66) +* async/await redis connection (fdfbc902) +* async/await psql connection (33bf1b0e) +* add group name to csv event (672959c1) +* **user:** icon background selector in change picture modal (95502124) +* **remountable-routes:** + * allow category and account routes to be remounted (9021f071) + * allow /admin and /post to be remountable (f01af62b) +* **topic-events:** + * topic events GET route in write API (dc84559d) + * server-side tests for topic events (449c379d) + * clear out topic events when a topic is purged (0d4a3775) + * client-side handling on topic event log (8e93bf73) + * handle newest_to_oldest sort in topic events, WIP (882e6a15) + * generic css for timeline-event (2293a07a) + * support for uids in topic event payloads (611d1f87) + * work in progress topic events logic and client-side implementation (ab2e1ecb) +* **hooks:** + * update action:ajaxify.end to use new hooks module (1d775721) + * client-side hooks module (01c9b184) + +##### Bug Fixes + +* regress. rescheduling shouldn't add to sets that pinning removed… (#9477) (8b79c7f1) +* logic is hard (4dd38446) +* run in series (bc0ca61c) +* wrong variable for cache (2e9efc0e) +* accidentally committed this (13fa983e) +* tests (eb240c90) +* eslint (fa0c92a7) +* use req.ip instead, since guests can upload as well (ea22cd30) +* #9492, keep query params on redirect (36f119a9) +* stripTags for editing sorted list items as well (93598982) +* #9487, session data gathered during a session is lost upon login (1fee6a70) +* failure on session reroll 🍣 test (f4c5050a) +* registration interstitials not handling promise rejections properly (e845c34b) +* stripHTMLTags for sorted list entries (75073c0e) +* restore original behavior for up/downvoting when logged out (e50408b4) +* let recent replies respect oldest/newest sort settings (60eed8d8) +* #9483, fix events count display (6907837f) +* escape flag reason (161081e9) +* copy change on plugin activate to instruct admins to rebuild as well as restart (95d5359c) +* updateCategoryTagsCount (2dc3283f) +* #9473 (#9476) (036f935f) +* #9474, load hooks on page load (1af34b43) +* spec (d09cdc04) +* #9466, don't call leaveRoom in maintenance mode (f32ea173) +* exempt ST from being del/res via last main posts (#9468) (a0dd9080) +* #9462, on install copy default favicon (784600d9) +* #9463 (c5ae8a70) +* #9465 (4041e786) +* #9450 express session saved even if saveUninitialized explicitly passed in (9c52fd2e) +* acp crash (cb53a64c) +* #9447, include query params in previousUrl (536591f8) +* thumb count not updated when uploading multiple thumbs at a time (1ad1787e) +* change email button stays disabled if user submitted an invalid email (01f63e5d) +* use app.logout() to clear session after deleting user (cfdef77b) +* ./nodebb help with commander@7 (#9434) (2a03012e) +* hide titleRaw for deleted topics as well (edf80cfb) +* #9410, fix post queue (c5dda64f) +* privilege tables (9052db93) +* #9420, paginate after loading notifications (67b09cba) +* hooks for alert animate, no more fadein/fadeout for reconnect alert (d9e20290) +* #9414, use posts:view_deleted (e42b152f) +* preserve order when changing parent (2ceda70a) +* #9411 (3c4e93a3) +* #9412 (cef58d1d) +* #9406, update flag post tools (93c595d9) +* typo in switch..case (d8ff9851) +* #9404, show signatures if the target user has signature privilege (801570e4) +* selector (ee69c1f8) +* sorting when filtering by uid (75553b24) +* allow local (and overridden) login strategies to pass Error objects back (98b72ca5) +* category search not using uid (6aa60b63) +* inf scroll with subfolder install (262e059f) +* flicker on dashboard (2041b808) +* #9398, crash on post flag (90d64fe1) +* #9395, pass all data from client to Topics.reply (#9396) (a8f7b244) +* lint (4ac38ab2) +* #9394, fix guest handles (eb360351) +* #9387, don't try to load undefined images (03e30634) +* #9389, allow admins to add themselves to private groups (5c59354c) +* #9386, add missing translation string (482641e3) +* #9383, don't show deleted topic titles in inf scroll (e789fe8d) +* #9378, crash on verifyToken if API Token settings not saved (null case error) (cc489708) +* closes #9382, fix digest topic links (35700d16) +* spec (1e1127bd) +* regression from filter hook change (53f67ff3) +* crash if unreadTopics is undefined (617f4730) +* dont crash if login el doesnt exist (f45c0aab) +* regression via c1b3079d93fb4c49ba62a4be5279b7bff8e5a54d (2a939aad) +* change notification updateCount to use client-side hooks (84725130) +* tests (39b0e0fb) +* #9370, show correct teaser index if sorting is newest to oldest (9382fc6d) +* don't copy if src doesn't exist (ebccc794) +* #9362 best not to check file exists on every page load; copying favicon to uploads/system folder instead (771a8955) +* #9362 (ad565495) +* regression where login redirect for admin routes didn't go to local=1 (678e8f0f) +* lint (f4f61b92) +* if no in passed use "titles" to match header search (e787e6ea) +* add back middleware.authenticateOrGuest (166d65a1) +* request authentication called twice in account routes (e3b2c00d) +* #9354, don't close quicksearch results if mouse is down on them (8a4c361e) +* #9339, only log email errors once per digest, notification push (3aa26c4d) +* winston.info (3f42d40c) +* #9351 bad logic when inserting rows to privilege tables, also a missing tfoot :foot: (c5e25788) +* app.parseAndTranslate to always return promise (c2650169) +* bug where fallback window trigger was not firing if there were no hook listeners attached (1e579428) +* bad assignment (c8b78654) +* #9348 incorrect redirect via connect-ensure-login (fbe9215b) +* bug where loginSeconds setting was ignored for local login (f806befd) +* remove old dep (b58bacaf) +* notif pruning (2737f653) +* notification prune test (ca817631) +* user icon text overflow in some cases (2b7d0b5a) +* use components for toggleNavbar instead (114e3a1e) +* allow interstitial callbacks to be functional (no cb required) (9bf94ad5) +* don't publish before pubClient is connected (cdf5d18f) +* remove unused async (48f1e265) +* in setupPageRoute helper, buildHeader after plugin hooks have fired (984c9dd9) +* timeago missing on table update (655e2c67) +* wrong qs param, allow string to be passed to util.getDaysArray (f8e1a74c) +* wrong call to sortedSetAdd (dbe5f702) +* session not persisting to database in some scenarios (020f0b83) +* allow hidden inputs in user settings page (beaac0a1) +* use root context if buildAvatar context is undefined (b4c0b32b) +* use bootbox module (fa91525a) +* #9307, use _.flatten (25c8f026) +* awaiting res.render in send404 controller > > A plugin wanted to use `response:rotuer.page` to 404 a specific page on some condition. res.render returns early in send404 and so must be awaited otherwise multiple responses will be sent (2fef4627) +* do not overwrite `config.port` from URL, if it's already set (34096b73) +* switch back to getSortedSetRange (8686fbfa) +* settings v3 (91734a64) +* another topic thumb test fix (782bef5e) +* thumbs.associate logic fix + tests (7ebb6d30) +* missing awaits, possible test fix (7665adf7) +* #9301, dont call sitemapstream if there are no entries in categories/pages/topics.xml (9a6cf3d9) +* properly incase its the same path (807b0d43) +* numThumbs count on associate (76bcc0c9) +* missing cache deletion calls for post-queue cache (1490b32d) +* use of removed URL to get post data (36e8d251) +* init topic events from webserver.js (b81508c4) +* check null topics (b753c69c) +* guard against null topics (58cd797e) +* tests, new categories go to top now (fc90f32e) +* #9292, messageobj.content already parsed (c953b1b3) +* clear category cache on copy parent (765db86d) +* delete category cache key on category create (ed3e9ce2) +* typo (c61cc37b) +* wait for event.log to finish before killing process (a5fa212f) +* tests, only generate csrf_token on 404 gets (b6493f89) +* #9287, generate csrf_token on 404 (94f72d60) +* do not blindly escape a notification's bodyLong (783786cf) +* pass jquery object in to action:notifications.loaded hook (16610b2d) +* #9275, (0cca6893) +* don't use global bootbox obj (cfa0d423) +* remove console.log (550cd995) +* move service worker back to relative_path/service-worker.js (fca17cb7) +* spec (ab0ef442) +* markread selector (a4878a5b) +* position when scrolling up (3090a2ae) +* cache key collision (e40af441) +* tests breakage due to 67e3fb64981fe2310b17515e1f18c32021a5e983 (5c21c33e) +* register returnTo logic to match login route (67e3fb64) +* tests (492cbc62) +* posts.uploads.sync dissociates uploaded thumbs of the main pid (f79aeef8) +* update grammar on unban text (68da1c55) +* privileges page - tweak icon position and width, group name wrapping (c729adeb) +* autofocus on search field in ACP > Manage > Plugins (4af9c2fc) +* openapi test specs (cabec378) +* include admins (7c9674de) +* include admins, limit to category mods, correct privilege name (eaf9d2e4) +* http 200 test for api routes (bd583963) +* invalid API call when unfollowing a user (58655e9a) +* example (833c73e8) +* #9127, scope service worker to relative_path for the forum (#9239) (2bc74cff) +* update docs (4c12e0aa) +* broken test after sorted-lists logic change (d6f60f45) +* clear all locks on restart (9834f72f) +* `action:admin.settingsLoaded` to use new hooks lib (5131eb6b) +* crash on firing action hook that had no listeners registered (b0f5d5a5) +* bug where `action:settings.sorted-list.loaded` fired early (1a04ec64) +* regression where `filter:settings.set` no longer received sorted-lists (a8be6fb8) +* #9231, fix redis pubsub connection (5bc1f5b4) +* don't translate message on every ajaxify (a29dd21d) +* tests (05c53394) +* improper override of req.body.username in login logic (74199220) +* full settings hash not passed through to action:settings.set (473d5f4a) +* #9223, don't overwrite stmp settings (a5bf9779) +* multiple sorted-lists do not save to the correct set (4029ec37) +* pass module name to `static:script.init`, +comments (f8bf9e99) +* handle delete and update for categories:name zset (e8429f50) +* tests remove old routes (faeb6373) +* removed object routes (d41ce873) +* removed methods (647d3ba8) +* incorrect return for Thumbs.get() if thumbs were disabled (7b090c58) +* script failure if client-side page script does not exist (7da1b43f) +* bug where `action:ajaxify.end` was never called if there were no init scripts (faf59603) +* update js concatenation logic to bundle scripts.rjs into minfile regardless of build environment (8ff07bc1) +* #7125, allow list for page route, configurable via plugin hook (f975063b) +* error on flag list if no flag filters were saved in session (942d9247) +* mod cid filter accidentally saved in session (35c92d0c) +* more tests for #9217 (ce7c74b2) +* tests for #9217 (f2a5cd0b) +* missing return for #9217 (27cae0d5) +* #9217, render 400 error page on bad access to /register (b2b1450e) +* redis check compat tests (78896fc6) +* registration completion overriding returnTo if it was already set (a186ea0f) +* add missing user delete event types (5c1b7429) +* missing option for user-deleteAccount on ACP Events page (1c420602) +* **deps:** + * update dependency html-to-text to v7.1.1 (427e4f47) + * update dependency redis to v3.1.2 (35a4d0be) + * update dependency validator to v13.6.0 (e3d5d8d7) + * update dependency nodebb-plugin-composer-default to v6.5.27 (1b846271) + * update dependency redis to v3.1.1 (286a63e3) + * update dependency nodebb-theme-persona to v11.0.17 (51d58ce6) + * update dependency nodebb-theme-vanilla to v12.0.7 (16a1ba57) + * update dependency postcss to v8.2.10 (31cec2de) + * update dependency nodebb-plugin-mentions to v2.13.9 (fe087806) + * update dependency mongodb to v3.6.6 (#9467) (4264b236) + * update dependency sharp to v0.28.1 (34cbc9e2) + * update dependency nodebb-theme-persona to v11.0.16 (a8330b6d) + * update dependency nodebb-theme-vanilla to v12.0.6 (c02310b8) + * update dependency nodebb-theme-persona to v11.0.15 (316c71d7) + * update socket.io packages to v4.0.1 (e7776f8d) + * update dependency redis to v3.1.0 (fd9ff334) + * update dependency nodebb-plugin-composer-default to v6.5.26 (#9446) (8d9afbc6) + * update dependency postcss to v8.2.9 (6f51c460) + * update dependency nodebb-theme-persona to v11.0.14 (#9443) (fecfcd81) + * update dependency nodebb-theme-persona to v11.0.13 (#9437) (e5cc6e40) + * update dependency nodebb-theme-slick to v1.4.6 (dfdb0050) + * update dependency nodebb-theme-persona to v11.0.11 (27de58f2) + * update dependency benchpressjs to v2.4.3 (382f75bc) + * update dependency nodebb-plugin-composer-default to v6.5.25 (24236718) + * update dependency nodebb-theme-vanilla to v12.0.5 (89973d80) + * update dependency nodebb-plugin-composer-default to v6.5.24 (dec34446) + * update dependency nodebb-theme-persona to v11.0.10 (f78b4ba6) + * update dependency nodebb-plugin-composer-default to v6.5.23 (#9422) (e35d0741) + * update dependency nodebb-theme-persona to v11.0.8 (124cb9d9) + * update dependency benchpressjs to v2.4.2 (1dddcb49) + * update dependency nodebb-plugin-mentions to v2.13.8 (d511216c) + * update dependency connect-mongo to v4.4.1 (29ff5bb9) + * update dependency nodebb-theme-persona to v11.0.7 (c5734063) + * update dependency nodebb-theme-vanilla to v12.0.4 (#9409) (870e6c2c) + * update dependency nodebb-theme-slick to v1.4.5 (#9408) (24be8642) + * update dependency nodebb-theme-persona to v11.0.6 (#9407) (b50739c1) + * update dependency nodebb-plugin-spam-be-gone to v0.7.9 (#9405) (9359cae9) + * update dependency nodebb-theme-persona to v11.0.5 (47b2b97f) + * update dependency nodebb-plugin-composer-default to v6.5.21 (#9401) (2f70ac5a) + * update dependency mongodb to v3.6.5 (fcd887fd) + * update dependency nodebb-plugin-composer-default to v6.5.19 (#9391) (1631f159) + * update dependency nodebb-plugin-composer-default to v6.5.17 (#9384) (8d401760) + * update dependency nodebb-theme-persona to v11.0.3 (27facadb) + * update dependency socket.io-redis to v6.1.0 (adaddde6) + * update dependency nodebb-plugin-composer-default to v6.5.16 (a98e92b4) + * update dependency nodebb-plugin-markdown to v8.12.7 (#9371) (56b0bfd5) + * update dependency nodebb-theme-vanilla to v12.0.2 (#9369) (8923d34c) + * update dependency nodebb-theme-persona to v11.0.2 (#9368) (fa71c483) + * update socket.io packages to v4 (#9363) (13f3c504) + * update dependency postcss to v8.2.8 (680cf5ef) + * update dependency nodebb-theme-persona to v10.5.17 (2645bf55) + * update dependency connect-mongo to v4.3.1 (59459074) + * update dependency connect-mongo to v4.3.0 (f388086a) + * update dependency autoprefixer to v10.2.5 (4f4cdacc) + * update dependency postcss to v8.2.7 (72db3754) + * update dependency nodebb-plugin-composer-default to v6.5.13 (017af7cb) + * update dependency jquery to v3.6.0 (dd6082a0) + * update dependency connect-mongo to v4.2.2 (ec0912cc) + * update dependency nodebb-plugin-spam-be-gone to v0.7.8 (#9337) (536bae70) + * update dependency nodebb-plugin-composer-default to v6.5.12 (2674de01) + * update socket.io packages to v3.1.2 (510eb1f9) + * update dependency nodebb-theme-persona to v10.5.16 (217d3afd) + * update dependency nodebb-plugin-emoji-android to v2.0.5 (e8209341) + * update dependency sharp to v0.27.2 (c5231f10) + * update dependency nodebb-theme-vanilla to v11.4.5 (8596dcc4) + * update dependency nodebb-theme-persona to v10.5.15 (753ab0a0) + * update dependency nodebb-theme-persona to v10.5.14 (ed503b80) + * update dependency nodebb-theme-persona to v10.5.12 (ddd8fa31) + * update dependency benchpressjs to v2.4.1 (4ee3a8e8) + * update dependency nodebb-theme-persona to v10.5.10 (7f8fd4b0) + * update dependency nodebb-theme-persona to v10.5.9 (5dd748c6) + * require xregexp 5.0.1 (86e911ba) + * update dependency xregexp to v5 (513cd1c3) + * update dependency nodebb-theme-persona to v10.5.8 (54b4dc1d) + * update dependency postcss to v8.2.6 (4d92af5a) + * update dependency nodebb-theme-persona to v10.5.7 (#9288) (c2459fd5) + * update dependency nodebb-plugin-composer-default to v6.5.10 (b312725f) + * update dependency nodebb-theme-persona to v10.5.6 (4599144f) + * update dependency nodebb-widget-essentials to v5.0.3 (#9284) (eb9f058f) + * update dependency nodebb-plugin-composer-default to v6.5.9 (6e14014b) + * update dependency nodebb-plugin-composer-default to v6.5.8 (674a31d1) + * update dependency nodebb-theme-slick to v1.4.3 (#9278) (d3923585) + * update dependency nodebb-theme-vanilla to v11.4.4 (#9279) (1f28e8c3) + * update dependency nodebb-theme-persona to v10.5.5 (#9277) (a7b46adc) + * update dependency connect-redis to v5.1.0 (#9276) (83a0b6b8) + * update dependency nodebb-theme-persona to v10.5.4 (#9270) (dc145284) + * update dependency nodebb-theme-vanilla to v11.4.3 (#9272) (2fda6774) + * update dependency nodebb-theme-slick to v1.4.2 (2b12905d) + * update dependency nodebb-theme-lavender to v5.2.1 (fb2f1143) + * update dependency nodebb-theme-slick to v1.4.1 (#9262) (2cfab367) + * update socket.io packages to v3.1.1 (#9253) (2147d386) + * update dependency postcss to v8.2.5 (1fa0d4f4) + * update dependency nodebb-plugin-emoji-android to v2.0.1 (42e365d9) + * update dependency nodebb-plugin-markdown to v8.12.6 (4fd6027b) + * update dependency nodebb-plugin-mentions to v2.13.7 (8a2fe3d9) + * update dependency nodebb-theme-vanilla to v11.4.2 (2326e9a6) + * update dependency nodebb-theme-persona to v10.5.3 (9245ffaf) + * update dependency nodebb-plugin-dbsearch to v4.2.0 (389690c3) + * update dependency nodebb-plugin-composer-default to v6.5.7 (13e12c95) + * update dependency json2csv to v5.0.6 (0aa8e03f) + * bump theme deps for #9244 (44019e28) + * update dependency mongodb to v3.6.4 (56e4e56b) + * update dependency nodebb-theme-persona to v10.5.1 (04411449) + * update dependency nodebb-theme-vanilla to v11.4.0 (#9238) (897d29ec) + * update dependency nodebb-theme-slick to v1.4.0 (#9237) (8e2deab4) + * update dependency nodebb-theme-persona to v10.5.0 (#9236) (4f842a79) + * update dependency nodebb-theme-lavender to v5.2.0 (47fd1634) + * update dependency nodebb-plugin-dbsearch to v4.1.3 (1e10ebfb) + * update dependency nodebb-plugin-composer-default to v6.5.6 (0e2b329b) + * update dependency autoprefixer to v10.2.4 (6c3b1fde) + * update dependency nodebb-plugin-markdown to v8.12.5 (05901fcd) + * update dependency nodebb-theme-persona to v10.4.1 (a9b3fb37) + * update dependency sharp to v0.27.1 (a90773a6) + * bump persona to get timeline style (ca14c0e2) + * update dependency postcss to v8.2.4 (5b2f0be0) + * update dependency autoprefixer to v10.2.3 (d99cb1cf) + * update dependency postcss-clean to v1.2.0 (4232d97b) +* **#9315:** api v3 post, put, del JSON (0d59fe3d) +* **remountable-routes:** + * more fixes to remountable routes (9d17f397) + * bug with user routes remounting to itself (bc68e990) +* **#9252:** pass site domain to nodemailer (#9254) (5e5d37c3) +* **topic-events:** + * topicEvents.init() test (aa8b84bb) + * repeated invocations of Posts.addTopicEvents caused dupes to be added to DOM (df2fdd56) +* **hooks:** + * bug where hook firing would fail if there were no listeners (efff8e2a) + * fallback handling for core invocations of hooks.fire (412d2858) + +##### Other Changes + +* schema docs for new ACP dashboard subpage routes (0804d547) + +##### Performance Improvements + +* increase batch size for notifs, run parallel (728ac5ff) +* faster category tags upgrade script (0dad568c) +* use setObjectBulk (95033ef7) +* make upgrade script faster (a07509f7) +* make upgrade script faster (0959b124) +* cache base_url (cf4002bc) +* single call to get digest topics, dont send duplicate topics (5ce28207) +* single db call to add all uids (90d5c9da) +* make digests a little bit faster (0185ea1b) +* only load thumbs for topics that actually have thumbs (7eebcbdb) + +##### Refactors + +* make debug handler async (1db8920b) +* widgets (#9471) (397baf02) +* style, no need to convert length to string (d00268c9) +* deprecate action:script.load, use filter:script.load instead (d1685600) +* remove uncessary check (f316c4d4) +* remove async.each/reduce from hooks for better stack traces (d05d7091) +* use hooks.fire (0d3979ef) +* fix variable name (1982edfd) +* account edit logic and template, closes #9364 (98bf4064) +* automatically authenticate all requests setup through route helpers (#9357) (7da061f0) +* async listen testSocket (0021c601) +* remove startsWith/endsWith (48bc23c0) +* app.parseAndTranslate to return promise if no callback passed (b5a6a314) +* privileges, export modules directly (#9325) (293b7c26) +* have Graph.init and Graph.update return promises (3fa2e3ce) +* abstract out some client side dashboard code into modules, analytics subpages for users, topics, and logins (f561799f) +* move picture change client-side logic to its own rjs module (28f6931e) +* remove dupe code (5286f208) +* thumbs.associate accepts both relative path and url in path arg (3e6640ef) +* move post queue retrival code to posts.getQueuedPosts (36f20211) +* call topic events init from within file itself (6074a0fb) +* improvements (970bd06f) +* update dom after diff deletion better (a2a7557c) +* removed 3 lines (4447a64e) +* use Map to track sorted lists in Settings.set() (65de2e76) +* **user:** all plugins to change list of icon background colours (fbccf6e2) +* **remountable-routes:** + * rename `src/routes/accounts.js` to `src/routes/user.js` to better match the route prefix (1f28713f) + * allow certain route prefixes to be mounted elsewhere (92758ec5) +* **topic-events:** + * expose addTopicEvents method in topic posts lib (9559fad8) + * break out some logic in events.get into local modifyEvent method (cec3fc93) + * fire topic event logging in topics/tools instead, pass uid into payload (425eca14) +* **hooks:** + * deprecate `action:script.load` client-side hook (8e5687a4) + * better error handling (e7bd038d) + +##### Reverts + +* revert tag sort (f9df6431) +* change toPid truthy (56523aa1) +* bring back backwards compat (a1c01446) + +##### Code Style Changes + +* eslint (b5ce8d25) +* **remountable-routes:** abstract removable routes code to a separate local fn (16c1d6e9) + +##### Tests + +* remove logs (435067aa) +* clear cache between runs, require middleware later in helpers (2ea468da) +* log (d15e2710) +* remove equals (354e0a82) +* test times (2f401d7d) +* log (80ef1082) +* added test for session id reroll on login (a3a7ab3a) +* add missing test (8ef38cb2) +* double filter test (70a653d0) +* admin/manage/users tests (0e67ab01) +* fix spec for topic thumbs (4c078084) +* added missing properties to topicObject (1d9ade4c) +* added missing test file (b31f6dd2) +* topic reordering tests (ad54b174) +* additional tests for topic thumbs (50664487) +* added more topic thumbnail tests (28b30134) +* post diff deletion tests (72b050b4) +* **user:** added additional tests for icon background colour (d3a9e76a) + #### v1.16.2 (2021-01-21) ##### Breaking Changes From 75f7972b8889babbf87bbc900fb9de789be993db Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 22 Apr 2021 00:37:31 +0000 Subject: [PATCH 002/116] chore: incrementing version number - v1.17.0 (cherry picked from commit 6b4ef46eadce177d51b609bf75df8acdaab61f0a) Signed-off-by: Misty (Bot) --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index fa47f30a30..9f493a639c 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.17.0-beta.5", + "version": "1.17.0", "homepage": "http://www.nodebb.org", "repository": { "type": "git", From 92de49be0012b9ef1d07ac7503a741757eca539c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 22 Apr 2021 11:14:47 -0400 Subject: [PATCH 003/116] test: add test for undefined fields in getObjectsFields --- src/database/mongo/hash.js | 2 +- src/database/postgres/hash.js | 7 +++++-- test/database/hash.js | 9 +++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index 5f58dfd93b..452ecf9d6e 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -120,7 +120,7 @@ module.exports = function (module) { cache.set(key, cachedData[key]); }); - if (!fields.length) { + if (!Array.isArray(fields) || !fields.length) { return keys.map(key => (cachedData[key] ? { ...cachedData[key] } : null)); } return keys.map((key) => { diff --git a/src/database/postgres/hash.js b/src/database/postgres/hash.js index 696e385bfd..1a733a3518 100644 --- a/src/database/postgres/hash.js +++ b/src/database/postgres/hash.js @@ -142,7 +142,9 @@ SELECT h."data"->>$2::TEXT f if (!key) { return null; } - + if (!Array.isArray(fields) || !fields.length) { + return await module.getObject(key); + } const res = await module.pool.query({ name: 'getObjectFields', text: ` @@ -174,7 +176,8 @@ SELECT (SELECT jsonb_object_agg(f, d."value") if (!Array.isArray(keys) || !keys.length) { return []; } - if (!fields.length) { + + if (!Array.isArray(fields) || !fields.length) { return await module.getObjects(keys); } const res = await module.pool.query({ diff --git a/test/database/hash.js b/test/database/hash.js index e1ccd782af..9ac9b3a40f 100644 --- a/test/database/hash.js +++ b/test/database/hash.js @@ -324,6 +324,15 @@ describe('Hash methods', () => { assert.strictEqual(Number(objects[1].age), 3); assert.strictEqual(!!objects[2], false); }); + + it('should return objects if fields is not an array', async () => { + const objects = await db.getObjectsFields(['testObject8', 'testObject9', 'doesnotexist'], undefined); + assert.strictEqual(objects[0].name, 'baris'); + assert.strictEqual(Number(objects[0].age), 99); + assert.strictEqual(objects[1].name, 'ginger'); + assert.strictEqual(Number(objects[1].age), 3); + assert.strictEqual(!!objects[2], false); + }); }); describe('getObjectKeys()', () => { From 4e490f605849f5f3cd7e6c18820287f0b1fa7657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 22 Apr 2021 11:28:10 -0400 Subject: [PATCH 004/116] test: fix redis tests --- src/database/redis/hash.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/database/redis/hash.js b/src/database/redis/hash.js index 3a83b861fe..42a1fccffc 100644 --- a/src/database/redis/hash.js +++ b/src/database/redis/hash.js @@ -98,9 +98,7 @@ module.exports = function (module) { if (!Array.isArray(keys) || !keys.length) { return []; } - if (!Array.isArray(fields)) { - return keys.map(() => ({})); - } + const cachedData = {}; const unCachedKeys = cache.getUnCachedKeys(keys, cachedData); @@ -118,7 +116,7 @@ module.exports = function (module) { cache.set(key, cachedData[key]); }); - if (!fields.length) { + if (!Array.isArray(fields) || !fields.length) { return keys.map(key => (cachedData[key] ? { ...cachedData[key] } : null)); } return keys.map((key) => { From 01956af43a79ea95b034b39f06f4a22264e96852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 22 Apr 2021 11:35:36 -0400 Subject: [PATCH 005/116] feat: remove sync hooks support --- src/plugins/hooks.js | 4 ---- test/plugins.js | 7 +------ 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index d3dec5965d..394c11c5b8 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -137,10 +137,6 @@ async function fireFilterHook(hook, hookList, params) { payload => resolve(payload), err => reject(err) ); - return; - } - if (returned) { - resolve(returned); } }); } diff --git a/test/plugins.js b/test/plugins.js index b7b5575d28..4bc48af007 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -47,7 +47,7 @@ describe('Plugins', () => { }); }); - it('should register and fire a filter hook having 3 methods, one returning a promise, one calling the callback and one just returning', async () => { + it('should register and fire a filter hook having 2 methods, one returning a promise, one calling the callback', async () => { function method1(data, callback) { data.foo += 1; callback(null, data); @@ -58,14 +58,9 @@ describe('Plugins', () => { resolve(data); }); } - function method3(data) { - data.foo += 1; - return data; - } plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method1 }); plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method2 }); - plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method3 }); const data = await plugins.hooks.fire('filter:test.hook2', { foo: 1 }); assert.strictEqual(data.foo, 8); From 1029a06a8758988704a03ba9564660a1b5119caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 22 Apr 2021 11:50:05 -0400 Subject: [PATCH 006/116] test: fix tests --- test/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugins.js b/test/plugins.js index 4bc48af007..21d0ff94b7 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -63,7 +63,7 @@ describe('Plugins', () => { plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method2 }); const data = await plugins.hooks.fire('filter:test.hook2', { foo: 1 }); - assert.strictEqual(data.foo, 8); + assert.strictEqual(data.foo, 7); }); it('should register and fire a filter hook that returns a promise that gets rejected', (done) => { From a30deef3ed34d1382d015cb59462c6cb84393b95 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 22 Apr 2021 16:15:55 +0000 Subject: [PATCH 007/116] chore(deps): update dependency grunt to v1.4.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 9f493a639c..7d495dbab5 100644 --- a/install/package.json +++ b/install/package.json @@ -148,7 +148,7 @@ "eslint": "7.24.0", "eslint-config-airbnb-base": "14.2.1", "eslint-plugin-import": "2.22.1", - "grunt": "1.3.0", + "grunt": "1.4.0", "grunt-contrib-watch": "1.1.0", "husky": "6.0.0", "jsdom": "16.5.3", From 38454df9a3acdb5331dc5659b235c586098a8ce4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 22 Apr 2021 18:47:19 +0000 Subject: [PATCH 008/116] fix(deps): update dependency postcss to v8.2.12 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7d495dbab5..7ca30316e0 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "passport-local": "1.0.0", "pg": "^8.5.1", "pg-cursor": "^2.5.2", - "postcss": "8.2.10", + "postcss": "8.2.12", "postcss-clean": "1.2.0", "prompt": "^1.1.0", "redis": "3.1.2", From 3b98d83a6bec7a2a963f7229efbc17c9b43377a4 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 23 Apr 2021 09:11:53 +0000 Subject: [PATCH 009/116] Latest translations and fallbacks --- public/language/fr/admin/settings/uploads.json | 6 +++--- public/language/fr/error.json | 2 +- public/language/hu/admin/extend/plugins.json | 2 +- public/language/hu/admin/settings/uploads.json | 6 +++--- public/language/hu/error.json | 2 +- public/language/hu/flags.json | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/language/fr/admin/settings/uploads.json b/public/language/fr/admin/settings/uploads.json index f6f979382e..dbba8cae6b 100644 --- a/public/language/fr/admin/settings/uploads.json +++ b/public/language/fr/admin/settings/uploads.json @@ -21,9 +21,9 @@ "topic-thumb-size": "Miniature du sujet", "allowed-file-extensions": "Extensions de fichier autorisés", "allowed-file-extensions-help": "Entrer une liste d’extensions de fichier séparés par une virgule (ex : pdf,xls,doc). Une liste vide signifie que toutes les extensions sont autorisées.", - "upload-limit-threshold": "Rate limit user uploads to:", - "upload-limit-threshold-per-minute": "Per %1 Minute", - "upload-limit-threshold-per-minutes": "Per %1 Minutes", + "upload-limit-threshold": "Limite d'envoi de fichiers par utilisateurs:", + "upload-limit-threshold-per-minute": "Par %1 Minute", + "upload-limit-threshold-per-minutes": "Par %1 Minutes", "profile-avatars": "Avatar", "allow-profile-image-uploads": "Autoriser les utilisateurs à télécharger des avatars", "convert-profile-image-png": "Convertir les avatars téléchargés au format PNG", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index ac4198d4cd..4ce02e3815 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -89,7 +89,7 @@ "file-too-big": "La taille maximale autorisée pour un fichier est de %1 ko. Veuillez envoyer un fichier plus petit.", "guest-upload-disabled": "L'envoi de fichiers a été désactivé pour les invités", "cors-error": "Impossible d'envoyer l'image en raison d'une erreur de configuration CORS", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", + "upload-ratelimit-reached": "Vous avez envoyé trop de fichiers à la fois. Veuillez réessayer plus tard.", "scheduling-to-past": "Veuillez sélectionner une date ultérieure.", "invalid-schedule-date": "Veuillez saisir une date et une heure valide.", "cant-pin-scheduled": "Les sujets planifiés ne peuvent pas être (dé)épinglés.", diff --git a/public/language/hu/admin/extend/plugins.json b/public/language/hu/admin/extend/plugins.json index a7ddbad1e9..18f559a666 100644 --- a/public/language/hu/admin/extend/plugins.json +++ b/public/language/hu/admin/extend/plugins.json @@ -39,7 +39,7 @@ "alert.upgraded": "Beépülő frissítve", "alert.installed": "Beépülő telepítve", "alert.uninstalled": "Beépülő eltávolítva", - "alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin", + "alert.activate-success": "Kérlek építsd újra és indítsd újra a NodeBB-t, hogy teljesen engedélyezd ezt a beépülőt", "alert.deactivate-success": "A beépülő sikeresen deaktiválva", "alert.upgrade-success": "A beépülő teljes frissítéséhez kérlek építsd újra majd indítsd újra a NodeBB-t.", "alert.install-success": "A beépülő sikeresen telepítve, kérlek aktiváld.", diff --git a/public/language/hu/admin/settings/uploads.json b/public/language/hu/admin/settings/uploads.json index 297f2f79b4..d3f3633e10 100644 --- a/public/language/hu/admin/settings/uploads.json +++ b/public/language/hu/admin/settings/uploads.json @@ -21,9 +21,9 @@ "topic-thumb-size": "Témakörkép mérete", "allowed-file-extensions": "Megengedett fájlkiterjesztések", "allowed-file-extensions-help": "Itt adj meg fájlkiterjesztési listát, vesszővel elválasztva (pl. pdf,xls,doc). Az üres lista azt jelenti, hogy minden kiterjesztés megengedett.", - "upload-limit-threshold": "Rate limit user uploads to:", - "upload-limit-threshold-per-minute": "Per %1 Minute", - "upload-limit-threshold-per-minutes": "Per %1 Minutes", + "upload-limit-threshold": "Felhasználó limit feltöltésekre:", + "upload-limit-threshold-per-minute": "%1 percenként", + "upload-limit-threshold-per-minutes": "%1 percenként", "profile-avatars": "Profil avatárok", "allow-profile-image-uploads": "Profilképek feltöltésének engedélyezése a felhasználók számára", "convert-profile-image-png": "Profilkép feltöltések átkonvertálása PNG-be", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 79706377e8..1e4d9afbbc 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -89,7 +89,7 @@ "file-too-big": "A maximális megengedett fájl méret %1 kB - kérlek kisebb méretű fájlt tölts fel", "guest-upload-disabled": "Vendég általi feltöltés kikapcsolva", "cors-error": "Nem sikerült a kép feltöltés a rosszul konfigurált CORS miatt", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", + "upload-ratelimit-reached": "Egyszerre túl sok fájlt töltöttél fel. Kérlek próbáld újra később.", "scheduling-to-past": "Kérlek adj meg egy jövőbeli időpontot.", "invalid-schedule-date": "Kérlek valós dátumot és időt adj meg.", "cant-pin-scheduled": "Időzített témakörök rögzítése nem oldható fel.", diff --git a/public/language/hu/flags.json b/public/language/hu/flags.json index e2121af042..0c475a5ede 100644 --- a/public/language/hu/flags.json +++ b/public/language/hu/flags.json @@ -27,7 +27,7 @@ "filter-cid-all": "Minden kategória", "apply-filters": "Szűrők alkalmazása", "more-filters": "Több szűrő", - "fewer-filters": "Fewer Filters", + "fewer-filters": "Kevesebb szűrő", "quick-actions": "Gyors akciók", "flagged-user": "Megjelölt felhasználó", From ed534f34f566d66357b174746cd5c00e3bf8b1a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 23 Apr 2021 12:37:59 -0400 Subject: [PATCH 010/116] fix: buildReqObject headers for socket.io calls --- src/api/helpers.js | 2 +- src/socket.io/categories/search.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/helpers.js b/src/api/helpers.js index 27481318e9..a383dc1f84 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -20,7 +20,7 @@ exports.setDefaultPostData = function (reqOrSocket, data) { // creates a slimmed down version of the request object exports.buildReqObject = (req, payload) => { req = req || {}; - const headers = req.headers || {}; + const headers = req.headers || (req.client && req.client.request && req.client.request.headers) || {}; const encrypted = req.connection ? !!req.connection.encrypted : false; let { host } = headers; const referer = headers.referer || ''; diff --git a/src/socket.io/categories/search.js b/src/socket.io/categories/search.js index 1cf2ffc29f..1affc248e5 100644 --- a/src/socket.io/categories/search.js +++ b/src/socket.io/categories/search.js @@ -8,7 +8,7 @@ const privileges = require('../../privileges'); const controllersHelpers = require('../../controllers/helpers'); module.exports = function (SocketCategories) { - // used by categorySeach module + // used by categorySearch module SocketCategories.categorySearch = async function (socket, data) { let cids = []; let matchedCids = []; From 9e07efc126fd69fb03d2b72ba54d5cd12e87faa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 23 Apr 2021 12:41:58 -0400 Subject: [PATCH 011/116] fix: use socket.request.headers --- src/api/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/helpers.js b/src/api/helpers.js index a383dc1f84..82a379ae40 100644 --- a/src/api/helpers.js +++ b/src/api/helpers.js @@ -20,7 +20,7 @@ exports.setDefaultPostData = function (reqOrSocket, data) { // creates a slimmed down version of the request object exports.buildReqObject = (req, payload) => { req = req || {}; - const headers = req.headers || (req.client && req.client.request && req.client.request.headers) || {}; + const headers = req.headers || (req.request && req.request.headers) || {}; const encrypted = req.connection ? !!req.connection.encrypted : false; let { host } = headers; const referer = headers.referer || ''; From 308252f566db1212f9d03ef89621b12d4dd7e0e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 23 Apr 2021 14:46:54 -0400 Subject: [PATCH 012/116] fix: #9503, dont error in markUnread if room doesnt exist this prevents deleting the user if they are the only person in the chat room --- src/messaging/unread.js | 2 +- test/user.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/messaging/unread.js b/src/messaging/unread.js index 4a1ab60cfb..169374045f 100644 --- a/src/messaging/unread.js +++ b/src/messaging/unread.js @@ -31,7 +31,7 @@ module.exports = function (Messaging) { Messaging.markUnread = async (uids, roomId) => { const exists = await Messaging.roomExists(roomId); if (!exists) { - throw new Error('[[error:chat-room-does-not-exist]]'); + return; } const keys = uids.map(uid => `uid:${uid}:chat:rooms:unread`); return await db.sortedSetsAdd(keys, Date.now(), roomId); diff --git a/test/user.js b/test/user.js index 3306ebee0b..e3482d5139 100644 --- a/test/user.js +++ b/test/user.js @@ -541,6 +541,17 @@ describe('User', () => { await Posts.upvote(result.postData.pid, 1); assert(!await db.isSortedSetMember('users:reputation', uid)); }); + + it('should delete user even if they started a chat', async () => { + const socketModules = require('../src/socket.io/modules'); + const uid1 = await User.create({ username: 'chatuserdelete1' }); + const uid2 = await User.create({ username: 'chatuserdelete2' }); + const roomId = await socketModules.chats.newRoom({ uid: uid1 }, { touid: uid2 }); + await socketModules.chats.send({ uid: uid1 }, { roomId: roomId, message: 'hello' }); + await socketModules.chats.leave({ uid: uid2 }, roomId); + await User.delete(1, uid1); + assert.strictEqual(await User.exists(uid1), false); + }); }); describe('passwordReset', () => { From 32c20806bc8467953ba354042b870ed8794f8517 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 23 Apr 2021 23:05:19 +0000 Subject: [PATCH 013/116] chore(deps): update dependency eslint to v7.25.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7ca30316e0..2f5dc708aa 100644 --- a/install/package.json +++ b/install/package.json @@ -145,7 +145,7 @@ "@commitlint/cli": "12.1.1", "@commitlint/config-angular": "12.1.1", "coveralls": "3.1.0", - "eslint": "7.24.0", + "eslint": "7.25.0", "eslint-config-airbnb-base": "14.2.1", "eslint-plugin-import": "2.22.1", "grunt": "1.4.0", From a478dc7ee8efa43d50283346f904e3a6125ae3b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 26 Apr 2021 10:35:34 -0400 Subject: [PATCH 014/116] feat: add filter:middleware.autoLocale --- src/middleware/headers.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/middleware/headers.js b/src/middleware/headers.js index e06082851c..dacfb62dec 100644 --- a/src/middleware/headers.js +++ b/src/middleware/headers.js @@ -7,6 +7,7 @@ const _ = require('lodash'); const meta = require('../meta'); const languages = require('../languages'); const helpers = require('./helpers'); +const plugins = require('../plugins'); module.exports = function (middleware) { middleware.addHeaders = helpers.try((req, res, next) => { @@ -74,9 +75,12 @@ module.exports = function (middleware) { }); middleware.autoLocale = helpers.try(async (req, res, next) => { - let langs; + await plugins.hooks.fire('filter:middleware.autoLocale', { + req: req, + res: res, + }); if (req.query.lang) { - langs = await listCodes(); + const langs = await listCodes(); if (!langs.includes(req.query.lang)) { req.query.lang = meta.config.defaultLang; } @@ -85,7 +89,7 @@ module.exports = function (middleware) { if (parseInt(req.uid, 10) > 0 || !meta.config.autoDetectLang) { return next(); } - langs = await listCodes(); + const langs = await listCodes(); const lang = req.acceptsLanguages(langs); if (!lang) { return next(); From 2bfa63aecf78e52a41aa4d962ebf657a10c2bafa Mon Sep 17 00:00:00 2001 From: psychobunny Date: Mon, 26 Apr 2021 11:17:46 -0400 Subject: [PATCH 015/116] feat: `hidden` class to FOUC --- public/src/utils.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/src/utils.js b/public/src/utils.js index 56b4c46573..fa9864ac5c 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -469,7 +469,9 @@ makeNumbersHumanReadable: function (elements) { elements.each(function () { - $(this).html(utils.makeNumberHumanReadable($(this).attr('title'))); + $(this) + .html(utils.makeNumberHumanReadable($(this).attr('title'))) + .removeClass('hidden'); }); }, @@ -488,7 +490,9 @@ addCommasToNumbers: function (elements) { elements.each(function (index, element) { - $(element).html(utils.addCommas($(element).html())); + $(element) + .html(utils.addCommas($(element).html())) + .removeClass('hidden'); }); }, From b40fc4b64def78251b41377574afe1fb17935e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 26 Apr 2021 14:50:44 -0400 Subject: [PATCH 016/116] feat: #9511 send notifications on accept/reject --- public/language/en-GB/notifications.json | 2 ++ public/language/en-GB/success.json | 2 +- src/posts/queue.js | 14 ++++++++++++-- src/socket.io/posts.js | 20 +++++++++++++++++--- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/public/language/en-GB/notifications.json b/public/language/en-GB/notifications.json index 0ec141d742..33014b5c80 100644 --- a/public/language/en-GB/notifications.json +++ b/public/language/en-GB/notifications.json @@ -51,6 +51,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", diff --git a/public/language/en-GB/success.json b/public/language/en-GB/success.json index 17093d3efe..6923dd3b8a 100644 --- a/public/language/en-GB/success.json +++ b/public/language/en-GB/success.json @@ -1,7 +1,7 @@ { "success": "Success", "topic-post": "You have successfully posted.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Authentication Successful", "settings-saved": "Settings saved!" } \ No newline at end of file diff --git a/src/posts/queue.js b/src/posts/queue.js index f3bb96b56b..d523420e43 100644 --- a/src/posts/queue.js +++ b/src/posts/queue.js @@ -228,10 +228,15 @@ module.exports = function (Posts) { } Posts.removeFromQueue = async function (id) { + const data = await getParsedObject(id); + if (!data) { + return; + } await removeQueueNotification(id); await db.sortedSetRemove('post:queue', id); await db.delete(`post:queue:${id}`); cache.del('post-queue'); + return data; }; Posts.submitFromQueue = async function (id) { @@ -240,11 +245,14 @@ module.exports = function (Posts) { return; } if (data.type === 'topic') { - await createTopic(data.data); + const result = await createTopic(data.data); + data.pid = result.postData.pid; } else if (data.type === 'reply') { - await createReply(data.data); + const result = await createReply(data.data); + data.pid = result.pid; } await Posts.removeFromQueue(id); + return data; }; async function getParsedObject(id) { @@ -260,6 +268,7 @@ module.exports = function (Posts) { async function createTopic(data) { const result = await topics.post(data); socketHelpers.notifyNew(data.uid, 'newTopic', { posts: [result.postData], topic: result.topicData }); + return result; } async function createReply(data) { @@ -270,6 +279,7 @@ module.exports = function (Posts) { 'downvote:disabled': !!meta.config['downvote:disabled'], }; socketHelpers.notifyNew(data.uid, 'newPost', result); + return postData; } Posts.editQueuedContent = async function (uid, editData) { diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 2af48a17c6..aee411a0d1 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -7,6 +7,7 @@ const plugins = require('../plugins'); const meta = require('../meta'); const topics = require('../topics'); const user = require('../user'); +const notifications = require('../notifications'); const socketHelpers = require('./helpers'); const utils = require('../utils'); const api = require('../api'); @@ -130,11 +131,13 @@ SocketPosts.getReplies = async function (socket, pid) { }; SocketPosts.accept = async function (socket, data) { - await acceptOrReject(posts.submitFromQueue, socket, data); + const result = await acceptOrReject(posts.submitFromQueue, socket, data); + await sendQueueNotification('post-queue-accepted', result.uid, `/post/${result.pid}`); }; SocketPosts.reject = async function (socket, data) { - await acceptOrReject(posts.removeFromQueue, socket, data); + const result = await acceptOrReject(posts.removeFromQueue, socket, data); + await sendQueueNotification('post-queue-rejected', result.uid, '/'); }; async function acceptOrReject(method, socket, data) { @@ -142,7 +145,18 @@ async function acceptOrReject(method, socket, data) { if (!canEditQueue) { throw new Error('[[error:no-privileges]]'); } - await method(data.id); + return await method(data.id); +} + +async function sendQueueNotification(type, targetUid, path) { + const notifObj = await notifications.create({ + type: type, + nid: `${type}-${targetUid}-${path}`, + bodyShort: type === 'post-queue-accepted' ? + '[[notifications:post-queue-accepted]]' : '[[notifications:post-queue-rejected]]', + path: path, + }); + await notifications.push(notifObj, [targetUid]); } SocketPosts.editQueuedContent = async function (socket, data) { From d08d0c42e9733b67062b13d82788c4fd0043f509 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 26 Apr 2021 16:13:48 -0400 Subject: [PATCH 017/116] docs: update API authentication verbiage --- public/openapi/read.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/public/openapi/read.yaml b/public/openapi/read.yaml index 0058822c63..f778e533e4 100644 --- a/public/openapi/read.yaml +++ b/public/openapi/read.yaml @@ -13,7 +13,7 @@ info: ## Shortcomings - The Read API is named because its primary use is by NodeBB itself when navigating between pages. Therefore, the routes almost universally always follow the same path as actual pages on NodeBB itself. There are also a small number of non-`GET` routes, which doesn't necessarily make sense in a Read API. These will be merged into the Write API in time. + The Read API is named because its primary use is by NodeBB itself when navigating between pages. Therefore, the routes almost universally always follow the same path as actual pages on NodeBB itself. There are also a small number of non-`GET` routes, which do not make sense in a Read API. These will be merged into the Write API in time. ## Authentication @@ -21,14 +21,16 @@ info: ### Cookie Authentication - This default authentication behaviour of this API is via cookie jar to find a valid session. A valid login session is required for API calls that pertain to operations involving a logged-in user. For example, `/api/unread` is a route showing unread topics, and is not accessible by guest users. + By default, the API will attempt to find a valid session in the browser's cookies. A valid login session is required for API calls that pertain to operations involving a logged-in user. For example, `/api/unread` is a route showing unread topics, and is not accessible by guest users. + + Most data transfer utilities like cURL will allow you to construct something like a cookie, to be sent alongside the request, to function much like a browser cookie. This should work with the API. ### Bearer Authentication - Both the Read API and Write API offers bearer authentication, as administered through the administration panel. + Both the Read API and Write API offer bearer authentication, as administered through the administration panel. - * For NodeBB v1.x, this is provided by [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). The Write API plugin needs to be installed before authentication via bearer token is enabled on routes provided by the Read API. - * For NodeBB v2.x+ (in development), the Write API is available in core, and bearer authentication is available out-of-the-box + * Up until v1.14.3, this is provided by [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). The Write API plugin needs to be installed before authentication via bearer token is enabled on routes provided by the Read API. + * From NodeBB v1.15.0 onwards, the Write API is available in core, and bearer authentication is available out-of-the-box tags: - name: home description: Routes used at the forum index only From 831e5c2682cc0932ec6716cce729a696ac20e08e Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 26 Apr 2021 21:01:34 +0000 Subject: [PATCH 018/116] fix(deps): update dependency postcss to v8.2.13 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 2f5dc708aa..c13228841a 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "passport-local": "1.0.0", "pg": "^8.5.1", "pg-cursor": "^2.5.2", - "postcss": "8.2.12", + "postcss": "8.2.13", "postcss-clean": "1.2.0", "prompt": "^1.1.0", "redis": "3.1.2", From 55e3f5c1dbdd98ee08ae54de9ed729973c313046 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 27 Apr 2021 09:13:53 +0000 Subject: [PATCH 019/116] Latest translations and fallbacks --- public/language/ar/notifications.json | 2 + public/language/ar/success.json | 2 +- public/language/bg/notifications.json | 2 + public/language/bg/success.json | 2 +- public/language/bn/notifications.json | 2 + public/language/bn/success.json | 2 +- public/language/cs/notifications.json | 2 + public/language/cs/success.json | 2 +- public/language/da/notifications.json | 2 + public/language/da/success.json | 2 +- public/language/de/notifications.json | 2 + public/language/de/success.json | 2 +- public/language/el/notifications.json | 2 + public/language/el/success.json | 2 +- public/language/en-US/notifications.json | 2 + public/language/en-US/success.json | 2 +- .../language/en-x-pirate/notifications.json | 2 + public/language/en-x-pirate/success.json | 2 +- public/language/es/notifications.json | 2 + public/language/es/success.json | 2 +- public/language/et/notifications.json | 2 + public/language/et/success.json | 2 +- public/language/fa-IR/notifications.json | 2 + public/language/fa-IR/success.json | 2 +- public/language/fi/notifications.json | 2 + public/language/fi/success.json | 2 +- public/language/fr/notifications.json | 2 + public/language/fr/success.json | 2 +- public/language/gl/notifications.json | 2 + public/language/gl/success.json | 2 +- public/language/he/notifications.json | 2 + public/language/he/success.json | 2 +- public/language/hr/notifications.json | 2 + public/language/hr/success.json | 2 +- public/language/hu/notifications.json | 2 + public/language/hu/success.json | 2 +- public/language/id/notifications.json | 2 + public/language/id/success.json | 2 +- public/language/it/notifications.json | 2 + public/language/it/success.json | 2 +- public/language/ja/notifications.json | 2 + public/language/ja/success.json | 2 +- public/language/ko/notifications.json | 2 + public/language/ko/success.json | 2 +- public/language/lt/notifications.json | 2 + public/language/lt/success.json | 2 +- public/language/lv/notifications.json | 2 + public/language/lv/success.json | 2 +- public/language/ms/notifications.json | 2 + public/language/ms/success.json | 2 +- public/language/nb/admin/admin.json | 6 +- public/language/nb/admin/dashboard.json | 4 +- .../language/nb/admin/manage/categories.json | 4 +- public/language/nb/admin/manage/tags.json | 2 +- public/language/nb/admin/manage/users.json | 2 +- .../nb/admin/settings/pagination.json | 6 +- public/language/nb/admin/settings/post.json | 8 +- public/language/nb/admin/settings/tags.json | 8 +- public/language/nb/admin/settings/user.json | 8 +- public/language/nb/category.json | 6 +- public/language/nb/error.json | 222 +++++++++--------- public/language/nb/global.json | 6 +- public/language/nb/login.json | 2 +- public/language/nb/modules.json | 2 +- public/language/nb/notifications.json | 8 +- public/language/nb/pages.json | 2 +- public/language/nb/reset_password.json | 2 +- public/language/nb/search.json | 4 +- public/language/nb/success.json | 2 +- public/language/nb/topic.json | 58 ++--- public/language/nb/unread.json | 6 +- public/language/nb/user.json | 12 +- public/language/nb/users.json | 6 +- public/language/nl/notifications.json | 2 + public/language/nl/success.json | 2 +- public/language/pl/notifications.json | 2 + public/language/pl/success.json | 2 +- public/language/pt-BR/notifications.json | 2 + public/language/pt-BR/success.json | 2 +- public/language/pt-PT/notifications.json | 2 + public/language/pt-PT/success.json | 2 +- public/language/ro/notifications.json | 2 + public/language/ro/success.json | 2 +- public/language/ru/notifications.json | 2 + public/language/ru/success.json | 2 +- public/language/ru/topic.json | 2 +- public/language/rw/notifications.json | 2 + public/language/rw/success.json | 2 +- public/language/sc/notifications.json | 2 + public/language/sc/success.json | 2 +- public/language/sk/notifications.json | 2 + public/language/sk/success.json | 2 +- public/language/sl/notifications.json | 2 + public/language/sl/success.json | 2 +- public/language/sr/notifications.json | 2 + public/language/sr/success.json | 2 +- public/language/sv/notifications.json | 2 + public/language/sv/success.json | 2 +- public/language/th/notifications.json | 2 + public/language/th/success.json | 2 +- public/language/tr/notifications.json | 2 + public/language/tr/success.json | 2 +- public/language/uk/notifications.json | 2 + public/language/uk/success.json | 2 +- public/language/vi/notifications.json | 2 + public/language/vi/success.json | 2 +- public/language/zh-CN/notifications.json | 2 + public/language/zh-CN/success.json | 2 +- public/language/zh-TW/notifications.json | 2 + public/language/zh-TW/success.json | 2 +- 110 files changed, 324 insertions(+), 236 deletions(-) diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 80677aeb4f..5b20ece2b1 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "تم التحقق من عنوان البريد الإلكتروني", "email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.", "email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.", diff --git a/public/language/ar/success.json b/public/language/ar/success.json index 6b2670dc00..57b7def037 100644 --- a/public/language/ar/success.json +++ b/public/language/ar/success.json @@ -1,7 +1,7 @@ { "success": "نجاح", "topic-post": "لقد تمت الإضافة بنجاح.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "تم تسجيل الدخول بنجاح", "settings-saved": "تم حفظ التغييرات!" } \ No newline at end of file diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index 86d2b8c7e8..2d3803eea7 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "Публикациите на %1 са изнесени, щракнете за сваляне", "uploads-exported": "Качванията на %1 са изнесени, щракнете за сваляне", "users-csv-exported": "Потребителите са изнесени във формат „csv“, щракнете за сваляне", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Е-пощата беше потвърдена", "email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.", "email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.", diff --git a/public/language/bg/success.json b/public/language/bg/success.json index 28725d2552..bd084f8deb 100644 --- a/public/language/bg/success.json +++ b/public/language/bg/success.json @@ -1,7 +1,7 @@ { "success": "Готово", "topic-post": "Вие публикувахте успешно.", - "post-queued": "Публикацията Ви е добавена в опашката за одобрение.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Успешно удостоверяване", "settings-saved": "Настройките са запазени!" } \ No newline at end of file diff --git a/public/language/bn/notifications.json b/public/language/bn/notifications.json index 661d4909d2..0650db9e2d 100644 --- a/public/language/bn/notifications.json +++ b/public/language/bn/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "ইমেইল নিশ্চিত করা হয়েছে", "email-confirmed-message": "আপনার ইমেইল যাচাই করার জন্য আপনাকে ধন্যবাদ। আপনার অ্যাকাউন্টটি এখন সম্পূর্ণরূপে সক্রিয়।", "email-confirm-error-message": "আপনার ইমেল ঠিকানার বৈধতা যাচাইয়ে একটি সমস্যা হয়েছে। সম্ভবত কোডটি ভুল ছিল অথবা কোডের মেয়াদ শেষ হয়ে গিয়েছে।", diff --git a/public/language/bn/success.json b/public/language/bn/success.json index c94040eeb1..7e8f468f6a 100644 --- a/public/language/bn/success.json +++ b/public/language/bn/success.json @@ -1,7 +1,7 @@ { "success": "সফল হয়েছে", "topic-post": "আপনি সফলভাবে পোষ্ট করেছেন। ", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "অথেন্টিকেশন সফল হয়েছে", "settings-saved": "সেটিংস সেভ করা হয়েছে। " } \ No newline at end of file diff --git a/public/language/cs/notifications.json b/public/language/cs/notifications.json index 35c65485c5..8eab980947 100644 --- a/public/language/cs/notifications.json +++ b/public/language/cs/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-mail potvrzen", "email-confirmed-message": "Děkujeme za ověření vaší e-mailové adresy. Váš účet je nyní aktivní.", "email-confirm-error-message": "Nastal problém s ověřením vaší e-mailové adresy. Kód je pravděpodobně neplatný nebo jeho platnost vypršela.", diff --git a/public/language/cs/success.json b/public/language/cs/success.json index 656ed305ef..b1f996e509 100644 --- a/public/language/cs/success.json +++ b/public/language/cs/success.json @@ -1,7 +1,7 @@ { "success": "Úspěšné", "topic-post": "Příspěvek úspěšně přidán.", - "post-queued": "Váš příspěvek byl přidán do fronty na schválení.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Úspěšné přihlášení", "settings-saved": "Nastavení byla uložena." } \ No newline at end of file diff --git a/public/language/da/notifications.json b/public/language/da/notifications.json index 4c6ad68139..e0ddf2362c 100644 --- a/public/language/da/notifications.json +++ b/public/language/da/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email bekræftet", "email-confirmed-message": "Tak fordi du validerede din email. Din konto er nu fuldt ud aktiveret.", "email-confirm-error-message": "Der var et problem med valideringen af din emailadresse. Bekræftelses koden var muligvis forkert eller udløbet.", diff --git a/public/language/da/success.json b/public/language/da/success.json index 67e8fb02f5..b024945606 100644 --- a/public/language/da/success.json +++ b/public/language/da/success.json @@ -1,7 +1,7 @@ { "success": "Udført", "topic-post": "Du har indsendt et indlæg.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Du blev autentificeret", "settings-saved": "Indstillinger gemt!" } \ No newline at end of file diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 030c0ed80b..c70f4679f4 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 Posts exportiert, klicke zum downloaden", "uploads-exported": "%1 Uploads exportiert, klicke zum downloaden", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-Mail bestätigt", "email-confirmed-message": "Vielen Dank für Ihre E-Mail-Validierung. Ihr Konto ist nun vollständig aktiviert.", "email-confirm-error-message": "Es gab ein Problem bei der Validierung Ihrer E-Mail-Adresse. Möglicherweise ist der Code ungültig oder abgelaufen.", diff --git a/public/language/de/success.json b/public/language/de/success.json index a944624fc6..2ef0331ba0 100644 --- a/public/language/de/success.json +++ b/public/language/de/success.json @@ -1,7 +1,7 @@ { "success": "Fertig", "topic-post": "Beitrag erfolgreich erstellt.", - "post-queued": "Dein Beitrag wurde zur Genehmigung eingereicht", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Authentifizierung erfolgreich!", "settings-saved": "Einstellungen gespeichert!" } \ No newline at end of file diff --git a/public/language/el/notifications.json b/public/language/el/notifications.json index 5779866aed..78e1d7b6ba 100644 --- a/public/language/el/notifications.json +++ b/public/language/el/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/el/success.json b/public/language/el/success.json index df56b7ec5f..89a804572f 100644 --- a/public/language/el/success.json +++ b/public/language/el/success.json @@ -1,7 +1,7 @@ { "success": "Επιτυχία", "topic-post": "Δημοσίευσες με επιτυχία.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Επιτυχής Ταυτοποίηση", "settings-saved": "Οι επιλογές αποθηκεύτηκαν!" } \ No newline at end of file diff --git a/public/language/en-US/notifications.json b/public/language/en-US/notifications.json index 14bc2e046e..a3816674e2 100644 --- a/public/language/en-US/notifications.json +++ b/public/language/en-US/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/en-US/success.json b/public/language/en-US/success.json index 231f17a160..7fa5550915 100644 --- a/public/language/en-US/success.json +++ b/public/language/en-US/success.json @@ -1,7 +1,7 @@ { "success": "Success", "topic-post": "You have successfully posted.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Authentication Successful", "settings-saved": "Settings saved!" } \ No newline at end of file diff --git a/public/language/en-x-pirate/notifications.json b/public/language/en-x-pirate/notifications.json index fe394df25a..79e4693058 100644 --- a/public/language/en-x-pirate/notifications.json +++ b/public/language/en-x-pirate/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/en-x-pirate/success.json b/public/language/en-x-pirate/success.json index 231f17a160..7fa5550915 100644 --- a/public/language/en-x-pirate/success.json +++ b/public/language/en-x-pirate/success.json @@ -1,7 +1,7 @@ { "success": "Success", "topic-post": "You have successfully posted.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Authentication Successful", "settings-saved": "Settings saved!" } \ No newline at end of file diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 5fc224c511..a519882961 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Correo electrónico confirmado", "email-confirmed-message": "Gracias por validar tu correo electrónico. Tu cuenta ya está completamente activa.", "email-confirm-error-message": "Hubo un problema al validar tu cuenta de correo electrónico. Quizá el código era erróneo o expiró...", diff --git a/public/language/es/success.json b/public/language/es/success.json index aad794e5a2..80dbf11c21 100644 --- a/public/language/es/success.json +++ b/public/language/es/success.json @@ -1,7 +1,7 @@ { "success": "¡Éxito!", "topic-post": "Mensaje publicado satisfactoriamente.", - "post-queued": "Tu post está en cola para su aprobación.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Identificado satisfactoriamente", "settings-saved": "¡Ajustes guardados satisfactoriamente!" } \ No newline at end of file diff --git a/public/language/et/notifications.json b/public/language/et/notifications.json index 51d15b1a6a..516c72ac26 100644 --- a/public/language/et/notifications.json +++ b/public/language/et/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Emaili aadress kinnitatud", "email-confirmed-message": "Täname, et kinnitasite oma emaili aadressi. Teie kasutaja on nüüd täielikult aktiveeritud.", "email-confirm-error-message": "Emaili aadressi kinnitamisel tekkis viga. Võibolla kinnituskood oli vale või aegunud.", diff --git a/public/language/et/success.json b/public/language/et/success.json index be9cc4d9e6..1d897c8083 100644 --- a/public/language/et/success.json +++ b/public/language/et/success.json @@ -1,7 +1,7 @@ { "success": "Õnnestus", "topic-post": "Edukalt postitatud.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Sisse logimine õnnestus!", "settings-saved": "Seaded salvestatud!" } \ No newline at end of file diff --git a/public/language/fa-IR/notifications.json b/public/language/fa-IR/notifications.json index 2d16080363..7fa8c2622a 100644 --- a/public/language/fa-IR/notifications.json +++ b/public/language/fa-IR/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "ایمیل تایید شد", "email-confirmed-message": "بابت تایید ایمیلتان سپاس‌گزاریم. حساب کاربری شما اکنون به صورت کامل فعال شده است.", "email-confirm-error-message": "خطایی در تایید آدرس ایمیل شما پیش آمده است. ممکن است کد نا‌معتبر و یا منقضی شده باشد.", diff --git a/public/language/fa-IR/success.json b/public/language/fa-IR/success.json index 9ca802250a..7544893c44 100644 --- a/public/language/fa-IR/success.json +++ b/public/language/fa-IR/success.json @@ -1,7 +1,7 @@ { "success": "موفقیت‌آمیز", "topic-post": "پست شما باموفقیت فرستاده شد.", - "post-queued": "پست شما برای تأیید در صف قرار گرفت.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "اعتبارسنجی موفق", "settings-saved": "تنظیمات ذخیره شد." } \ No newline at end of file diff --git a/public/language/fi/notifications.json b/public/language/fi/notifications.json index 4083fcd37c..da64260a2b 100644 --- a/public/language/fi/notifications.json +++ b/public/language/fi/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Sähköpostiosoite vahvistettu", "email-confirmed-message": "Kiitos sähköpostiosoitteesi vahvistamisesta. Käyttäjätilisi on nyt täysin aktivoitu.", "email-confirm-error-message": "Ongelma sähköpostiosoitteen vahvistamisessa. Ehkäpä koodi oli virheellinen tai vanhentunut.", diff --git a/public/language/fi/success.json b/public/language/fi/success.json index b782e7e9a5..02864d93ff 100644 --- a/public/language/fi/success.json +++ b/public/language/fi/success.json @@ -1,7 +1,7 @@ { "success": "Onnistui", "topic-post": "Viestin lähettäminen onnistui.", - "post-queued": "Viestisi on jonossa odottamassa hyväksyntää", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Tunnistautuminen onnistui", "settings-saved": "Asetukset tallennettu!" } \ No newline at end of file diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index ab11735341..bd7dd52415 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 messages exportés, cliquez pour les télécharger", "uploads-exported": "%1 envois exportés, cliquez pour les télécharger", "users-csv-exported": "Utilisateurs exportés en CSV, cliquez pour télécharger", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email vérifié", "email-confirmed-message": "Merci pour la validation de votre adresse email. Votre compte est désormais activé.", "email-confirm-error-message": "Il y a un un problème dans la vérification de votre adresse email. Le code est peut être invalide ou a expiré.", diff --git a/public/language/fr/success.json b/public/language/fr/success.json index 11894dcd3f..cb6f055689 100644 --- a/public/language/fr/success.json +++ b/public/language/fr/success.json @@ -1,7 +1,7 @@ { "success": "Terminé", "topic-post": "Le message a bien été envoyé.", - "post-queued": "Votre message est en attente d'approbation.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Authentification réussie", "settings-saved": "Paramètres enregistrés !" } \ No newline at end of file diff --git a/public/language/gl/notifications.json b/public/language/gl/notifications.json index 5f3ceb4af1..0243fac65f 100644 --- a/public/language/gl/notifications.json +++ b/public/language/gl/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Correo confirmado", "email-confirmed-message": "Grazas por validar o teu correo. A túa conta agora está activada.", "email-confirm-error-message": "Houbo un problema validando o teu correo. Poida que o código fose inválido ou expirase. ", diff --git a/public/language/gl/success.json b/public/language/gl/success.json index c98888b604..ab75efd29b 100644 --- a/public/language/gl/success.json +++ b/public/language/gl/success.json @@ -1,7 +1,7 @@ { "success": "Éxito", "topic-post": "Publicaches con éxito.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autenticación exitosa", "settings-saved": "Configuración gardada!" } \ No newline at end of file diff --git a/public/language/he/notifications.json b/public/language/he/notifications.json index b79ec05b08..76392360ae 100644 --- a/public/language/he/notifications.json +++ b/public/language/he/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 פוסטים יוצאו, לחץ כדי להוריד.", "uploads-exported": "%1 העלאות יוצאו, לחץ כדי להוריד.", "users-csv-exported": "משתמשים יוצאו כ-csv, לחץ כאן להורדה.", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "כתובת המייל אושרה", "email-confirmed-message": "תודה שאישרת את כתובת המייל שלך. החשבון שלך פעיל כעת.", "email-confirm-error-message": "אירעה שגיאה בעת אישור המייל שלך. ייתכן כי הקוד היה שגוי או פג תוקף.", diff --git a/public/language/he/success.json b/public/language/he/success.json index da04fbee46..c658ec97f0 100644 --- a/public/language/he/success.json +++ b/public/language/he/success.json @@ -1,7 +1,7 @@ { "success": "הצלחה", "topic-post": "העלת פוסט בהצלחה.", - "post-queued": "הפוסט שלך ממתין לאישור.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "הנתונים אומתו בהצלחה", "settings-saved": "הנתונים נשמרו!" } \ No newline at end of file diff --git a/public/language/hr/notifications.json b/public/language/hr/notifications.json index 0db4e82c4f..35d05ab336 100644 --- a/public/language/hr/notifications.json +++ b/public/language/hr/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email potvrđen", "email-confirmed-message": "Hvala na potvrdi emaila. Vaš račun je sada aktivan.", "email-confirm-error-message": "Nastao je problem pri potvrdi Vaše email adrese. Provjerite kod ili zatražite novi.", diff --git a/public/language/hr/success.json b/public/language/hr/success.json index 5427792de5..d00c3087ef 100644 --- a/public/language/hr/success.json +++ b/public/language/hr/success.json @@ -1,7 +1,7 @@ { "success": "Uspijeh", "topic-post": "Uspješna objava", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autentifikacija uspješna", "settings-saved": "Postavke spremljene!" } \ No newline at end of file diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index 84910426bb..db470c45cc 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "A Users csv exportálva, kattints ide a letöltéshez", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-mail megerősítve", "email-confirmed-message": "Köszönjük az e-mail címed megerősítését. A fiókod mostantól teljesen aktiválva van.", "email-confirm-error-message": "Probléma lépett fel az e-mail címed megerősítésekor. Talán a kód érvénytelen volt vagy lejárt.", diff --git a/public/language/hu/success.json b/public/language/hu/success.json index f7cdaaeb19..5a2d590191 100644 --- a/public/language/hu/success.json +++ b/public/language/hu/success.json @@ -1,7 +1,7 @@ { "success": "Sikeres", "topic-post": "Sikeres hozzászólás.", - "post-queued": "A hozzászólásod jóváhagyásra vár.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Sikeres hitelesítés", "settings-saved": "Beállítások mentve!" } \ No newline at end of file diff --git a/public/language/id/notifications.json b/public/language/id/notifications.json index a4b823d82b..069a285f8b 100644 --- a/public/language/id/notifications.json +++ b/public/language/id/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email telah Dikonfirmasi", "email-confirmed-message": "Terimakasih telah melakukan validasi email. Akunmu saat ini telah aktif sepenuhnya.", "email-confirm-error-message": "Terjadi masalah saat melakukan validasi emailmu. Mungkin terjadi kesalahan kode atau waktu habis.", diff --git a/public/language/id/success.json b/public/language/id/success.json index e73e61b7ff..266e5e27ad 100644 --- a/public/language/id/success.json +++ b/public/language/id/success.json @@ -1,7 +1,7 @@ { "success": "Sukses", "topic-post": "Kamu berhasil melakukan posting.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Otentikasi Sukses", "settings-saved": "Pengaturan disimpan!" } \ No newline at end of file diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index d263fd1cb7..1a05ed7733 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 post esportati, clicca per scaricare", "uploads-exported": "%1 caricamenti esportati, clicca per scaricare", "users-csv-exported": "Utenti esportati in CSV, clicca per scaricare", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confermata", "email-confirmed-message": "Grazie per aver validato la tua email. Il tuo account è ora completamente attivato.", "email-confirm-error-message": "C'è stato un problema nella validazione del tuo indirizzo email. Potrebbe essere il codice non valido o scaduto.", diff --git a/public/language/it/success.json b/public/language/it/success.json index f75ae41f5a..5af6e4acd2 100644 --- a/public/language/it/success.json +++ b/public/language/it/success.json @@ -1,7 +1,7 @@ { "success": "Riuscito", "topic-post": "Hai postato correttamente.", - "post-queued": "Il tuo post è in attesa di approvazione.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autenticazione Riuscita", "settings-saved": "Impostazioni salvate!" } \ No newline at end of file diff --git a/public/language/ja/notifications.json b/public/language/ja/notifications.json index 07b5857a37..1815a37f9e 100644 --- a/public/language/ja/notifications.json +++ b/public/language/ja/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Eメールが確認されました", "email-confirmed-message": "メールアドレス検証をして頂き、ありがとうございます。あなたのアカウントは完全にアクティブになりました。", "email-confirm-error-message": "あなたのEメールアドレス検証に問題があります。コードが無効か、期限切れです。", diff --git a/public/language/ja/success.json b/public/language/ja/success.json index 44a88b9bd1..ad6f53e5ae 100644 --- a/public/language/ja/success.json +++ b/public/language/ja/success.json @@ -1,7 +1,7 @@ { "success": "成功しました", "topic-post": "投稿に成功しました", - "post-queued": "あなたの投稿は承認待ちです。", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "認証に成功しました", "settings-saved": "設定を保存しました。" } \ No newline at end of file diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index a274341cf0..83211391f8 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1의 포스트 내보내기 완료, 클릭해서 다운로드 ", "uploads-exported": "%1의 업로드 내보내기 완료, 클릭해서 다운로드 ", "users-csv-exported": "사용자 csv 내보내기 완료, 클릭해서 다운로드", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "이메일 인증이 완료되었습니다.", "email-confirmed-message": "이메일을 인증해주셔서 감사합니다. 계정이 완전히 활성화되었습니다.", "email-confirm-error-message": "이메일 주소를 인증하지 못했습니다. 코드가 올바르지 않거나 만료되었을 수 있습니다.", diff --git a/public/language/ko/success.json b/public/language/ko/success.json index 0bf47a388c..0eee3bf46d 100644 --- a/public/language/ko/success.json +++ b/public/language/ko/success.json @@ -1,7 +1,7 @@ { "success": "성공", "topic-post": "성공적으로 작성했습니다.", - "post-queued": "글이 승인 대기 중입니다.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "인증에 성공했습니다.", "settings-saved": "설정이 저장되었습니다!" } \ No newline at end of file diff --git a/public/language/lt/notifications.json b/public/language/lt/notifications.json index 3177907282..3ab7f45e3c 100644 --- a/public/language/lt/notifications.json +++ b/public/language/lt/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "El. paštas patvirtintas", "email-confirmed-message": "Dėkojame už el. pašto patvirtinimą. Jūsų paskyra pilnai aktyvuota.", "email-confirm-error-message": "Įvyko klaida mėginant patvirtinti Jūsų el. pašto adresą. Galbūt kodas yra neteisingas, arba nebegalioajantis.", diff --git a/public/language/lt/success.json b/public/language/lt/success.json index 91c9e63dba..818476c6a5 100644 --- a/public/language/lt/success.json +++ b/public/language/lt/success.json @@ -1,7 +1,7 @@ { "success": "Pavyko", "topic-post": "Sėkmingai parašėte pranešimą", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autentifikacija sėkminga", "settings-saved": "Nustatymai išsaugoti!" } \ No newline at end of file diff --git a/public/language/lv/notifications.json b/public/language/lv/notifications.json index 40601196ef..9f7d4b78af 100644 --- a/public/language/lv/notifications.json +++ b/public/language/lv/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-pasta adrese ir apstiprināta", "email-confirmed-message": "Paldies, ka apstiprināji e-pasta adresi. Tavs konts tagad ir pilnībā aktivizēts.", "email-confirm-error-message": "Tavā e-pasta adreses apstiprināšanā radās problēma. Iespējams, kods ir nederīgs vai ir beidzies derīguma termiņš.", diff --git a/public/language/lv/success.json b/public/language/lv/success.json index 9c9cd08e74..e44895da00 100644 --- a/public/language/lv/success.json +++ b/public/language/lv/success.json @@ -1,7 +1,7 @@ { "success": "Veiksme", "topic-post": "Veiksmīgi publicēts.", - "post-queued": "Tavs raksts gaida apstiprināšanu.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Veiksmīgi autentificējies", "settings-saved": "Iestatījumi saglabāti!" } \ No newline at end of file diff --git a/public/language/ms/notifications.json b/public/language/ms/notifications.json index 89031d7e50..996299be13 100644 --- a/public/language/ms/notifications.json +++ b/public/language/ms/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Emel Disahkan", "email-confirmed-message": "Terima kasih kerana mengesahkan emel anda. Akaun anda telah diaktifkan sepenuhnya.", "email-confirm-error-message": "Berlaku masalah semasa mengesahkan emel anda. Mungkin kod tidak sah atau tamat tempoh.", diff --git a/public/language/ms/success.json b/public/language/ms/success.json index bde8980ba9..e58458ce99 100644 --- a/public/language/ms/success.json +++ b/public/language/ms/success.json @@ -1,7 +1,7 @@ { "success": "Berjaya", "topic-post": "Kiriman anda berjaya dihantar.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Pengesahan Berjaya", "settings-saved": "Tetapan disimpan!" } \ No newline at end of file diff --git a/public/language/nb/admin/admin.json b/public/language/nb/admin/admin.json index 1c96a5c8cc..3c2646fa79 100644 --- a/public/language/nb/admin/admin.json +++ b/public/language/nb/admin/admin.json @@ -1,7 +1,7 @@ { - "alert.confirm-rebuild-and-restart": "Are you sure you wish to rebuild and restart NodeBB?", + "alert.confirm-rebuild-and-restart": "Er du sikker på at du vil gjenoppbygge og restarte NodeBB?", "alert.confirm-restart": "Er du sikker på at du ønsker å restarte NoddeBB?", - "acp-title": "%1 | NodeBB Admin Control Panel", - "settings-header-contents": "Contents" + "acp-title": "%1 | NodeBB Admin Kontrollpanel", + "settings-header-contents": "Innhold" } \ No newline at end of file diff --git a/public/language/nb/admin/dashboard.json b/public/language/nb/admin/dashboard.json index 0de31d4917..2f744a1182 100644 --- a/public/language/nb/admin/dashboard.json +++ b/public/language/nb/admin/dashboard.json @@ -63,11 +63,11 @@ "user-presence": "User Presence", "on-categories": "On categories list", "reading-posts": "Reading posts", - "browsing-topics": "Browsing topics", + "browsing-topics": "Blar i tråder", "recent": "Recent", "unread": "Unread", - "high-presence-topics": "High Presence Topics", + "high-presence-topics": "Høyt synlige tråder", "graphs.page-views": "Page Views", "graphs.page-views-registered": "Page Views Registered", diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index db353a8ce2..569c3a5e6f 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -65,14 +65,14 @@ "analytics.title": "Analytics for \"%1\" category", "analytics.pageviews-hourly": "Figure 1 – Hourly page views for this category", "analytics.pageviews-daily": "Figure 2 – Daily page views for this category", - "analytics.topics-daily": "Figure 3 – Daily topics created in this category", + "analytics.topics-daily": "Figur 3 – Daglige tråder publisert i denne kategorien", "analytics.posts-daily": "Figure 4 – Daily posts made in this category", "alert.created": "Created", "alert.create-success": "Category successfully created!", "alert.none-active": "You have no active categories.", "alert.create": "Create a Category", - "alert.confirm-purge": "

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

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

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

", + "alert.confirm-purge": "

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

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

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

", "alert.purge-success": "Category purged!", "alert.copy-success": "Settings Copied!", "alert.set-parent-category": "Set Parent Category", diff --git a/public/language/nb/admin/manage/tags.json b/public/language/nb/admin/manage/tags.json index 3976ea97d7..21b333056d 100644 --- a/public/language/nb/admin/manage/tags.json +++ b/public/language/nb/admin/manage/tags.json @@ -1,5 +1,5 @@ { - "none": "Your forum does not have any topics with tags yet.", + "none": "Forumet ditt har ingen tråder med emneord.", "bg-color": "Background Colour", "text-color": "Text Colour", "create-modify": "Create & Modify Tags", diff --git a/public/language/nb/admin/manage/users.json b/public/language/nb/admin/manage/users.json index 76488baeb7..7798e70d73 100644 --- a/public/language/nb/admin/manage/users.json +++ b/public/language/nb/admin/manage/users.json @@ -88,7 +88,7 @@ "alerts.validate-email-success": "Emails validated", "alerts.validate-force-password-reset-success": "User(s) passwords have been reset and their existing sessions have been revoked.", "alerts.password-reset-confirm": "Do you want to send password reset email(s) to these user(s)?", - "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.confirm-delete": "Advarsel!

Vil du virkelig slette bruker(e)?

Denne handlingen kan ikke angres! Kun brukerkontoen vil bli slettet, deres innlegg og tråder påvirkes ikke.

", "alerts.delete-success": "User(s) Deleted!", "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!", diff --git a/public/language/nb/admin/settings/pagination.json b/public/language/nb/admin/settings/pagination.json index 3bf306b2f9..2fb3343b1d 100644 --- a/public/language/nb/admin/settings/pagination.json +++ b/public/language/nb/admin/settings/pagination.json @@ -1,12 +1,12 @@ { "pagination": "Pagination Settings", - "enable": "Paginate topics and posts instead of using infinite scroll.", + "enable": "Paginer tråder og innlegg istedet for å bruke uendelig scrolling.", "posts": "Post Pagination", - "topics": "Topic Pagination", + "topics": "Trådpaginering", "posts-per-page": "Posts per Page", "max-posts-per-page": "Maximum posts per page", "categories": "Category Pagination", - "topics-per-page": "Topics per Page", + "topics-per-page": "Tråder per side", "max-topics-per-page": "Maximum topics per page", "categories-per-page": "Categories per page" } \ No newline at end of file diff --git a/public/language/nb/admin/settings/post.json b/public/language/nb/admin/settings/post.json index 27493aafbd..f2b9a5e674 100644 --- a/public/language/nb/admin/settings/post.json +++ b/public/language/nb/admin/settings/post.json @@ -5,7 +5,7 @@ "sorting.newest-to-oldest": "Newest to Oldest", "sorting.most-votes": "Most Votes", "sorting.most-posts": "Most Posts", - "sorting.topic-default": "Default Topic Sorting", + "sorting.topic-default": "Standard trådsortering", "length": "Post Length", "post-queue": "Post Queue", "restrictions": "Posting Restrictions", @@ -22,7 +22,7 @@ "restrictions.seconds-before-new": "Seconds before a new user can make their first post", "restrictions.seconds-edit-after": "Number of seconds a post remains editable (set to 0 to disable)", "restrictions.seconds-delete-after": "Number of seconds a post remains deletable (set to 0 to disable)", - "restrictions.replies-no-delete": "Number of replies after users are disallowed to delete their own topics (set to 0 to disable)", + "restrictions.replies-no-delete": "Antall svar i tråd før bruker ikke lenger får lov til å slette egen tråd (sett til 0 for å deaktivere)", "restrictions.min-title-length": "Minimum Title Length", "restrictions.max-title-length": "Maximum Title Length", "restrictions.min-post-length": "Minimum Post Length", @@ -42,7 +42,7 @@ "teaser.first": "First", "unread": "Unread Settings", "unread.cutoff": "Unread cutoff days", - "unread.min-track-last": "Minimum posts in topic before tracking last read", + "unread.min-track-last": "Minimum antall innlegg i tråd før registrering av sist lest", "recent": "Recent Settings", "recent.max-topics": "Maximum topics on /recent", "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", @@ -52,7 +52,7 @@ "signature.no-images": "Disable images in signatures", "signature.max-length": "Maximum Signature Length", "composer": "Composer Settings", - "composer-help": "The following settings govern the functionality and/or appearance of the post composer shown\n\t\t\t\tto users when they create new topics, or reply to existing topics.", + "composer-help": "Følgende innstillinger styrer funksjonaliteten og/ eller utseendet til skriveverktøyet vist\n\t\t\t\ttil brukere når de lager nye tråder, eller svarer på eksisterende tråder.", "composer.show-help": "Show \"Help\" tab", "composer.enable-plugin-help": "Allow plugins to add content to the help tab", "composer.custom-help": "Custom Help Text", diff --git a/public/language/nb/admin/settings/tags.json b/public/language/nb/admin/settings/tags.json index 080010f6f0..57c22ae822 100644 --- a/public/language/nb/admin/settings/tags.json +++ b/public/language/nb/admin/settings/tags.json @@ -3,10 +3,10 @@ "link-to-manage": "Manage Tags", "system-tags": "System Tags", "system-tags-help": "Only privileged users will be able to use these tags.", - "min-per-topic": "Minimum Tags per Topic", - "max-per-topic": "Maximum Tags per Topic", + "min-per-topic": "Minimalt antall emneord per tråd", + "max-per-topic": "Maksimalt antall emneord per tråd", "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", - "related-topics": "Related Topics", - "max-related-topics": "Maximum related topics to display (if supported by theme)" + "related-topics": "Relaterte tråder", + "max-related-topics": "Maks antall relaterte tråder å vise (hvis støttet av tema)" } \ No newline at end of file diff --git a/public/language/nb/admin/settings/user.json b/public/language/nb/admin/settings/user.json index 48be13b75e..b19fbeb8ba 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -65,7 +65,7 @@ "show-fullname": "Show fullname", "restrict-chat": "Only allow chat messages from users I follow", "outgoing-new-tab": "Open outgoing links in new tab", - "topic-search": "Enable In-Topic Searching", + "topic-search": "Aktiver i-tråd-søk", "update-url-with-post-index": "Update url with post index while browsing topics", "digest-freq": "Subscribe to Digest", "digest-freq.off": "Off", @@ -73,9 +73,9 @@ "digest-freq.weekly": "Weekly", "digest-freq.monthly": "Monthly", "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", - "email-post-notif": "Send an email when replies are made to topics I am subscribed to", - "follow-created-topics": "Follow topics you create", - "follow-replied-topics": "Follow topics that you reply to", + "email-post-notif": "Send en e-post når det kommer svar på tråder jeg abbonnerer på", + "follow-created-topics": "Følg tråder du lager", + "follow-replied-topics": "Følg tråder du svarer på", "default-notification-settings": "Default notification settings", "categoryWatchState": "Default category watch state", "categoryWatchState.watching": "Watching", diff --git a/public/language/nb/category.json b/public/language/nb/category.json index 61b9df06b0..9e687671d1 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -2,7 +2,7 @@ "category": "Kategori", "subcategories": "Underkategorier", "new_topic_button": "Nytt emne", - "guest-login-post": "Logg inn til innlegg", + "guest-login-post": "Logg inn for å publisere innlegg", "no_topics": "Det er ingen emner i denne kategorien
Hvorfor ikke opprette et?", "browsing": "leser", "no_replies": "Ingen har svart", @@ -12,9 +12,9 @@ "watching": "Watching", "not-watching": "Not Watching", "ignoring": "Ignoring", - "watching.description": "Show topics in unread and recent", + "watching.description": "Vis tråder blandt uleste og nylige", "not-watching.description": "Do not show topics in unread, show in recent", - "ignoring.description": "Do not show topics in unread and recent", + "ignoring.description": "Ikke vis tråder blandt uleste og nylige", "watching.message": "You are now watching updates from this category and all subcategories", "notwatching.message": "You are not watching updates from this category and all subcategories", "ignoring.message": "You are now ignoring updates from this category and all subcategories", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index b8c8be4cbc..88f135a184 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -1,53 +1,53 @@ { "invalid-data": "Ugyldige data", - "invalid-json": "Invalid JSON", + "invalid-json": "Ugyldig JSON", "not-logged-in": "Du ser ikke ut til å være logget inn.", "account-locked": "Kontoen din har blitt midlertidig låst", "search-requires-login": "Søking krever en konto - vennligst logg inn eller registrer deg.", - "goback": "Press back to return to the previous page", + "goback": "Trykk på tilbakeknappen for å gå tilbake til forrige side", "invalid-cid": "Ugyldig kategori-ID", "invalid-tid": "Ugyldig emne-ID", "invalid-pid": "Ugyldig innlegg-ID", "invalid-uid": "Ugyldig bruker-ID", - "invalid-date": "A valid date must be provided", + "invalid-date": "En gyldig dato må oppgis", "invalid-username": "Ugyldig brukernavn", "invalid-email": "Ugyldig e-post", - "invalid-fullname": "Invalid Fullname", - "invalid-location": "Invalid Location", - "invalid-birthday": "Invalid Birthday", - "invalid-title": "Invalid title", + "invalid-fullname": "Ugyldig fullt navn", + "invalid-location": "Ugyldig plassering", + "invalid-birthday": "Ugyldig bursdag", + "invalid-title": "Ugyldig tittel", "invalid-user-data": "Ugyldig brukerdata", "invalid-password": "Ugyldig passord", - "invalid-login-credentials": "Invalid login credentials", + "invalid-login-credentials": "Ugyldige innloggingsdata", "invalid-username-or-password": "Vennligst spesifiser både et brukernavn og passord", "invalid-search-term": "Ugyldig søkeord", - "invalid-url": "Invalid URL", - "invalid-event": "Invalid event: %1", - "local-login-disabled": "Local login system has been disabled for non-privileged accounts.", - "csrf-invalid": "We were unable to log you in, likely due to an expired session. Please try again", - "invalid-pagination-value": "Invalid pagination value, must be at least %1 and at most %2", + "invalid-url": "Ugyldig lenkeadresse", + "invalid-event": "Ugyldig hendelse: %1", + "local-login-disabled": "Lokalt innloggingssystem har blitt deaktivert for ikke-privelegerte brukere", + "csrf-invalid": "Vi kunne ikke logge deg inn, sannsynligvis på grunn av en utgått sesjon. Vennligst prøv igjen", + "invalid-pagination-value": "Ugyldig sidetall, må være minst %1 og maks %2", "username-taken": "Brukernavn opptatt", "email-taken": "E-post opptatt", - "email-invited": "Email was already invited", - "email-not-confirmed": "You are unable to post until your email is confirmed, please click here to confirm your email.", + "email-invited": "E-post har allerede fått invitasjon", + "email-not-confirmed": "Du kan ikke skrive innlegg før e-posten din er bekreftet, vennligst klikk her for å bekrefte din e-post.", "email-not-confirmed-chat": "Du kan ikke chatte før e-posten din er bekreftet, vennligst klikk her for å bekrefte e-postadressen.", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", + "email-not-confirmed-email-sent": "Din e-post har enda ikke blitt bekreftet, vennligst sjekk innboksen din for bekreftelsesmailen. Du har ikke tilgang til å skrive innlegg eller chatte før e-posten din er bekreftet.", "no-email-to-confirm": "Dette forumet krever e-postbekreftelse, vennligst klikk her for å skrive inn en e-post", "email-confirm-failed": "Vi kunne ikke bekrefte e-posten din, vennligst prøv igjen senere.", "confirm-email-already-sent": "E-post for bekreftelse er allerede sendt, vennligst vent %1 minutt(er) for å sende en til.", - "sendmail-not-found": "The sendmail executable could not be found, please ensure it is installed and executable by the user running NodeBB.", - "digest-not-enabled": "This user does not have digests enabled, or the system default is not configured to send digests", + "sendmail-not-found": "Funksjonaliteten \"sendmail\" ble ikke funnet, vennligst sjekk at den er installert og kjørbar av brukeren som kjører NodeBB.", + "digest-not-enabled": "Denne brukeren har ikke oppsummeringer aktivert, eller systemstandarden er ikke konfigurert til å sende ut oppsummeringer", "username-too-short": "Brukernavnet er for kort", "username-too-long": "Brukernavnet er for langt", - "password-too-long": "Password too long", - "reset-rate-limited": "Too many password reset requests (rate limited)", - "reset-same-password": "Please use a password that is different from your current one", + "password-too-long": "Passordet er for langt", + "reset-rate-limited": "For mange passord-tilbakestillinger er forespurt (begrenset antall forespørsler)", + "reset-same-password": "Vennligst bruk et passord som er annerledes fra ditt nåværende", "user-banned": "Bruker utestengt", - "user-banned-reason": "Sorry, this account has been banned (Reason: %1)", - "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", + "user-banned-reason": "Beklager, denne kontoen har blitt utestengt (Grunn: %1)", + "user-banned-reason-until": "Beklager, denne kontoen har blit utestengt til %1 (Grunn: %2)", "user-too-new": "Beklager, du må vente %1 sekund(er) før du oppretter ditt første innlegg", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", - "ban-expiry-missing": "Please provide an end date for this ban", + "blacklisted-ip": "Beklager, din IP-adresse har blitt utestengt fra dette forumet. Hvis du føler dette er en feil, vennligst kontakt en sideadministrator.", + "ban-expiry-missing": "Vennligst oppgi et sluttidspunkt for denne utestengingen.", "no-category": "Kategorien eksisterer ikke", "no-topic": "Emne eksisterer ikke", "no-post": "Innlegg eksisterer ikke", @@ -58,67 +58,67 @@ "category-disabled": "Kategori deaktivert", "topic-locked": "Emne låst", "post-edit-duration-expired": "Du har bare lov til å redigere innlegg i %1 sekund(er) etter at det er sendt", - "post-edit-duration-expired-minutes": "You are only allowed to edit posts for %1 minute(s) after posting", - "post-edit-duration-expired-minutes-seconds": "You are only allowed to edit posts for %1 minute(s) %2 second(s) after posting", - "post-edit-duration-expired-hours": "You are only allowed to edit posts for %1 hour(s) after posting", - "post-edit-duration-expired-hours-minutes": "You are only allowed to edit posts for %1 hour(s) %2 minute(s) after posting", - "post-edit-duration-expired-days": "You are only allowed to edit posts for %1 day(s) after posting", - "post-edit-duration-expired-days-hours": "You are only allowed to edit posts for %1 day(s) %2 hour(s) after posting", - "post-delete-duration-expired": "You are only allowed to delete posts for %1 second(s) after posting", - "post-delete-duration-expired-minutes": "You are only allowed to delete posts for %1 minute(s) after posting", - "post-delete-duration-expired-minutes-seconds": "You are only allowed to delete posts for %1 minute(s) %2 second(s) after posting", - "post-delete-duration-expired-hours": "You are only allowed to delete posts for %1 hour(s) after posting", - "post-delete-duration-expired-hours-minutes": "You are only allowed to delete posts for %1 hour(s) %2 minute(s) after posting", - "post-delete-duration-expired-days": "You are only allowed to delete posts for %1 day(s) after posting", - "post-delete-duration-expired-days-hours": "You are only allowed to delete posts for %1 day(s) %2 hour(s) after posting", - "cant-delete-topic-has-reply": "You can't delete your topic after it has a reply", - "cant-delete-topic-has-replies": "You can't delete your topic after it has %1 replies", + "post-edit-duration-expired-minutes": "Du har bare lov til å redigere innlegg i %1 sekund(er) etter at det er sendt", + "post-edit-duration-expired-minutes-seconds": "Du har bare lov til å redigere innlegg i %1 minutt(er), %2 sekund(er) etter at det er sendt", + "post-edit-duration-expired-hours": "Du har bare lov til å redigere innlegg i %1 time(r) etter at det er sendt", + "post-edit-duration-expired-hours-minutes": "Du har bare lov til å redigere innlegg i %1 time(r), %2 minutt(er) etter at det er sendt", + "post-edit-duration-expired-days": "Du har bare lov til å redigere innlegg i %1 dag(er) etter at det er sendt", + "post-edit-duration-expired-days-hours": "Du har bare lov til å redigere innlegg i %1 dag(er), %2 time(r) etter at det er sendt", + "post-delete-duration-expired": "Du har bare lov til å slette innlegg i %1 sekund(er) etter at det er sendt", + "post-delete-duration-expired-minutes": "Du har bare lov til å slette innlegg i %1 sekund(er) etter at det er sendt", + "post-delete-duration-expired-minutes-seconds": "Du har bare lov til å slette innlegg i %1 minutt(er), %2 sekund(er) etter at det er sendt", + "post-delete-duration-expired-hours": "Du har bare lov til å slette innlegg i %1 time(r) etter at det er sendt", + "post-delete-duration-expired-hours-minutes": "Du har bare lov til å slette innlegg i %1 time(r), %2 minutt(er) etter at det er sendt", + "post-delete-duration-expired-days": "Du har bare lov til å slette innlegg i %1 dag(er) etter at det er sendt", + "post-delete-duration-expired-days-hours": "Du har bare lov til å slette innlegg i %1 dag(er), %2 time(r) etter at det er sendt", + "cant-delete-topic-has-reply": "Du kan ikke slette tråden din etter den har fått et innlegg", + "cant-delete-topic-has-replies": "Du kan ikke slette tråden din etter den har %1 innlegg", "content-too-short": "Vennligst skriv et lengre innlegg. Innlegg må inneholde minst %1 tegn.", "content-too-long": "Vennligst skriv et kortere innlegg. Innlegg kan ikke være lengre enn %1 tegn.", "title-too-short": "Vennligst skriv en lengre tittel. Titler må inneholde minst %1 tegn.", "title-too-long": "Vennligst skriv en kortere tittel. Tittel kan ikke være lengre enn %1 tegn.", - "category-not-selected": "Category not selected.", + "category-not-selected": "Kategori ikke valgt", "too-many-posts": "Du kan bare poste en gang per %1 sekund(er) – vennligst vent før du poster igjen", "too-many-posts-newbie": "Som ny bruker kan du bare poste en gang per %1. sekund(er), før du har opparbeidet %2 i rykte – vennligst vent før du poster igjen", "tag-too-short": "Vennligst skriv et lengre emneord. Disse må være på minst %1 tegn", "tag-too-long": "Vennligst skriv et kortere emneord. Disse kan ikke være lengre enn %1 tegn", "not-enough-tags": "Ikke nok emneord. Emner må ha minst %1.", "too-many-tags": "For mange emneord. Emner kan ikke ha flere enn %1.", - "cant-use-system-tag": "You can not use this system tag.", + "cant-use-system-tag": "Du kan ikke bruke dette emneordet", "still-uploading": "Vennligst vent til opplastingene er fullført.", "file-too-big": "Største tillatte filstørrelse er %1 kB – vennligst last opp en mindre fil", - "guest-upload-disabled": "Guest uploading has been disabled", - "cors-error": "Unable to upload image due to misconfigured CORS", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", - "scheduling-to-past": "Please select a date in the future.", - "invalid-schedule-date": "Please enter a valid date and time.", - "cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.", - "cant-merge-scheduled": "Scheduled topics cannot be merged.", - "cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.", - "cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.", - "already-bookmarked": "You have already bookmarked this post", - "already-unbookmarked": "You have already unbookmarked this post", + "guest-upload-disabled": "Gjester har ikke tilgang til å laste opp filer", + "cors-error": "Kunne ikke laste opp bilde på grunn av feilinstillt CORS", + "upload-ratelimit-reached": "Du har lastet opp for mange filer samtidig. Vennligst prøv igjen senere.", + "scheduling-to-past": "Vennligst velg en dato i fremtiden.", + "invalid-schedule-date": "Vennligst skriv inn en gyldig dato og tidspunkt.", + "cant-pin-scheduled": "Planlagte tråder kan ikke bli (u)festet.", + "cant-merge-scheduled": "Planlagte tråder kan ikke slås sammen.", + "cant-move-posts-to-scheduled": "Kan ikke flytte innlegg til en planlagt tråd.", + "cant-move-from-scheduled-to-existing": "Kan ikke flytte innlegg fra en planlagt tråd til en eksisterende tråd.", + "already-bookmarked": "Du har allerede bokmerket dette innlegget", + "already-unbookmarked": "Du har allerede fjernet bokmerket fra dette innlegget", "cant-ban-other-admins": "Du kan ikke utestenge andre administratorer!", "cant-remove-last-admin": "Du er den eneste administratoren. Legg til en annen bruker som administrator før du fjerner deg selv.", - "account-deletion-disabled": "Account deletion is disabled", - "cant-delete-admin": "Remove administrator privileges from this account before attempting to delete it.", - "already-deleting": "Already deleting", - "invalid-image": "Invalid image", + "account-deletion-disabled": "Kontosletting er deaktivert", + "cant-delete-admin": "Fjern administratorrettigheter fra denne kontoen før du prøver å slette den.", + "already-deleting": "Sletting pågår allerede", + "invalid-image": "Ugyldig bilde", "invalid-image-type": "Ugyldig bildetype. Tilatte typer er: %1", "invalid-image-extension": "Ugyldig bildefiltype", "invalid-file-type": "Ugyldig filtype. Tillatte typer er: %1", - "invalid-image-dimensions": "Image dimensions are too big", + "invalid-image-dimensions": "Bildedimensjoner er for store", "group-name-too-short": "Gruppenavnet er for kort", - "group-name-too-long": "Group name too long", + "group-name-too-long": "Gruppenavnet er for kort", "group-already-exists": "Gruppe eksisterer allerede", "group-name-change-not-allowed": "Endring av gruppenavn er ikke tillatt", - "group-already-member": "Already part of this group", - "group-not-member": "Not a member of this group", + "group-already-member": "Allerede del av denne gruppen", + "group-not-member": "Ikke medlem av denne gruppen", "group-needs-owner": "Denne gruppen krever minst en eier", "group-already-invited": "Denne brukeren har allerede blitt invitert", "group-already-requested": "Forespørsel om medlemskap er allerede innsendt", - "group-join-disabled": "You are not able to join this group at this time", - "group-leave-disabled": "You are not able to leave this group at this time", + "group-join-disabled": "Du kan ikke bli med i denne gruppen på dette tidspunktet", + "group-leave-disabled": "Du kan ikke forlate denne gruppen på dette tidspunktet", "post-already-deleted": "Dette innlegget har blitt slettet", "post-already-restored": "Dette innlegget har allerede blitt gjenopprettet", "topic-already-deleted": "Dette emnet har allerede blitt slettet", @@ -131,63 +131,63 @@ "about-me-too-long": "Beklager, om meg kan ikke være lengre enn %1 tegn.", "cant-chat-with-yourself": "Du kan ikke chatte med deg selv!", "chat-restricted": "Denne brukeren har begrenset sine samtalemeldinger. De må følge deg før du kan chatte med dem", - "chat-disabled": "Chat system disabled", + "chat-disabled": "Chattesystem er deaktivert", "too-many-messages": "Du har sendt for mange meldinger, vennligst vent en stund.", "invalid-chat-message": "Ugyldig samtalemelding", - "chat-message-too-long": "Chat messages can not be longer than %1 characters.", - "cant-edit-chat-message": "You are not allowed to edit this message", - "cant-remove-last-user": "You can't remove the last user", - "cant-delete-chat-message": "You are not allowed to delete this message", - "chat-edit-duration-expired": "You are only allowed to edit chat messages for %1 second(s) after posting", - "chat-delete-duration-expired": "You are only allowed to delete chat messages for %1 second(s) after posting", - "chat-deleted-already": "This chat message has already been deleted.", - "chat-restored-already": "This chat message has already been restored.", - "chat-room-does-not-exist": "Chat room does not exist.", - "already-voting-for-this-post": "You have already voted for this post.", + "chat-message-too-long": "Chattebeskjeder kan ikke være lengre enn %1 tegn.", + "cant-edit-chat-message": "Du har ikke tilgang til å redigere denne meldingen", + "cant-remove-last-user": "Du kan ikke fjerne den siste brukeren", + "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-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.", + "already-voting-for-this-post": "Du har allerede stemt på dette innlegget", "reputation-system-disabled": "Ryktesystemet er deaktivert.", "downvoting-disabled": "Nedstemming er deaktivert", "not-enough-reputation-to-downvote": "Du har ikke nok rykte til å nedstemme det innlegget", "not-enough-reputation-to-flag": "Du har ikke nok rykte til å flagge dette innlegget", - "not-enough-reputation-min-rep-website": "You do not have enough reputation to add a website", - "not-enough-reputation-min-rep-aboutme": "You do not have enough reputation to add an about me", - "not-enough-reputation-min-rep-signature": "You do not have enough reputation to add a signature", - "not-enough-reputation-min-rep-profile-picture": "You do not have enough reputation to add a profile picture", - "not-enough-reputation-min-rep-cover-picture": "You do not have enough reputation to add a cover picture", - "post-already-flagged": "You have already flagged this post", - "user-already-flagged": "You have already flagged this user", - "post-flagged-too-many-times": "This post has been flagged by others already", - "user-flagged-too-many-times": "This user has been flagged by others already", - "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", - "self-vote": "You cannot vote on your own post", - "too-many-downvotes-today": "You can only downvote %1 times a day", - "too-many-downvotes-today-user": "You can only downvote a user %1 times a day", + "not-enough-reputation-min-rep-website": "Du har ikke nok rykte til å legge til et nettsted", + "not-enough-reputation-min-rep-aboutme": "Du har ikke nok rykte for å legge til en biografi", + "not-enough-reputation-min-rep-signature": "Du har ikke nok rykte til å legge til en signatur", + "not-enough-reputation-min-rep-profile-picture": "Du har ikke nok rykte til å legge til et profilbilde", + "not-enough-reputation-min-rep-cover-picture": "Du har ikke nok rykte til å legge til et bakgrunnsbilde", + "post-already-flagged": "Du har allerede flagget dette innlegget", + "user-already-flagged": "Du har allerede flagget denne brukeren", + "post-flagged-too-many-times": "Dette innlegget har allerede blitt flagget av andre", + "user-flagged-too-many-times": "Denne brukeren har allerede blitt flagget av andre", + "cant-flag-privileged": "Du har ikke lov til å flagge profiler eller innhold fra priveligerte burkere (moderatorer/ globale moderatorer/ administratorer)", + "self-vote": "Du kan ikke stemme på ditt eget innlegg", + "too-many-downvotes-today": "Du kan bare nedstemme %1 gang(er) dagen", + "too-many-downvotes-today-user": "Du kan bare nedstemme en bruker %1 gang(er) dagen", "reload-failed": "NodeBB støtte på et problem under lasting på nytt: \"%1\". NodeBB vil fortsette å servere eksisterende klientside ressurser, selv om du burde angre endringene du gjorde før du lastet på nytt.", "registration-error": "Feil under registrering", "parse-error": "Noe gikk feil under analysering av serversvar", "wrong-login-type-email": "Vennligst benytt e-posten din for å logge inn", "wrong-login-type-username": "Vennligst benytt brukernavnet ditt for å logge inn", - "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", - "sso-multiple-association": "You cannot associate multiple accounts from this service to your NodeBB account. Please dissociate your existing account and try again.", - "invite-maximum-met": "You have invited the maximum amount of people (%1 out of %2).", - "no-session-found": "No login session found!", - "not-in-room": "User not in room", - "cant-kick-self": "You can't kick yourself from the group", - "no-users-selected": "No user(s) selected", - "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", - "no-topics-selected": "No topics selected!", - "cant-move-to-same-topic": "Can't move post to same topic!", - "cant-move-topic-to-same-category": "Can't move topic to the same category!", - "cannot-block-self": "You cannot block yourself!", - "cannot-block-privileged": "You cannot block administrators or global moderators", - "cannot-block-guest": "Guest are not able to block other users", - "already-blocked": "This user is already blocked", - "already-unblocked": "This user is already unblocked", - "no-connection": "There seems to be a problem with your internet connection", - "socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later", - "plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP", - "topic-event-unrecognized": "Topic event '%1' unrecognized", - "cant-set-child-as-parent": "Can't set child as parent category", - "cant-set-self-as-parent": "Can't set self as parent category" + "sso-registration-disabled": "Registrering har blitt deaktivert for %1 konto(er), vennligst registrer deg med en e-post adresse først", + "sso-multiple-association": "Du kan ikke knytte flere kontoer til din NodeBB konto. Vennligst koble fra din eksisterende konto og prøv igjen.", + "invite-maximum-met": "Du har invitert maks antall personer (%1 av %2).", + "no-session-found": "Ingen innlogget sesjon funnet!", + "not-in-room": "Bruker ikke i rom", + "cant-kick-self": "Du kan ikke utestenge deg selv fra gruppen", + "no-users-selected": "Ingen bruker(e) valgt", + "invalid-home-page-route": "Ugyldig hjemmesidelenke", + "invalid-session": "Sesjon samsvarer ikke", + "invalid-session-text": "Det ser ut som din sesjon ikke lenger er aktiv, eller ikke lenger samsvarer med serveren. Vennligst oppdater denne siden.", + "no-topics-selected": "Ingen tråder valgt!", + "cant-move-to-same-topic": "Du kan ikke flytte innlegg til samme tråd!", + "cant-move-topic-to-same-category": "Du kan ikke flytte tråd til samme kategori!", + "cannot-block-self": "Du kan ikke blokkere deg selv!", + "cannot-block-privileged": "Du kan ikke blokkere administratorer eller globale moderatorer", + "cannot-block-guest": "Gjester kan ikke blokkere andre brukere", + "already-blocked": "Denne brukeren har allerede blitt blokkert", + "already-unblocked": "Denne brukeren har allerede blitt ublokkert", + "no-connection": "Det virker å være et problem med internett-tilgangen din", + "socket-reconnect-failed": "Får ikke tilgang til serveren for øyeblikket. Klikk her for å prøve igjen, eller prøv igjen senere", + "plugin-not-whitelisted": "Ute av stand til å installere tillegget – bare tillegg som er hvitelistet av NodeBB sin pakkebehandler kan bli installert via administratorkontrollpanelet", + "topic-event-unrecognized": "Trådhendelse '%1' er ukjent", + "cant-set-child-as-parent": "Kan ikke sette underkategori til hovedkategori", + "cant-set-self-as-parent": "Kan ikke sette denne som hovedkategori" } \ No newline at end of file diff --git a/public/language/nb/global.json b/public/language/nb/global.json index 1601d7765c..bf90375c2f 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -7,7 +7,7 @@ "403.login": "Kanskje du skal prøve å logge inn?", "404.title": "Ikke funnet", "404.message": "Du har funnet en side som ikke eksisterer. Returner til startsiden?", - "500.title": "Internal Error.", + "500.title": "Intern feil.", "500.message": "Oops! Ser ut som noe gikk galt!", "400.title": "Bad Request.", "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", @@ -46,7 +46,7 @@ "alert.success": "Suksess", "alert.error": "Feil", "alert.banned": "Utestengt", - "alert.banned.message": "You have just been banned, your access is now restricted.", + "alert.banned.message": "Du har nettop blitt utestengt, din tilgang er nå begrenset.", "alert.unbanned": "Unbanned", "alert.unbanned.message": "Your ban has been lifted.", "alert.unfollow": "Du følger ikke lenger %1!", @@ -81,7 +81,7 @@ "guest_posted_ago": "Gjest skrev den %1", "last_edited_by": "last edited by %1", "norecentposts": "Ingen nylige innlegg", - "norecenttopics": "Ingen nye emner", + "norecenttopics": "Ingen nye tråder", "recentposts": "Seneste innlegg", "recentips": "Seneste innloggede IPer", "moderator_tools": "Moderator Tools", diff --git a/public/language/nb/login.json b/public/language/nb/login.json index 0622fd53e9..ef7d3a0926 100644 --- a/public/language/nb/login.json +++ b/public/language/nb/login.json @@ -5,7 +5,7 @@ "remember_me": "Husk meg?", "forgot_password": "Glemt passord?", "alternative_logins": "Alternativ innlogging", - "failed_login_attempt": "Login Unsuccessful", + "failed_login_attempt": "Innlogging misslyktes", "login_successful": "Du har blitt logget inn!", "dont_have_account": "Har du ikke en konto?", "logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity", diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index c6de7300ac..d0d341f252 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -1,5 +1,5 @@ { - "chat.chatting_with": "Chat with", + "chat.chatting_with": "Chat med", "chat.placeholder": "Skriv chat-melding her, trykk enter for å sende", "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", "chat.send": "Send", diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index bdcca81501..dc473a3bdb 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -5,10 +5,10 @@ "mark_all_read": "Merk alle varsler som lest", "back_to_home": "Tilbake til %1", "outgoing_link": "Utgående link", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "Du forlater nå %1", "continue_to": "Fortsett til %1", "return_to": "Gå tilbake til %1", - "new_notification": "You have a new notification", + "new_notification": "Du har en ny varsling", "you_have_unread_notifications": "Du har uleste varsler.", "all": "All", "topics": "Topics", @@ -34,7 +34,7 @@ "user_posted_to": "%1 har skrevet et svar til: %2", "user_posted_to_dual": "%1 and %2 have posted replies to: %3", "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", - "user_posted_topic": "%1 har skrevet et nytt emne: %2", + "user_posted_topic": "%1 har skrevet en ny tråd: %2", "user_edited_post": "%1 has edited a post in %2", "user_started_following_you": "%1 begynte å følge deg.", "user_started_following_you_dual": "%1 and %2 started following you.", @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-post bekreftet", "email-confirmed-message": "Takk for at du har validert din e-post. Kontoen din er nå fullstendig aktivert.", "email-confirm-error-message": "Det oppsto et problem under valdiering av din e-post. Koden kan ha vært ugyldig eller ha utløpt.", diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index 6030f98c83..ac0317a671 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -23,7 +23,7 @@ "users/search": "Brukersøk", "notifications": "Varsler", "tags": "Emneord", - "tag": "Topics tagged under "%1"", + "tag": "Tråder tagget under "%1"", "register": "Registrer en konto", "registration-complete": "Registration complete", "login": "Logg inn på kontoen din", diff --git a/public/language/nb/reset_password.json b/public/language/nb/reset_password.json index 776d331725..ecb1a63e89 100644 --- a/public/language/nb/reset_password.json +++ b/public/language/nb/reset_password.json @@ -10,7 +10,7 @@ "changing_password": "Changing Password", "enter_email": "Vennligst skriv inn e-post-adressen din, så sender vi en e-post med instruksjoner om hvordan du tilbakestiller kontoen din.", "enter_email_address": "Skriv e-postadresse", - "password_reset_sent": "If the specified address corresponds to an existing user account, a password reset email was sent. Please note that only one email will be sent per minute.", + "password_reset_sent": "Hvis den spesifiserte e-postadressen hører til en eksisterende konto blir en e-post med instruksjoner for gjenoppretting av passord sendt. Merk at kun en e-post vil bli sendt ut per minutt.", "invalid_email": "Ugyldig e-post / e-post eksisterer ikke", "password_too_short": "Passordet du skrev inn er for kort, vennligst velg et lengre passord.", "passwords_do_not_match": "Passordene du har skrevet inn samsvarer ikke.", diff --git a/public/language/nb/search.json b/public/language/nb/search.json index a240704ae2..d0e3e0afb6 100644 --- a/public/language/nb/search.json +++ b/public/language/nb/search.json @@ -30,11 +30,11 @@ "one-year": "Ett år", "sort-by": "Sorter etter", "last-reply-time": "Sise svartid", - "topic-title": "Emne-tittel", + "topic-title": "Tråd-tittel", "topic-votes": "Topic votes", "number-of-replies": "Antall svar", "number-of-views": "Antall visninger", - "topic-start-date": "Starttid for emne", + "topic-start-date": "Starttid for tråd", "username": "Brukernavn", "category": "Kategori", "descending": "I synkende rekkefølge", diff --git a/public/language/nb/success.json b/public/language/nb/success.json index 5345ec339d..633643722b 100644 --- a/public/language/nb/success.json +++ b/public/language/nb/success.json @@ -1,7 +1,7 @@ { "success": "Suksess", "topic-post": "Du har nå publisert.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Innlogging vellykket!", "settings-saved": "Innstillinger lagret!" } \ No newline at end of file diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 6d0ae39bcc..0dbc494a78 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -1,21 +1,21 @@ { "topic": "Emne", "title": "Title", - "no_topics_found": "Ingen emner funnet!", + "no_topics_found": "Ingen tråder funnet!", "no_posts_found": "Ingen innlegg funnet!", "post_is_deleted": "Dette innlegget er slettet!", - "topic_is_deleted": "Dette emnet er slettet!", + "topic_is_deleted": "Denne tråden er slettet!", "profile": "Profil", "posted_by": "Skapt av %1", "posted_by_guest": "Skapt av Gjest", "chat": "Chat", - "notify_me": "Bli varslet om nye svar i dette emnet", + "notify_me": "Bli varslet om nye svar i denne tråden", "quote": "Siter", "reply": "Svar", "replies_to_this_post": "%1 Replies", "one_reply_to_this_post": "1 Reply", "last_reply_time": "Last reply", - "reply-as-topic": "Reply as topic", + "reply-as-topic": "Svar som tråd", "guest-login-reply": "Logg inn for å besvare", "login-to-view": "🔒 Log in to view", "edit": "Endre", @@ -44,34 +44,34 @@ "deleted-by": "Deleted by", "restored-by": "Restored by", "queued-by": "Post queued for approval →", - "bookmark_instructions": "Click here to return to the last read post in this thread.", + "bookmark_instructions": "Klikk her for å gå tilbake til det siste innlegget i denne tråden.", "flag-post": "Flag this post", "flag-user": "Flag this user", "already-flagged": "Already Flagged", "view-flag-report": "View Flag Report", "resolve-flag": "Resolve Flag", "merged_message": "This topic has been merged into %2", - "deleted_message": "Dette emnet har blitt slettet. Bare brukere med emnehåndterings-privilegier kan se den.", + "deleted_message": "Denne tråden har blitt slettet. Bare brukere med trådhåndterings-privilegier kan se den.", "following_topic.message": "Du vil nå motta varsler når noen skriver i denne tråden.", - "not_following_topic.message": "You will see this topic in the unread topics list, but you will not receive notifications when somebody posts to this topic.", - "ignoring_topic.message": "You will no longer see this topic in the unread topics list. You will be notified when you are mentioned or your post is up voted.", + "not_following_topic.message": "Du vil se denne tråden i trådlisten, men du vil ikke motta varslinger når noen skriver i den.", + "ignoring_topic.message": "Du vil ikke lenger se denne tråden blandt de uleste trådene. Du vil få et varsel når du blir nevnt eller din tråd blir oppstemt.", "login_to_subscribe": "Vennligst registrer deg eller logg inn for å abonnere på denne tråden.", "markAsUnreadForAll.success": "Tråd markert som ulest for alle.", "mark_unread": "Mark unread", - "mark_unread.success": "Topic marked as unread.", + "mark_unread.success": "Tråd merket som ulest.", "watch": "Overvåk", "unwatch": "Ikke overvåk", - "watch.title": "Bli varslet om nye svar i dette emnet", - "unwatch.title": "Slutt å overvåke dette emnet", + "watch.title": "Bli varslet om nye svar i denne tråden", + "unwatch.title": "Slutt å følge denne tråden", "share_this_post": "Del ditt innlegg", "watching": "Watching", "not-watching": "Not Watching", "ignoring": "Ignoring", - "watching.description": "Notify me of new replies.
Show topic in unread.", - "not-watching.description": "Do not notify me of new replies.
Show topic in unread if category is not ignored.", - "ignoring.description": "Do not notify me of new replies.
Do not show topic in unread.", - "thread_tools.title": "Emneverktøy", - "thread_tools.markAsUnreadForAll": "Mark Unread For All", + "watching.description": "Varlse meg om nye svar.
Vis tråd i ulest.", + "not-watching.description": "Ikke varsle meg om nye svar.
Vis tråd i ulest hvis ikke kategori er ignorert.", + "ignoring.description": "Ikke varsle meg om nye svar.
Ikke vis tråd i ulest.", + "thread_tools.title": "Trådverktøy", + "thread_tools.markAsUnreadForAll": "Merk som ulest for alle", "thread_tools.pin": "Fest tråd", "thread_tools.unpin": "Ufest tråd", "thread_tools.lock": "Lås tråd", @@ -84,14 +84,14 @@ "thread_tools.fork": "Forgren tråd", "thread_tools.delete": "Slett tråd", "thread_tools.delete-posts": "Delete Posts", - "thread_tools.delete_confirm": "Er du sikker på at du vil slette dette emnet?", + "thread_tools.delete_confirm": "Er du sikker på at du vil slette denne tråden?", "thread_tools.restore": "Gjenopprett tråd", - "thread_tools.restore_confirm": "Er du sikker på at du vil gjenopprette dette emnet?", - "thread_tools.purge": "Rensk emne", - "thread_tools.purge_confirm": "Er du sikker på at du vil renske dette emnet?", + "thread_tools.restore_confirm": "Er du sikker på at du vil gjenopprette denne tråden?", + "thread_tools.purge": "Rensk tråd", + "thread_tools.purge_confirm": "Er du sikker på at du vil renske denne tråden?", "thread_tools.merge_topics": "Merge Topics", "thread_tools.merge": "Merge", - "topic_move_success": "This topic will be moved to \"%1\" shortly. Click here to undo.", + "topic_move_success": "Denne tråden vil straks bli flyttet til \"%1\". Klikk her for å angre.", "topic_move_multiple_success": "These topics will be moved to \"%1\" shortly. Click here to undo.", "topic_move_all_success": "All topics will be moved to \"%1\" shortly. Click here to undo.", "topic_move_undone": "Topic move undone", @@ -109,11 +109,11 @@ "bookmarks": "Bookmarks", "bookmarks.has_no_bookmarks": "You haven't bookmarked any posts yet.", "loading_more_posts": "Laster flere innlegg", - "move_topic": "Flytt emne", - "move_topics": "Flytt emner", + "move_topic": "Flytt tård", + "move_topics": "Flytt tråder", "move_post": "Flytt innlegg", "post_moved": "Innlegg flyttet!", - "fork_topic": "Forgren Emne", + "fork_topic": "Forgren tråd", "enter-new-topic-title": "Enter new topic title", "fork_topic_instruction": "Trykk på innleggene du vil forgrene", "fork_no_pids": "Ingen innlegg valgt!", @@ -121,7 +121,7 @@ "x-posts-selected": "%1 post(s) selected", "x-posts-will-be-moved-to-y": "%1 post(s) will be moved to \"%2\"", "fork_pid_count": "%1 post(s) selected", - "fork_success": "Dette emnet ble forgrenet! Klikk for å gå til forgrenet emne.", + "fork_success": "Denne tråden ble forgrenet! Klikk for å gå til forgrenet tråd.", "delete_posts_instruction": "Click the posts you want to delete/purge", "merge_topics_instruction": "Click the topics you want to merge or search for them", "merge-topic-list-title": "List of topics to be merged", @@ -155,10 +155,10 @@ "newest_to_oldest": "Nyeste til eldste", "most_votes": "Most Votes", "most_posts": "Most Posts", - "stale.title": "Create new topic instead?", - "stale.warning": "The topic you are replying to is quite old. Would you like to create a new topic instead, and reference this one in your reply?", - "stale.create": "Create a new topic", - "stale.reply_anyway": "Reply to this topic anyway", + "stale.title": "Lag en ny tråd i stedet?", + "stale.warning": "Tråden du svarer på er ganske gammel. Vil du heller lage en ny tråd og refere til denne i den?", + "stale.create": "Lag en ny tråd", + "stale.reply_anyway": "Svar på denne tråden allikevel", "link_back": "Re: [%1](%2)", "diffs.title": "Post Edit History", "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", diff --git a/public/language/nb/unread.json b/public/language/nb/unread.json index ba4cb60942..c9cbfe5c8c 100644 --- a/public/language/nb/unread.json +++ b/public/language/nb/unread.json @@ -7,9 +7,9 @@ "all": "Alle", "all_categories": "Alle kategorier", "topics_marked_as_read.success": "Emner merket som lest!", - "all-topics": "All Topics", - "new-topics": "New Topics", - "watched-topics": "Watched Topics", + "all-topics": "Alle tråder", + "new-topics": "Nye tråder", + "watched-topics": "Fulgte tråder", "unreplied-topics": "Unreplied Topics", "multiple-categories-selected": "Multiple Selected" } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index 9c6aa39e6b..c59cf1ec70 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -98,8 +98,8 @@ "has_no_follower": "Denne brukeren har ingen følgere :(", "follows_no_one": "Denne brukeren følger ingen :(", "has_no_posts": "Denne brukeren har ikke skrevet noe enda.", - "has_no_topics": "Denne brukeren har ikke skrevet noen emner enda.", - "has_no_watched_topics": "Denne brukeren har ikke overvåket noen emner enda.", + "has_no_topics": "Denne brukeren har ikke skrevet noen tråder enda.", + "has_no_watched_topics": "Denne brukeren har ikke fulgt noen tråder enda.", "has_no_ignored_topics": "This user hasn't ignored any topics yet.", "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", @@ -122,12 +122,12 @@ "upvote-notif-freq.disabled": "Disabled", "browsing": "Surfeinnstillinger", "open_links_in_new_tab": "Åpne utgående lenker i en ny fane", - "enable_topic_searching": "Aktiver søk-i-emne", - "topic_search_help": "Hvis søk-i-emne er aktivert, overstyres nettleserens standard sidesøk og gir mulighet til å søke gjennom hele emnet, ikke bare det som vises på skjermen", + "enable_topic_searching": "Aktiver søk-i-tråd", + "topic_search_help": "Hvis søk-i-tård er aktivert, overstyres nettleserens standard sidesøk og gir mulighet til å søke gjennom hele tråden, ikke bare det som vises på skjermen", "update_url_with_post_index": "Update url with post index while browsing topics", "scroll_to_my_post": "After posting a reply, show the new post", - "follow_topics_you_reply_to": "Watch topics that you reply to", - "follow_topics_you_create": "Watch topics you create", + "follow_topics_you_reply_to": "Følg tråder du vil svare på", + "follow_topics_you_create": "Følg tråder du vil lage", "grouptitle": "Group Title", "group-order-help": "Select a group and use the arrows to order titles", "no-group-title": "Ingen gruppetittel", diff --git a/public/language/nb/users.json b/public/language/nb/users.json index 92ede45840..c222134152 100644 --- a/public/language/nb/users.json +++ b/public/language/nb/users.json @@ -14,9 +14,9 @@ "groups-to-join": "Groups to be joined when invite is accepted:", "invitation-email-sent": "En invitasjons-epost ble sendt til %1", "user_list": "Brukerliste", - "recent_topics": "Seneste emner", - "popular_topics": "Populære emnter", - "unread_topics": "Uleste emner", + "recent_topics": "Seneste tråder", + "popular_topics": "Populære tråder", + "unread_topics": "Uleste tråder", "categories": "Kategorier", "tags": "Tagger", "no-users-found": "No users found!" diff --git a/public/language/nl/notifications.json b/public/language/nl/notifications.json index 28b813258a..7d12ec4c9b 100644 --- a/public/language/nl/notifications.json +++ b/public/language/nl/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 berichten geëxporteerd, klik om te downloaden", "uploads-exported": "%1 uploads geëxporteerd, klik om te downloaden", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-mailadres bevestigd", "email-confirmed-message": "Bedankt voor het bevestigen van je e-mailadres. Je account is nu volledig geactiveerd.", "email-confirm-error-message": "Er was een probleem met het bevestigen van dit e-mailadres. Misschien is de code niet goed ingevoerd of was de beschikbare tijd inmiddels verstreken.", diff --git a/public/language/nl/success.json b/public/language/nl/success.json index 54671b1c8d..b52366d982 100644 --- a/public/language/nl/success.json +++ b/public/language/nl/success.json @@ -1,7 +1,7 @@ { "success": "Geslaagd", "topic-post": "Je bericht is met succes geplaatst.", - "post-queued": "Je bericht wacht op goedkeuring.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Aanmelden geslaagd", "settings-saved": "Instellingen opgeslagen!" } \ No newline at end of file diff --git a/public/language/pl/notifications.json b/public/language/pl/notifications.json index 05aafb1182..4ad334c683 100644 --- a/public/language/pl/notifications.json +++ b/public/language/pl/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1postów wyeksportowane, kliknij tutaj by pobrać", "uploads-exported": "%1przesłanych plików wyeksportowane, kliknij tutaj by pobrać", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-mail potwierdzony", "email-confirmed-message": "Dziękujemy za potwierdzenie maila. Twoje konto zostało aktywowane.", "email-confirm-error-message": "Wystąpił problem przy aktywacji - kod jest błędny lub przestarzały", diff --git a/public/language/pl/success.json b/public/language/pl/success.json index bea7494581..ff998782b4 100644 --- a/public/language/pl/success.json +++ b/public/language/pl/success.json @@ -1,7 +1,7 @@ { "success": "Udało się", "topic-post": "Twój post został wysłany.", - "post-queued": "Post został dodany do kolejki oczekujących na zatwierdzenie.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Uwierzytelnienie powiodło się.", "settings-saved": "Ustawienia zostały zapisane." } \ No newline at end of file diff --git a/public/language/pt-BR/notifications.json b/public/language/pt-BR/notifications.json index 22508e43fd..ed96ffd3c4 100644 --- a/public/language/pt-BR/notifications.json +++ b/public/language/pt-BR/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confirmado", "email-confirmed-message": "Obrigado por validar o seu email. Agora sua conta está plenamente ativada.", "email-confirm-error-message": "Houve um problema ao validar o seu endereço de email. Talvez o código era invalido ou tenha expirado.", diff --git a/public/language/pt-BR/success.json b/public/language/pt-BR/success.json index d842a2abd2..2eb8d19a85 100644 --- a/public/language/pt-BR/success.json +++ b/public/language/pt-BR/success.json @@ -1,7 +1,7 @@ { "success": "Sucesso", "topic-post": "Você postou com sucesso.", - "post-queued": "A sua postagem está na fila para aprovação.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autenticação Bem-sucedida", "settings-saved": "Configurações salvas!" } \ No newline at end of file diff --git a/public/language/pt-PT/notifications.json b/public/language/pt-PT/notifications.json index c86d77695a..4598eef55f 100644 --- a/public/language/pt-PT/notifications.json +++ b/public/language/pt-PT/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-mail confirmado", "email-confirmed-message": "Obrigado por validares o teu endereço de e-mail. A tua conta está agora totalmente ativa.", "email-confirm-error-message": "Ocorreu um problema a validar o teu endereço de e-mail. Talvez o código seja inválido ou já tenha expirado.", diff --git a/public/language/pt-PT/success.json b/public/language/pt-PT/success.json index d4d477fd57..c1a5e6c17a 100644 --- a/public/language/pt-PT/success.json +++ b/public/language/pt-PT/success.json @@ -1,7 +1,7 @@ { "success": "Sucesso", "topic-post": "Publicaste com sucesso.", - "post-queued": "A tua publicação está a aguardar aprovação.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autenticação Bem Sucedida", "settings-saved": "Configurações guardadas!" } \ No newline at end of file diff --git a/public/language/ro/notifications.json b/public/language/ro/notifications.json index ceb0531488..c2d124d96b 100644 --- a/public/language/ro/notifications.json +++ b/public/language/ro/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email confirmat", "email-confirmed-message": "Îți mulțumim pentru validarea emailului. Contul tău este acuma activat.", "email-confirm-error-message": "A fost o problemă cu activarea adresei tale de email. Poate codul de activare a fost invalid sau expirat.", diff --git a/public/language/ro/success.json b/public/language/ro/success.json index 2eb63cf761..27c9593b53 100644 --- a/public/language/ro/success.json +++ b/public/language/ro/success.json @@ -1,7 +1,7 @@ { "success": "Succes", "topic-post": "Ai postat cu succes.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autentificare Reușită", "settings-saved": "Setări salvate!" } \ No newline at end of file diff --git a/public/language/ru/notifications.json b/public/language/ru/notifications.json index 9e48353cbc..180b91f3ae 100644 --- a/public/language/ru/notifications.json +++ b/public/language/ru/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "Посты %1 экспортированы, нажмите для загрузки", "uploads-exported": "Вложения %1 экспортированы, нажмите для загрузки", "users-csv-exported": "CSV пользователей экспортирован, нажмите, чтобы загрузить", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Электронная почта подтверждена", "email-confirmed-message": "Спасибо за подтверждение адреса электронной почты. Ваша учётная запись активирована.", "email-confirm-error-message": "Ошибка проверки адреса электронной почты. Возможно, код подтверждения введён неправильно или у него истёк срок действия.", diff --git a/public/language/ru/success.json b/public/language/ru/success.json index b25041f8c5..7ecfdad3c0 100644 --- a/public/language/ru/success.json +++ b/public/language/ru/success.json @@ -1,7 +1,7 @@ { "success": "Готово", "topic-post": "Вы успешно отправили сообщение.", - "post-queued": "Ваше сообщение помещено в очередь на одобрение.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Авторизация выполнена успешно", "settings-saved": "Настройки сохранены!" } \ No newline at end of file diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index cb2acfbe8e..1ea7b81c62 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -138,7 +138,7 @@ "composer.schedule": "Schedule", "composer.replying_to": "Ответ %1", "composer.new_topic": "Создать тему", - "composer.editing": "Editing", + "composer.editing": "Редактирование \"%1\"", "composer.uploading": "загрузка...", "composer.thumb_url_label": "Вставьте ссылку на картинку с иконкой темы.", "composer.thumb_title": "Добавить иконку к этой теме", diff --git a/public/language/rw/notifications.json b/public/language/rw/notifications.json index 3faf1cf4a8..9c35cfa34b 100644 --- a/public/language/rw/notifications.json +++ b/public/language/rw/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Yemejwe", "email-confirmed-message": "Urakoze kugaragaza ko email yawe ikora. Ubu ngubu konte yawe irakora nta kabuza. ", "email-confirm-error-message": "Havutse ikibazo mu gushaka kumenya niba email yawe ikora. Ushobora kuba wakoresheje kode itari yo cyangwa se yarengeje igihe. ", diff --git a/public/language/rw/success.json b/public/language/rw/success.json index cfe4b261aa..1b764a4f09 100644 --- a/public/language/rw/success.json +++ b/public/language/rw/success.json @@ -1,7 +1,7 @@ { "success": "Byaciyemo", "topic-post": "Wabishyizeho nta ngorane. ", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Igenzura Ryaciyemo", "settings-saved": "Ibyatunganyijwe byakiriwe!" } \ No newline at end of file diff --git a/public/language/sc/notifications.json b/public/language/sc/notifications.json index b896eedec0..b926d42b88 100644 --- a/public/language/sc/notifications.json +++ b/public/language/sc/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email Confirmed", "email-confirmed-message": "Thank you for validating your email. Your account is now fully activated.", "email-confirm-error-message": "There was a problem validating your email address. Perhaps the code was invalid or has expired.", diff --git a/public/language/sc/success.json b/public/language/sc/success.json index 231f17a160..7fa5550915 100644 --- a/public/language/sc/success.json +++ b/public/language/sc/success.json @@ -1,7 +1,7 @@ { "success": "Success", "topic-post": "You have successfully posted.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Authentication Successful", "settings-saved": "Settings saved!" } \ No newline at end of file diff --git a/public/language/sk/notifications.json b/public/language/sk/notifications.json index 8c630a00e0..6418185de8 100644 --- a/public/language/sk/notifications.json +++ b/public/language/sk/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-mail bol potvrdený", "email-confirmed-message": "Ďakujeme za potvrdenie Vášho e-mailu. Váš účet je teraz aktivovaný.", "email-confirm-error-message": "Vyskytla sa chyba pri overení Vašej e-mailovej adresy. ", diff --git a/public/language/sk/success.json b/public/language/sk/success.json index a8bbfa23d7..bfc1e4b403 100644 --- a/public/language/sk/success.json +++ b/public/language/sk/success.json @@ -1,7 +1,7 @@ { "success": "Úspech", "topic-post": "Úspešne ste pridali nový príspevok.", - "post-queued": "Váš príspevok bol pridaný do fronty sa schválenie.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Overovanie úspešné", "settings-saved": "Nastavenia boli uložené." } \ No newline at end of file diff --git a/public/language/sl/notifications.json b/public/language/sl/notifications.json index 76bcbf6a38..aeff954bfa 100644 --- a/public/language/sl/notifications.json +++ b/public/language/sl/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-poštni naslov potrjen", "email-confirmed-message": "Hvala, da ste potrdili svoj e-naslov. Račun je sedaj aktiviran.", "email-confirm-error-message": "Prišlo je do napake pri preverjanju vašega e-poštnega naslova. Morda je bila koda napačna ali pa je potekla.", diff --git a/public/language/sl/success.json b/public/language/sl/success.json index 288f56f38c..4c6a5ddbe6 100644 --- a/public/language/sl/success.json +++ b/public/language/sl/success.json @@ -1,7 +1,7 @@ { "success": "Uspešno", "topic-post": "Uspešno ste objavili.", - "post-queued": "Your post is queued for approval.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Avtentikacija uspešna", "settings-saved": "Nastavitve shranjene!" } \ No newline at end of file diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index e21484c7c7..d52d9d14e7 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 порука извезено, кликните за преузимање", "uploads-exported": "%1 отпремања извезено, кликните за преузимање", "users-csv-exported": "Кориснички csv извезен, кликните за преузимање", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Е-пошта је потврђена.", "email-confirmed-message": "Хвала на овери ваше е-поште. Ваш налог је сада у потпуности активан.", "email-confirm-error-message": "Дошло је до проблема са овером ваше е-поште. Можда је код неисправан или је истекао.", diff --git a/public/language/sr/success.json b/public/language/sr/success.json index bbf415b6ac..7a6b2fe1d6 100644 --- a/public/language/sr/success.json +++ b/public/language/sr/success.json @@ -1,7 +1,7 @@ { "success": "Успешно", "topic-post": "Успешно сте послали поруку.", - "post-queued": "Ваша порука је стављена у ред за одобрење.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Успешна аутентификација", "settings-saved": "Подешавања су сачувана!" } \ No newline at end of file diff --git a/public/language/sv/notifications.json b/public/language/sv/notifications.json index aa1eaa9c34..7a426b7d4b 100644 --- a/public/language/sv/notifications.json +++ b/public/language/sv/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-post bekräftad", "email-confirmed-message": "Tack för att du bekräftat din e-postadress. Ditt konto är nu fullt ut aktiverat.", "email-confirm-error-message": "Det uppstod ett problem med bekräftelsen av din e-postadress. Kanske var koden felaktig eller ogiltig.", diff --git a/public/language/sv/success.json b/public/language/sv/success.json index 939069385e..d938c2c9f7 100644 --- a/public/language/sv/success.json +++ b/public/language/sv/success.json @@ -1,7 +1,7 @@ { "success": "Lyckat", "topic-post": "Du har nu gjort ett inlägg.", - "post-queued": "Ditt inlägg väntar nu på att bli godkänt.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Autentisering lyckades", "settings-saved": "Inställningarna sparades." } \ No newline at end of file diff --git a/public/language/th/notifications.json b/public/language/th/notifications.json index 8c8f538a2a..adc174ff2b 100644 --- a/public/language/th/notifications.json +++ b/public/language/th/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Email ได้รับการยืนยันแล้ว", "email-confirmed-message": "ขอบคุณที่ยืนยัน Email ของคุณ บัญชีของคุณสามารถใช้งานได้แล้ว", "email-confirm-error-message": "มีปัญหาในการยืนยัน Email ของคุณ บางทีรหัสไม่ถูกต้องหรือหมดอายุแล้ว", diff --git a/public/language/th/success.json b/public/language/th/success.json index 3173db70a8..7751c7b027 100644 --- a/public/language/th/success.json +++ b/public/language/th/success.json @@ -1,7 +1,7 @@ { "success": "สำเร็จ", "topic-post": "คุณลงข้อความสำเร็จแล้ว", - "post-queued": "โพสของคุณกำลังรอการอนุมัติ", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "การระบุตัวตนสำเร็จแล้ว", "settings-saved": "การตั้งค่าได้ถูกบันทึกแล้ว" } \ No newline at end of file diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index 1160f55cc4..7d15ede5c0 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 iletileri hazırlandı, indirmek için tıklayınız", "uploads-exported": "%1 yüklemeleri hazırlandı, indirmek için tıklayınız", "users-csv-exported": "Kullanıcılar csv hazırlandı, indirmek için tıklayınız", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-posta onaylandı", "email-confirmed-message": "E-postanızı onayladığınız için teşekkürler. Hesabınız tamamen aktif edildi.", "email-confirm-error-message": "E-posta adresinizi onaylarken bir hata oluştu. Kodunuz geçersiz ya da eski olabilir.", diff --git a/public/language/tr/success.json b/public/language/tr/success.json index 0e16198149..dc9f9c77c3 100644 --- a/public/language/tr/success.json +++ b/public/language/tr/success.json @@ -1,7 +1,7 @@ { "success": "Başarılı", "topic-post": "Başarıyla gönderim yaptınız.", - "post-queued": "İletiniz onay için sıraya alındı.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Doğrulama Başarılı", "settings-saved": "Ayarlar kaydedildi!" } \ No newline at end of file diff --git a/public/language/uk/notifications.json b/public/language/uk/notifications.json index 81db999a59..b5b72f459f 100644 --- a/public/language/uk/notifications.json +++ b/public/language/uk/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "Електронну пошту підтверджено", "email-confirmed-message": "Дякуємо за підтвердження електронної пошти. Ваш акаунт тепер повністю активовано.", "email-confirm-error-message": "При перевірці вашої електронної пошти сталася проблема. Можливо код був недійсним або простроченим.", diff --git a/public/language/uk/success.json b/public/language/uk/success.json index df20ad7bdf..e6f239a285 100644 --- a/public/language/uk/success.json +++ b/public/language/uk/success.json @@ -1,7 +1,7 @@ { "success": "Успіх", "topic-post": "Публікацію успішно створено.", - "post-queued": "Ваш пост поставлений в чергу на схвалення.", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "Аутентифікація успішна", "settings-saved": "Налаштування збережені!" } \ No newline at end of file diff --git a/public/language/vi/notifications.json b/public/language/vi/notifications.json index e1478d87d4..6a6ed2cbbb 100644 --- a/public/language/vi/notifications.json +++ b/public/language/vi/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 đã xuất bài viết, nhấn tải xuống", "uploads-exported": "%1 đã xuất tải lên, nhấn tải xuống", "users-csv-exported": "Đã xuất csv người dùng, nhấp để tải xuống", + "post-queue-accepted": "Bài đăng trong hàng đợi của bạn đã được chấp nhận. Nhấn vào đây để xem bài viết của bạn.", + "post-queue-rejected": "Bài đăng trong hàng đợi của bạn đã bị từ chối", "email-confirmed": "Đã Xác Nhận Email", "email-confirmed-message": "Cảm ơn bạn đã xác nhận địa chỉ email của bạn. Tài khoản của bạn đã được kích hoạt đầy đủ.", "email-confirm-error-message": "Đã có lỗi khi xác nhận địa chỉ email. Có thể đoạn mã không đúng hoặc đã hết hạn.", diff --git a/public/language/vi/success.json b/public/language/vi/success.json index 7f37c5fa4c..f4034365f8 100644 --- a/public/language/vi/success.json +++ b/public/language/vi/success.json @@ -1,7 +1,7 @@ { "success": "Thành công", "topic-post": "Bạn đã đăng bài thành công", - "post-queued": "Bài đăng của bạn được chờ xét duyệt.", + "post-queued": "Bài đăng của bạn được xếp hàng để phê duyệt. Bạn sẽ nhận được thông báo khi nó được chấp nhận hoặc bị từ chối.", "authentication-successful": "Xác thực thành công", "settings-saved": "Đã lưu thiết lập" } \ No newline at end of file diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index ac864191f6..335b8d5f1b 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1帖子已导出,点击下载", "uploads-exported": "%1上传已导出,点击下载", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "电子邮箱已确认", "email-confirmed-message": "感谢您验证您的电子邮箱。您的帐户现已完全激活。", "email-confirm-error-message": "验证的您电子邮箱地址时出现了问题。可能是因为验证码无效或已过期。", diff --git a/public/language/zh-CN/success.json b/public/language/zh-CN/success.json index 0b0f706dec..bd3a117454 100644 --- a/public/language/zh-CN/success.json +++ b/public/language/zh-CN/success.json @@ -1,7 +1,7 @@ { "success": "成功", "topic-post": "您已成功发布。", - "post-queued": "您的帖子正在等待审核。", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "验证成功", "settings-saved": "设置已保存!" } \ No newline at end of file diff --git a/public/language/zh-TW/notifications.json b/public/language/zh-TW/notifications.json index 8951ca9a2a..d8b721e037 100644 --- a/public/language/zh-TW/notifications.json +++ b/public/language/zh-TW/notifications.json @@ -47,6 +47,8 @@ "posts-exported": "%1 posts exported, click to download", "uploads-exported": "%1 uploads exported, click to download", "users-csv-exported": "Users csv exported, click to download", + "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "電子信箱已確認", "email-confirmed-message": "感謝您驗證您的電子信箱。您的帳戶現已完全啟用。", "email-confirm-error-message": "驗證的您電子信箱地址時出現了問題。可能是因為驗證碼無效或已過期。", diff --git a/public/language/zh-TW/success.json b/public/language/zh-TW/success.json index d5b8b0089d..759e67120d 100644 --- a/public/language/zh-TW/success.json +++ b/public/language/zh-TW/success.json @@ -1,7 +1,7 @@ { "success": "成功", "topic-post": "您已成功發佈。", - "post-queued": "您的貼文正在等待審核。", + "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", "authentication-successful": "驗證成功", "settings-saved": "設定已儲存!" } \ No newline at end of file From 6ed8890c2e5542e04a69a8acf0efd89eee0f418d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 27 Apr 2021 10:00:52 -0400 Subject: [PATCH 020/116] fix: #9512, fix chat icon if no privileges --- src/middleware/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/header.js b/src/middleware/header.js index 17b9987752..9bd0acaed7 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -115,7 +115,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) { templateValues.isAdmin = results.user.isAdmin; templateValues.isGlobalMod = results.user.isGlobalMod; templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; - templateValues.canChat = results.canChat && meta.config.disableChat !== 1; + templateValues.canChat = results.privileges.chat && meta.config.disableChat !== 1; templateValues.user = results.user; templateValues.userJSON = jsesc(JSON.stringify(results.user), { isScriptContext: true }); templateValues.useCustomCSS = meta.config.useCustomCSS && meta.config.customCSS; From c0d54a06f680419ab52dbf5b0a4e98a6f31d5ee7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 27 Apr 2021 14:04:11 +0000 Subject: [PATCH 021/116] fix(deps): update dependency connect-redis to v5.2.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c13228841a..3c1fdf0934 100644 --- a/install/package.json +++ b/install/package.json @@ -49,7 +49,7 @@ "connect-mongo": "4.4.1", "connect-multiparty": "^2.2.0", "connect-pg-simple": "^6.2.1", - "connect-redis": "5.1.0", + "connect-redis": "5.2.0", "cookie-parser": "^1.4.5", "cron": "^1.8.2", "cropperjs": "^1.5.11", From ac1a272321a37ca2aebebac7c7b61cb882d2324d Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 28 Apr 2021 09:14:04 +0000 Subject: [PATCH 022/116] Latest translations and fallbacks --- public/language/bg/notifications.json | 4 ++-- public/language/bg/success.json | 2 +- public/language/it/notifications.json | 2 +- public/language/it/success.json | 2 +- public/language/nb/category.json | 6 +++--- public/language/nb/global.json | 14 +++++++------- public/language/nb/user.json | 2 +- public/language/ru/global.json | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/public/language/bg/notifications.json b/public/language/bg/notifications.json index 2d3803eea7..5a13ffa0a1 100644 --- a/public/language/bg/notifications.json +++ b/public/language/bg/notifications.json @@ -47,8 +47,8 @@ "posts-exported": "Публикациите на %1 са изнесени, щракнете за сваляне", "uploads-exported": "Качванията на %1 са изнесени, щракнете за сваляне", "users-csv-exported": "Потребителите са изнесени във формат „csv“, щракнете за сваляне", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-accepted": "Вашата публикация, която чакаше в опашката, беше приета. Натиснете тук, за да я видите.", + "post-queue-rejected": "Вашата публикация, която чакаше в опашката, беше отхвърлена.", "email-confirmed": "Е-пощата беше потвърдена", "email-confirmed-message": "Благодарим Ви, че потвърдихте е-пощата си. Акаунтът Ви е вече напълно активиран.", "email-confirm-error-message": "Възникна проблем при потвърждаването на е-пощата Ви. Може кодът да е грешен или давността му да е изтекла.", diff --git a/public/language/bg/success.json b/public/language/bg/success.json index bd084f8deb..6319fc1cc0 100644 --- a/public/language/bg/success.json +++ b/public/language/bg/success.json @@ -1,7 +1,7 @@ { "success": "Готово", "topic-post": "Вие публикувахте успешно.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Публикацията Ви е поставена в опашка за одобрение. Ще получите известие, когато тя бъде одобрена или отхвърлена.", "authentication-successful": "Успешно удостоверяване", "settings-saved": "Настройките са запазени!" } \ No newline at end of file diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 1a05ed7733..c6f6de144d 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -48,7 +48,7 @@ "uploads-exported": "%1 caricamenti esportati, clicca per scaricare", "users-csv-exported": "Utenti esportati in CSV, clicca per scaricare", "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-rejected": "Il tuo post in coda è stato rifiutato.", "email-confirmed": "Email Confermata", "email-confirmed-message": "Grazie per aver validato la tua email. Il tuo account è ora completamente attivato.", "email-confirm-error-message": "C'è stato un problema nella validazione del tuo indirizzo email. Potrebbe essere il codice non valido o scaduto.", diff --git a/public/language/it/success.json b/public/language/it/success.json index 5af6e4acd2..d5d2534894 100644 --- a/public/language/it/success.json +++ b/public/language/it/success.json @@ -1,7 +1,7 @@ { "success": "Riuscito", "topic-post": "Hai postato correttamente.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Il tuo post è in coda per l'approvazione. Riceverai una notifica quando sarà accettato o rifiutato.", "authentication-successful": "Autenticazione Riuscita", "settings-saved": "Impostazioni salvate!" } \ No newline at end of file diff --git a/public/language/nb/category.json b/public/language/nb/category.json index 9e687671d1..19fc5f8881 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -9,9 +9,9 @@ "no_new_posts": "Ingen nye innlegg.", "watch": "Overvåk", "ignore": "Ignorer", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", + "watching": "Følger", + "not-watching": "Følger ikke", + "ignoring": "Ignorerer", "watching.description": "Vis tråder blandt uleste og nylige", "not-watching.description": "Do not show topics in unread, show in recent", "ignoring.description": "Ikke vis tråder blandt uleste og nylige", diff --git a/public/language/nb/global.json b/public/language/nb/global.json index bf90375c2f..d84cf80d27 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -9,8 +9,8 @@ "404.message": "Du har funnet en side som ikke eksisterer. Returner til startsiden?", "500.title": "Intern feil.", "500.message": "Oops! Ser ut som noe gikk galt!", - "400.title": "Bad Request.", - "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", + "400.title": "Ugyldig forespørsel ", + "400.message": "Det ser ut til at denne lenken er ugyldig, vennligst dobbeltsjekk og prøv igjen. Ellers, gå tilbake til hjemmesiden.", "register": "Registrer", "login": "Logg inn", "please_log_in": "Vennligst logg inn", @@ -19,7 +19,7 @@ "welcome_back": "Velkommen tilbake", "you_have_successfully_logged_in": "Du har blitt logget inn", "save_changes": "Lagre endringer", - "save": "Save", + "save": "Lagre", "close": "Lukk", "pagination": "Paginering", "pagination.out_of": "%1 ut av %2", @@ -30,7 +30,7 @@ "header.unread": "Uleste", "header.tags": "Emneord", "header.popular": "Populære", - "header.top": "Top", + "header.top": "Topp", "header.users": "Brukere", "header.groups": "Grupper", "header.chats": "Samtaler", @@ -48,7 +48,7 @@ "alert.banned": "Utestengt", "alert.banned.message": "Du har nettop blitt utestengt, din tilgang er nå begrenset.", "alert.unbanned": "Unbanned", - "alert.unbanned.message": "Your ban has been lifted.", + "alert.unbanned.message": "Utestengelsen er opphevet", "alert.unfollow": "Du følger ikke lenger %1!", "alert.follow": "Du følger nå %1!", "users": "Brukere", @@ -56,7 +56,7 @@ "posts": "Innlegg", "x-posts": "%1 posts", "best": "Best", - "votes": "Votes", + "votes": "Stemmer", "x-votes": "%1 votes", "voters": "Voters", "upvoters": "Upvoters", @@ -120,5 +120,5 @@ "edited": "Edited", "disabled": "Disabled", "select": "Select", - "user-search-prompt": "Type something here to find users..." + "user-search-prompt": "Skriv her for å finne andre brukere..." } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index c59cf1ec70..e04a5253b5 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -107,7 +107,7 @@ "has_no_blocks": "You have blocked no users.", "email_hidden": "E-post skjult", "hidden": "skjult", - "paginate_description": "Bruk sidevelger for emner og innlegg istedet for uendelig scrolling", + "paginate_description": "Bruk sidevelger for tråder og innlegg istedet for uendelig scrolling", "topics_per_page": "Tråd per side", "posts_per_page": "Innlegg per side", "max_items_per_page": "Maximum %1", diff --git a/public/language/ru/global.json b/public/language/ru/global.json index 96197e0ee8..775f475ce8 100644 --- a/public/language/ru/global.json +++ b/public/language/ru/global.json @@ -120,5 +120,5 @@ "edited": "Отредактированный", "disabled": "Отключено", "select": "Выбрать", - "user-search-prompt": "Введите что-нибудь здесь, чтобы найти пользователей ..." + "user-search-prompt": "Введите что-нибудь здесь, чтобы найти пользователей..." } \ No newline at end of file From 33d91fdef81a68b2a1f4c51c09ff625731c3f71f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 28 Apr 2021 09:24:11 +0000 Subject: [PATCH 023/116] fix(deps): update dependency nodebb-theme-persona to v11.0.18 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3c1fdf0934..b300827980 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.2.1", - "nodebb-theme-persona": "11.0.17", + "nodebb-theme-persona": "11.0.18", "nodebb-theme-slick": "1.4.6", "nodebb-theme-vanilla": "12.0.7", "nodebb-widget-essentials": "5.0.3", From 5fe97b9c2ec8175a458000c86b2b3a7519933c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 28 Apr 2021 15:00:43 -0400 Subject: [PATCH 024/116] revert: sync hooks --- src/plugins/hooks.js | 5 +++++ test/plugins.js | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index 394c11c5b8..f14c94791f 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -137,9 +137,14 @@ async function fireFilterHook(hook, hookList, params) { payload => resolve(payload), err => reject(err) ); + return; + } + if (returned) { + resolve(returned); } }); } + for (const hookObj of hookList) { // eslint-disable-next-line params = await fireMethod(hookObj, params); diff --git a/test/plugins.js b/test/plugins.js index 21d0ff94b7..b7b5575d28 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -47,7 +47,7 @@ describe('Plugins', () => { }); }); - it('should register and fire a filter hook having 2 methods, one returning a promise, one calling the callback', async () => { + it('should register and fire a filter hook having 3 methods, one returning a promise, one calling the callback and one just returning', async () => { function method1(data, callback) { data.foo += 1; callback(null, data); @@ -58,12 +58,17 @@ describe('Plugins', () => { resolve(data); }); } + function method3(data) { + data.foo += 1; + return data; + } plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method1 }); plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method2 }); + plugins.hooks.register('test-plugin', { hook: 'filter:test.hook2', method: method3 }); const data = await plugins.hooks.fire('filter:test.hook2', { foo: 1 }); - assert.strictEqual(data.foo, 7); + assert.strictEqual(data.foo, 8); }); it('should register and fire a filter hook that returns a promise that gets rejected', (done) => { From 8789716ae40373cc2afde890acff5ca727fb4b24 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 29 Apr 2021 09:18:19 +0000 Subject: [PATCH 025/116] Latest translations and fallbacks --- public/language/vi/modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/vi/modules.json b/public/language/vi/modules.json index 3c5755694e..3fbf9c8f69 100644 --- a/public/language/vi/modules.json +++ b/public/language/vi/modules.json @@ -1,6 +1,6 @@ { "chat.chatting_with": "Trò chuyện với", - "chat.placeholder": "Nhập tin nhắn ở đây, nhấn enter để gửi", + "chat.placeholder": "Nhập tin nhắn trò chuyện ở đây, 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.", From 084c9851179f4863cc087c91aa20d21ed295cb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 29 Apr 2021 10:47:23 -0400 Subject: [PATCH 026/116] feat: guard against multiple resolves --- src/plugins/hooks.js | 15 ++++++++++++--- test/plugins.js | 23 +++++++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index f14c94791f..59f904d186 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -128,19 +128,28 @@ async function fireFilterHook(hook, hookList, params) { return await hookObj.method(params); } return new Promise((resolve, reject) => { + let resolved = false; + function _resolve(result) { + if (resolved) { + winston.warn(`[plugins] ${hook} already resolved in plugin ${hookObj.id}`); + return; + } + resolved = true; + resolve(result); + } const returned = hookObj.method(params, (err, result) => { - if (err) reject(err); else resolve(result); + if (err) reject(err); else _resolve(result); }); if (utils.isPromise(returned)) { returned.then( - payload => resolve(payload), + payload => _resolve(payload), err => reject(err) ); return; } if (returned) { - resolve(returned); + _resolve(returned); } }); } diff --git a/test/plugins.js b/test/plugins.js index b7b5575d28..ae5e403abf 100644 --- a/test/plugins.js +++ b/test/plugins.js @@ -71,6 +71,25 @@ describe('Plugins', () => { assert.strictEqual(data.foo, 8); }); + it('should not error with invalid hooks', async () => { + function method1(data, callback) { + data.foo += 1; + return data; + } + function method2(data, callback) { + data.foo += 2; + // this is invalid + callback(null, data); + return data; + } + + plugins.hooks.register('test-plugin', { hook: 'filter:test.hook3', method: method1 }); + plugins.hooks.register('test-plugin', { hook: 'filter:test.hook3', method: method2 }); + + const data = await plugins.hooks.fire('filter:test.hook3', { foo: 1 }); + assert.strictEqual(data.foo, 4); + }); + it('should register and fire a filter hook that returns a promise that gets rejected', (done) => { async function method(data) { return new Promise((resolve, reject) => { @@ -78,8 +97,8 @@ describe('Plugins', () => { reject(new Error('nope')); }); } - plugins.hooks.register('test-plugin', { hook: 'filter:test.hook3', method: method }); - plugins.hooks.fire('filter:test.hook3', { foo: 1 }, (err) => { + plugins.hooks.register('test-plugin', { hook: 'filter:test.hook4', method: method }); + plugins.hooks.fire('filter:test.hook4', { foo: 1 }, (err) => { assert(err); done(); }); From 19f1cbfc4a6d7e97237198e96ec8c6c8c5db8966 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 29 Apr 2021 22:03:58 +0000 Subject: [PATCH 027/116] fix(deps): update dependency nodebb-widget-essentials to v5.0.4 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index b300827980..398fb2610c 100644 --- a/install/package.json +++ b/install/package.json @@ -96,7 +96,7 @@ "nodebb-theme-persona": "11.0.18", "nodebb-theme-slick": "1.4.6", "nodebb-theme-vanilla": "12.0.7", - "nodebb-widget-essentials": "5.0.3", + "nodebb-widget-essentials": "5.0.4", "nodemailer": "^6.5.0", "nprogress": "0.2.0", "passport": "^0.4.1", From d8e4fd4cddf6d4124a96d63a59ad84a08a25acea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 30 Apr 2021 10:06:19 -0400 Subject: [PATCH 028/116] feat: add filter:categories.copySettingsFrom --- src/categories/create.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/categories/create.js b/src/categories/create.js index 93121dc8b9..b5068ff0dc 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -170,6 +170,11 @@ module.exports = function (Categories) { if (copyParent) { destination.parentCid = source.parentCid || 0; } + await plugins.hooks.fire('filter:categories.copySettingsFrom', { + source: source, + destination: destination, + copyParent: copyParent, + }); await db.setObject(`category:${toCid}`, destination); From 46899ccadb3eb8045da634f579a2ab4828fe0293 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 30 Apr 2021 11:23:01 -0400 Subject: [PATCH 029/116] feat: add _hooks metadata object to all hooks that have object-type params --- src/plugins/hooks.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index 59f904d186..b7dc59742f 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -96,6 +96,17 @@ Hooks.fire = async function (hook, params) { winston.warn(`[plugins] Unknown hookType: ${hookType}, hook : ${hook}`); return; } + + if (params === undefined) { // can't be simpler falsy check, empty strings can be passed e.g. filter:parse.raw + params = {}; + } + if (typeof params === 'object') { + params._hook = Object.freeze({ + name: hook, + type: hookType, + listeners: hookList && Array.isArray(hookList) ? hookList.length : 0, + }); + } const result = await hookTypeToMethod[hookType](hook, hookList, params); if (hook !== 'action:plugins.firehook' && hook !== 'filter:plugins.firehook') { From db48b9527d2169fec3d69cb9e637304ce68b90c3 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 30 Apr 2021 12:02:15 -0400 Subject: [PATCH 030/116] fix: #9519 unable to properly ajaxify to home on subfolder installs if anchor did not have a trailing slash --- public/src/ajaxify.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index af52676726..883c0f12a7 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -473,10 +473,11 @@ $(document).ready(function () { var href = $this.attr('href'); var internalLink = utils.isInternalURI(this, window.location, config.relative_path); + const rootAndPath = new RegExp(`^${rootUrl}${config.relative_path}/?`); var process = function () { if (!e.ctrlKey && !e.shiftKey && !e.metaKey && e.which === 1) { if (internalLink) { - var pathname = this.href.replace(rootUrl + config.relative_path + '/', ''); + var pathname = this.href.replace(rootAndPath, ''); // Special handling for urls with hashes if (window.location.pathname === this.pathname && this.hash.length) { From 7c1e163d82aead9bb2b87364d67d9d76e3f10c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 30 Apr 2021 12:16:30 -0400 Subject: [PATCH 031/116] Revert "feat: add _hooks metadata object to all hooks that have object-type params" This reverts commit 46899ccadb3eb8045da634f579a2ab4828fe0293. --- src/plugins/hooks.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index b7dc59742f..59f904d186 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -96,17 +96,6 @@ Hooks.fire = async function (hook, params) { winston.warn(`[plugins] Unknown hookType: ${hookType}, hook : ${hook}`); return; } - - if (params === undefined) { // can't be simpler falsy check, empty strings can be passed e.g. filter:parse.raw - params = {}; - } - if (typeof params === 'object') { - params._hook = Object.freeze({ - name: hook, - type: hookType, - listeners: hookList && Array.isArray(hookList) ? hookList.length : 0, - }); - } const result = await hookTypeToMethod[hookType](hook, hookList, params); if (hook !== 'action:plugins.firehook' && hook !== 'filter:plugins.firehook') { From 0389dd968f893af618eb10afc496e3e1c51fd31a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 2 May 2021 04:58:18 +0000 Subject: [PATCH 032/116] fix(deps): update dependency sitemap to v7 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 398fb2610c..1e4a20581d 100644 --- a/install/package.json +++ b/install/package.json @@ -117,7 +117,7 @@ "semver": "^7.3.4", "serve-favicon": "^2.5.0", "sharp": "0.28.1", - "sitemap": "^6.4.0", + "sitemap": "^7.0.0", "slideout": "1.0.1", "socket.io": "4.0.1", "socket.io-adapter-cluster": "^1.0.1", From 9950602eff013a60089ea755d30bd3dff9360a10 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 2 May 2021 09:07:08 +0000 Subject: [PATCH 033/116] Latest translations and fallbacks --- public/language/fr/notifications.json | 4 ++-- public/language/fr/success.json | 2 +- public/language/sr/error.json | 18 +++++++++--------- public/language/sr/notifications.json | 4 ++-- public/language/sr/success.json | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index bd7dd52415..7f38bf7b7f 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -47,8 +47,8 @@ "posts-exported": "%1 messages exportés, cliquez pour les télécharger", "uploads-exported": "%1 envois exportés, cliquez pour les télécharger", "users-csv-exported": "Utilisateurs exportés en CSV, cliquez pour télécharger", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-accepted": "Votre message a été accepté. Cliquez ici pour voir votre message.", + "post-queue-rejected": "Votre message a été rejeté.", "email-confirmed": "Email vérifié", "email-confirmed-message": "Merci pour la validation de votre adresse email. Votre compte est désormais activé.", "email-confirm-error-message": "Il y a un un problème dans la vérification de votre adresse email. Le code est peut être invalide ou a expiré.", diff --git a/public/language/fr/success.json b/public/language/fr/success.json index cb6f055689..33e50aadfa 100644 --- a/public/language/fr/success.json +++ b/public/language/fr/success.json @@ -1,7 +1,7 @@ { "success": "Terminé", "topic-post": "Le message a bien été envoyé.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Votre message est en attente d'approbation. Vous recevrez une notification lorsqu'il sera accepté ou rejeté.", "authentication-successful": "Authentification réussie", "settings-saved": "Paramètres enregistrés !" } \ No newline at end of file diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 576e31a727..2f2acbd19c 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -9,7 +9,7 @@ "invalid-tid": "Неисправан ID теме", "invalid-pid": "Неисправан ID поруке", "invalid-uid": "Неисправан ИД корисника", - "invalid-date": "A valid date must be provided", + "invalid-date": "Мора се навести важећи датум", "invalid-username": "Неисправно корисничко име", "invalid-email": "Неисправна е-пошта", "invalid-fullname": "Неисправно пуно име", @@ -22,13 +22,13 @@ "invalid-username-or-password": "Молимо наведите и корисничко име и лозинку", "invalid-search-term": "Неисправан упит за претрагу", "invalid-url": "Неважећа адреса", - "invalid-event": "Invalid event: %1", + "invalid-event": "Неважећи догађај: %1", "local-login-disabled": "Локални систем за пријављивање је онемогућен за непривилеговане налоге.", "csrf-invalid": "Нисмо успели да вас пријавимо, вероватно због истека сесије. Молимо покушајте поново", "invalid-pagination-value": "Неважећа вредност приликом нумерисања страница, мора бити најмање %1 а највише %2 ", "username-taken": "Корисничко име је заузето", "email-taken": "Адреса е-поште је заузета", - "email-invited": "Email was already invited", + "email-invited": "Е-пошта је већ позвана", "email-not-confirmed": "Није вам дозвољено да шаљете поруке док не потврдите вашу е-пошту, кликните овде да то учините.", "email-not-confirmed-chat": "Није вам дозвољено да ћаскате док не потврдите вашу е-пошту, кликните овде да то учините.", "email-not-confirmed-email-sent": "Ваша е-пошта још увек није потврђена, проверите ваше пријемно сандуче. Неће вам бити дозвољено да шаљете поруке или ћаскате док не потврдите е-пошту.", @@ -41,7 +41,7 @@ "username-too-long": "Корисничко име је предуго", "password-too-long": "Шифра је предугачка.", "reset-rate-limited": "Превише захтева за поништавање лозинке (ограничена стопа)", - "reset-same-password": "Please use a password that is different from your current one", + "reset-same-password": "Користите лозинку која се разликује од ваше тренутне", "user-banned": "Корисник је забрањен", "user-banned-reason": "Овај налог је забрањен (Разлог: %1)", "user-banned-reason-until": "Овај налог је забрањен до %1 (Разлог: %2)", @@ -84,7 +84,7 @@ "tag-too-long": "Унесите краћу ознаку. Ознаке не смеју бити дуже од %1 знак(ов)а.", "not-enough-tags": "Нема довољно ознака. Теме морају имати најмање %1 ознаке/а.", "too-many-tags": "Превише ознака. Теме не смеју имати више од %1 ознаке/а.", - "cant-use-system-tag": "You can not use this system tag.", + "cant-use-system-tag": "Не можете користити ову системску ознаку.", "still-uploading": "Сачекајте док се отпремања не заврше.", "file-too-big": "Највећа дозвољена величина датотеке је %1 kB - отпремите мању датотеку.", "guest-upload-disabled": "Гостима је онемогућено отпремање", @@ -100,9 +100,9 @@ "already-unbookmarked": "Већ сте одстранили ову поруку из обележивача", "cant-ban-other-admins": "Не можете забранити друге администраторе!", "cant-remove-last-admin": "Ви сте једини администратор. Додајте другог корисника као администратора пре него што уклоните себе као администратора.", - "account-deletion-disabled": "Account deletion is disabled", + "account-deletion-disabled": "Брисање налога је онемогућено", "cant-delete-admin": "Уклоните администраторске привилегије овом налогу пре него што покушате да га избришете.", - "already-deleting": "Already deleting", + "already-deleting": "Већ се брише", "invalid-image": "Неважећа слика", "invalid-image-type": "Неважећи тип слике. Дозвољени типови су: %1", "invalid-image-extension": "Неважећи тип слике", @@ -142,7 +142,7 @@ "chat-delete-duration-expired": "Време у којем вам је дозвољено брисање порука ћаскања након објављивања: %1 сек.", "chat-deleted-already": "Ова порука ћаскања је већ избрисана.", "chat-restored-already": "Ова порука ћаскања је већ обновљена.", - "chat-room-does-not-exist": "Chat room does not exist.", + "chat-room-does-not-exist": "Соба за ћаскање не постоји.", "already-voting-for-this-post": "Већ сте гласали за ову поруку.", "reputation-system-disabled": "Угледи су онемогућени.", "downvoting-disabled": "Негативно гласање је онемогућено", @@ -178,7 +178,7 @@ "invalid-session-text": "Изгледа да ваша сесија пријављивања није више активна или се више не подудара са сервером. Поново учитајте ову страницу.", "no-topics-selected": "Нема одабраних тема!", "cant-move-to-same-topic": "Није могуће преместити поруку у исту тему!", - "cant-move-topic-to-same-category": "Can't move topic to the same category!", + "cant-move-topic-to-same-category": "Није могуће преместити тему у исту категорију!", "cannot-block-self": "Не можете блокирати себе!", "cannot-block-privileged": "Не можете блокирати администраторе или глобалне модераторе", "cannot-block-guest": "Гости нису у могућности да блокирају друге кориснике", diff --git a/public/language/sr/notifications.json b/public/language/sr/notifications.json index d52d9d14e7..c0ee49386e 100644 --- a/public/language/sr/notifications.json +++ b/public/language/sr/notifications.json @@ -47,8 +47,8 @@ "posts-exported": "%1 порука извезено, кликните за преузимање", "uploads-exported": "%1 отпремања извезено, кликните за преузимање", "users-csv-exported": "Кориснички csv извезен, кликните за преузимање", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-accepted": "Ваша порука на чекању је прихваћена. Кликните овде да бисте видели своју поруку.", + "post-queue-rejected": "Ваша порука на чекању је одбијена.", "email-confirmed": "Е-пошта је потврђена.", "email-confirmed-message": "Хвала на овери ваше е-поште. Ваш налог је сада у потпуности активан.", "email-confirm-error-message": "Дошло је до проблема са овером ваше е-поште. Можда је код неисправан или је истекао.", diff --git a/public/language/sr/success.json b/public/language/sr/success.json index 7a6b2fe1d6..d47cdfbaf3 100644 --- a/public/language/sr/success.json +++ b/public/language/sr/success.json @@ -1,7 +1,7 @@ { "success": "Успешно", "topic-post": "Успешно сте послали поруку.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Ваша порука је на чекању за одобрење. Добићете обавештење када буде прихваћена или одбијена.", "authentication-successful": "Успешна аутентификација", "settings-saved": "Подешавања су сачувана!" } \ No newline at end of file From cb1dd0a3db4da2cb717a13754046102cc0ca19c4 Mon Sep 17 00:00:00 2001 From: gasoved Date: Mon, 3 May 2021 18:23:28 +0300 Subject: [PATCH 034/116] fix: infinite scroll with small number of items #9524 (#9525) --- public/src/client/infinitescroll.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/src/client/infinitescroll.js b/public/src/client/infinitescroll.js index 0ada79cd04..2f66ce91a8 100644 --- a/public/src/client/infinitescroll.js +++ b/public/src/client/infinitescroll.js @@ -10,15 +10,20 @@ define('forum/infinitescroll', function () { var scrollTimeout = 0; scroll.init = function (el, cb) { + const $body = $('body'); if (typeof el === 'function') { callback = el; - container = $('body'); + container = $body; } else { callback = cb; - container = el || $('body'); + container = el || $body; } previousScrollTop = $(window).scrollTop(); $(window).off('scroll', startScrollTimeout).on('scroll', startScrollTimeout); + + if ($body.height() <= $(window).height()) { + callback(1); + } }; function startScrollTimeout() { From ce5fea2abd730a61e3a14d325a31a79da131f035 Mon Sep 17 00:00:00 2001 From: gasoved Date: Sat, 1 May 2021 10:32:48 +0300 Subject: [PATCH 035/116] fix: do not register SW for Safari until upstream fixes #9193 --- public/src/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/src/app.js b/public/src/app.js index aa3e9f6088..92c3acf4aa 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -799,7 +799,8 @@ app.cacheBuster = null; }; function registerServiceWorker() { - if ('serviceWorker' in navigator) { + // Do not register for Safari browsers + if (!ajaxify.data._locals.useragent.isSafari && 'serviceWorker' in navigator) { navigator.serviceWorker.register(config.relative_path + '/service-worker.js', { scope: config.relative_path + '/' }) .then(function () { console.info('ServiceWorker registration succeeded.'); From 32d67666cd80f47dce9764fba1e4d2aafddc5df5 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 4 May 2021 09:09:22 +0000 Subject: [PATCH 036/116] Latest translations and fallbacks --- public/language/tr/admin/settings/advanced.json | 6 +++--- public/language/tr/admin/settings/api.json | 6 +++--- public/language/tr/notifications.json | 4 ++-- public/language/tr/success.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/language/tr/admin/settings/advanced.json b/public/language/tr/admin/settings/advanced.json index 7cdf04e608..d8432101d4 100644 --- a/public/language/tr/admin/settings/advanced.json +++ b/public/language/tr/admin/settings/advanced.json @@ -6,7 +6,7 @@ "headers": "Başlıklar", "headers.allow-from": "NodeBB'yi bir iFrame'e yerleştirmek için ALLOW-FROM'u ayarla", "headers.csp-frame-ancestors": "NodeBB'yi bir iFrame'e yerleştirmek için Content-Security-Policy frame-ancestors başlığını ayarla", - "headers.csp-frame-ancestors-help": "'none', 'self'(default) or list of URIs to allow.", + "headers.csp-frame-ancestors-help": "\"yok\", \"iç\" (varsayılan) veya izin verilecek URI'lerin listesi.", "headers.powered-by": "NodeBB tarafından gönderilen \"Powered By\" başlığını özelleştirin", "headers.acao": "Erişim-Kontrolü-Kaynak-İzni", "headers.acao-regex": "Erişim-Kontrolü-Kaynak-İzni Düzenli İfade", @@ -36,8 +36,8 @@ "analytics.settings": "Analitik Ayarlar", "analytics.max-cache": "Analitik Önbellek Maksimum Değeri", - "analytics.max-cache-help": "On high-traffic installs, the cache could be exhausted continuously if there are more concurrent active users than the Max Cache value. (Restart required)", + "analytics.max-cache-help": "Yüksek trafikli zamanlarda, Maksimum Önbellek değerinden daha fazla eşzamanlı etkin kullanıcı varsa önbellek sürekli olarak tüketilebilir. (Yeniden başlatmak gerekir)", "compression.settings": "Sıkıştırma Ayarları", "compression.enable": "Sıkıştırmayı Aktifleştir", - "compression.help": "This setting enables gzip compression. For a high-traffic website in production, the best way to put compression in place is to implement it at a reverse proxy level. You can enable it here for testing purposes." + "compression.help": "Bu ayar gzip sıkıştırmasını etkinleştirir. Üretimdeki yüksek trafiğe sahip bir web sitesi için sıkıştırmayı uygulamaya koymanın en iyi yolu ters proxy düzeyinden uygulamaktır. Test amacıyla buradan etkinleştirebilirsiniz." } \ No newline at end of file diff --git a/public/language/tr/admin/settings/api.json b/public/language/tr/admin/settings/api.json index 4cf4394504..1f1f40a6b5 100644 --- a/public/language/tr/admin/settings/api.json +++ b/public/language/tr/admin/settings/api.json @@ -2,14 +2,14 @@ "tokens": "Jetonlar (Tokens)", "settings": "Ayarlar", "lead-text": "Bu sayfadan NodeBB'deki \"Write API\"e erişimi yapılandırabilirsiniz.", - "intro": "By default, the Write API authenticates users based on their session cookie, but NodeBB also supports Bearer authentication via tokens generated via this page.", + "intro": "Varsayılan olarak, Yazma API'si kullanıcıların kimliklerini oturum tanımlama bilgileri temelinde doğrular, ancak NodeBB ayrıca bu sayfa aracılığıyla oluşturulan belirteçler aracılığıyla Taşıyıcı kimlik doğrulamasını da destekler.", "docs": "Tüm API özeliklerine erişmek için buraya tıklayın. ", "require-https": "API kullanımı için HTTPS kısıtlaması gerektir", - "require-https-caveat": "Note: Some installations involving load balancers may proxy their requests to NodeBB using HTTP, in which case this option should remain disabled.", + "require-https-caveat": "Not: Yük dengeleyicilerini içeren bazı kurulumlar, isteklerini HTTP kullanarak NodeBB'ye proxy uygulayabilir, bu durumda bu seçenek devre dışı kalmalıdır.", "uid": "Kullanıcı ID", - "uid-help-text": "Specify a User ID to associate with this token. If the user ID is 0, it will be considered a master token, which can assume the identity of other users based on the _uid parameter", + "uid-help-text": "Bu jetonla ilişkilendirilecek bir Kullanıcı Kimliği belirtin. Kullanıcı kimliği 0 ise, diğer kullanıcıların kimliğini _uid parametresine göre üstlenebilen bir ana simge olarak kabul edilir.", "description": "Açıklama", "no-description": "Hiçbir açıklama belirtilmemiş.", "token-on-save": "Form kaydedildikten sonra bir jeton oluşturulacak" diff --git a/public/language/tr/notifications.json b/public/language/tr/notifications.json index 7d15ede5c0..73ed0560ef 100644 --- a/public/language/tr/notifications.json +++ b/public/language/tr/notifications.json @@ -47,8 +47,8 @@ "posts-exported": "%1 iletileri hazırlandı, indirmek için tıklayınız", "uploads-exported": "%1 yüklemeleri hazırlandı, indirmek için tıklayınız", "users-csv-exported": "Kullanıcılar csv hazırlandı, indirmek için tıklayınız", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-accepted": "Sıradaki gönderiniz kabul edildi. Gönderinizi görmek için burayı tıklayın.", + "post-queue-rejected": "Sıraya alınmış gönderiniz reddedildi.", "email-confirmed": "E-posta onaylandı", "email-confirmed-message": "E-postanızı onayladığınız için teşekkürler. Hesabınız tamamen aktif edildi.", "email-confirm-error-message": "E-posta adresinizi onaylarken bir hata oluştu. Kodunuz geçersiz ya da eski olabilir.", diff --git a/public/language/tr/success.json b/public/language/tr/success.json index dc9f9c77c3..d474f90a92 100644 --- a/public/language/tr/success.json +++ b/public/language/tr/success.json @@ -1,7 +1,7 @@ { "success": "Başarılı", "topic-post": "Başarıyla gönderim yaptınız.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Gönderiniz onay için sıraya alındı. Kabul edildiğinde veya reddedildiğinde bir bildirim alacaksınız.", "authentication-successful": "Doğrulama Başarılı", "settings-saved": "Ayarlar kaydedildi!" } \ No newline at end of file From 45a4bb4174411ae064a623f6f1a60056a8c282cf Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 5 May 2021 09:10:08 +0000 Subject: [PATCH 037/116] Latest translations and fallbacks --- public/language/nb/admin/settings/guest.json | 8 +-- public/language/nb/global.json | 70 ++++++++++---------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/public/language/nb/admin/settings/guest.json b/public/language/nb/admin/settings/guest.json index 75d44f37e4..ab416c7889 100644 --- a/public/language/nb/admin/settings/guest.json +++ b/public/language/nb/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "settings": "Settings", + "settings": "Innstillinger ", "handles.enabled": "Allow guest handles", - "handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"", - "topic-views.enabled": "Allow guests to increase topic view counts", - "reply-notifications.enabled": "Allow guests to generate reply notifications" + "handles.enabled-help": "Dette alternativet viser et nytt felt som lar gjestene velge et navn som kan knyttes til hvert innlegg de lager. Hvis de er deaktivert, vil de bare bli kalt \"Gjest\"", + "topic-views.enabled": "La gjestene øke antall visninger av emner", + "reply-notifications.enabled": "La gjestene generere varsler på svar" } \ No newline at end of file diff --git a/public/language/nb/global.json b/public/language/nb/global.json index d84cf80d27..cc4126c945 100644 --- a/public/language/nb/global.json +++ b/public/language/nb/global.json @@ -47,45 +47,45 @@ "alert.error": "Feil", "alert.banned": "Utestengt", "alert.banned.message": "Du har nettop blitt utestengt, din tilgang er nå begrenset.", - "alert.unbanned": "Unbanned", + "alert.unbanned": "Ikke utestengt", "alert.unbanned.message": "Utestengelsen er opphevet", "alert.unfollow": "Du følger ikke lenger %1!", "alert.follow": "Du følger nå %1!", "users": "Brukere", "topics": "Emner", "posts": "Innlegg", - "x-posts": "%1 posts", + "x-posts": "%1 post", "best": "Best", "votes": "Stemmer", - "x-votes": "%1 votes", - "voters": "Voters", - "upvoters": "Upvoters", - "upvoted": "Upvoted", - "downvoters": "Downvoters", - "downvoted": "Downvoted", + "x-votes": "%1 stemmer", + "voters": "Velgere", + "upvoters": "Oppstemmere", + "upvoted": "Oppstemt ", + "downvoters": "Nedstemmer", + "downvoted": "Nedstemte ", "views": "Visninger", - "posters": "Posters", + "posters": "Innlegg ", "reputation": "Rykte", - "lastpost": "Last post", - "firstpost": "First post", + "lastpost": "Seneste innlegg", + "firstpost": "Første innlegg ", "read_more": "les mer", "more": "Mer", "posted_ago_by_guest": "skrevet %1 av Gjest", "posted_ago_by": "skrevet %1 av %2", "posted_ago": "skrevet %1", - "posted_in": "posted in %1", - "posted_in_by": "posted in %1 by %2", + "posted_in": "skrevet i %1", + "posted_in_by": "skrevet i %1 %2", "posted_in_ago": "skrevet i %1 %2", "posted_in_ago_by": "skrevet i %1 %2 av %3", "user_posted_ago": "%1 skrev %2", "guest_posted_ago": "Gjest skrev den %1", - "last_edited_by": "last edited by %1", + "last_edited_by": "sist endret av %1", "norecentposts": "Ingen nylige innlegg", "norecenttopics": "Ingen nye tråder", "recentposts": "Seneste innlegg", "recentips": "Seneste innloggede IPer", - "moderator_tools": "Moderator Tools", - "online": "Online", + "moderator_tools": "Moderatorverktøy", + "online": "Pålogget", "away": "Borte", "dnd": "Ikke forstyrr", "invisible": "Usynlig", @@ -94,9 +94,9 @@ "language": "Språk", "guest": "Gjest", "guests": "Gjester", - "former_user": "A Former User", - "system-user": "System", - "unknown-user": "Unknown user", + "former_user": "En tidligere bruker", + "system-user": "System ", + "unknown-user": "Ukjent bruker", "updated.title": "Forum oppdatert", "updated.message": "Dette forumet har nettopp blitt oppdatert til den nyeste versjonen. Klikk her for å laste siden på nytt.", "privacy": "Personvern", @@ -104,21 +104,21 @@ "unfollow": "Avfølg", "delete_all": "Slett alle", "map": "Kart", - "sessions": "Login Sessions", - "ip_address": "IP Address", - "enter_page_number": "Enter page number", - "upload_file": "Upload file", - "upload": "Upload", - "uploads": "Uploads", - "allowed-file-types": "Allowed file types are %1", - "unsaved-changes": "You have unsaved changes. Are you sure you wish to navigate away?", - "reconnecting-message": "Looks like your connection to %1 was lost, please wait while we try to reconnect.", - "play": "Play", - "cookies.message": "This website uses cookies to ensure you get the best experience on our website.", - "cookies.accept": "Got it!", - "cookies.learn_more": "Learn More", - "edited": "Edited", - "disabled": "Disabled", - "select": "Select", + "sessions": "Påloggingsøkt ", + "ip_address": "IP-adresse", + "enter_page_number": "Tast inn sidenummer", + "upload_file": "Last opp fil ", + "upload": "Last opp", + "uploads": "Opplastninger", + "allowed-file-types": "Tillatte filtyper er %1", + "unsaved-changes": "Du har endringer som ikke er lagret. Er du sikker på at du ønsker å navigere bort?", + "reconnecting-message": "Ser ut til at forbindelsen med %1 forsvant, vær vennlig å vent mens vi forsøker å gjenopprette forbindelsen. ", + "play": "Start", + "cookies.message": "Dette nettstedet bruker informasjonskapsler for å sikre at du får den beste opplevelsen på nettstedet vårt.", + "cookies.accept": "Forstått!", + "cookies.learn_more": "Lær mer", + "edited": "Redigert", + "disabled": "Deaktivert ", + "select": "Velg", "user-search-prompt": "Skriv her for å finne andre brukere..." } \ No newline at end of file From 22ec1ea5a61b3ae4550499c680da0fe6388c36ae Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 5 May 2021 20:26:33 +0000 Subject: [PATCH 038/116] fix(deps): update dependency postcss to v8.2.14 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 1e4a20581d..451e4e88db 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "passport-local": "1.0.0", "pg": "^8.5.1", "pg-cursor": "^2.5.2", - "postcss": "8.2.13", + "postcss": "8.2.14", "postcss-clean": "1.2.0", "prompt": "^1.1.0", "redis": "3.1.2", From 3cfd8f7671383a985c2e97687269f0ce8831eb4c Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 6 May 2021 09:12:28 +0000 Subject: [PATCH 039/116] Latest translations and fallbacks --- public/language/nb/flags.json | 106 +++++++++++++++++----------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/public/language/nb/flags.json b/public/language/nb/flags.json index bec69fc1a8..da3c132846 100644 --- a/public/language/nb/flags.json +++ b/public/language/nb/flags.json @@ -1,78 +1,78 @@ { "state": "State", - "reports": "Reports", - "first-reported": "First Reported", - "no-flags": "Hooray! No flags found.", - "assignee": "Assignee", - "update": "Update", - "updated": "Updated", - "resolved": "Resolved", - "target-purged": "The content this flag referred to has been purged and is no longer available.", + "reports": "Rapporter", + "first-reported": "Først rapportert", + "no-flags": "Hurra! Ingen flagg funnet", + "assignee": "Tildelt", + "update": "Oppdater ", + "updated": "Oppdatert", + "resolved": "Løst", + "target-purged": "Innholdet dette flagget refererte til er renset og er ikke lenger tilgjengelig.", - "graph-label": "Daily Flags", - "quick-filters": "Quick Filters", - "filter-active": "There are one or more filters active in this list of flags", - "filter-reset": "Remove Filters", - "filters": "Filter Options", + "graph-label": "Daglige flagg", + "quick-filters": "Raske filter", + "filter-active": "Det er ett eller flere filtre som er aktive i denne listen over flagg", + "filter-reset": "Fjern filtre ", + "filters": "Filteralternativer", "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "All Content", - "filter-type-post": "Post", - "filter-type-user": "User", - "filter-state": "State", - "filter-assignee": "Assignee UID", - "filter-cid": "Category", - "filter-quick-mine": "Assigned to me", - "filter-cid-all": "All categories", - "apply-filters": "Apply Filters", - "more-filters": "More Filters", - "fewer-filters": "Fewer Filters", + "filter-targetUid": "Flaggede UID", + "filter-type": "Flaggtype", + "filter-type-all": "alt innhold", + "filter-type-post": "Innlegg", + "filter-type-user": "Bruker", + "filter-state": "Status", + "filter-assignee": "Rettighetshavers UID", + "filter-cid": "Kategori", + "filter-quick-mine": "Tildelt til meg", + "filter-cid-all": "Alle kategorier", + "apply-filters": "Bruke filtre", + "more-filters": "Flere filtre ", + "fewer-filters": "Færre filtre", - "quick-actions": "Quick Actions", - "flagged-user": "Flagged User", - "view-profile": "View Profile", - "start-new-chat": "Start New Chat", - "go-to-target": "View Flag Target", - "assign-to-me": "Assign To Me", - "delete-post": "Delete Post", - "purge-post": "Purge Post", - "restore-post": "Restore Post", + "quick-actions": "Raske handlinger ", + "flagged-user": "Flagget bruker", + "view-profile": "Vis profil", + "start-new-chat": "Start ny chat", + "go-to-target": "Vis flaggmålet", + "assign-to-me": "Tildel til meg", + "delete-post": "Slett innlegg", + "purge-post": "Rens post", + "restore-post": "Gjenopprett post", - "user-view": "View Profile", - "user-edit": "Edit Profile", + "user-view": "Vis profil", + "user-edit": "Rediger profil", - "notes": "Flag Notes", - "add-note": "Add Note", - "no-notes": "No shared notes.", + "notes": "Flaggnotiser", + "add-note": "Legg til flagg", + "no-notes": "Ingen delte notiser ", "delete-note-confirm": "Are you sure you want to delete this flag note?", "note-added": "Note Added", "note-deleted": "Note Deleted", "history": "Account & Flag History", - "no-history": "No flag history.", + "no-history": "Ingen flagghistorikk", - "state-all": "All states", - "state-open": "New/Open", - "state-wip": "Work in Progress", - "state-resolved": "Resolved", - "state-rejected": "Rejected", - "no-assignee": "Not Assigned", + "state-all": "Alle statuser", + "state-open": "Ny/Åpne", + "state-wip": "Under arbeid ", + "state-resolved": "Løst", + "state-rejected": "Avvist", + "no-assignee": "Ikke tildelt", - "sort": "Sort by", - "sort-newest": "Newest first", - "sort-oldest": "Oldest first", + "sort": "Sorter etter", + "sort-newest": "Nyeste først", + "sort-oldest": "Eldste først", "sort-reports": "Most reports", "sort-all": "All flag types...", "sort-posts-only": "Posts only...", "sort-downvotes": "Most downvotes", "sort-upvotes": "Most upvotes", - "sort-replies": "Most replies", + "sort-replies": "Flest kommentarer", - "modal-title": "Report Content", + "modal-title": "Rapporter innhold", "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", - "modal-reason-offensive": "Offensive", + "modal-reason-offensive": "Støtende", "modal-reason-other": "Other (specify below)", "modal-reason-custom": "Reason for reporting this content...", "modal-submit": "Submit Report", From ff98f854887147e251b8259d15a748f9c62b9c2a Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 6 May 2021 13:21:23 +0000 Subject: [PATCH 040/116] fix(deps): update socket.io packages to v4.0.2 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 451e4e88db..98b06c5ef5 100644 --- a/install/package.json +++ b/install/package.json @@ -119,9 +119,9 @@ "sharp": "0.28.1", "sitemap": "^7.0.0", "slideout": "1.0.1", - "socket.io": "4.0.1", + "socket.io": "4.0.2", "socket.io-adapter-cluster": "^1.0.1", - "socket.io-client": "4.0.1", + "socket.io-client": "4.0.2", "socket.io-redis": "6.1.0", "sortablejs": "1.13.0", "spdx-license-list": "^6.4.0", From 2c22b06feb48b86debd40af9c2ec72d67f2c8076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 May 2021 12:44:01 -0400 Subject: [PATCH 041/116] fix: isObjectField(s) empty field --- src/database/mongo/hash.js | 4 +++- test/database/hash.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index 452ecf9d6e..ec8a0b9c03 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -156,7 +156,9 @@ module.exports = function (module) { const data = {}; fields.forEach((field) => { field = helpers.fieldToString(field); - data[field] = 1; + if (field) { + data[field] = 1; + } }); const item = await module.client.collection('objects').findOne({ _key: key }, { projection: data }); diff --git a/test/database/hash.js b/test/database/hash.js index 9ac9b3a40f..39c4e39624 100644 --- a/test/database/hash.js +++ b/test/database/hash.js @@ -406,6 +406,11 @@ describe('Hash methods', () => { done(); }); }); + + it('should not error if field is falsy', async () => { + const value = await db.isObjectField('hashTestObjectEmpty', ''); + assert.strictEqual(value, false); + }); }); @@ -427,6 +432,11 @@ describe('Hash methods', () => { done(); }); }); + + it('should not error if one field is falsy', async () => { + const values = await db.isObjectFields('hashTestObject', ['name', '']); + assert.deepStrictEqual(values, [true, false]); + }); }); describe('deleteObjectField()', () => { From d8a8864cee4fded0678b0814f230aa577ce20c7b Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 7 May 2021 09:14:07 +0000 Subject: [PATCH 042/116] Latest translations and fallbacks --- public/language/nb/flags.json | 40 +++++++++--------- public/language/nb/notifications.json | 60 +++++++++++++-------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/public/language/nb/flags.json b/public/language/nb/flags.json index da3c132846..822f6aac34 100644 --- a/public/language/nb/flags.json +++ b/public/language/nb/flags.json @@ -14,7 +14,7 @@ "filter-active": "Det er ett eller flere filtre som er aktive i denne listen over flagg", "filter-reset": "Fjern filtre ", "filters": "Filteralternativer", - "filter-reporterId": "Reporter UID", + "filter-reporterId": "Rapporter UID", "filter-targetUid": "Flaggede UID", "filter-type": "Flaggtype", "filter-type-all": "alt innhold", @@ -45,9 +45,9 @@ "notes": "Flaggnotiser", "add-note": "Legg til flagg", "no-notes": "Ingen delte notiser ", - "delete-note-confirm": "Are you sure you want to delete this flag note?", - "note-added": "Note Added", - "note-deleted": "Note Deleted", + "delete-note-confirm": "Er du sikker på at du ønsker å slette flaggnotifikasjonen? ", + "note-added": "Merknad lagt til", + "note-deleted": "Merknad slettet", "history": "Account & Flag History", "no-history": "Ingen flagghistorikk", @@ -62,27 +62,27 @@ "sort": "Sorter etter", "sort-newest": "Nyeste først", "sort-oldest": "Eldste først", - "sort-reports": "Most reports", - "sort-all": "All flag types...", - "sort-posts-only": "Posts only...", - "sort-downvotes": "Most downvotes", - "sort-upvotes": "Most upvotes", + "sort-reports": "Flest rapporter", + "sort-all": "Alle flaggtyper...", + "sort-posts-only": "Kun innlegg", + "sort-downvotes": "Flest nedstemninger ", + "sort-upvotes": "Flest oppstemte", "sort-replies": "Flest kommentarer", "modal-title": "Rapporter innhold", - "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", + "modal-body": "Oppgi årsaken til at du rapporterer% 1% 2. Alternativt kan du bruke en av hurtigrapportknappene hvis det er aktuelt.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Støtende", "modal-reason-other": "Other (specify below)", - "modal-reason-custom": "Reason for reporting this content...", - "modal-submit": "Submit Report", - "modal-submit-success": "Content has been flagged for moderation.", - "modal-submit-confirm": "Confirm Submission", - "modal-submit-confirm-text": "You have a custom reason specified already. Are you sure you wish to submit via quick-report?", - "modal-submit-confirm-text-help": "Submitting a quick report will overwrite any custom reasons defined.", + "modal-reason-custom": "Årsak til rapportering av dette innholdet ...", + "modal-submit": "Send inn rapporten", + "modal-submit-success": "Innholdet er flagget for moderering.", + "modal-submit-confirm": "Bekreft innlevering", + "modal-submit-confirm-text": "Du har allerede angitt en egendefinert grunn. Er du sikker på at du vil sende inn via hurtigrapport?", + "modal-submit-confirm-text-help": "Hvis du sender inn en hurtigrapport, overskriver du de definerte årsakene. ", - "bulk-actions": "Bulk Actions", - "bulk-resolve": "Resolve Flag(s)", - "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)" + "bulk-actions": "Massehandlinger", + "bulk-resolve": "Løse Flagg(ene).", + "bulk-success": "%1 flagg er oppdaterte ", + "flagged-timeago-readable": "Flaggede 11 (%2)" } \ No newline at end of file diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index dc473a3bdb..941b55b0f9 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -10,44 +10,44 @@ "return_to": "Gå tilbake til %1", "new_notification": "Du har en ny varsling", "you_have_unread_notifications": "Du har uleste varsler.", - "all": "All", - "topics": "Topics", - "replies": "Replies", - "chat": "Chats", - "follows": "Follows", - "upvote": "Upvotes", - "new-flags": "New Flags", - "my-flags": "Flags assigned to me", - "bans": "Bans", + "all": "Alle", + "topics": "Emner", + "replies": "Svar", + "chat": "Samtaler", + "follows": "Følger", + "upvote": "Oppstemmer", + "new-flags": "Nye flagg", + "my-flags": "Flagg som er tildelt til meg", + "bans": "Forbud", "new_message_from": "Ny melding fra %1", "upvoted_your_post_in": "%1 har stemt opp innlegget ditt i %2.", - "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", - "upvoted_your_post_in_multiple": "%1 and %2 others have upvoted your post in %3.", - "moved_your_post": "%1 has moved your post to %2", - "moved_your_topic": "%1 has moved %2", + "upvoted_your_post_in_dual": "%1 og 2% har stemt opp innlegget ditt i %3.", + "upvoted_your_post_in_multiple": "%1 og 2% har stemt opp innlegget ditt i %3.", + "moved_your_post": "%1 har flyttet innlegget ditt til %2.", + "moved_your_topic": "%1 har flyttet %2", "user_flagged_post_in": "%1 har flagget et innlegg i %2", "user_flagged_post_in_dual": "%1 and %2 flagged a post in %3", - "user_flagged_post_in_multiple": "%1 and %2 others flagged a post in %3", - "user_flagged_user": "%1 flagged a user profile (%2)", - "user_flagged_user_dual": "%1 and %2 flagged a user profile (%3)", - "user_flagged_user_multiple": "%1 and %2 others flagged a user profile (%3)", + "user_flagged_post_in_multiple": "%1 og %2 har flagget et innlegg i %3", + "user_flagged_user": "%1 flagget en brukerprofil (%2)", + "user_flagged_user_dual": "%1 og 2% har flagget en brukerprofil (%3)", + "user_flagged_user_multiple": "%1 og %2 andre flagget en brukerprofil (%3)", "user_posted_to": "%1 har skrevet et svar til: %2", - "user_posted_to_dual": "%1 and %2 have posted replies to: %3", - "user_posted_to_multiple": "%1 and %2 others have posted replies to: %3", + "user_posted_to_dual": "%1 og 2% har svart på innlegget ditt i %3.", + "user_posted_to_multiple": "%1 og 2% andre har svart på %3", "user_posted_topic": "%1 har skrevet en ny tråd: %2", - "user_edited_post": "%1 has edited a post in %2", + "user_edited_post": "%1 har redigert ett innlegg i %2", "user_started_following_you": "%1 begynte å følge deg.", - "user_started_following_you_dual": "%1 and %2 started following you.", - "user_started_following_you_multiple": "%1 and %2 others started following you.", + "user_started_following_you_dual": "%1 og 2% har begynt å følge deg. ", + "user_started_following_you_multiple": "%1 og %2 andre begynte å følge deg.", "new_register": "%1 sendte en forespørsel om registrering", - "new_register_multiple": "There are %1 registration requests awaiting review.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", - "post_awaiting_review": "Post awaiting review", - "profile-exported": "%1 profile exported, click to download", - "posts-exported": "%1 posts exported, click to download", - "uploads-exported": "%1 uploads exported, click to download", - "users-csv-exported": "Users csv exported, click to download", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", + "new_register_multiple": " Det er %1 registreringsforespørsler som venter på deg.", + "flag_assigned_to_you": "Flag %1 har blitt tildelt deg", + "post_awaiting_review": "Innlegg avventer anmeldelse", + "profile-exported": "%1 profil eksportert, klikk for å laste ned", + "posts-exported": "%1 innlegg eksportert, klikk for å laste ned", + "uploads-exported": "%1 opplastninger eksportert, klikk for å laste ned", + "users-csv-exported": "Bruker csv eksportert, klikk for å laste ned", + "post-queue-accepted": "Innlegget ditt i køen er godtatt. Klikk her for å se innlegget ditt.", "post-queue-rejected": "Your queued post has been rejected.", "email-confirmed": "E-post bekreftet", "email-confirmed-message": "Takk for at du har validert din e-post. Kontoen din er nå fullstendig aktivert.", From f6b583bb9db058ddcd11bfe58306ac3ddfc5e2a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 7 May 2021 09:32:06 -0400 Subject: [PATCH 043/116] feat: #9533, allow redirect in build hooks --- src/middleware/render.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/middleware/render.js b/src/middleware/render.js index 08f574dc5e..6e5ddb6074 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -34,9 +34,15 @@ module.exports = function (middleware) { options.bodyClass = buildBodyClass(req, res, options); const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options }); + if (res.headersSent) { + return; + } const templateToRender = buildResult.templateData.templateToRender || template; const renderResult = await plugins.hooks.fire('filter:middleware.render', { req: req, res: res, templateData: buildResult.templateData }); + if (res.headersSent) { + return; + } options = renderResult.templateData; options._header = { tags: await meta.tags.parse(req, renderResult, res.locals.metaTags, res.locals.linkTags), From 461e187b0343bf5c27936d937075519d9f12891d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 7 May 2021 10:01:26 +0000 Subject: [PATCH 044/116] chore(deps): update dependency mocha to v8.4.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 98b06c5ef5..4814d58bf4 100644 --- a/install/package.json +++ b/install/package.json @@ -153,7 +153,7 @@ "husky": "6.0.0", "jsdom": "16.5.3", "lint-staged": "10.5.4", - "mocha": "8.3.2", + "mocha": "8.4.0", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", "nyc": "15.1.0", From 1bf57d40f26aeff7ec3698ae646ddc008c07c762 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 7 May 2021 18:07:15 +0000 Subject: [PATCH 045/116] chore(deps): update dependency lint-staged to v11 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 4814d58bf4..e378507d35 100644 --- a/install/package.json +++ b/install/package.json @@ -152,7 +152,7 @@ "grunt-contrib-watch": "1.1.0", "husky": "6.0.0", "jsdom": "16.5.3", - "lint-staged": "10.5.4", + "lint-staged": "11.0.0", "mocha": "8.4.0", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", From ee3634cc5c02937250b2f3cd69833ee8e0eb68f7 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 7 May 2021 21:51:30 +0000 Subject: [PATCH 046/116] fix(deps): update dependency nodebb-plugin-markdown to v8.12.9 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index e378507d35..6ef58c9071 100644 --- a/install/package.json +++ b/install/package.json @@ -88,7 +88,7 @@ "nodebb-plugin-dbsearch": "4.2.0", "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", - "nodebb-plugin-markdown": "8.12.7", + "nodebb-plugin-markdown": "8.12.9", "nodebb-plugin-mentions": "2.13.9", "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.4", From d1418210cabbc019243f798313b19acfd9e249e8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 8 May 2021 04:18:33 +0000 Subject: [PATCH 047/116] chore(deps): update dependency eslint to v7.26.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 6ef58c9071..33f6aece63 100644 --- a/install/package.json +++ b/install/package.json @@ -145,7 +145,7 @@ "@commitlint/cli": "12.1.1", "@commitlint/config-angular": "12.1.1", "coveralls": "3.1.0", - "eslint": "7.25.0", + "eslint": "7.26.0", "eslint-config-airbnb-base": "14.2.1", "eslint-plugin-import": "2.22.1", "grunt": "1.4.0", From 230bbf01fc17c76849cdd9e039a545c28b2e0234 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 8 May 2021 09:08:16 +0000 Subject: [PATCH 048/116] Latest translations and fallbacks --- public/language/es/tags.json | 2 +- public/language/es/topic.json | 12 +++--- public/language/nb/notifications.json | 38 +++++++++--------- public/language/nb/pages.json | 58 +++++++++++++-------------- public/language/nb/user.json | 16 ++++---- public/language/sr/error.json | 38 +++++++++--------- public/language/sr/flags.json | 44 ++++++++++---------- public/language/sr/ip-blacklist.json | 28 ++++++------- 8 files changed, 118 insertions(+), 118 deletions(-) diff --git a/public/language/es/tags.json b/public/language/es/tags.json index ddea2905c6..c61d272cde 100644 --- a/public/language/es/tags.json +++ b/public/language/es/tags.json @@ -4,5 +4,5 @@ "enter_tags_here": "Introduce aquí las etiquetas, entre %1 y %2 caracteres cada una.", "enter_tags_here_short": "Introduzca las etiquetas...", "no_tags": "Aún no hay etiquetas.", - "select_tags": "Select Tags" + "select_tags": "Seleccionar Etiquetas" } \ No newline at end of file diff --git a/public/language/es/topic.json b/public/language/es/topic.json index e08c2ca404..b92af3daf6 100644 --- a/public/language/es/topic.json +++ b/public/language/es/topic.json @@ -1,6 +1,6 @@ { "topic": "Tema", - "title": "Title", + "title": "Título", "no_topics_found": "¡No se encontraron temas!", "no_posts_found": "¡No se encontraron publicaciones!", "post_is_deleted": "¡Esta publicación está eliminada!", @@ -31,18 +31,18 @@ "locked": "Cerrado", "pinned": "Fijo", "pinned-with-expiry": "Pinned until %1", - "scheduled": "Scheduled", + "scheduled": "Programado", "moved": "Movido", "moved-from": "Moved from %1", "copy-ip": "Copiar IP", "ban-ip": "Banear IP", "view-history": "Editar Historial", - "locked-by": "Locked by", - "unlocked-by": "Unlocked by", + "locked-by": "Bloqueado por", + "unlocked-by": "Desbloqueado por", "pinned-by": "Pinned by", "unpinned-by": "Unpinned by", - "deleted-by": "Deleted by", - "restored-by": "Restored by", + "deleted-by": "Borrado por", + "restored-by": "Restaurado por", "queued-by": "Post queued for approval →", "bookmark_instructions": "Haz click aquí para volver a tu último mensaje leído en este tema", "flag-post": "Flag this post", diff --git a/public/language/nb/notifications.json b/public/language/nb/notifications.json index 941b55b0f9..15ec6a34b4 100644 --- a/public/language/nb/notifications.json +++ b/public/language/nb/notifications.json @@ -48,27 +48,27 @@ "uploads-exported": "%1 opplastninger eksportert, klikk for å laste ned", "users-csv-exported": "Bruker csv eksportert, klikk for å laste ned", "post-queue-accepted": "Innlegget ditt i køen er godtatt. Klikk her for å se innlegget ditt.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-rejected": "Innlegget dit i køen har blitt avvist", "email-confirmed": "E-post bekreftet", "email-confirmed-message": "Takk for at du har validert din e-post. Kontoen din er nå fullstendig aktivert.", "email-confirm-error-message": "Det oppsto et problem under valdiering av din e-post. Koden kan ha vært ugyldig eller ha utløpt.", "email-confirm-sent": "Bekreftelsesepost sendt.", - "none": "None", - "notification_only": "Notification Only", - "email_only": "Email Only", - "notification_and_email": "Notification & Email", - "notificationType_upvote": "When someone upvotes your post", - "notificationType_new-topic": "When someone you follow posts a topic", - "notificationType_new-reply": "When a new reply is posted in a topic you are watching", - "notificationType_post-edit": "When a post is edited in a topic you are watching", - "notificationType_follow": "When someone starts following you", - "notificationType_new-chat": "When you receive a chat message", - "notificationType_new-group-chat": "When you receive a group chat message", - "notificationType_group-invite": "When you receive a group invite", - "notificationType_group-leave": "When a user leaves your group", - "notificationType_group-request-membership": "When someone requests to join a group you own", - "notificationType_new-register": "When someone gets added to registration queue", - "notificationType_post-queue": "When a new post is queued", - "notificationType_new-post-flag": "When a post is flagged", - "notificationType_new-user-flag": "When a user is flagged" + "none": "Ingen", + "notification_only": "Kun notifikasjon ", + "email_only": "Kun e-post", + "notification_and_email": "Notifikasjon og e-post ", + "notificationType_upvote": "Når noen stemmer opp innlegget ditt", + "notificationType_new-topic": "Når noen du følger følger legger ut et emne", + "notificationType_new-reply": "Når et nytt svar er lagt ut i et emne du overvåker", + "notificationType_post-edit": "Når et innlegg er redigert i et emne du overvåker", + "notificationType_follow": "Når noen starter å følge deg", + "notificationType_new-chat": "Når du mottar en melding i chatt", + "notificationType_new-group-chat": "Når du mottar en gruppemelding i chatt", + "notificationType_group-invite": "Når du får tilsendt en gruppeinvitasjon ", + "notificationType_group-leave": "Når en bruker forlater gruppen din", + "notificationType_group-request-membership": "Når noen sender en forespørsel om å bli med i en gruppe du eier", + "notificationType_new-register": "Når noen blir lag til i kø for å registrere", + "notificationType_post-queue": "Når et nytt innlegg er satt i kø ", + "notificationType_new-post-flag": "Når ett nytt innlegg er flagget", + "notificationType_new-user-flag": "Når en bruker er flagget" } \ No newline at end of file diff --git a/public/language/nb/pages.json b/public/language/nb/pages.json index ac0317a671..40081fd02d 100644 --- a/public/language/nb/pages.json +++ b/public/language/nb/pages.json @@ -6,26 +6,26 @@ "popular-month": "Populære emner denne måneden", "popular-alltime": "Mest populære emner for all tid", "recent": "Nylige emner", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", - "moderator-tools": "Moderator Tools", - "flagged-content": "Flagged Content", - "ip-blacklist": "IP Blacklist", - "post-queue": "Post Queue", + "top-day": "Dagens emne med fleste stemmer", + "top-week": "Emne med flest stemmer denne uken", + "top-month": "Emne med flest stemme denne måneden ", + "top-alltime": "Emner med flest stemmer", + "moderator-tools": "Moderatorverktøy", + "flagged-content": "Flagget innhold", + "ip-blacklist": "IP Svarteliste", + "post-queue": "Innleggskø", "users/online": "Påloggede Brukere", "users/latest": "Nyeste Brukere", "users/sort-posts": "Brukere med flest innlegg", "users/sort-reputation": "Brukere med best rykte", - "users/banned": "Banned Users", - "users/most-flags": "Most flagged users", + "users/banned": "Utestengte brukere", + "users/most-flags": "Brukere som er mest flagget ", "users/search": "Brukersøk", "notifications": "Varsler", "tags": "Emneord", "tag": "Tråder tagget under "%1"", "register": "Registrer en konto", - "registration-complete": "Registration complete", + "registration-complete": "Registrering er fullført", "login": "Logg inn på kontoen din", "reset": "Tilbakestill passordet ditt", "categories": "Kategorier", @@ -33,32 +33,32 @@ "group": "%1 gruppe", "chats": "Samtaler", "chat": "Samtale med %1", - "flags": "Flags", - "flag-details": "Flag %1 Details", + "flags": "Flagg", + "flag-details": "Flagg %1 Detaljer", "account/edit": "Endrer \"%1\"", - "account/edit/password": "Editing password of \"%1\"", - "account/edit/username": "Editing username of \"%1\"", - "account/edit/email": "Editing email of \"%1\"", - "account/info": "Account Info", + "account/edit/password": "Redigeringspassord for \"%1\"", + "account/edit/username": "Rediger brukernavnet til \"%1\"", + "account/edit/email": "Rediger e-post for \"%1\"", + "account/info": "Informasjon om brukerkonto ", "account/following": "Personer %1 følger", "account/followers": "Personer som følger %1", "account/posts": "Innlegg opprettet av %1", - "account/latest-posts": "Latest posts made by %1", + "account/latest-posts": "Seneste innlegg skrevet av %1", "account/topics": "Emner opprettet av %1", "account/groups": "%1 sine grupper", - "account/watched_categories": "%1's Watched Categories", - "account/bookmarks": "%1's Bookmarked Posts", + "account/watched_categories": "%1's overvåkede kategorier", + "account/bookmarks": "%1's bokmerkede innlegg", "account/settings": "Brukerinnstillinger", "account/watched": "Innlegg overvåket av %1", - "account/ignored": "Topics ignored by %1", - "account/upvoted": "Posts upvoted by %1", - "account/downvoted": "Posts downvoted by %1", - "account/best": "Best posts made by %1", - "account/blocks": "Blocked users for %1", - "account/uploads": "Uploads by %1", - "account/sessions": "Login Sessions", - "confirm": "Email Confirmed", + "account/ignored": "Emner ignorert av %1", + "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/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 is currently unavailable due to excessive load. Please come back another time." + "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/user.json b/public/language/nb/user.json index e04a5253b5..bbd7f1a3ee 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -1,23 +1,23 @@ { "banned": "Utestengt", "offline": "Offline", - "deleted": "Deleted", + "deleted": "Slettet", "username": "Brukernavn", "joindate": "Registereringsdato", "postcount": "Antall innlegg", "email": "E-post", "confirm_email": "Bekfreft e-post", - "account_info": "Account Info", - "admin_actions_label": "Administrative Actions", + "account_info": "Kontoinformasjon", + "admin_actions_label": "Administrative handlinger ", "ban_account": "Utesteng kont", "ban_account_confirm": "Vil du virkelig utestenge denne brukeren?", "unban_account": "Opphev utestenging", "delete_account": "Slett konto", - "delete_account_as_admin": "Delete Account", - "delete_content": "Delete Account Content", - "delete_all": "Delete Account and Content", - "delete_account_confirm": "Are you sure you want to anonymize your posts and delete your account?
This action is irreversible and you will not be able to recover any of your data

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

", + "delete_account_as_admin": "Slett Brukerkonto", + "delete_content": "Slett brukerkonto Innhold", + "delete_all": "Slett Brukerkonto og Innhold", + "delete_account_confirm": "Er du sikker på at du vil anonymisere alle innleggene dine og slette brukerkonten?
Denne handlingen er irreversibel, og du vil ikke kunne gjenopprette noen av dataene dine

Skriv inn passordet ditt for å bekrefte at du ønsker å slette denne brukerkontoen.", + "delete_this_account_confirm": "Er du sikker på at du vil slette denne brukerkontoen og la innholdet ligge igjen?
Denne handlingen er irreversibel, innlegg blir anonymisert, og du vil ikke kunne gjenopprette innleggsassosiasjoner med den slettede kontoen

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

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

", "account-deleted": "Konto slettet", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 2f2acbd19c..1c4f97bb65 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -89,13 +89,13 @@ "file-too-big": "Највећа дозвољена величина датотеке је %1 kB - отпремите мању датотеку.", "guest-upload-disabled": "Гостима је онемогућено отпремање", "cors-error": "Није могуће отпремити слику због погрешно конфигурисаног CORS", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", - "scheduling-to-past": "Please select a date in the future.", - "invalid-schedule-date": "Please enter a valid date and time.", - "cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.", - "cant-merge-scheduled": "Scheduled topics cannot be merged.", - "cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.", - "cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.", + "upload-ratelimit-reached": "Отпремили сте превише датотека одједном. Покушајте поново касније.", + "scheduling-to-past": "Изаберите датум у будућности.", + "invalid-schedule-date": "Унесите важећи датум и време.", + "cant-pin-scheduled": "Планиране теме се не могу закачити/откачити.", + "cant-merge-scheduled": "Планиране теме се не могу спојити.", + "cant-move-posts-to-scheduled": "Није могуће преместити поруке у планирану тему.", + "cant-move-from-scheduled-to-existing": "Није могуће преместити поруке из планиране теме у постојећу.", "already-bookmarked": "Већ сте додали ову поруку у обележиваче", "already-unbookmarked": "Већ сте одстранили ову поруку из обележивача", "cant-ban-other-admins": "Не можете забранити друге администраторе!", @@ -153,14 +153,14 @@ "not-enough-reputation-min-rep-signature": "Немате довољно велики углед да бисте додали потпис", "not-enough-reputation-min-rep-profile-picture": "Немате довољно велики углед да бисте додали слику профила", "not-enough-reputation-min-rep-cover-picture": "Немате довољно велики углед да бисте додали насловну слику", - "post-already-flagged": "You have already flagged this post", - "user-already-flagged": "You have already flagged this user", - "post-flagged-too-many-times": "This post has been flagged by others already", - "user-flagged-too-many-times": "This user has been flagged by others already", - "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "post-already-flagged": "Већ сте означили заставицом ову поруку", + "user-already-flagged": "Већ сте означили заставицом овог корисника", + "post-flagged-too-many-times": "Ову поруку су већ означили заставицом други", + "user-flagged-too-many-times": "Овог корисника су већ означили заставицом други", + "cant-flag-privileged": "Није вам дозвољено да означавате заставицом профиле или садржај привилегованих корисника (модератори/глобални модератори/администратори)", "self-vote": "Не можете гласати за своју поруку", - "too-many-downvotes-today": "You can only downvote %1 times a day", - "too-many-downvotes-today-user": "You can only downvote a user %1 times a day", + "too-many-downvotes-today": "Можете негативно гласати само %1 пута дневно", + "too-many-downvotes-today-user": "Можете негативно гласати за корисника само %1 пута дневно", "reload-failed": "NodeBB је наишао на проблем док се поново учитавао: \"%1\". NodeBB ће наставити да опслужује постојећа клијентска средства , иако би требало да опозовете оно што сте урадили пре поновног учитавања.", "registration-error": "Грешка при регистрацији", "parse-error": "Нешто је кренуло погрешно приликом анализе одговора сервера", @@ -185,9 +185,9 @@ "already-blocked": "Овај корисник је већ блокиран", "already-unblocked": "Овај корисник је већ одблокиран", "no-connection": "Изгледа да постоји проблем са вашом интернет везом", - "socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later", - "plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP", - "topic-event-unrecognized": "Topic event '%1' unrecognized", - "cant-set-child-as-parent": "Can't set child as parent category", - "cant-set-self-as-parent": "Can't set self as parent category" + "socket-reconnect-failed": "Тренутно није могуће приступити серверу. Кликните овде да бисте покушали поново или покушајте поново касније", + "plugin-not-whitelisted": "Инсталација додатне компоненте &ndash није могућа; преко ACP-а могу се инсталирати само додатне компоненте које је на белој листи ставио NodeBB Package Manager", + "topic-event-unrecognized": "Догађај из теме „%1“ није препознат", + "cant-set-child-as-parent": "Није могуће поставити подређену категорију као надређену", + "cant-set-self-as-parent": "Није могуће поставити себе као надређену категорију" } \ No newline at end of file diff --git a/public/language/sr/flags.json b/public/language/sr/flags.json index c159a5120a..f247d97a64 100644 --- a/public/language/sr/flags.json +++ b/public/language/sr/flags.json @@ -1,12 +1,12 @@ { "state": "Стање", - "reports": "Reports", - "first-reported": "First Reported", + "reports": "Извештаји", + "first-reported": "Прво пријављено", "no-flags": "Ура! Нема заставица.", "assignee": "Заступник", "update": "Ажурирај", "updated": "Ажурирано", - "resolved": "Resolved", + "resolved": "Решено", "target-purged": "Садржај на који се односи ова заставица је очишћен и није више доступан.", "graph-label": "Дневне заставице", @@ -26,8 +26,8 @@ "filter-quick-mine": "Додељено мени", "filter-cid-all": "Све категорије", "apply-filters": "Примени филтере", - "more-filters": "More Filters", - "fewer-filters": "Fewer Filters", + "more-filters": "Више филтера", + "fewer-filters": "Мање филтера", "quick-actions": "Брзе радње", "flagged-user": "Означени корисник", @@ -42,12 +42,12 @@ "user-view": "Погледај профил", "user-edit": "Уреди профил", - "notes": "Белешке о заставицама", + "notes": "Белешке са заставицама", "add-note": "Додај белешку", "no-notes": "Нема дељених бележака.", - "delete-note-confirm": "Are you sure you want to delete this flag note?", + "delete-note-confirm": "Да ли сте сигурни да желите избрисати ову белешку са заставицом?", "note-added": "Белешка је додата", - "note-deleted": "Note Deleted", + "note-deleted": "Белешка је избрисана", "history": "Налог и историја заставица", "no-history": "Нема историје заставица", @@ -59,17 +59,17 @@ "state-rejected": "Одбијено", "no-assignee": "Недодељено", - "sort": "Sort by", - "sort-newest": "Newest first", - "sort-oldest": "Oldest first", - "sort-reports": "Most reports", - "sort-all": "All flag types...", - "sort-posts-only": "Posts only...", - "sort-downvotes": "Most downvotes", - "sort-upvotes": "Most upvotes", - "sort-replies": "Most replies", + "sort": "Сортирај по", + "sort-newest": "Прво најновије", + "sort-oldest": "Прво најстарије", + "sort-reports": "Највише извештаја", + "sort-all": "Сви типови заставица...", + "sort-posts-only": "Само поруке...", + "sort-downvotes": "Највише негативних гласова", + "sort-upvotes": "Највише гласова", + "sort-replies": "Највише одговора", - "modal-title": "Report Content", + "modal-title": "Извештај о садржају", "modal-body": "Наведите разлог за означавање %1 %2 за проверу. Алтернативно, користите један од тастера за брзу пријаву ко је применљиво.", "modal-reason-spam": "Непожељно", "modal-reason-offensive": "Увредљиво", @@ -81,8 +81,8 @@ "modal-submit-confirm-text": "Већ имате наведени прилагођени разлог. Да ли сте сигурни да желите послати путем брзог извештаја?", "modal-submit-confirm-text-help": "Подношење брзог извештаја ће заменити све прилагођене разлоге.", - "bulk-actions": "Bulk Actions", - "bulk-resolve": "Resolve Flag(s)", - "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)" + "bulk-actions": "Масовне радње", + "bulk-resolve": "Реши заставицу/е", + "bulk-success": "Ажурираних заставица: %1", + "flagged-timeago-readable": "Означено заставицом (%2)" } \ No newline at end of file diff --git a/public/language/sr/ip-blacklist.json b/public/language/sr/ip-blacklist.json index 588fbd62b6..ad61ee7aa4 100644 --- a/public/language/sr/ip-blacklist.json +++ b/public/language/sr/ip-blacklist.json @@ -1,19 +1,19 @@ { - "lead": "Configure your IP blacklist here.", - "description": "Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and they will be prevented from logging in to or registering a new account.", - "active-rules": "Active Rules", - "validate": "Validate Blacklist", - "apply": "Apply Blacklist", - "hints": "Syntax Hints", - "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", - "hint-2": "You can add in comments by starting lines with the # symbol.", + "lead": "Овде конфигуришите своју црну листу IP-а.", + "description": "Забрана корисничког налога некад није довољно средство за одвраћање. Понекад је ограничавање приступа форуму одређеној IP адреси или низу IP адреса најбољи начин да се форум заштити. У овим сценаријима можете додати проблематичне IP адресе или читаве CIDR блокове на ову црну листу и биће им онемогућено да се пријаве или региструју нови налог.", + "active-rules": "Активна правила", + "validate": "Потврдите црну листу", + "apply": "Примени црну листу", + "hints": "Савети за синтаксу", + "hint-1": "Дефинишите једну IP адресу по реду. Можете додати IP блокове све док следе формат CIDR (нпр. 192.168.100.0/22).", + "hint-2": "У коментаре можете додавати почетне редове са симболом #.", - "validate.x-valid": "%1 out of %2 rule(s) valid.", - "validate.x-invalid": "The following %1 rules are invalid:", + "validate.x-valid": "%1 од %2 правила важеће.", + "validate.x-invalid": "Следећа правила (укупно %1) су неважећа:", - "alerts.applied-success": "Blacklist Applied", + "alerts.applied-success": "Црна листа је примењена", - "analytics.blacklist-hourly": "Figure 1 – Blacklist hits per hour", - "analytics.blacklist-daily": "Figure 2 – Blacklist hits per day", - "ip-banned": "IP banned" + "analytics.blacklist-hourly": "Figure 1 – број посета са црне листе на сат", + "analytics.blacklist-daily": "Figure 1 – број посета са црне листе на дан", + "ip-banned": "IP је забрањен" } \ No newline at end of file From 7f7d5a8f793136806bc0cce29046e44a358b2eb2 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sun, 9 May 2021 09:07:05 +0000 Subject: [PATCH 049/116] Latest translations and fallbacks --- public/language/ko/admin/extend/plugins.json | 2 +- public/language/ko/admin/settings/uploads.json | 6 +++--- public/language/ko/error.json | 2 +- public/language/ko/flags.json | 4 ++-- public/language/ko/notifications.json | 4 ++-- public/language/ko/success.json | 2 +- public/language/ru/error.json | 2 +- public/language/ru/user.json | 6 +++--- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/language/ko/admin/extend/plugins.json b/public/language/ko/admin/extend/plugins.json index 2f9e6006fe..aea2277f7e 100644 --- a/public/language/ko/admin/extend/plugins.json +++ b/public/language/ko/admin/extend/plugins.json @@ -39,7 +39,7 @@ "alert.upgraded": "플러그인 업그레이드 완료", "alert.installed": "플러그인 설치 완료", "alert.uninstalled": "플러그인 제거 완료", - "alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin", + "alert.activate-success": "해당 플러그인을 완벽하게 활성화하기 위해 NodeBB를 리빌드하고 다시 시작해주세요.", "alert.deactivate-success": "플러그인이 성공적으로 비활성화됐습니다.", "alert.upgrade-success": "이 플러그인을 업그레이드 하려면 NodeBB를 리빌드하고 다시 시작해주세요.", "alert.install-success": "플러그인이 성공적으로 설치됐습니다. 플러그인을 활성화 해주세요.", diff --git a/public/language/ko/admin/settings/uploads.json b/public/language/ko/admin/settings/uploads.json index fdd297a6ca..9c589448e9 100644 --- a/public/language/ko/admin/settings/uploads.json +++ b/public/language/ko/admin/settings/uploads.json @@ -21,9 +21,9 @@ "topic-thumb-size": "화제 썸네일 크기", "allowed-file-extensions": "사용 가능한 파일 확장자", "allowed-file-extensions-help": "파일 확장자 목록을 콤마(,) 로 구분지어 입력해주세요.(예: pdf, xls, doc) 빈칸으로 남기면 모든 확장자를 허용합니다. ", - "upload-limit-threshold": "Rate limit user uploads to:", - "upload-limit-threshold-per-minute": "Per %1 Minute", - "upload-limit-threshold-per-minutes": "Per %1 Minutes", + "upload-limit-threshold": "업로드 속도 제한:", + "upload-limit-threshold-per-minute": "%1분 기준", + "upload-limit-threshold-per-minutes": "%1분 기준", "profile-avatars": "프로필 사진", "allow-profile-image-uploads": "사용자들이 프로필 사진 업로드 하는것을 허용", "convert-profile-image-png": "업로드 된 프로필 사진 확장자를 PNG로 변환", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 111e01cc83..abe7a61ec6 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -89,7 +89,7 @@ "file-too-big": "업로드 가능한 파일크기는 최대 %1 KB 입니다. 파일의 용량을 줄이거나 압축을 활용하세요.", "guest-upload-disabled": "비회원의 파일 업로드는 제한되어 있습니다.", "cors-error": "잘못 구성된 CORS로 인해 이미지를 업로드 할 수 없습니다.", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", + "upload-ratelimit-reached": "한 번에 너무 많은 파일을 업로드하셨습니다. 나중에 다시 시도해주세요.", "scheduling-to-past": "내일 이후의 날짜를 선택해주세요.", "invalid-schedule-date": "적합한 형식의 날짜와 시간을 입력해주세요.", "cant-pin-scheduled": "예약된 화제는 상단에 고정(해제)할 수 없습니다.", diff --git a/public/language/ko/flags.json b/public/language/ko/flags.json index aa7e0b7a31..df0854692f 100644 --- a/public/language/ko/flags.json +++ b/public/language/ko/flags.json @@ -26,8 +26,8 @@ "filter-quick-mine": "나에게 배정된 신고", "filter-cid-all": "모든 카테고리", "apply-filters": "필터 적용", - "more-filters": "필터 추가", - "fewer-filters": "Fewer Filters", + "more-filters": "더 많은 필터", + "fewer-filters": "기본 필터", "quick-actions": "빠른 신고", "flagged-user": "신고된 사용자", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index 83211391f8..7634e08858 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -47,8 +47,8 @@ "posts-exported": "%1의 포스트 내보내기 완료, 클릭해서 다운로드 ", "uploads-exported": "%1의 업로드 내보내기 완료, 클릭해서 다운로드 ", "users-csv-exported": "사용자 csv 내보내기 완료, 클릭해서 다운로드", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "post-queue-accepted": "게시 대기 중인 게시물이 승인되었습니다. 여기를 눌러 포스트를 확인할 수 있습니다.", + "post-queue-rejected": "게시 대기 중인 게시물이 거절되었습니다.", "email-confirmed": "이메일 인증이 완료되었습니다.", "email-confirmed-message": "이메일을 인증해주셔서 감사합니다. 계정이 완전히 활성화되었습니다.", "email-confirm-error-message": "이메일 주소를 인증하지 못했습니다. 코드가 올바르지 않거나 만료되었을 수 있습니다.", diff --git a/public/language/ko/success.json b/public/language/ko/success.json index 0eee3bf46d..a627bcb5af 100644 --- a/public/language/ko/success.json +++ b/public/language/ko/success.json @@ -1,7 +1,7 @@ { "success": "성공", "topic-post": "성공적으로 작성했습니다.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "포스트가 게시 대기열에 등록되었습니다. 승인 혹은 거절될 경우 알림이 전송됩니다.", "authentication-successful": "인증에 성공했습니다.", "settings-saved": "설정이 저장되었습니다!" } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 23b6f7304d..ccff4a0661 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -185,7 +185,7 @@ "already-blocked": "Этот пользователь уже заблокирован", "already-unblocked": "Этот пользователь уже разблокирован", "no-connection": "Похоже, есть проблема с вашим подключением к Интернету", - "socket-reconnect-failed": "В настоящее время невозможно связаться с сервером. Нажмите здесь, чтобы повторить попытку, или повторите попытку позже", + "socket-reconnect-failed": "В настоящее время невозможно связаться с сервером. Нажмите здесь, чтобы повторить попытку, или сделайте это позднее", "plugin-not-whitelisted": "Не удалось установить плагин – только плагины, внесенные в белый список диспетчером пакетов NodeBB, могут быть установлены через ACP", "topic-event-unrecognized": "Событие темы \"%1\" нераспознанно", "cant-set-child-as-parent": "Невозможно установить дочернюю категорию в качестве родительской", diff --git a/public/language/ru/user.json b/public/language/ru/user.json index 1cd729b3a9..570c9a77f8 100644 --- a/public/language/ru/user.json +++ b/public/language/ru/user.json @@ -39,10 +39,10 @@ "default-category-watch-state": "Стандартная настройка отслеживания категорий", "followers": "Подписчики", "following": "Подписки", - "blocks": "Блокировки", + "blocks": "Чёрный список", "block_toggle": "Блок./Разблок", - "block_user": "Блокировать", - "unblock_user": "Разблокировать", + "block_user": "Добавить в Чёрный Список", + "unblock_user": "Убрать из Чёрного Списка", "aboutme": "Обо мне", "signature": "Подпись", "birthday": "День рождения", From b4c31f78ec8b2dfb74a4cbdca23ced9445ef9ce2 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Mon, 10 May 2021 09:13:56 +0000 Subject: [PATCH 050/116] Latest translations and fallbacks --- public/language/nb/user.json | 134 +++++++++++++++++------------------ 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/public/language/nb/user.json b/public/language/nb/user.json index bbd7f1a3ee..a89fd9e4c0 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -18,10 +18,10 @@ "delete_all": "Slett Brukerkonto og Innhold", "delete_account_confirm": "Er du sikker på at du vil anonymisere alle innleggene dine og slette brukerkonten?
Denne handlingen er irreversibel, og du vil ikke kunne gjenopprette noen av dataene dine

Skriv inn passordet ditt for å bekrefte at du ønsker å slette denne brukerkontoen.", "delete_this_account_confirm": "Er du sikker på at du vil slette denne brukerkontoen og la innholdet ligge igjen?
Denne handlingen er irreversibel, innlegg blir anonymisert, og du vil ikke kunne gjenopprette innleggsassosiasjoner med den slettede kontoen

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

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

", + "delete_account_content_confirm": "Er du sikker på at du vil slette innholdet på denne brukerkontoen (innlegg / emner / opplastinger)?
Denne handlingen er irreversibel, og du vil ikke kunne gjenopprette data

", + "delete_all_confirm": "
Er du sikker på at du vil slette denne kontoen og alt innholdet (innlegg / emner / opplastinger)?Denne handlingen er irreversibel, og du vil ikke kunne gjenopprette data\n

", "account-deleted": "Konto slettet", - "account-content-deleted": "Account content deleted", + "account-content-deleted": "Kontoinnhold slettet", "fullname": "Fullt navn", "website": "Nettsted", "location": "Plassering", @@ -31,36 +31,36 @@ "profile": "Profil", "profile_views": "Profilvisninger", "reputation": "Rykte", - "bookmarks": "Bookmarks", - "watched_categories": "Watched categories", - "change_all": "Change All", + "bookmarks": "Bokmerker", + "watched_categories": "Overvåkede kategorier", + "change_all": "Endre alt", "watched": "Overvåkede", - "ignored": "Ignored", - "default-category-watch-state": "Default category watch state", + "ignored": "Ignorert", + "default-category-watch-state": "Standard kategori overvåkingstilstand", "followers": "Følgere", "following": "Følger", - "blocks": "Blocks", + "blocks": "Blokkeringer", "block_toggle": "Toggle Block", - "block_user": "Block User", - "unblock_user": "Unblock User", + "block_user": "Blokker bruker", + "unblock_user": "Opphev blokkering av bruker", "aboutme": "Om meg", "signature": "Signatur", "birthday": "Bursdag", "chat": "Chat", - "chat_with": "Continue chat with %1", - "new_chat_with": "Start new chat with %1", - "flag-profile": "Flag Profile", + "chat_with": "Fortsett å chatte med % 1", + "new_chat_with": "Start ny chatt med %1", + "flag-profile": "Flagg profil", "follow": "Følg", "unfollow": "Avfølg", "more": "Mer", "profile_update_success": "Profilen ble oppdatert!", "change_picture": "Bytt bilde", - "change_username": "Change Username", - "change_email": "Change Email", - "email_same_as_password": "Please enter your current password to continue – you've entered your new email again", + "change_username": "Endre brukernavn", + "change_email": "Endre e-post", + "email_same_as_password": "Vennligst skriv inn ditt nåværende passord for å fortsette & ndash; du har skrevet inn den nye e-posten din igjen", "edit": "Endre", - "edit-profile": "Edit Profile", - "default_picture": "Default Icon", + "edit-profile": "Rediger profil", + "default_picture": "Standardikonet", "uploaded_picture": "Opplastet bilde", "upload_new_picture": "Last opp nytt bidle", "upload_new_picture_from_url": "Last opp nytt bilde fra URL", @@ -75,16 +75,16 @@ "password": "Passord", "username_taken_workaround": "Brukernavnet du ønsket er opptatt, så vi har endret ditt litt. Du er nå kjent som %1", "password_same_as_username": "Ditt passord er det samme som ditt brukernavn, vennligst velg et annet passord.", - "password_same_as_email": "Your password is the same as your email, please select another password.", - "weak_password": "Weak password.", + "password_same_as_email": "Passordet ditt er det samme som e-postadressen din. Velg et annet passord.", + "weak_password": "Svakt passord", "upload_picture": "Last opp bilde", "upload_a_picture": "Last opp et bilde", "remove_uploaded_picture": "Fjern Opplastet Bilde", - "upload_cover_picture": "Upload cover picture", - "remove_cover_picture_confirm": "Are you sure you want to remove the cover picture?", - "crop_picture": "Crop picture", - "upload_cropped_picture": "Crop and upload", - "avatar-background-colour": "Avatar background colour", + "upload_cover_picture": "Last opp bakgrunnsbilde", + "remove_cover_picture_confirm": "Er du sikker på at du vil fjerne bakgrunnsbilde?", + "crop_picture": "Beskjær bilde", + "upload_cropped_picture": "Beskjær og last opp", + "avatar-background-colour": "Avatar bakgrunnsfarge", "settings": "Innstillinger", "show_email": "Vis min e-post", "show_fullname": "Vis mitt fulle navn", @@ -100,69 +100,69 @@ "has_no_posts": "Denne brukeren har ikke skrevet noe enda.", "has_no_topics": "Denne brukeren har ikke skrevet noen tråder enda.", "has_no_watched_topics": "Denne brukeren har ikke fulgt noen tråder enda.", - "has_no_ignored_topics": "This user hasn't ignored any topics yet.", - "has_no_upvoted_posts": "This user hasn't upvoted any posts yet.", - "has_no_downvoted_posts": "This user hasn't downvoted any posts yet.", - "has_no_voted_posts": "This user has no voted posts", - "has_no_blocks": "You have blocked no users.", + "has_no_ignored_topics": "Denne brukeren har ikke ignorert noen emner ennå", + "has_no_upvoted_posts": "Denne brukeren har ikke lastet opp noen innlegg ennå", + "has_no_downvoted_posts": "Denne brukeren har ikke nedlastet noen innlegg ennå", + "has_no_voted_posts": "Denne brukeren har ingen innlegg som er stemt på", + "has_no_blocks": "Du har ingen blokkerte brukere.", "email_hidden": "E-post skjult", "hidden": "skjult", "paginate_description": "Bruk sidevelger for tråder og innlegg istedet for uendelig scrolling", "topics_per_page": "Tråd per side", "posts_per_page": "Innlegg per side", - "max_items_per_page": "Maximum %1", - "acp_language": "Admin Page Language", - "notifications": "Notifications", + "max_items_per_page": "Maksimum %1", + "acp_language": "Administrer sidespråk", + "notifications": "Notifikasjoner", "upvote-notif-freq": "Upvote Notification Frequency", - "upvote-notif-freq.all": "All Upvotes", - "upvote-notif-freq.first": "First Per Post", - "upvote-notif-freq.everyTen": "Every Ten Upvotes", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", - "upvote-notif-freq.logarithmic": "On 10, 100, 1000...", - "upvote-notif-freq.disabled": "Disabled", + "upvote-notif-freq.all": "Alle oppstemmer", + "upvote-notif-freq.first": "Først per innlegg", + "upvote-notif-freq.everyTen": "Hver tiende oppstemning", + "upvote-notif-freq.threshold": "På 1, 5, 10, 25, 50, 100, 150, 200 ...", + "upvote-notif-freq.logarithmic": "På 10, 100, 1000 ...", + "upvote-notif-freq.disabled": "Noe er galt med funksjonen", "browsing": "Surfeinnstillinger", "open_links_in_new_tab": "Åpne utgående lenker i en ny fane", "enable_topic_searching": "Aktiver søk-i-tråd", "topic_search_help": "Hvis søk-i-tård er aktivert, overstyres nettleserens standard sidesøk og gir mulighet til å søke gjennom hele tråden, ikke bare det som vises på skjermen", - "update_url_with_post_index": "Update url with post index while browsing topics", - "scroll_to_my_post": "After posting a reply, show the new post", + "update_url_with_post_index": "Oppdater url med postindeks mens du surfer på emner", + "scroll_to_my_post": "Etter å ha postet et svar, vis det nye innlegget", "follow_topics_you_reply_to": "Følg tråder du vil svare på", "follow_topics_you_create": "Følg tråder du vil lage", - "grouptitle": "Group Title", + "grouptitle": "Gruppetittel", "group-order-help": "Select a group and use the arrows to order titles", "no-group-title": "Ingen gruppetittel", "select-skin": "Velg et skin", - "select-homepage": "Select a Homepage", - "homepage": "Homepage", - "homepage_description": "Select a page to use as the forum homepage or 'None' to use the default homepage.", - "custom_route": "Custom Homepage Route", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\" or \"category/2/general-discussion\")", + "select-homepage": "Velg en hjemmeside", + "homepage": "Hjemmeside", + "homepage_description": "Velg en side du vil bruke som forumets hjemmeside, eller 'Ingen' for å bruke standardhjemmesiden.", + "custom_route": "Tilpasset hjemmeside-rute", + "custom_route_help": "Skriv inn et rutenavn her uten noen forrige skråstrek (f.eks. \"Nylig\" eller \"kategori / 2 / generell diskusjon\")", "sso.title": "Single Sign-on Services", "sso.associated": "Assosiert med", "sso.not-associated": "Klikk her for å assosiere med", "sso.dissociate": "Dissociate", "sso.dissociate-confirm-title": "Confirm Dissociation", "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", - "info.latest-flags": "Latest Flags", - "info.no-flags": "No Flagged Posts Found", - "info.ban-history": "Recent Ban History", - "info.no-ban-history": "This user has never been banned", - "info.banned-until": "Banned until %1", - "info.banned-expiry": "Expiry", - "info.banned-permanently": "Banned permanently", - "info.banned-reason-label": "Reason", - "info.banned-no-reason": "No reason given.", - "info.username-history": "Username History", - "info.email-history": "Email History", - "info.moderation-note": "Moderation Note", - "info.moderation-note.success": "Moderation note saved", - "info.moderation-note.add": "Add note", - "sessions.description": "This page allows you to view any active sessions on this forum and revoke them if necessary. You can revoke your own session by logging out of your account.", - "consent.title": "Your Rights & Consent", + "info.latest-flags": "Seneste flagg", + "info.no-flags": "Ingen flaggede innlegg funnet", + "info.ban-history": "Nylig utestengingshistorikk", + "info.no-ban-history": "Denne brukeren har aldri blitt utestengt ", + "info.banned-until": "Utestengt til %1", + "info.banned-expiry": "Utløp", + "info.banned-permanently": "Utestengt permanent", + "info.banned-reason-label": "Årsak", + "info.banned-no-reason": "ingen årsak oppgitt", + "info.username-history": "Brukernavnhistorikk", + "info.email-history": "E-post historikk", + "info.moderation-note": "Moderasjonsnotat ", + "info.moderation-note.success": "Moderasjonsnotat ikke lagret ", + "info.moderation-note.add": "Legg til notat", + "sessions.description": "Denne siden lar deg se alle aktivitetsøkter på dette forumet og tilbakekalle dem om nødvendig. Du kan tilbakekalle din egen økt ved å logge av brukerkontoen din.", + "consent.title": "Dine rettigheter & amp; Samtykke", "consent.lead": "This community forum collects and processes your personal information.", - "consent.intro": "We use this information strictly to personalise your experience in this community, as well as to associate the posts you make to your user account. During the registration step you were asked to provide a username and email address, you can also optionally provide additional information to complete your user profile on this website.

We retain this information for the life of your user account, and you are able to withdraw consent at any time by deleting your account. At any time you may request a copy of your contribution to this website, via your Rights & Consent page.

If you have any questions or concerns, we encourage you to reach out to this forum's administrative team.", - "consent.email_intro": "Occasionally, we may send emails to your registered email address in order to provide updates and/or to notify you of new activity that is pertinent to you. You can customise the frequency of the community digest (including disabling it outright), as well as select which types of notifications to receive via email, via your user settings page.", - "consent.digest_frequency": "Unless explicitly changed in your user settings, this community delivers email digests every %1.", + "consent.intro": "Vi bruker denne informasjonen for å tilpasse opplevelsen din i dette samfunnet, samt for å knytte innleggene du lager til brukerkontoen din. Under registreringstrinnet ble du bedt om å oppgi fullt navn og en e-postadresse. Du kan også velge å gi 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_off": "Unless explicitly changed in your user settings, this community does not send out email digests", "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", From 2ac5a08559a8936612377d9b99a409b1d7245702 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 May 2021 14:04:39 +0000 Subject: [PATCH 051/116] fix(deps): update dependency nodebb-plugin-markdown to v8.12.10 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 33f6aece63..6c40ceb5b0 100644 --- a/install/package.json +++ b/install/package.json @@ -88,7 +88,7 @@ "nodebb-plugin-dbsearch": "4.2.0", "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", - "nodebb-plugin-markdown": "8.12.9", + "nodebb-plugin-markdown": "8.12.10", "nodebb-plugin-mentions": "2.13.9", "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.4", From 6ef0c8e95055511feb7af49b7cee8e7888843030 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 10 May 2021 11:20:24 -0400 Subject: [PATCH 052/116] docs: update API docs to better outline authentication options --- public/openapi/read.yaml | 7 +++++++ public/openapi/write.yaml | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/public/openapi/read.yaml b/public/openapi/read.yaml index f778e533e4..6605079d47 100644 --- a/public/openapi/read.yaml +++ b/public/openapi/read.yaml @@ -31,6 +31,13 @@ info: * Up until v1.14.3, this is provided by [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). The Write API plugin needs to be installed before authentication via bearer token is enabled on routes provided by the Read API. * From NodeBB v1.15.0 onwards, the Write API is available in core, and bearer authentication is available out-of-the-box + + In both cases, a bearer token is issued in the NodeBB admin panel in order to grant access to the API. + + There are two types of tokens: + * A *user token* is associated with a specific uid, and all calls made are made in the name of that user + * A *master token* is not associated with any specific uid, though a `_uid` parameter is required in the request, and then all calls are made in the name of *that* user. + This is the only difference between the two tokens. A master token with `_uid` set to a non-administrator will not allow you to make administrative calls. tags: - name: home description: Routes used at the forum index only diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index b7d1363e1d..8bf652c3d8 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -15,6 +15,10 @@ info: Years prior to this determination, many users of NodeBB had asked for a RESTful API to call against NodeBB, which led to the creation of [`nodebb-plugin-write-api`](https://github.com/NodeBB/nodebb-plugin-write-api). In tandem with the above decision, the Write API was merged into NodeBB core in late 2020. v3 of the Write API (this document) achieves rough feature parity with v2 of the Write API plugin. + + # Authentication + + Please see the ["Authentication" section under the Read API](../read/#section/Overview/Authentication) for more information on how to authenticate against this API in order to make calls. version: 1.15.0 contact: email: support@nodebb.org From ec6d1e2321718e303bb3f07955def186670c3edd Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 10 May 2021 11:22:37 -0400 Subject: [PATCH 053/116] fix: #9507 session reroll causes socket.io to become confused (#9534) * fix: #9507 session reroll causes socket.io to become confused * fix: added return * fix: simpler logic for error handling * fix: overly sensitive catch --- public/language/en-GB/error.json | 7 +++++-- public/src/app.js | 23 ++++++++++++++++++----- public/src/sockets.js | 5 ++++- src/socket.io/index.js | 17 +++++++++++++---- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index 2a849f7c5c..2f0f89458b 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -206,8 +206,11 @@ "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", diff --git a/public/src/app.js b/public/src/app.js index 92c3acf4aa..eacfb7e2ee 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -181,9 +181,9 @@ app.cacheBuster = null; app.alertError = function (message, timeout) { message = (message && message.message) || message; - if (message === '[[error:invalid-session]]') { - app.handleInvalidSession(); - app.logout(false); + if (message === '[[error:revalidate-failure]]') { + socket.disconnect(); + app.reconnect(); return; } @@ -197,14 +197,27 @@ app.cacheBuster = null; }; app.handleInvalidSession = function () { + socket.disconnect(); + app.logout(false); + bootbox.alert({ + title: '[[error:invalid-session]]', + message: '[[error:invalid-session-text]]', + closeButton: false, + callback: function () { + window.location.reload(); + }, + }); + }; + + app.handleSessionMismatch = () => { if (app.flags._login || app.flags._logout) { return; } socket.disconnect(); bootbox.alert({ - title: '[[error:invalid-session]]', - message: '[[error:invalid-session-text]]', + title: '[[error:session-mismatch]]', + message: '[[error:session-mismatch-text]]', closeButton: false, callback: function () { window.location.reload(); diff --git a/public/src/sockets.js b/public/src/sockets.js index 5c27f979d7..935f4aec2c 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -74,9 +74,12 @@ socket = window.socket; socket.on('checkSession', function (uid) { if (parseInt(uid, 10) !== parseInt(app.user.uid, 10)) { - app.handleInvalidSession(); + app.handleSessionMismatch(); } }); + socket.on('event:invalid_session', () => { + app.handleInvalidSession(); + }); socket.on('setHostname', function (hostname) { app.upstreamHost = hostname; diff --git a/src/socket.io/index.js b/src/socket.io/index.js index fc07f5f5c6..f119568b63 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -86,7 +86,16 @@ function onDisconnect(socket) { plugins.hooks.fire('action:sockets.disconnect', { socket: socket }); } -function onConnect(socket) { +async function onConnect(socket) { + try { + await validateSession(socket, '[[error:invalid-session]]'); + } catch (e) { + if (e.message === 'error:invalid-session') { + socket.emit('event:invalid_session'); + return; + } + } + if (socket.uid) { socket.join(`uid_${socket.uid}`); socket.join('online_users'); @@ -143,7 +152,7 @@ async function onMessage(socket, payload) { try { await checkMaintenance(socket); - await validateSession(socket); + await validateSession(socket, '[[error:revalidate-failure]]'); if (Namespaces[namespace].before) { await Namespaces[namespace].before(socket, eventName, params); @@ -191,14 +200,14 @@ const getSessionAsync = util.promisify( (sid, callback) => db.sessionStore.get(sid, (err, sessionObj) => callback(err, sessionObj || null)) ); -async function validateSession(socket) { +async function validateSession(socket, errorMsg) { const req = socket.request; if (!req.signedCookies || !req.signedCookies[nconf.get('sessionKey')]) { return; } const sessionData = await getSessionAsync(req.signedCookies[nconf.get('sessionKey')]); if (!sessionData) { - throw new Error('[[error:invalid-session]]'); + throw new Error(errorMsg); } const result = await plugins.hooks.fire('static:sockets.validateSession', { req: req, From a9bb1088024d375165a66e214e0cfdb5abc25afc Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 10 May 2021 11:33:20 -0400 Subject: [PATCH 054/116] fix: wrong error message checked --- src/socket.io/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index f119568b63..03380acfeb 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -90,7 +90,7 @@ async function onConnect(socket) { try { await validateSession(socket, '[[error:invalid-session]]'); } catch (e) { - if (e.message === 'error:invalid-session') { + if (e.message === '[[error:invalid-session]]') { socket.emit('event:invalid_session'); return; } From 0096cf178a7ec48c9764be0d5baa78acdac30e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 10 May 2021 11:34:54 -0400 Subject: [PATCH 055/116] refactor: bubble other errors --- src/socket.io/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 03380acfeb..aaaceb2010 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -94,6 +94,7 @@ async function onConnect(socket) { socket.emit('event:invalid_session'); return; } + throw e; } if (socket.uid) { From 8cc61f11974b98a952096cb98ec21f22834743d6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 10 May 2021 13:59:13 -0400 Subject: [PATCH 056/116] feat: automatically attempt reconnection on window focus --- public/src/sockets.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/sockets.js b/public/src/sockets.js index 935f4aec2c..6c4c4b62c3 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -70,6 +70,8 @@ socket = window.socket; .find('p') .translateText('[[error:socket-reconnect-failed]]') .one('click', app.reconnect); + + $(window).one('focus', app.reconnect); }); socket.on('checkSession', function (uid) { From 7e2ea4df2c86a336f917fb019fbc345cbcf16785 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 May 2021 19:21:09 +0000 Subject: [PATCH 057/116] fix(deps): update dependency nodebb-plugin-mentions to v2.13.11 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 6c40ceb5b0..555c5cec0c 100644 --- a/install/package.json +++ b/install/package.json @@ -89,7 +89,7 @@ "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", "nodebb-plugin-markdown": "8.12.10", - "nodebb-plugin-mentions": "2.13.9", + "nodebb-plugin-mentions": "2.13.11", "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.2.1", From 3145c7d5f18b791c2f6cfbca3e0222d91e790c76 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 May 2021 21:04:32 +0000 Subject: [PATCH 058/116] fix(deps): update dependency nodebb-theme-persona to v11.0.19 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 555c5cec0c..5bbdf0db16 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.2.1", - "nodebb-theme-persona": "11.0.18", + "nodebb-theme-persona": "11.0.19", "nodebb-theme-slick": "1.4.6", "nodebb-theme-vanilla": "12.0.7", "nodebb-widget-essentials": "5.0.4", From 7770c2a13120d458b1eeccbd78a4d00333335dd3 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 10 May 2021 22:52:37 +0000 Subject: [PATCH 059/116] fix(deps): update dependency postcss to v8.2.15 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 5bbdf0db16..05c9bd39e6 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "passport-local": "1.0.0", "pg": "^8.5.1", "pg-cursor": "^2.5.2", - "postcss": "8.2.14", + "postcss": "8.2.15", "postcss-clean": "1.2.0", "prompt": "^1.1.0", "redis": "3.1.2", From 4bc07a087ad5875c32ac4fb83bc5852579e8c0f6 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 May 2021 00:25:41 +0000 Subject: [PATCH 060/116] fix(deps): update dependency sharp to v0.28.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 05c9bd39e6..f81755cfe9 100644 --- a/install/package.json +++ b/install/package.json @@ -116,7 +116,7 @@ "sanitize-html": "^2.3.2", "semver": "^7.3.4", "serve-favicon": "^2.5.0", - "sharp": "0.28.1", + "sharp": "0.28.2", "sitemap": "^7.0.0", "slideout": "1.0.1", "socket.io": "4.0.2", From f645a96d18efc9fb014cf75a8f21864becb943ec Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 11 May 2021 09:09:16 +0000 Subject: [PATCH 061/116] Latest translations and fallbacks --- public/language/ar/error.json | 6 +- public/language/bg/error.json | 6 +- public/language/bn/error.json | 6 +- public/language/cs/error.json | 6 +- public/language/da/error.json | 6 +- public/language/de/error.json | 6 +- public/language/el/error.json | 6 +- public/language/en-US/error.json | 6 +- public/language/en-x-pirate/error.json | 6 +- public/language/es/error.json | 6 +- public/language/et/error.json | 6 +- public/language/fa-IR/error.json | 6 +- public/language/fi/error.json | 6 +- public/language/fr/error.json | 6 +- public/language/gl/error.json | 6 +- public/language/he/admin/settings/user.json | 38 +++++----- public/language/he/error.json | 6 +- public/language/hr/error.json | 6 +- public/language/hu/error.json | 6 +- public/language/id/error.json | 6 +- public/language/it/error.json | 6 +- public/language/ja/error.json | 6 +- public/language/ko/error.json | 6 +- public/language/lt/error.json | 6 +- public/language/lv/error.json | 6 +- public/language/ms/error.json | 6 +- public/language/nb/admin/settings/user.json | 80 ++++++++++----------- public/language/nb/error.json | 6 +- public/language/nb/tags.json | 2 +- public/language/nb/user.json | 44 ++++++------ public/language/nl/error.json | 6 +- public/language/pl/error.json | 6 +- public/language/pt-BR/error.json | 6 +- public/language/pt-PT/error.json | 6 +- public/language/ro/error.json | 6 +- public/language/ru/error.json | 6 +- public/language/rw/error.json | 6 +- public/language/sc/error.json | 6 +- public/language/sk/error.json | 6 +- public/language/sl/error.json | 6 +- public/language/sr/error.json | 6 +- public/language/sv/error.json | 6 +- public/language/th/error.json | 6 +- public/language/tr/error.json | 6 +- public/language/uk/error.json | 6 +- public/language/vi/error.json | 6 +- public/language/zh-CN/error.json | 6 +- public/language/zh-TW/error.json | 6 +- 48 files changed, 258 insertions(+), 170 deletions(-) diff --git a/public/language/ar/error.json b/public/language/ar/error.json index ae71364c67..2be4c10ea7 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "لا يمكنك طرد نفسك من المجموعة.", "no-users-selected": "لا يوجد مستخدم محدد.", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "يبدو أن فترة التسجيل لم تعد قائمة او هي غير مطابقة مع الخادم. يرجى إعادة تحميل هذه الصفحة.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index f99e87accc..636545912e 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Не можете да изритате себе си от групата", "no-users-selected": "Няма избран(и) потребител(и)", "invalid-home-page-route": "Грешен път към началната страница", - "invalid-session": "Несъответствие в сесията", - "invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла или не съответства на сървъра. Моля, опреснете страницата.", + "invalid-session": "Изтекла сесия", + "invalid-session-text": "Изглежда сесията Ви на вписване вече е изтекла. Моля, опреснете страницата.", + "session-mismatch": "Несъответствие в сесията", + "session-mismatch-text": "Изглежда сесията Ви на вписване вече не съответства на сървъра. Моля, опреснете страницата.", "no-topics-selected": "Няма избрани теми!", "cant-move-to-same-topic": "Публикацията не може да бъде преместена в същата тема!", "cant-move-topic-to-same-category": "Темата не може да бъде преместена в същата категория!", diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 97d34f7fa7..c9577d2149 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index cd143ef070..60628f1984 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Nemůžete vyhodit sami sebe ze skupiny", "no-users-selected": "Žádný uživatel/é nebyl/y vybrán/i", "invalid-home-page-route": "Neplatná cesta k domovské stránkce", - "invalid-session": "Nesoulad v relacích", - "invalid-session-text": "Zdá se, že vše relace s přihlášením již není aktivní nebo již neodpovídá s relací na serveru. Obnovte prosím tuto stránku.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Žádná vybraná témata.", "cant-move-to-same-topic": "Není možné přesunout příspěvek do stejného tématu!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/da/error.json b/public/language/da/error.json index 2bebe430cc..b7d49e2f18 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/de/error.json b/public/language/de/error.json index d72d636de8..a383a75396 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Du kannst dich nicht selber aus der Gruppe entfernen.", "no-users-selected": "Kein(e) Benutzer ausgewählt", "invalid-home-page-route": "Ungültiger Startseitenpfad", - "invalid-session": "Sitzungsdiskrepanz", - "invalid-session-text": "Es scheint als wäre deine Login-Sitzung nicht mehr aktiv oder sie passt nicht mehr mit der des Servers. Bitte aktualisiere diese Seite.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Keine Beiträge ausgewählt!", "cant-move-to-same-topic": "Du kannst den Beitrag nicht in das selbe Thema schieben!", "cant-move-topic-to-same-category": "Das Thema kann nicht zur selben Kategorie verschoben werden!", diff --git a/public/language/el/error.json b/public/language/el/error.json index 2610f43acb..7d1bd35e85 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index d1635c8723..4ebeaecde0 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index d1635c8723..4ebeaecde0 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/es/error.json b/public/language/es/error.json index f52907cf73..3a5b111245 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "No te puedes expulsar a ti mismo del grupo", "no-users-selected": "Ningun usuario(s) seleccionado", "invalid-home-page-route": "Ruta de página de inicio invalida", - "invalid-session": "No concuerdan los datos de sesión", - "invalid-session-text": "Parece que su sesión ha expirado o no concuerda con el servidor. Por favor vuelva a cargar la página.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "¡No se han seleccionado temas!", "cant-move-to-same-topic": "¡No puedes mover el mensaje al mismo tema!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/et/error.json b/public/language/et/error.json index a8226a57ad..3c101a3a41 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Sa ei saa ennast ära visata gruppist", "no-users-selected": "Ühtki kasutajat pole valitud", "invalid-home-page-route": "Vigane avalehe suunamine", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 6cc73559e2..b19cf7b242 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "شما نمی توانید خودتان را از گروه کیک کنید", "no-users-selected": "هیچ کاربر(های) انتخاب نشده", "invalid-home-page-route": "مسیر صفحه اصلی نامعتبر است", - "invalid-session": "عدم تطابق جلسه", - "invalid-session-text": "به نظر می‌رسد این جلسه برای ورود دیگر فعال نیست و یا با سرور هماهنگ نیست. لطفا این صفحه را رفرش کنید.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "هیچ موضوعی انتخاب نشده است !", "cant-move-to-same-topic": "نمی توان پست یک موضوع را به همان موضوع انتقال داد !", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index d6ba3838a4..970f45c3ea 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Ei aiheita valittuna", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 4ce02e3815..f970d5efdd 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Vous ne pouvez pas vous exclure vous-même du groupe", "no-users-selected": "Aucun utilisateur sélectionné", "invalid-home-page-route": "Chemin vers la page d'accueil invalide", - "invalid-session": "Session interrompue", - "invalid-session-text": "Il semble que votre session ne soit plus active, ou que le serveur ne la reconnaisse plus. Merci de rafraichir cette page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Aucun sujet sélectionné !", "cant-move-to-same-topic": "Impossible de déplacer le message dans le même sujet !", "cant-move-topic-to-same-category": "Impossible de déplacer le sujet dans la même catégorie !", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index cf247b6cac..4a84d894f4 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Non te podes expulsar a ti mesmo do grupo", "no-users-selected": "Ningún usuario seleccionado", "invalid-home-page-route": "Ruta de páxina de inicio inválida", - "invalid-session": "Non concordan os datos da sesión", - "invalid-session-text": "Parece que a súa sesión expirou ou non concorda co servidor. Por favor, recarge a páxina.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/he/admin/settings/user.json b/public/language/he/admin/settings/user.json index 0557595e9c..1d1a13ee20 100644 --- a/public/language/he/admin/settings/user.json +++ b/public/language/he/admin/settings/user.json @@ -16,25 +16,25 @@ "allow-account-deletion": "אפשר מחיקת חשבונות", "hide-fullname": "החבא שם מלא ממשתמשים", "hide-email": "החבא כתובת מייל ממשתמשים", - "show-fullname-as-displayname": "Show user's full name as their display name if available", + "show-fullname-as-displayname": "הצג את השם המלא של המשתמש כשם התצוגה שלו אם הוא זמין", "themes": "ערכות נושא", "disable-user-skins": "אל תאפשר למשתמשים לבחור ערכת נושא", - "account-protection": "Account Protection", - "admin-relogin-duration": "Admin relogin duration (minutes)", - "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", - "login-attempts": "Login attempts per hour", - "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", - "lockout-duration": "Account Lockout Duration (minutes)", - "login-days": "Days to remember user login sessions", - "password-expiry-days": "Force password reset after a set number of days", - "session-time": "Session Time", - "session-time-days": "Days", - "session-time-seconds": "Seconds", + "account-protection": "הגנת חשבון", + "admin-relogin-duration": "משך חיבור של מנהל מערכת (דקות)", + "admin-relogin-duration-help": "לאחר פרק זמן מוגדר של גישה למקטע הניהול ידרוש כניסה מחדש, הגדר ל- 0 על-מנת להפוך ללא זמין", + "login-attempts": "נסיונות כניסה לשעה", + "login-attempts-help": "אם ניסיונות כניסה ל user's חורג מסף זה, החשבון יינעל לפרק זמן שנקבע מראש", + "lockout-duration": "משך נעילת חשבון (דקות)", + "login-days": "ימים לזכירת התחברות כניסה של משתמשים", + "password-expiry-days": "כפיית איפוס סיסמה לאחר מספר ימים מוגדר", + "session-time": "זמן סשן", + "session-time-days": "ימים", + "session-time-seconds": "שניות", "session-time-help": "These values are used to govern how long a user stays logged in when they check "Remember Me" on login. Note that only one of these values will be used. If there is no seconds value we fall back to days. If there is no days value we default to 14 days.", "online-cutoff": "Minutes after user is considered inactive", - "online-cutoff-help": "If user performs no actions for this duration, they are considered inactive and they do not receive realtime updates.", - "registration": "User Registration", - "registration-type": "סוג השרמה", + "online-cutoff-help": "אם משתמש אינו מבצע פעולות במשך זמן זה, הוא נחשב כלא פעיל ואינו מקבל עדכונים בזמן אמת.", + "registration": "רישום משתמש", + "registration-type": "סוג הרשמה", "registration-approval-type": "סוג אישור הרשמה", "registration-type.normal": "רגיל", "registration-type.admin-approval": "אישור מנהל", @@ -44,14 +44,14 @@ "registration-type.disabled": "בטל הרשמה", "registration-type.help": "רגיל - משתמשים יכולים להירשם על ידי שימוש בדף /register.
\nהזמנה בלבד - משתמשים אחרים יכולים להזמין משתמשים מדף המשתמש.
\nהזמנת מנהל בלבד - רק מנהלים יכולים להזמין משתמשים אחרים מדף
המשתמש ודף ההנהלת משתמשים.
\nבטל הרשמה - לא ניתן להירשם.
ד", "registration-approval-type.help": "רגיל - משתמשים נרשמים באופן מיידי.
\nאישור מנהל - משתמשים אשר נרשמו מוכנים לתוך רשימת אישור למנהלים.
\nאישור מנהל לכתובות IP - רגיל למשתמשים חדשים, אישור מנהל לכתובות IP אשר כבר מקושר אליהם חשבון.
", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", - "registration-queue-show-average-time": "Show users average time it takes to approve a new user", + "registration-queue-auto-approve-time": "זמן אישור אוטומטי", + "registration-queue-auto-approve-time-help": "שעות לפני שהמשתמש מאושר באופן אוטומטי. רשום 0 על-מנת להשבית.", + "registration-queue-show-average-time": "הצג למשתמשים זמן ממוצע שנדרש על-מנת לאשר משתמש חדש", "registration.max-invites": "מרב ההזמנות למשתמש", "max-invites": "מרב ההזמנות למשתמש", "max-invites-help": "0 בשביל לבטל הגבלה. מנהלים מקבלים אינסוף הזמנות
תקף רק ל-\"הזמנה בלבד\"", "invite-expiration": "תוקף ההזמנה", - "invite-expiration-help": "הזמנות יפוגו ב# ימים.", + "invite-expiration-help": "הזמנות יפוגו ב-# ימים.", "min-username-length": "Minimum Username Length", "max-username-length": "Maximum Username Length", "min-password-length": "Minimum Password Length", diff --git a/public/language/he/error.json b/public/language/he/error.json index eeefe47316..db5de54d2c 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "אינך יכול להסיר את עצמך מהקבוצה", "no-users-selected": "לא נבחרו משתמשים", "invalid-home-page-route": "כתובת דף הבית הינה שגויה", - "invalid-session": "מושב לא תואם", - "invalid-session-text": "נראה שסשן ההתחברות שלך כבר לא פעיל. אנא טען מחדש את העמוד.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "לא נבחרו נושאים!", "cant-move-to-same-topic": "אתה לא יכול להעביר פוסט לאותו נושא!", "cant-move-topic-to-same-category": "לא ניתן להעביר נושא לאותה קטגוריה!", diff --git a/public/language/hr/error.json b/public/language/hr/error.json index 3e6978ea21..8c940ea4fe 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Ne možete sebe izbaciti iz grupe", "no-users-selected": "Korisnici nisu odabrani", "invalid-home-page-route": "Netočna putanja naslovnice", - "invalid-session": "Pogreška sesije", - "invalid-session-text": "Vaša sesija nije više aktivna ili se više ne poklapa sa serverom. Molimo osvježite stranicu.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 1e4d9afbbc..c3158a29c2 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Nem rúghatod ki magad a csoportból", "no-users-selected": "Nincs felhasználó kiválasztva", "invalid-home-page-route": "Érvénytelen főoldal elérési útvonal", - "invalid-session": "Eltérő munkamenet", - "invalid-session-text": "A bejelentkezés munkamenete már nem aktív vagy már nem illik össze a szerverrel. Kérlek frissítsd az oldalt.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nincs témakör kiválasztva", "cant-move-to-same-topic": "Nem mozgathatsz hozzászólást azonos témakörbe!", "cant-move-topic-to-same-category": "Nem mozgathatod a témakört azonos kategóriába!", diff --git a/public/language/id/error.json b/public/language/id/error.json index 57c474cd37..e81972811c 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/it/error.json b/public/language/it/error.json index f2300f1783..07e1af839f 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Non puoi espellerti dal gruppo", "no-users-selected": "Nessun utente selezionato", "invalid-home-page-route": "Percorso della pagina iniziale non valido", - "invalid-session": "Discrepanza della sessione", - "invalid-session-text": "Sembra che la tua sessione non sia più attiva, oppure non corrisponde con il server. Per favore ricarica la pagina.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nessuna discussione selezionata!", "cant-move-to-same-topic": "Non puoi spostare il post nella stessa discussione!", "cant-move-topic-to-same-category": "Non si può spostare la discussione nella stessa categoria!", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index 466281e762..c217b344a7 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "あなたは、グループから自分自身をキックすることが出来ません", "no-users-selected": "ユーザー(s)が選択されていません", "invalid-home-page-route": "ホームページのルートが無効", - "invalid-session": "セッションの不一致", - "invalid-session-text": "ログインセッションの期限切れ、またはサーバーとの未接続が長すぎると思われます。このページを更新してみてください。", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "スレッドが選択されていません!!", "cant-move-to-same-topic": "同じスレッドに投稿を移動することはできません!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index abe7a61ec6..25588a9a31 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "스스로 이 그룹을 탈퇴할 수 없습니다.", "no-users-selected": "선택된 사용자가 없습니다.", "invalid-home-page-route": "올바르지 않은 홈페이지 경로입니다. ", - "invalid-session": "일치하지 않는 세션입니다.", - "invalid-session-text": "로그인 세션이 비활성화 되었거나 서버와 일치하지 않습니다. 페이지를 새로고침 해주세요.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "선택된 화제가 없습니다!", "cant-move-to-same-topic": "동일한 화제로 포스트를 이동할 수 없습니다!", "cant-move-topic-to-same-category": "동일한 카테고리로 화제를 이동할 수 없습니다!", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 1a0e0bfe86..93cf27e543 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Negalite išmesti savęs iš grupės", "no-users-selected": "Nepasirinktas joks vartotojas", "invalid-home-page-route": "Blogas kelias į pagrindinį puslapį", - "invalid-session": "Sesijų Nesutapimas", - "invalid-session-text": "Panašu, jog jūsų prisijungimo sesija nebeaktyvi arba nesutampa su serverio. Prašome perkrauti puslapį.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nepasirinkta jokia tema!", "cant-move-to-same-topic": "Negalima perkelti įrašo į tą pačią temą!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index f10ffee6ca..d54a6c46af 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Nevar sevi izslēgt no grupas", "no-users-selected": "Nav atlasīts neviens lietotājs(-i)", "invalid-home-page-route": "Nederīgs sākumlapas ceļš", - "invalid-session": "Sesijas nesakrīt", - "invalid-session-text": "Izskatās, ka Tava sesija vairs nav aktīva vai vairs nesakrīt ar serveri. Lūdzu, atsvaidzināt šo lapu.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nav atlasīts neviens temats", "cant-move-to-same-topic": "Nevar pārnest uz savu pašu tematu!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index ee09559819..c9eeead36f 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/nb/admin/settings/user.json b/public/language/nb/admin/settings/user.json index b19fbeb8ba..35068c94a0 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -1,47 +1,47 @@ { - "authentication": "Authentication", - "require-email-confirmation": "Require Email Confirmation", - "email-confirm-interval": "User may not resend a confirmation email until", - "email-confirm-email2": "minutes have elapsed", - "allow-login-with": "Allow login with", - "allow-login-with.username-email": "Username or Email", - "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", - "gdpr_enabled": "Enable GDPR consent collection", - "gdpr_enabled_help": "When enabled, all new registrants will be required to explicitly give consent for data collection and usage under the General Data Protection Regulation (GDPR). Note: Enabling GDPR does not force pre-existing users to provide consent. To do so, you will need to install the GDPR plugin.", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", - "allow-account-deletion": "Allow account deletion", - "hide-fullname": "Hide fullname from users", - "hide-email": "Hide email from users", - "show-fullname-as-displayname": "Show user's full name as their display name if available", - "themes": "Themes", - "disable-user-skins": "Prevent users from choosing a custom skin", - "account-protection": "Account Protection", - "admin-relogin-duration": "Admin relogin duration (minutes)", - "admin-relogin-duration-help": "After a set amount of time accessing the admin section will require re-login, set to 0 to disable", - "login-attempts": "Login attempts per hour", - "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", - "lockout-duration": "Account Lockout Duration (minutes)", - "login-days": "Days to remember user login sessions", - "password-expiry-days": "Force password reset after a set number of days", - "session-time": "Session Time", - "session-time-days": "Days", - "session-time-seconds": "Seconds", - "session-time-help": "These values are used to govern how long a user stays logged in when they check "Remember Me" on login. Note that only one of these values will be used. If there is no seconds value we fall back to days. If there is no days value we default to 14 days.", + "authentication": "Autentisering ", + "require-email-confirmation": "Krever bekreftelse via e-post", + "email-confirm-interval": "Brukeren kan ikke sende en bekreftelses-e-post på nytt før", + "email-confirm-email2": "minutter har gått", + "allow-login-with": "Tillat innlogging med", + "allow-login-with.username-email": "Brukernavn eller e-post", + "allow-login-with.username": "Kun brukernavn", + "allow-login-with.email": "Kun e-post", + "account-settings": "Kontoinnstillinger ", + "gdpr_enabled": "Aktiver innhenting av GDPR-samtykke", + "gdpr_enabled_help": "Når aktivert, vil alle nye registranter være pålagt å eksplisitt gi samtykke til datainnsamling og behandling under Personvernforordningen (GDPR). Merk: Aktivering av GDPR tvinger ikke eksisterende brukere til å gi samtykke. For å gjøre dette, må du installere GDPR-programutvidelse. ", + "disable-username-changes": "Deaktiver endringer for brukernavn", + "disable-email-changes": "Deaktiver endringer for e-post", + "disable-password-changes": "Deaktiver endringer for passord", + "allow-account-deletion": "Tillat kontosletting ", + "hide-fullname": "Skjul fullt navn for andre brukere", + "hide-email": "Skjul e-post for brukere", + "show-fullname-as-displayname": "Vis brukerens fulle navn som navn ved visning hvis tilgjengelig", + "themes": "Temaer", + "disable-user-skins": "Forhindre brukere fra å velge en tilpasset skin", + "account-protection": "Kontobeskyttelse", + "admin-relogin-duration": "Innloggingstid for administrator (minutter)", + "admin-relogin-duration-help": "Etter en angitt tid for å få tilgang til administrasjon-delen, vil det kreve pålogging på nytt, sett til 0 for å deaktivere", + "login-attempts": "Innloggingsforsøk per time", + "login-attempts-help": "Hvis påloggingsforsøk til brukerens konto overskrider denne terskelen, vil brukerkontoen bli låst i en forhåndskonfigurert tid", + "lockout-duration": "Varighet på kontosperring (minutter)", + "login-days": "Dager å huske brukerinnloggingsøkter på", + "password-expiry-days": "Tving passordtilbakestillingen etter angitt antall dager", + "session-time": "Tidssesjon ", + "session-time-days": "Dager", + "session-time-seconds": "Sekunder", + "session-time-help": "Minutter etter at bruker er ansett som inaktiv ", "online-cutoff": "Minutes after user is considered inactive", - "online-cutoff-help": "If user performs no actions for this duration, they are considered inactive and they do not receive realtime updates.", - "registration": "User Registration", - "registration-type": "Registration Type", + "online-cutoff-help": "Hvis brukeren ikke utfører noen handlinger for den bestemte varigheten, anses de som inaktive, og de mottar ikke sanntidsoppdateringer.", + "registration": "Brukerregistrering", + "registration-type": "Registreringstype", "registration-approval-type": "Registration Approval Type", "registration-type.normal": "Normal", - "registration-type.admin-approval": "Admin Approval", - "registration-type.admin-approval-ip": "Admin Approval for IPs", - "registration-type.invite-only": "Invite Only", - "registration-type.admin-invite-only": "Admin Invite Only", - "registration-type.disabled": "No registration", + "registration-type.admin-approval": "Administrator-godkjenning", + "registration-type.admin-approval-ip": "Administrator godkjenning for IP-er", + "registration-type.invite-only": "Kun invitasjon", + "registration-type.admin-invite-only": "Kun invitasjon fra administrator ", + "registration-type.disabled": "Ingen registrering ", "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", "registration-queue-auto-approve-time": "Automatic Approval Time", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index 88f135a184..263ef2a5e6 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Du kan ikke utestenge deg selv fra gruppen", "no-users-selected": "Ingen bruker(e) valgt", "invalid-home-page-route": "Ugyldig hjemmesidelenke", - "invalid-session": "Sesjon samsvarer ikke", - "invalid-session-text": "Det ser ut som din sesjon ikke lenger er aktiv, eller ikke lenger samsvarer med serveren. Vennligst oppdater denne siden.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Ingen tråder valgt!", "cant-move-to-same-topic": "Du kan ikke flytte innlegg til samme tråd!", "cant-move-topic-to-same-category": "Du kan ikke flytte tråd til samme kategori!", diff --git a/public/language/nb/tags.json b/public/language/nb/tags.json index 91a494b74b..6d6e768270 100644 --- a/public/language/nb/tags.json +++ b/public/language/nb/tags.json @@ -4,5 +4,5 @@ "enter_tags_here": "Skriv emneord her, mellom %1 og %2 tegn hver.", "enter_tags_here_short": "Skriv emneord...", "no_tags": "Det finnes ingen emneord enda.", - "select_tags": "Select Tags" + "select_tags": "Velg kode" } \ No newline at end of file diff --git a/public/language/nb/user.json b/public/language/nb/user.json index a89fd9e4c0..216a003cd7 100644 --- a/public/language/nb/user.json +++ b/public/language/nb/user.json @@ -140,9 +140,9 @@ "sso.title": "Single Sign-on Services", "sso.associated": "Assosiert med", "sso.not-associated": "Klikk her for å assosiere med", - "sso.dissociate": "Dissociate", - "sso.dissociate-confirm-title": "Confirm Dissociation", - "sso.dissociate-confirm": "Are you sure you wish to dissociate your account from %1?", + "sso.dissociate": "Separer", + "sso.dissociate-confirm-title": "Bekreft seperasjon", + "sso.dissociate-confirm": "Er du sikker på at du vil separere kontoen din fra% 1?", "info.latest-flags": "Seneste flagg", "info.no-flags": "Ingen flaggede innlegg funnet", "info.ban-history": "Nylig utestengingshistorikk", @@ -160,25 +160,25 @@ "sessions.description": "Denne siden lar deg se alle aktivitetsøkter på dette forumet og tilbakekalle dem om nødvendig. Du kan tilbakekalle din egen økt ved å logge av brukerkontoen din.", "consent.title": "Dine rettigheter & amp; Samtykke", "consent.lead": "This community forum collects and processes your personal information.", - "consent.intro": "Vi bruker denne informasjonen for å tilpasse opplevelsen din i dette samfunnet, samt for å knytte innleggene du lager til brukerkontoen din. Under registreringstrinnet ble du bedt om å oppgi fullt navn og en e-postadresse. Du kan også velge å gi 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.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_off": "Unless explicitly changed in your user settings, this community does not send out email digests", - "consent.received": "You have provided consent for this website to collect and process your information. No additional action is required.", - "consent.not_received": "You have not provided consent for data collection and processing. At any time this website's administration may elect to delete your account in order to become compliant with the General Data Protection Regulation.", - "consent.give": "Give consent", - "consent.right_of_access": "You have the Right of Access", - "consent.right_of_access_description": "You have the right to access any data collected by this website upon request. You can retrieve a copy of this data by clicking the appropriate button below.", - "consent.right_to_rectification": "You have the Right to Rectification", - "consent.right_to_rectification_description": "You have the right to change or update any inaccurate data provided to us. Your profile can be updated by editing your profile, and post content can always be edited. If this is not the case, please contact this site's administrative team.", - "consent.right_to_erasure": "You have the Right to Erasure", - "consent.right_to_erasure_description": "At any time, you are able to revoke your consent to data collection and/or processing by deleting your account. Your individual profile can be deleted, although your posted content will remain. If you wish to delete both your account and your content, please contact the administrative team for this website.", - "consent.right_to_data_portability": "You have the Right to Data Portability", - "consent.right_to_data_portability_description": "You may request from us a machine-readable export of any collected data about you and your account. You can do so by clicking the appropriate button below.", - "consent.export_profile": "Export Profile (.json)", - "consent.export-profile-success": "Exporting profile, you will get a notification when it is complete.", - "consent.export_uploads": "Export Uploaded Content (.zip)", - "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", - "consent.export_posts": "Export Posts (.csv)", - "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete." + "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. ", + "consent.give": "Gi samtykke", + "consent.right_of_access": "Du har rett til innsyn", + "consent.right_of_access_description": "På forespørsel har du har rett til å få tilgang til data som samles inn av dette nettstedet. Du kan hente en kopi av disse dataene ved å klikke på riktig knapp nedenfor.", + "consent.right_to_rectification": "Du har rett til å få rettet uriktige data ", + "consent.right_to_rectification_description": "Du har rett til å endre eller oppdatere uriktige data som er gitt til oss. Brukerprofilen din kan oppdateres ved å redigere profilen din, og innhold på innlegg kan alltid redigeres. Hvis dette ikke er tilfelle, kan du kontakte dette nettstedets administrasjonsteam.", + "consent.right_to_erasure": "Du har rett til sletting", + "consent.right_to_erasure_description": "Når som helst kan du tilbakekalle ditt samtykke til datainnsamling og / eller behandling ved å slette brukerkontoen din. Den individuelle profilen din kan slettes, selv om de publiserte innleggene dine blir værende igjen. Hvis du vil slette begge kontoer og alt innhold, vennligst kontakt administrasjonsteamet for dette nettstedet. ", + "consent.right_to_data_portability": "Du har retten til dataportabilitet", + "consent.right_to_data_portability_description": "Du kan be oss om maskinlesbar eksport av innsamlede data om deg og brukerkontoen din. Du kan gjøre det ved å klikke på riktig knapp nedenfor.", + "consent.export_profile": "Eksporter profil (.json)", + "consent.export-profile-success": "Eksporterer profil, du vil få en notifikasjon når eksporten er fullført. ", + "consent.export_uploads": "Eksporter opplastet innhold (.zip)", + "consent.export-uploads-success": "Når du eksporterer opplastinger, får du et varsel når det er fullført.", + "consent.export_posts": "Eksporter innlegg (.csv)", + "consent.export-posts-success": "Eksporterer innlegg, du får en notifikasjon når eksporten er fullført." } \ No newline at end of file diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 4b74016a20..d9eb266917 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Je kunt jezelf niet uit een groep schoppen", "no-users-selected": "Geen gebruiker(s) geselecteerd", "invalid-home-page-route": "Onbekende homepage route", - "invalid-session": "Verkeerde sessie combinatie", - "invalid-session-text": "Het lijkt erop dat je login sessie niet meer actief is of niet langer synchroon is met de server. Ververs de pagina.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Geen onderwerpen geselecteerd!", "cant-move-to-same-topic": "Een bericht kan niet naar hetzelfde onderwerp worden verplaatst!", "cant-move-topic-to-same-category": "Kan onderwerp niet verplaatsen naar dezelfde categorie", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index 58d9ec80d6..80281c8544 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Nie możesz wyrzucić samego siebie z grupy", "no-users-selected": "Nie wybrano żadnych użytkowników", "invalid-home-page-route": "Niepoprawny odnośnik strony domowej", - "invalid-session": "Niewłaściwa sesja", - "invalid-session-text": "Zdaje się, że Twoja sesja jest nieaktywna lub nie zgadza się z serwerem. Odśwież stronę.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nie wybrano tematów.", "cant-move-to-same-topic": "Nie można przenieść wpisu do tego samego tematu!", "cant-move-topic-to-same-category": "Nie można przenieść tematu do tej samej kategorii!", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index 858a97929f..af35c489b4 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Você não pode kickar a si mesmo do grupo", "no-users-selected": "Nenhuma escolha de usuário(s) foi feita", "invalid-home-page-route": "Rota de página inicial inválida", - "invalid-session": "Erro de Sessão", - "invalid-session-text": "Parece que sua sessão de login não está mais ativao ou não corresponde mais com a do servidor. Por favor, recarregue esta página.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nenhum tópico selecionado!", "cant-move-to-same-topic": "Não é possível mover um post para o mesmo tópico!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index 3054af36d2..9ce8552b5f 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Não te podes expulsar a ti próprio do grupo", "no-users-selected": "Não existe(m) utilizador(es) selecionado(s)", "invalid-home-page-route": "Rota para a página principal inválida", - "invalid-session": "Sessão incompatível", - "invalid-session-text": "Parece que a tua sessão não se encontra mais ativa ou não tem correspondência com o servidor. Por favor recarrega esta página.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Nenhum tópico selecionado!", "cant-move-to-same-topic": "Não podes mover publicações para o mesmo tópico!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 64af899346..2e939d42a0 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index ccff4a0661..8d1f4fa7b9 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Удалить себя из группы невозможно.", "no-users-selected": "Выберите одного или нескольких пользователей", "invalid-home-page-route": "Неверная ссылка на домашнюю страницу", - "invalid-session": "Сессия не существует", - "invalid-session-text": "Похоже, что ваша сессия больше не активна или она не совпадает с сессией на сервере. Пожалуйста, обновите эту страницу.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Темы не выбраны!", "cant-move-to-same-topic": "Невозможно переместить сообщение в эту же тему!", "cant-move-topic-to-same-category": "Невозможно переместить тему в эту же категорию!", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index f275bca938..b389c3c920 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index d1635c8723..4ebeaecde0 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "You can't kick yourself from the group", "no-users-selected": "No user(s) selected", "invalid-home-page-route": "Invalid home page route", - "invalid-session": "Session Mismatch", - "invalid-session-text": "It looks like your login session is no longer active, or no longer matches with the server. Please refresh this page.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index 61bc0e7c2a..fd5437ecb5 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Nemôžete vykopnúť samého seba zo skupiny", "no-users-selected": "Žiadny užívateľ(ia) neboli vybratý", "invalid-home-page-route": "Neplatná cesta pre domovskú stránku", - "invalid-session": "Relácia neodpovedá", - "invalid-session-text": "Vyzerá to, že Vaše prihlasovacia relácia už nie je aktívna, alebo sa už nezhoduje so serverom. Aktualizujte túto stránku.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Žiadne vybrané témy.", "cant-move-to-same-topic": "Nie je možné presunúť príspevok do rovnakej témy!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index be65f42003..c584dd2153 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Sebe ne morete umakniti iz skupine.", "no-users-selected": "Ni izbranih uporabnikov.", "invalid-home-page-route": "Napačna pot do domače strani.", - "invalid-session": "Seje se ne ujemajo.", - "invalid-session-text": "Kaže, da vaša prijavna seja ni več aktiva. Prosimo, osvežite to stran.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 1c4f97bb65..eab45b0118 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Не можете избацити себе из групе", "no-users-selected": "Није одабран корисник", "invalid-home-page-route": "Неважећа путања почетне странице", - "invalid-session": "Неподударање сесија", - "invalid-session-text": "Изгледа да ваша сесија пријављивања није више активна или се више не подудара са сервером. Поново учитајте ову страницу.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Нема одабраних тема!", "cant-move-to-same-topic": "Није могуће преместити поруку у исту тему!", "cant-move-topic-to-same-category": "Није могуће преместити тему у исту категорију!", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index d2c79f791a..c7b7cde67f 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Du kan inte sparka ut dig själv från gruppen", "no-users-selected": "Ingen användare vald(a)", "invalid-home-page-route": "Ogiltig sidsökväg", - "invalid-session": "Session fel", - "invalid-session-text": "Det ser ut som din inloggningssession inte längre är aktiv eller inte längre överensstämmer med servern. Uppdatera denna sida.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Inga ämnen valda!", "cant-move-to-same-topic": "Kan inte flytta inlägg till samma ämne!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/th/error.json b/public/language/th/error.json index b663761c04..660b50f93c 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "คุณไม่สามารถเตะตัวเองออกจากกลุ่มได้", "no-users-selected": "ไม่มีผู้ใช้ที่เลือก", "invalid-home-page-route": "เส้นทางไปหน้าแรกผิดพลาด", - "invalid-session": "เซสชั่นไม่ถูกต้อง", - "invalid-session-text": "เหมือนกับว่าการเข้าสู่ระบบของคุณไม่ได้มีอยู่ในระบบ หรือไม่ก็ไม่ได้รับการตอบกลับจากเซิร์ฟเวอร์ กรุณารีเฟรชหน้าเว็บนี้", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "No topics selected!", "cant-move-to-same-topic": "Can't move post to same topic!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index 43809043b5..d565877c83 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Kendinizi gruptan atamazsınız.", "no-users-selected": "Seçili kullanıcı(lar) bulunamadı", "invalid-home-page-route": "Geçersiz anasayfa yolu", - "invalid-session": "Oturum Uyuşmazlığı", - "invalid-session-text": "Senin giriş oturumun pek aktif gözükmüyor, ya da sunucu ile eşleşmiyor. Lütfen sayfayı yenileyiniz.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Hiçbir başlık seçilmedi!", "cant-move-to-same-topic": "İletiyi aynı başlığa taşıyamazsın!", "cant-move-topic-to-same-category": "Başlığı bulunduğu kategoriye taşıyamazsınız!", diff --git a/public/language/uk/error.json b/public/language/uk/error.json index 47841172fd..106f6a9bef 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Ви не можете вигнати самі себе з групи", "no-users-selected": "Не вибрано жодного користувача", "invalid-home-page-route": "Невірний шлях на головну", - "invalid-session": "Сесія не існує", - "invalid-session-text": "Здається, що ваша сесія більше неактивна або розійшлася з серверною. Оновіть, будь ласка, цю сторінку.", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "Не вибрано жодної теми!", "cant-move-to-same-topic": "Ви не можете перемістити пост до тієї ж самої теми!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 7a92cd3901..a6819cce3a 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "Bạn không thể loại mình khỏi nhóm", "no-users-selected": "Chưa có người dùng(s) nào", "invalid-home-page-route": "Đường dẫn trang chủ không hợp lệ", - "invalid-session": "Không Khớp Phiên", - "invalid-session-text": "Có vẻ như phiên đăng nhập của bạn không hoạt động, hoặc không đúng với thông tin trên máy chủ. Vui lòng tải lại trang này", + "invalid-session": "Phiên Không Hợp Lệ", + "invalid-session-text": "Có vẻ như phiên đăng nhập của bạn không còn hoạt động. Vui lòng làm mới trang này.", + "session-mismatch": "‎Phiên Không Khớp‎", + "session-mismatch-text": "Có vẻ như phiên đăng nhập của bạn không còn khớp với máy chủ. Vui lòng làm mới trang này.", "no-topics-selected": "Không có chủ đề nào đang được chọn!", "cant-move-to-same-topic": "Bạn không thể di chuyển bài viết vào cùng chủ đề hiện tại!", "cant-move-topic-to-same-category": "Không thể di chuyển chủ đề sang cùng chuyên mục!", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index 4c35f7f5b0..81a5194eb9 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "您不能把自己踢出群组", "no-users-selected": "尚未选择用户", "invalid-home-page-route": "无效的首页路径", - "invalid-session": "Session 无法匹配", - "invalid-session-text": "您的登入状态已经失效,或者是与服务器信息不匹配。请刷新此页面。", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "没有主题被选中!", "cant-move-to-same-topic": "无法将帖子移动到相同的主题中!", "cant-move-topic-to-same-category": "无法将主题移动到相同的版块!", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index c20cdbd407..0fa4215f22 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -174,8 +174,10 @@ "cant-kick-self": "您不能把自己踢出群組", "no-users-selected": "尚未選擇使用者", "invalid-home-page-route": "無效的首頁路徑", - "invalid-session": "無效 Session", - "invalid-session-text": "您的登入狀態已經失效,或者是與伺服器資訊不一致。請重載此頁面。", + "invalid-session": "Invalid Session", + "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", + "session-mismatch": "Session Mismatch", + "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", "no-topics-selected": "沒有主題被選中!", "cant-move-to-same-topic": "無法將貼文移動到相同的主題中!", "cant-move-topic-to-same-category": "Can't move topic to the same category!", From 53335677e30e44dc1702f56790baa8070e77bc25 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 May 2021 09:23:59 +0000 Subject: [PATCH 062/116] fix(deps): update socket.io packages to v4.1.0 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index f81755cfe9..d734338dbc 100644 --- a/install/package.json +++ b/install/package.json @@ -119,9 +119,9 @@ "sharp": "0.28.2", "sitemap": "^7.0.0", "slideout": "1.0.1", - "socket.io": "4.0.2", + "socket.io": "4.1.0", "socket.io-adapter-cluster": "^1.0.1", - "socket.io-client": "4.0.2", + "socket.io-client": "4.1.0", "socket.io-redis": "6.1.0", "sortablejs": "1.13.0", "spdx-license-list": "^6.4.0", From dd81dd03e0987fb8bee0353c0d2e86f76bbb7dcc Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 11 May 2021 12:18:45 -0600 Subject: [PATCH 063/116] fix(#9508): switch to ioredis (#9545) * switch to ioredis also need this fix in redisearch: redis-search.js:98 ``` redisClient.multi(cmds).exec(function(err, ids) { if (err) { return callback(err); } var errRes = ids[resultIndex]; if (errRes[0]) { return callback(errRes[0]); } callback(null, errRes[1]); }); ``` * dbsearch compatible with ioredis * fixed dbsearch? --- install/package.json | 6 +++--- src/database/redis/connection.js | 37 ++++++++++++++++---------------- src/database/redis/hash.js | 8 +++++++ src/database/redis/helpers.js | 11 ++++++---- src/database/redis/sets.js | 3 +++ 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/install/package.json b/install/package.json index d734338dbc..cdd65a8581 100644 --- a/install/package.json +++ b/install/package.json @@ -85,7 +85,7 @@ "@nodebb/bootswatch": "3.4.2", "nconf": "^0.11.2", "nodebb-plugin-composer-default": "6.5.27", - "nodebb-plugin-dbsearch": "4.2.0", + "nodebb-plugin-dbsearch": "5.0.1", "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", "nodebb-plugin-markdown": "8.12.10", @@ -107,7 +107,7 @@ "postcss": "8.2.15", "postcss-clean": "1.2.0", "prompt": "^1.1.0", - "redis": "3.1.2", + "ioredis": "4.27.2", "request": "2.88.2", "request-promise-native": "^1.0.9", "requirejs": "2.3.6", @@ -182,4 +182,4 @@ "url": "https://github.com/barisusakli" } ] -} \ No newline at end of file +} diff --git a/src/database/redis/connection.js b/src/database/redis/connection.js index 6e685eadcf..1c8179a346 100644 --- a/src/database/redis/connection.js +++ b/src/database/redis/connection.js @@ -1,37 +1,34 @@ 'use strict'; const nconf = require('nconf'); -const redis = require('redis'); +const Redis = require('ioredis'); const winston = require('winston'); -const _ = require('lodash'); const connection = module.exports; -connection.getConnectionOptions = function (redis) { - redis = redis || nconf.get('redis'); - const connOptions = {}; - if (redis.password) { - connOptions.auth_pass = redis.password; - } - if (redis.hasOwnProperty('database')) { - connOptions.db = redis.database; - } - return _.merge(connOptions, redis.options || {}); -}; - connection.connect = async function (options) { return new Promise((resolve, reject) => { options = options || nconf.get('redis'); const redis_socket_or_host = options.host; - const connOptions = connection.getConnectionOptions(options); let cxn; if (redis_socket_or_host && String(redis_socket_or_host).indexOf('/') >= 0) { - /* If redis.host contains a path name character, use the unix dom sock connection. ie, /tmp/redis.sock */ - cxn = redis.createClient(options.host, connOptions); + // If redis.host contains a path name character, use the unix dom sock connection. ie, /tmp/redis.sock + cxn = new Redis({ + ...options.options, + path: redis_socket_or_host, + password: options.password, + db: options.database, + }); } else { - /* Else, connect over tcp/ip */ - cxn = redis.createClient(options.port, options.host, connOptions); + // Else, connect over tcp/ip + cxn = new Redis({ + ...options.options, + host: redis_socket_or_host, + port: options.port, + password: options.password, + db: options.database, + }); } const dbIdx = parseInt(options.database, 10); @@ -44,6 +41,8 @@ connection.connect = async function (options) { reject(err); }); cxn.on('ready', () => { + // back-compat with node_redis + cxn.batch = cxn.pipeline; resolve(cxn); }); diff --git a/src/database/redis/hash.js b/src/database/redis/hash.js index 42a1fccffc..24630ba371 100644 --- a/src/database/redis/hash.js +++ b/src/database/redis/hash.js @@ -111,6 +111,14 @@ module.exports = function (module) { data = [await module.client.async.hgetall(unCachedKeys[0])]; } + // convert empty objects into null for back-compat with node_redis + data = data.map((elem) => { + if (!Object.keys(elem).length) { + return null; + } + return elem; + }); + unCachedKeys.forEach((key, i) => { cachedData[key] = data[i] || null; cache.set(key, cachedData[key]); diff --git a/src/database/redis/helpers.js b/src/database/redis/helpers.js index 30b440d4e2..8961da8255 100644 --- a/src/database/redis/helpers.js +++ b/src/database/redis/helpers.js @@ -1,14 +1,17 @@ 'use strict'; -const util = require('util'); - const helpers = module.exports; helpers.noop = function () {}; helpers.execBatch = async function (batch) { - const proFn = util.promisify(batch.exec).bind(batch); - return await proFn(); + const results = await batch.exec(); + return results.map(([err, res]) => { + if (err) { + throw err; + } + return res; + }); }; helpers.resultsToBool = function (results) { diff --git a/src/database/redis/sets.js b/src/database/redis/sets.js index 2146e1ae5e..a0431995a4 100644 --- a/src/database/redis/sets.js +++ b/src/database/redis/sets.js @@ -29,6 +29,9 @@ module.exports = function (module) { if (!Array.isArray(key)) { key = [key]; } + if (!value.length) { + return; + } const batch = module.client.batch(); key.forEach(k => batch.srem(String(k), value)); From 155a7fb6e714af25855c11b17bfd13145e49c76d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 11 May 2021 23:26:16 +0000 Subject: [PATCH 064/116] fix(deps): update socket.io packages to v4.1.1 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index cdd65a8581..a9e4a7a377 100644 --- a/install/package.json +++ b/install/package.json @@ -119,9 +119,9 @@ "sharp": "0.28.2", "sitemap": "^7.0.0", "slideout": "1.0.1", - "socket.io": "4.1.0", + "socket.io": "4.1.1", "socket.io-adapter-cluster": "^1.0.1", - "socket.io-client": "4.1.0", + "socket.io-client": "4.1.1", "socket.io-redis": "6.1.0", "sortablejs": "1.13.0", "spdx-license-list": "^6.4.0", From 2e6a01a7c8e886650efa37a90e9bbe0c1788fa67 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 12 May 2021 09:08:37 +0000 Subject: [PATCH 065/116] Latest translations and fallbacks --- public/language/it/error.json | 8 +-- public/language/nb/admin/settings/user.json | 70 +++++++++---------- public/language/zh-CN/admin/dashboard.json | 16 ++--- .../language/zh-CN/admin/extend/plugins.json | 2 +- .../zh-CN/admin/manage/privileges.json | 8 +-- public/language/zh-CN/post-queue.json | 14 ++-- public/language/zh-CN/success.json | 2 +- public/language/zh-CN/user.json | 6 +- public/language/zh-CN/users.json | 2 +- 9 files changed, 64 insertions(+), 64 deletions(-) diff --git a/public/language/it/error.json b/public/language/it/error.json index 07e1af839f..70619300a5 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -174,10 +174,10 @@ "cant-kick-self": "Non puoi espellerti dal gruppo", "no-users-selected": "Nessun utente selezionato", "invalid-home-page-route": "Percorso della pagina iniziale non valido", - "invalid-session": "Invalid Session", - "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", - "session-mismatch": "Session Mismatch", - "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", + "invalid-session": "Sessione non valida", + "invalid-session-text": "Sembra che la tua sessione di accesso non sia più attiva. Si prega di aggiornare questa pagina.", + "session-mismatch": "Mancata corrispondenza della sessione", + "session-mismatch-text": "Sembra che la tua sessione di accesso non corrisponda più al server. Si prega di aggiornare questa pagina.", "no-topics-selected": "Nessuna discussione selezionata!", "cant-move-to-same-topic": "Non puoi spostare il post nella stessa discussione!", "cant-move-topic-to-same-category": "Non si può spostare la discussione nella stessa categoria!", diff --git a/public/language/nb/admin/settings/user.json b/public/language/nb/admin/settings/user.json index 35068c94a0..37f0b6fdfe 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -30,55 +30,55 @@ "session-time": "Tidssesjon ", "session-time-days": "Dager", "session-time-seconds": "Sekunder", - "session-time-help": "Minutter etter at bruker er ansett som inaktiv ", - "online-cutoff": "Minutes after user is considered inactive", + "session-time-help": "Disse verdiene brukes for å følge med på hvor lenge en bruker er logget inn når de sjekker "Remember Me" ved pålogging. Merk at kun en av disse verdiene brukes. Hvis det ikke er sekundverdi bruker vi dager. Hvis det ikke er noen verdier for dager faller verdien tilbake til 14 dager.", + "online-cutoff": "Minutter etter at bruker er ansett som inaktiv ", "online-cutoff-help": "Hvis brukeren ikke utfører noen handlinger for den bestemte varigheten, anses de som inaktive, og de mottar ikke sanntidsoppdateringer.", "registration": "Brukerregistrering", "registration-type": "Registreringstype", - "registration-approval-type": "Registration Approval Type", + "registration-approval-type": "Registrering godkjenningstype", "registration-type.normal": "Normal", "registration-type.admin-approval": "Administrator-godkjenning", "registration-type.admin-approval-ip": "Administrator godkjenning for IP-er", "registration-type.invite-only": "Kun invitasjon", "registration-type.admin-invite-only": "Kun invitasjon fra administrator ", "registration-type.disabled": "Ingen registrering ", - "registration-type.help": "Normal - Users can register from the /register page.
\nInvite Only - Users can invite others from the users page.
\nAdmin Invite Only - Only administrators can invite others from users and admin/manage/users pages.
\nNo registration - No user registration.
", - "registration-approval-type.help": "Normal - Users are registered immediately.
\nAdmin Approval - User registrations are placed in an approval queue for administrators.
\nAdmin Approval for IPs - Normal for new users, Admin Approval for IP addresses that already have an account.
", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", + "registration-type.help": "Normalt - Brukere kan registrere seg fra / registersiden.
\nKun invitasjon - Brukere kan invitere andre fra brukersiden \nKun admin-invitasjon- Kun administratorer kan invitere andre fra brukere og administrere/brukere sidene .
\n Ingen registrering - Ingen brukerregistrering.
", + "registration-approval-type.help": "Normalt - Brukere registreres umiddelbart.
\nAdministratorgodkjenning - Brukerregistreringer plasseres i en kø for godkjenning for administratorer.
\nAdmin-godkjenning for IP-er - Normalt for nye brukere, Admin-godkjenning for IP-adresser som allerede har en konto.
", + "registration-queue-auto-approve-time": "Automatisk godkjenningstid", + "registration-queue-auto-approve-time-help": "Timer før brukeren godkjennes automatisk. 0 for å deaktivere.", "registration-queue-show-average-time": "Show users average time it takes to approve a new user", - "registration.max-invites": "Maximum Invitations per User", - "max-invites": "Maximum Invitations per User", - "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", - "invite-expiration": "Invite expiration", - "invite-expiration-help": "# of days invitations expire in.", - "min-username-length": "Minimum Username Length", - "max-username-length": "Maximum Username Length", - "min-password-length": "Minimum Password Length", - "min-password-strength": "Minimum Password Strength", - "max-about-me-length": "Maximum About Me Length", - "terms-of-use": "Forum Terms of Use (Leave blank to disable)", - "user-search": "User Search", - "user-search-results-per-page": "Number of results to display", - "default-user-settings": "Default User Settings", - "show-email": "Show email", - "show-fullname": "Show fullname", - "restrict-chat": "Only allow chat messages from users I follow", - "outgoing-new-tab": "Open outgoing links in new tab", + "registration.max-invites": "Maksimum invitasjoner per bruker", + "max-invites": "Maksimum invitasjoner per bruker", + "max-invites-help": "0 for uten begrensning. Administratorer får uendelige invitasjoner
Gjelder kun for \"Bare inviter\"", + "invite-expiration": "Invitasjon utløpt", + "invite-expiration-help": "Invitasjoner utløper om # dager.", + "min-username-length": "Minimum lengde på brukernavnet ", + "max-username-length": "Maksimum lengde på brukernavn ", + "min-password-length": "Maksimum passordlengde", + "min-password-strength": "Minimum passordstyrke", + "max-about-me-length": "Maksimum lengde på om meg", + "terms-of-use": "Brukervilkår for nettforumet (La stå tomt for å deaktivere)", + "user-search": "Brukersøk", + "user-search-results-per-page": "Antall resultater å vise", + "default-user-settings": "Standard brukerinnstillinger ", + "show-email": "Vis e-post", + "show-fullname": "Vis fullt navn", + "restrict-chat": "Tillat kun chatt-meldinger fra brukere jeg følger", + "outgoing-new-tab": "Åpne utgående lenker i ny fane", "topic-search": "Aktiver i-tråd-søk", - "update-url-with-post-index": "Update url with post index while browsing topics", + "update-url-with-post-index": "Oppdater url med postindeks mens du surfer på emner", "digest-freq": "Subscribe to Digest", - "digest-freq.off": "Off", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", - "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", + "digest-freq.off": "Av", + "digest-freq.daily": "Daglig", + "digest-freq.weekly": "Ukentlig", + "digest-freq.monthly": "Månedlig ", + "email-chat-notifs": "Send en e-post hvis jeg mottar en ny chatt-melding om jeg ikke er online. ", "email-post-notif": "Send en e-post når det kommer svar på tråder jeg abbonnerer på", "follow-created-topics": "Følg tråder du lager", "follow-replied-topics": "Følg tråder du svarer på", - "default-notification-settings": "Default notification settings", + "default-notification-settings": "Standard varslingsinnstillinger", "categoryWatchState": "Default category watch state", - "categoryWatchState.watching": "Watching", - "categoryWatchState.notwatching": "Not Watching", - "categoryWatchState.ignoring": "Ignoring" + "categoryWatchState.watching": "Overvåker", + "categoryWatchState.notwatching": "Overvåker ikke", + "categoryWatchState.ignoring": "Ignorerer" } diff --git a/public/language/zh-CN/admin/dashboard.json b/public/language/zh-CN/admin/dashboard.json index 9cf1dd41b7..427fdb412a 100644 --- a/public/language/zh-CN/admin/dashboard.json +++ b/public/language/zh-CN/admin/dashboard.json @@ -2,7 +2,7 @@ "forum-traffic": "论坛流量", "page-views": "页面浏览量", "unique-visitors": "单一访客", - "logins": "Logins", + "logins": "登录", "new-users": "新用户", "posts": "发帖", "topics": "主题", @@ -30,7 +30,7 @@ "upgrade-available": "

新的版本 (v%1) 已经发布。建议您 升级 NodeBB

", "prerelease-upgrade-available": "

这是一个已经过期的预发布版本的 NodeBB,新的版本 (v%1) 已经发布。建议您 升级 NodeBB

", "prerelease-warning": "

正在使用测试版 NodeBB。可能会出现意外的 Bug。

", - "fallback-emailer-not-found": "Fallback emailer not found!", + "fallback-emailer-not-found": "找不到备用邮箱", "running-in-development": "论坛正处于开发模式,这可能使其暴露于潜在的危险之中;请联系您的系统管理员。", "latest-lookup-failed": "

无法查找 NodeBB 的最新可用版本

", @@ -79,10 +79,10 @@ "last-restarted-by": "上次重启管理员/时间", "no-users-browsing": "没有用户正在浏览", - "back-to-dashboard": "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-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" + "back-to-dashboard": "返回控制面板", + "details.no-users": "选定的时间内没有用户加入", + "details.no-topics": "选定的时间内没有发布主题", + "details.no-logins": "选定的时间内没有登录记录", + "details.logins-static": "NodeBB只保留%1天登录数据,下列表格显示最近活动的登录。", + "details.logins-login-time": "登录时间" } diff --git a/public/language/zh-CN/admin/extend/plugins.json b/public/language/zh-CN/admin/extend/plugins.json index c69c28021d..27e29a407f 100644 --- a/public/language/zh-CN/admin/extend/plugins.json +++ b/public/language/zh-CN/admin/extend/plugins.json @@ -39,7 +39,7 @@ "alert.upgraded": "插件已升级", "alert.installed": "插件已安装", "alert.uninstalled": "插件已卸载", - "alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin", + "alert.activate-success": "请重新编译和启动NodeBB以激活此插件", "alert.deactivate-success": "插件停用成功", "alert.upgrade-success": "请部署并重启您的 NodeBB 来完成更新此插件。", "alert.install-success": "插件安装成功,请启用插件。", diff --git a/public/language/zh-CN/admin/manage/privileges.json b/public/language/zh-CN/admin/manage/privileges.json index 638395ebd4..d924b77dd4 100644 --- a/public/language/zh-CN/admin/manage/privileges.json +++ b/public/language/zh-CN/admin/manage/privileges.json @@ -4,13 +4,13 @@ "group-privileges": "群组权限", "user-privileges": "用户权限", "edit-privileges": "编辑权限", - "select-clear-all": "Select/Clear All", + "select-clear-all": "选择/清除 全部", "chat": "对话", "upload-images": "上传图片", "upload-files": "上传文件", "signature": "签名档", "ban": "封禁", - "invite": "Invite", + "invite": "邀请", "search-content": "搜索内容", "search-users": "搜索用户", "search-tags": "搜索话题", @@ -41,8 +41,8 @@ "admin-privileges": "权限", "admin-users": "用户", "admin-admins-mods": "Admins & Mods", - "admin-groups": "Groups", - "admin-tags": "Tags", + "admin-groups": "群组", + "admin-tags": "话题", "admin-settings": "设置", "alert.confirm-moderate": "您确定要将审核权限授予此用户组吗?此用户组是公开的,任何用户都可以随意加入。", diff --git a/public/language/zh-CN/post-queue.json b/public/language/zh-CN/post-queue.json index a63312d82b..721af42702 100644 --- a/public/language/zh-CN/post-queue.json +++ b/public/language/zh-CN/post-queue.json @@ -8,11 +8,11 @@ "content": "内容", "posted": "发布", "reply-to": "回复\"%1\"", - "content-editable": "Click on content to edit", - "category-editable": "Click on category to edit", - "title-editable": "Click on title to edit", - "reply": "Reply", - "topic": "Topic", - "accept": "Accept", - "reject": "Reject" + "content-editable": "点击内容开始编辑", + "category-editable": "点击版块开始编辑", + "title-editable": "点击标题开始编辑", + "reply": "回复", + "topic": "主题", + "accept": "接受", + "reject": "拒绝" } \ No newline at end of file diff --git a/public/language/zh-CN/success.json b/public/language/zh-CN/success.json index bd3a117454..951863f0a6 100644 --- a/public/language/zh-CN/success.json +++ b/public/language/zh-CN/success.json @@ -1,7 +1,7 @@ { "success": "成功", "topic-post": "您已成功发布。", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "你的帖子正在等待批准。帖子被批准或者拒绝的时候,你会收到一个通知。", "authentication-successful": "验证成功", "settings-saved": "设置已保存!" } \ No newline at end of file diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index be98b84f01..01df3bc8b7 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -84,7 +84,7 @@ "remove_cover_picture_confirm": "您确定要移除封面图片吗?", "crop_picture": "剪裁图片", "upload_cropped_picture": "剪裁并上传", - "avatar-background-colour": "Avatar background colour", + "avatar-background-colour": "头像背景颜色", "settings": "设置", "show_email": "显示我的电子邮箱", "show_fullname": "显示我的全名", @@ -124,7 +124,7 @@ "open_links_in_new_tab": "在新标签打开外部链接", "enable_topic_searching": "启用主题内搜索", "topic_search_help": "如果启用此项,主题内搜索会替代浏览器默认的页面搜索,您将可以在整个主题内搜索,而不仅仅只搜索页面上展现的内容。", - "update_url_with_post_index": "Update url with post index while browsing topics", + "update_url_with_post_index": "浏览主题是更新链接和索引", "scroll_to_my_post": "在提交回复之后显示新回复", "follow_topics_you_reply_to": "关注您回复过的主题", "follow_topics_you_create": "关注您创建的主题", @@ -136,7 +136,7 @@ "homepage": "首页", "homepage_description": "选择一个页面作为论坛的首页,否则设置为 ‘空’ 使用默认首页。", "custom_route": "自定义首页路由", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\" or \"category/2/general-discussion\")", + "custom_route_help": "输入路由名称,前面不需要斜杠 ( 例如, \"recent\" 或 \"category/2/general-discussion\" )", "sso.title": "单点登录服务", "sso.associated": "已关联到", "sso.not-associated": "点击这里来关联", diff --git a/public/language/zh-CN/users.json b/public/language/zh-CN/users.json index 6cdac0c1cc..9b1f392eb8 100644 --- a/public/language/zh-CN/users.json +++ b/public/language/zh-CN/users.json @@ -11,7 +11,7 @@ "online-only": "只看在线", "invite": "邀请注册", "prompt-email": "邮件:", - "groups-to-join": "Groups to be joined when invite is accepted:", + "groups-to-join": "邀请接受时要加入的群组:", "invitation-email-sent": "已发送邀请给 %1", "user_list": "用户列表", "recent_topics": "最新主题", From b82774c51d6a4ea8dfc482cb734014156ec3dc23 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 12 May 2021 09:55:33 +0000 Subject: [PATCH 066/116] chore(deps): update commitlint monorepo to v12.1.3 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index a9e4a7a377..07b2375297 100644 --- a/install/package.json +++ b/install/package.json @@ -142,8 +142,8 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.0.2", - "@commitlint/cli": "12.1.1", - "@commitlint/config-angular": "12.1.1", + "@commitlint/cli": "12.1.3", + "@commitlint/config-angular": "12.1.3", "coveralls": "3.1.0", "eslint": "7.26.0", "eslint-config-airbnb-base": "14.2.1", From a2442ee91460feade9f67d5661a3c0f97825474e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 12 May 2021 10:20:45 -0400 Subject: [PATCH 067/116] feat: add filter:account.getPostsFromUserSet --- src/controllers/accounts/posts.js | 45 +++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index 0d52621a9b..23f226a1e5 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -8,6 +8,8 @@ const categories = require('../../categories'); const pagination = require('../../pagination'); const helpers = require('../helpers'); const accountHelpers = require('./helpers'); +const plugins = require('../../plugins'); +const utils = require('../../utils'); const postsController = module.exports; @@ -107,38 +109,38 @@ const templateToData = { }; postsController.getBookmarks = async function (req, res, next) { - await getFromUserSet('account/bookmarks', req, res, next); + await getPostsFromUserSet('account/bookmarks', req, res, next); }; postsController.getPosts = async function (req, res, next) { - await getFromUserSet('account/posts', req, res, next); + await getPostsFromUserSet('account/posts', req, res, next); }; postsController.getUpVotedPosts = async function (req, res, next) { - await getFromUserSet('account/upvoted', req, res, next); + await getPostsFromUserSet('account/upvoted', req, res, next); }; postsController.getDownVotedPosts = async function (req, res, next) { - await getFromUserSet('account/downvoted', req, res, next); + await getPostsFromUserSet('account/downvoted', req, res, next); }; postsController.getBestPosts = async function (req, res, next) { - await getFromUserSet('account/best', req, res, next); + await getPostsFromUserSet('account/best', req, res, next); }; postsController.getWatchedTopics = async function (req, res, next) { - await getFromUserSet('account/watched', req, res, next); + await getPostsFromUserSet('account/watched', req, res, next); }; postsController.getIgnoredTopics = async function (req, res, next) { - await getFromUserSet('account/ignored', req, res, next); + await getPostsFromUserSet('account/ignored', req, res, next); }; postsController.getTopics = async function (req, res, next) { - await getFromUserSet('account/topics', req, res, next); + await getPostsFromUserSet('account/topics', req, res, next); }; -async function getFromUserSet(template, req, res, callback) { +async function getPostsFromUserSet(template, req, res, callback) { const data = templateToData[template]; const page = Math.max(1, parseInt(req.query.page, 10) || 1); @@ -154,11 +156,26 @@ async function getFromUserSet(template, req, res, callback) { const start = (page - 1) * itemsPerPage; const stop = start + itemsPerPage - 1; const sets = await data.getSets(req.uid, userData); - - const [itemCount, itemData] = await Promise.all([ - settings.usePagination ? db.sortedSetsCardSum(sets) : 0, - getItemData(sets, data, req, start, stop), - ]); + let result; + if (plugins.hasListeners('filter:account.getPostsFromUserSet')) { + result = await plugins.hooks.fire('filter:account.getPostsFromUserSet', { + req: req, + userData: userData, + settings: settings, + data: data, + start: start, + stop: stop, + itemCount: itemCount, + itemData: itemData, + }); + } else { + result = utils.promiseParallel({ + itemCount: settings.usePagination ? db.sortedSetsCardSum(sets) : 0, + itemData: getItemData(sets, data, req, start, stop), + }); + } + const itemCount = result.itemCount; + const itemData = result.itemData; userData[data.type] = itemData[data.type]; userData.nextStart = itemData.nextStart; From 1f3e660108696822c32c356e788bfd28401463d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 12 May 2021 10:22:51 -0400 Subject: [PATCH 068/116] feat: add template to hook --- src/controllers/accounts/posts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index 23f226a1e5..93c7d8b917 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -160,6 +160,7 @@ async function getPostsFromUserSet(template, req, res, callback) { if (plugins.hasListeners('filter:account.getPostsFromUserSet')) { result = await plugins.hooks.fire('filter:account.getPostsFromUserSet', { req: req, + template: template, userData: userData, settings: settings, data: data, From 074ee859c46ccea956a1c550f6ac4991e848a73f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 12 May 2021 10:28:35 -0400 Subject: [PATCH 069/116] fix: tests --- src/controllers/accounts/posts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index 93c7d8b917..a2996084dd 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -166,8 +166,8 @@ async function getPostsFromUserSet(template, req, res, callback) { data: data, start: start, stop: stop, - itemCount: itemCount, - itemData: itemData, + itemCount: 0, + itemData: [], }); } else { result = utils.promiseParallel({ From fad5988ed6243aac9052ef6f501e540b3de68877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 12 May 2021 10:38:11 -0400 Subject: [PATCH 070/116] fix: tests --- src/controllers/accounts/posts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index a2996084dd..7b7575c119 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -157,7 +157,7 @@ async function getPostsFromUserSet(template, req, res, callback) { const stop = start + itemsPerPage - 1; const sets = await data.getSets(req.uid, userData); let result; - if (plugins.hasListeners('filter:account.getPostsFromUserSet')) { + if (plugins.hooks.hasListeners('filter:account.getPostsFromUserSet')) { result = await plugins.hooks.fire('filter:account.getPostsFromUserSet', { req: req, template: template, @@ -170,7 +170,7 @@ async function getPostsFromUserSet(template, req, res, callback) { itemData: [], }); } else { - result = utils.promiseParallel({ + result = await utils.promiseParallel({ itemCount: settings.usePagination ? db.sortedSetsCardSum(sets) : 0, itemData: getItemData(sets, data, req, start, stop), }); From ffa801635531548902527ad560784ee1a711554f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 12 May 2021 10:41:38 -0400 Subject: [PATCH 071/116] fix: lint --- src/controllers/accounts/posts.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index 7b7575c119..b589b3990a 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -175,9 +175,7 @@ async function getPostsFromUserSet(template, req, res, callback) { itemData: getItemData(sets, data, req, start, stop), }); } - const itemCount = result.itemCount; - const itemData = result.itemData; - + const { itemCount, itemData } = result; userData[data.type] = itemData[data.type]; userData.nextStart = itemData.nextStart; From 4a01313de3236f37f31b7871799866de6ae7e15d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 13 May 2021 06:55:08 +0000 Subject: [PATCH 072/116] chore(deps): update commitlint monorepo to v12.1.4 --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index 07b2375297..35ccf6d832 100644 --- a/install/package.json +++ b/install/package.json @@ -142,8 +142,8 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "10.0.2", - "@commitlint/cli": "12.1.3", - "@commitlint/config-angular": "12.1.3", + "@commitlint/cli": "12.1.4", + "@commitlint/config-angular": "12.1.4", "coveralls": "3.1.0", "eslint": "7.26.0", "eslint-config-airbnb-base": "14.2.1", From 70852c24de5f5384f203af783e8d52c5db2ec359 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 13 May 2021 09:07:39 +0000 Subject: [PATCH 073/116] Latest translations and fallbacks --- public/language/nb/success.json | 2 +- public/language/nb/topic.json | 24 ++++++++++++------------ public/language/nb/users.json | 8 ++++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/public/language/nb/success.json b/public/language/nb/success.json index 633643722b..13fa3b4f37 100644 --- a/public/language/nb/success.json +++ b/public/language/nb/success.json @@ -1,7 +1,7 @@ { "success": "Suksess", "topic-post": "Du har nå publisert.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Innlegget ditt er satt i kø for godkjenning. Du vil få en melding når den har blitt godkjent eller avvist. ", "authentication-successful": "Innlogging vellykket!", "settings-saved": "Innstillinger lagret!" } \ No newline at end of file diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 0dbc494a78..491ee142d6 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -1,6 +1,6 @@ { "topic": "Emne", - "title": "Title", + "title": "Tittel", "no_topics_found": "Ingen tråder funnet!", "no_posts_found": "Ingen innlegg funnet!", "post_is_deleted": "Dette innlegget er slettet!", @@ -12,29 +12,29 @@ "notify_me": "Bli varslet om nye svar i denne tråden", "quote": "Siter", "reply": "Svar", - "replies_to_this_post": "%1 Replies", - "one_reply_to_this_post": "1 Reply", - "last_reply_time": "Last reply", + "replies_to_this_post": "%1 Svar", + "one_reply_to_this_post": "1 Svar", + "last_reply_time": "Siste svar", "reply-as-topic": "Svar som tråd", "guest-login-reply": "Logg inn for å besvare", - "login-to-view": "🔒 Log in to view", + "login-to-view": "🔒 Logg inn for å se", "edit": "Endre", "delete": "Slett", "purge": "Rensk", "restore": "Gjenopprett", "move": "Flytt", - "change-owner": "Change Owner", + "change-owner": "Bytt eier", "fork": "Forgren", "link": "Link", "share": "Del", "tools": "Verktøy", "locked": "Låst", - "pinned": "Pinned", - "pinned-with-expiry": "Pinned until %1", - "scheduled": "Scheduled", - "moved": "Moved", - "moved-from": "Moved from %1", - "copy-ip": "Copy IP", + "pinned": "Festet", + "pinned-with-expiry": "Festet til %1", + "scheduled": "Planlagt", + "moved": "Flyttet", + "moved-from": "Flyttet fra %1", + "copy-ip": "Kopier IP", "ban-ip": "Ban IP", "view-history": "Edit History", "locked-by": "Locked by", diff --git a/public/language/nb/users.json b/public/language/nb/users.json index c222134152..fad91fcace 100644 --- a/public/language/nb/users.json +++ b/public/language/nb/users.json @@ -2,7 +2,7 @@ "latest_users": "Seneste brukere", "top_posters": "Flest innlegg", "most_reputation": "Best rykte", - "most_flags": "Most Flags", + "most_flags": "Flest flagg", "search": "Søk", "enter_username": "Skriv inn et brukernavn for å søke", "load_more": "Last flere", @@ -10,8 +10,8 @@ "filter-by": "Filtrer etter", "online-only": "Bare påloggede", "invite": "Invitér", - "prompt-email": "Emails:", - "groups-to-join": "Groups to be joined when invite is accepted:", + "prompt-email": "E-poster:", + "groups-to-join": "Grupper som en kan bli med i når invitasjonen godtas:", "invitation-email-sent": "En invitasjons-epost ble sendt til %1", "user_list": "Brukerliste", "recent_topics": "Seneste tråder", @@ -19,5 +19,5 @@ "unread_topics": "Uleste tråder", "categories": "Kategorier", "tags": "Tagger", - "no-users-found": "No users found!" + "no-users-found": "Ingen brukere funnet" } \ No newline at end of file From a3d6c56ec32aa1cdd8faf1ee3ea91ab87bd3627a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 13 May 2021 12:16:53 -0400 Subject: [PATCH 074/116] feat: #9551 --- install/package.json | 2 +- src/database/redis.js | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/install/package.json b/install/package.json index 35ccf6d832..3ca7a4ad65 100644 --- a/install/package.json +++ b/install/package.json @@ -122,7 +122,7 @@ "socket.io": "4.1.1", "socket.io-adapter-cluster": "^1.0.1", "socket.io-client": "4.1.1", - "socket.io-redis": "6.1.0", + "@socket.io/redis-adapter": "7.0.0", "sortablejs": "1.13.0", "spdx-license-list": "^6.4.0", "spider-detector": "2.0.0", diff --git a/src/database/redis.js b/src/database/redis.js index cef6105b5e..759f100bab 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -104,13 +104,11 @@ redisModule.info = async function (cxn) { }; redisModule.socketAdapter = async function () { - const redisAdapter = require('socket.io-redis'); + const redisAdapter = require('@socket.io/redis-adapter'); const pub = await connection.connect(nconf.get('redis')); const sub = await connection.connect(nconf.get('redis')); - return redisAdapter({ + return redisAdapter(pub, sub, { key: `db:${nconf.get('redis:database')}:adapter_key`, - pubClient: pub, - subClient: sub, }); }; From 1623ba4f4148fdc83724bba7829a6f5604d70246 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 14 May 2021 07:11:56 +0000 Subject: [PATCH 075/116] chore(deps): update dependency eslint-plugin-import to v2.23.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3ca7a4ad65..34687b8708 100644 --- a/install/package.json +++ b/install/package.json @@ -147,7 +147,7 @@ "coveralls": "3.1.0", "eslint": "7.26.0", "eslint-config-airbnb-base": "14.2.1", - "eslint-plugin-import": "2.22.1", + "eslint-plugin-import": "2.23.0", "grunt": "1.4.0", "grunt-contrib-watch": "1.1.0", "husky": "6.0.0", From 728db64485c2fe71d05f619112ab1fe4e5741ad9 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 14 May 2021 09:10:04 +0000 Subject: [PATCH 076/116] Latest translations and fallbacks --- public/language/fr/error.json | 8 +++--- public/language/nb/topic.json | 54 +++++++++++++++++------------------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/public/language/fr/error.json b/public/language/fr/error.json index f970d5efdd..741fff28d7 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -174,10 +174,10 @@ "cant-kick-self": "Vous ne pouvez pas vous exclure vous-même du groupe", "no-users-selected": "Aucun utilisateur sélectionné", "invalid-home-page-route": "Chemin vers la page d'accueil invalide", - "invalid-session": "Invalid Session", - "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", - "session-mismatch": "Session Mismatch", - "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", + "invalid-session": "Session Invalide", + "invalid-session-text": "Il semblerait que votre session de connexion ne soit plus active. Merci de rafraîchir cette page.", + "session-mismatch": "Session Interrompue", + "session-mismatch-text": "Il semble que votre session ne soit plus active, ou que le serveur ne la reconnaisse plus. Merci de rafraîchir cette page.", "no-topics-selected": "Aucun sujet sélectionné !", "cant-move-to-same-topic": "Impossible de déplacer le message dans le même sujet !", "cant-move-topic-to-same-category": "Impossible de déplacer le sujet dans la même catégorie !", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 491ee142d6..275fd77bfc 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -35,38 +35,38 @@ "moved": "Flyttet", "moved-from": "Flyttet fra %1", "copy-ip": "Kopier IP", - "ban-ip": "Ban IP", - "view-history": "Edit History", - "locked-by": "Locked by", - "unlocked-by": "Unlocked by", - "pinned-by": "Pinned by", - "unpinned-by": "Unpinned by", - "deleted-by": "Deleted by", - "restored-by": "Restored by", - "queued-by": "Post queued for approval →", + "ban-ip": "Forby IP", + "view-history": "Redigere historie", + "locked-by": "Låst av", + "unlocked-by": "Låst opp av", + "pinned-by": "Festet av", + "unpinned-by": "Løsnet av", + "deleted-by": "Slettet av", + "restored-by": "Gjenopprettet av", + "queued-by": "Innlegg i kø for godkjenning & rarr;", "bookmark_instructions": "Klikk her for å gå tilbake til det siste innlegget i denne tråden.", - "flag-post": "Flag this post", - "flag-user": "Flag this user", - "already-flagged": "Already Flagged", - "view-flag-report": "View Flag Report", - "resolve-flag": "Resolve Flag", - "merged_message": "This topic has been merged into %2", + "flag-post": "Flagg denne posten", + "flag-user": "Flagg denne brukeren", + "already-flagged": "Allerede flagget", + "view-flag-report": "Vis flaggrapport ", + "resolve-flag": "Løs flagg", + "merged_message": "Dette emnet er slått sammen med %2", "deleted_message": "Denne tråden har blitt slettet. Bare brukere med trådhåndterings-privilegier kan se den.", "following_topic.message": "Du vil nå motta varsler når noen skriver i denne tråden.", "not_following_topic.message": "Du vil se denne tråden i trådlisten, men du vil ikke motta varslinger når noen skriver i den.", "ignoring_topic.message": "Du vil ikke lenger se denne tråden blandt de uleste trådene. Du vil få et varsel når du blir nevnt eller din tråd blir oppstemt.", "login_to_subscribe": "Vennligst registrer deg eller logg inn for å abonnere på denne tråden.", "markAsUnreadForAll.success": "Tråd markert som ulest for alle.", - "mark_unread": "Mark unread", + "mark_unread": "Merk som ulest", "mark_unread.success": "Tråd merket som ulest.", "watch": "Overvåk", "unwatch": "Ikke overvåk", "watch.title": "Bli varslet om nye svar i denne tråden", "unwatch.title": "Slutt å følge denne tråden", "share_this_post": "Del ditt innlegg", - "watching": "Watching", - "not-watching": "Not Watching", - "ignoring": "Ignoring", + "watching": "Overvåker", + "not-watching": "Overvåker ikke", + "ignoring": "Ignorerer", "watching.description": "Varlse meg om nye svar.
Vis tråd i ulest.", "not-watching.description": "Ikke varsle meg om nye svar.
Vis tråd i ulest hvis ikke kategori er ignorert.", "ignoring.description": "Ikke varsle meg om nye svar.
Ikke vis tråd i ulest.", @@ -77,23 +77,23 @@ "thread_tools.lock": "Lås tråd", "thread_tools.unlock": "Lås opp tråd", "thread_tools.move": "Flytt tråd", - "thread_tools.move-posts": "Move Posts", + "thread_tools.move-posts": "Flytt innlegg", "thread_tools.move_all": "Flytt alle", - "thread_tools.change_owner": "Change Owner", - "thread_tools.select_category": "Select Category", + "thread_tools.change_owner": "Bytt eier", + "thread_tools.select_category": "Velg kategori", "thread_tools.fork": "Forgren tråd", "thread_tools.delete": "Slett tråd", - "thread_tools.delete-posts": "Delete Posts", + "thread_tools.delete-posts": "Slett innlegg", "thread_tools.delete_confirm": "Er du sikker på at du vil slette denne tråden?", "thread_tools.restore": "Gjenopprett tråd", "thread_tools.restore_confirm": "Er du sikker på at du vil gjenopprette denne tråden?", "thread_tools.purge": "Rensk tråd", "thread_tools.purge_confirm": "Er du sikker på at du vil renske denne tråden?", - "thread_tools.merge_topics": "Merge Topics", - "thread_tools.merge": "Merge", + "thread_tools.merge_topics": "Flett emner", + "thread_tools.merge": "Slå sammen", "topic_move_success": "Denne tråden vil straks bli flyttet til \"%1\". Klikk her for å angre.", - "topic_move_multiple_success": "These topics will be moved to \"%1\" shortly. Click here to undo.", - "topic_move_all_success": "All topics will be moved to \"%1\" shortly. Click here to undo.", + "topic_move_multiple_success": "Disse emnene vil straks bli flyttet til \"%1\". Klikk her for å angre.", + "topic_move_all_success": "Alle emner vil straks bli flyttet til \"%1\". Klikk her for å angre.", "topic_move_undone": "Topic move undone", "topic_move_posts_success": "Posts will be moved shortly. Click here to undo.", "topic_move_posts_undone": "Post move undone", From 94c12e37716a9ac36f6f653430202be8c8d3b5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 14 May 2021 10:56:03 -0400 Subject: [PATCH 077/116] feat: #9508, add cluster support --- src/database/redis/connection.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/database/redis/connection.js b/src/database/redis/connection.js index 1c8179a346..6b43c9ee79 100644 --- a/src/database/redis/connection.js +++ b/src/database/redis/connection.js @@ -12,7 +12,9 @@ connection.connect = async function (options) { const redis_socket_or_host = options.host; let cxn; - if (redis_socket_or_host && String(redis_socket_or_host).indexOf('/') >= 0) { + if (options.cluster) { + cxn = new Redis.Cluster(options.cluster, options.options); + } else if (redis_socket_or_host && String(redis_socket_or_host).indexOf('/') >= 0) { // If redis.host contains a path name character, use the unix dom sock connection. ie, /tmp/redis.sock cxn = new Redis({ ...options.options, From e8c5c18af16567daba1359e7cbd3806ef1ca4920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 14 May 2021 11:21:49 -0400 Subject: [PATCH 078/116] fix: lint --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 34687b8708..3ca7a4ad65 100644 --- a/install/package.json +++ b/install/package.json @@ -147,7 +147,7 @@ "coveralls": "3.1.0", "eslint": "7.26.0", "eslint-config-airbnb-base": "14.2.1", - "eslint-plugin-import": "2.23.0", + "eslint-plugin-import": "2.22.1", "grunt": "1.4.0", "grunt-contrib-watch": "1.1.0", "husky": "6.0.0", From 0551642a35cc4c486edbb8170bc122fa8674b840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 14 May 2021 13:00:56 -0400 Subject: [PATCH 079/116] fix: #9553, use same fields for user search results in acp --- src/controllers/admin/users.js | 48 +++++++++++++++------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index ae26338dab..a05d1f1a60 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -92,27 +92,11 @@ async function getUsers(req, res) { return uids; } - async function getUsersWithFields(set) { - const uids = await getUids(set); - const [isAdmin, userData, lastonline] = await Promise.all([ - user.isAdministrator(uids), - user.getUsersWithFields(uids, userFields, req.uid), - db.sortedSetScores('users:online', uids), - ]); - userData.forEach((user, index) => { - if (user) { - user.administrator = isAdmin[index]; - const timestamp = lastonline[index] || user.joindate; - user.lastonline = timestamp; - user.lastonlineISO = utils.toISOString(timestamp); - } - }); - return userData; - } const set = buildSet(); + const uids = await getUids(set); const [count, users] = await Promise.all([ getCount(set), - getUsersWithFields(set), + loadUserInfo(req.uid, uids), ]); await render(req, res, { @@ -162,16 +146,8 @@ usersController.search = async function (req, res) { }); const uids = searchData.users.map(user => user && user.uid); - const userInfo = await user.getUsersFields(uids, ['email', 'flags', 'lastonline', 'joindate']); + searchData.users = await loadUserInfo(req.uid, uids); - searchData.users.forEach((user, index) => { - if (user && userInfo[index]) { - user.email = userInfo[index].email; - user.flags = userInfo[index].flags || 0; - user.lastonlineISO = userInfo[index].lastonlineISO; - user.joindateISO = userInfo[index].joindateISO; - } - }); searchData.query = validator.escape(String(req.query.query || '')); searchData.resultsPerPage = resultsPerPage; searchData.sortBy = req.query.sortBy; @@ -179,6 +155,24 @@ usersController.search = async function (req, res) { await render(req, res, searchData); }; +async function loadUserInfo(callerUid, uids) { + const [isAdmin, userData, lastonline] = await Promise.all([ + user.isAdministrator(uids), + user.getUsersWithFields(uids, userFields, callerUid), + db.sortedSetScores('users:online', uids), + ]); + userData.forEach((user, index) => { + if (user) { + user.administrator = isAdmin[index]; + user.flags = userData[index].flags || 0; + const timestamp = lastonline[index] || user.joindate; + user.lastonline = timestamp; + user.lastonlineISO = utils.toISOString(timestamp); + } + }); + return userData; +} + usersController.registrationQueue = async function (req, res) { const page = parseInt(req.query.page, 10) || 1; const itemsPerPage = 20; From 4164b3229b0d85ab1c83d321cc14fc0d3312a3e1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 14 May 2021 21:50:35 +0000 Subject: [PATCH 080/116] fix(deps): update dependency nodebb-plugin-composer-default to v6.5.28 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 3ca7a4ad65..456eed0d70 100644 --- a/install/package.json +++ b/install/package.json @@ -84,7 +84,7 @@ "multiparty": "4.2.2", "@nodebb/bootswatch": "3.4.2", "nconf": "^0.11.2", - "nodebb-plugin-composer-default": "6.5.27", + "nodebb-plugin-composer-default": "6.5.28", "nodebb-plugin-dbsearch": "5.0.1", "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", From bf4aa50c8cfc9b058ed726670d2bd1f2d4f6b592 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 17 May 2021 01:10:15 +0000 Subject: [PATCH 081/116] fix(deps): update dependency nodebb-theme-slick to v1.4.7 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 456eed0d70..7ca8cc1811 100644 --- a/install/package.json +++ b/install/package.json @@ -94,7 +94,7 @@ "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.2.1", "nodebb-theme-persona": "11.0.19", - "nodebb-theme-slick": "1.4.6", + "nodebb-theme-slick": "1.4.7", "nodebb-theme-vanilla": "12.0.7", "nodebb-widget-essentials": "5.0.4", "nodemailer": "^6.5.0", From 518157d9faf05b155dc43a5fa230c02d4f1803c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 17 May 2021 10:26:32 -0400 Subject: [PATCH 082/116] feat: pass req.query to getUserDataByUserSlug --- src/controllers/accounts/blocks.js | 2 +- src/controllers/accounts/categories.js | 2 +- src/controllers/accounts/consent.js | 2 +- src/controllers/accounts/edit.js | 4 ++-- src/controllers/accounts/follow.js | 2 +- src/controllers/accounts/groups.js | 2 +- src/controllers/accounts/helpers.js | 8 ++++++-- src/controllers/accounts/info.js | 2 +- src/controllers/accounts/posts.js | 2 +- src/controllers/accounts/profile.js | 2 +- src/controllers/accounts/sessions.js | 2 +- src/controllers/accounts/settings.js | 2 +- src/controllers/accounts/uploads.js | 2 +- src/controllers/user.js | 2 +- 14 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/controllers/accounts/blocks.js b/src/controllers/accounts/blocks.js index 7665d4d2b9..12962e1027 100644 --- a/src/controllers/accounts/blocks.js +++ b/src/controllers/accounts/blocks.js @@ -14,7 +14,7 @@ blocksController.getBlocks = async function (req, res, next) { const start = Math.max(0, page - 1) * resultsPerPage; const stop = start + resultsPerPage - 1; - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/categories.js b/src/controllers/accounts/categories.js index c752a377f7..a5cd86c9d5 100644 --- a/src/controllers/accounts/categories.js +++ b/src/controllers/accounts/categories.js @@ -10,7 +10,7 @@ const meta = require('../../meta'); const categoriesController = module.exports; categoriesController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/consent.js b/src/controllers/accounts/consent.js index 3456fceb54..a4b5cd02c9 100644 --- a/src/controllers/accounts/consent.js +++ b/src/controllers/accounts/consent.js @@ -12,7 +12,7 @@ consentController.get = async function (req, res, next) { return next(); } - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js index c050ea422c..3bcaff1d85 100644 --- a/src/controllers/accounts/edit.js +++ b/src/controllers/accounts/edit.js @@ -12,7 +12,7 @@ const editController = module.exports; editController.get = async function (req, res, next) { const [userData, canUseSignature] = await Promise.all([ - accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid), + accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query), privileges.global.can('signature', req.uid), ]); if (!userData) { @@ -114,7 +114,7 @@ async function renderRoute(name, req, res, next) { } async function getUserData(req) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return null; } diff --git a/src/controllers/accounts/follow.js b/src/controllers/accounts/follow.js index 77543b5271..82b23cb2f9 100644 --- a/src/controllers/accounts/follow.js +++ b/src/controllers/accounts/follow.js @@ -16,7 +16,7 @@ followController.getFollowers = async function (req, res, next) { }; async function getFollow(tpl, name, req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/groups.js b/src/controllers/accounts/groups.js index db9651e9fe..7d2f03cbf3 100644 --- a/src/controllers/accounts/groups.js +++ b/src/controllers/accounts/groups.js @@ -7,7 +7,7 @@ const accountHelpers = require('./helpers'); const groupsController = module.exports; groupsController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index 718f5fe7c4..359355da87 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -16,7 +16,7 @@ const categories = require('../../categories'); const helpers = module.exports; -helpers.getUserDataByUserSlug = async function (userslug, callerUID) { +helpers.getUserDataByUserSlug = async function (userslug, callerUID, query = {}) { const uid = await user.getUidByUserslug(userslug); if (!uid) { return null; @@ -117,7 +117,11 @@ helpers.getUserDataByUserSlug = async function (userslug, callerUID) { await getCounts(userData, callerUID); - const hookData = await plugins.hooks.fire('filter:helpers.getUserDataByUserSlug', { userData: userData, callerUID: callerUID }); + const hookData = await plugins.hooks.fire('filter:helpers.getUserDataByUserSlug', { + userData: userData, + callerUID: callerUID, + query: query, + }); return hookData.userData; }; diff --git a/src/controllers/accounts/info.js b/src/controllers/accounts/info.js index 6fd247eb31..950b74945d 100644 --- a/src/controllers/accounts/info.js +++ b/src/controllers/accounts/info.js @@ -9,7 +9,7 @@ const pagination = require('../../pagination'); const infoController = module.exports; infoController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js index b589b3990a..ab213609bf 100644 --- a/src/controllers/accounts/posts.js +++ b/src/controllers/accounts/posts.js @@ -145,7 +145,7 @@ async function getPostsFromUserSet(template, req, res, callback) { const page = Math.max(1, parseInt(req.query.page, 10) || 1); const [userData, settings] = await Promise.all([ - accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid), + accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query), user.getSettings(req.uid), ]); diff --git a/src/controllers/accounts/profile.js b/src/controllers/accounts/profile.js index 599d0bab79..71a9f01ee6 100644 --- a/src/controllers/accounts/profile.js +++ b/src/controllers/accounts/profile.js @@ -26,7 +26,7 @@ profileController.get = async function (req, res, next) { } } - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/sessions.js b/src/controllers/accounts/sessions.js index 26bbc3c8b9..c1713d3d62 100644 --- a/src/controllers/accounts/sessions.js +++ b/src/controllers/accounts/sessions.js @@ -7,7 +7,7 @@ const accountHelpers = require('./helpers'); const sessionController = module.exports; sessionController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 8d561bc976..848f62b893 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -18,7 +18,7 @@ const accountHelpers = require('./helpers'); const settingsController = module.exports; settingsController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/accounts/uploads.js b/src/controllers/accounts/uploads.js index 95fce14801..d1c113846a 100644 --- a/src/controllers/accounts/uploads.js +++ b/src/controllers/accounts/uploads.js @@ -11,7 +11,7 @@ const accountHelpers = require('./helpers'); const uploadsController = module.exports; uploadsController.get = async function (req, res, next) { - const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, req.query); if (!userData) { return next(); } diff --git a/src/controllers/user.js b/src/controllers/user.js index 353c4170c1..acd018ce67 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -14,7 +14,7 @@ userController.getCurrentUser = async function (req, res) { return res.status(401).json('not-authorized'); } const userslug = await user.getUserField(req.uid, 'userslug'); - const userData = await accountHelpers.getUserDataByUserSlug(userslug, req.uid); + const userData = await accountHelpers.getUserDataByUserSlug(userslug, req.uid, req.query); res.json(userData); }; From 1d9cfe1e966c8024776e85e1e9d62f51299ef3c6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 17 May 2021 10:50:50 -0400 Subject: [PATCH 083/116] fix: bug where interstitial errors were not properly passed to the front-end via req.flash --- src/controllers/authentication.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index f5d44dec36..54415ee928 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -183,7 +183,7 @@ authenticationController.registerComplete = function (req, res, next) { const results = await Promise.allSettled(callbacks.map(async (cb) => { await cb(req.session.registration, req.body); })); - const errors = results.map(result => result.status === 'rejected').filter(Boolean); + const errors = results.map(result => result.status === 'rejected' && result.reason && result.reason.message).filter(Boolean); if (errors.length) { req.flash('errors', errors); return res.redirect(`${nconf.get('relative_path')}/register/complete`); From 4afca6900b58397c2987d4d7d2960ea1e6a13efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 17 May 2021 12:12:16 -0400 Subject: [PATCH 084/116] feat: add filter:user.getWatchedCategories --- src/search.js | 2 +- src/user/categories.js | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/search.js b/src/search.js index b8c2717941..7ef8eb8062 100644 --- a/src/search.js +++ b/src/search.js @@ -284,7 +284,7 @@ async function getWatchedCids(data) { if (!data.categories.includes('watched')) { return []; } - return await user.getCategoriesByStates(data.uid, [categories.watchStates.watching]); + return await user.getWatchedCategories(data.uid); } async function getChildrenCids(data) { diff --git a/src/user/categories.js b/src/user/categories.js index 29f56cbdda..a1d141a628 100644 --- a/src/user/categories.js +++ b/src/user/categories.js @@ -4,6 +4,7 @@ const _ = require('lodash'); const db = require('../database'); const categories = require('../categories'); +const plugins = require('../plugins'); module.exports = function (User) { User.setCategoryWatchState = async function (uid, cids, state) { @@ -36,14 +37,24 @@ module.exports = function (User) { if (!(parseInt(uid, 10) > 0)) { return []; } - return await User.getCategoriesByStates(uid, [categories.watchStates.ignoring]); + const cids = await User.getCategoriesByStates(uid, [categories.watchStates.ignoring]); + const result = await plugins.hooks.fire('filter:user.getIgnoredCategories', { + uid: uid, + cids: cids, + }); + return result.cids; }; User.getWatchedCategories = async function (uid) { if (!(parseInt(uid, 10) > 0)) { return []; } - return await User.getCategoriesByStates(uid, [categories.watchStates.watching]); + const cids = await User.getCategoriesByStates(uid, [categories.watchStates.watching]); + const result = await plugins.hooks.fire('filter:user.getWatchedCategories', { + uid: uid, + cids: cids, + }); + return result.cids; }; User.getCategoriesByStates = async function (uid, states) { From 1ce595083a3c713af4373260a0faebc505a3b3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 17 May 2021 13:59:11 -0400 Subject: [PATCH 085/116] fix: ioredis upgrade fix, maybe --- src/cli/upgrade.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js index 0e1e96b1da..1210c23ef2 100644 --- a/src/cli/upgrade.js +++ b/src/cli/upgrade.js @@ -4,9 +4,6 @@ const async = require('async'); const nconf = require('nconf'); const packageInstall = require('./package-install'); -const upgrade = require('../upgrade'); -const build = require('../meta/build'); -const db = require('../database'); const { upgradePlugins } = require('./upgrade-plugins'); const steps = { @@ -31,7 +28,7 @@ const steps = { message: 'Checking installed plugins for updates...', handler: function (next) { async.series([ - db.init, + require('../database').init, upgradePlugins, ], next); }, @@ -40,15 +37,15 @@ const steps = { message: 'Updating NodeBB data store schema...', handler: function (next) { async.series([ - db.init, + require('../database').init, require('../meta').configs.init, - upgrade.run, + require('../upgrade').run, ], next); }, }, build: { message: 'Rebuilding assets...', - handler: build.buildAll, + handler: require('../meta/build').buildAll, }, }; @@ -96,10 +93,10 @@ function runUpgrade(upgrades, options) { } async.series([ - db.init, + require('../database').init, require('../meta').configs.init, async function () { - await upgrade.runParticular(upgrades); + await require('../upgrade').runParticular(upgrades); }, ], (err) => { if (err) { From ac86937c8879a20931db3e9a54d86a89ade566ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 17 May 2021 17:08:00 -0400 Subject: [PATCH 086/116] refactor: cli/upgrade async/await (#9558) * refactor: cli/upgrade async/await async/await cli/upgrade-plugins remove unused payload.files * fix: add missing await --- src/cli/package-install.js | 2 +- src/cli/upgrade-plugins.js | 275 ++++++++++++++++--------------------- src/cli/upgrade.js | 78 +++++------ 3 files changed, 148 insertions(+), 207 deletions(-) diff --git a/src/cli/package-install.js b/src/cli/package-install.js index 4f391c18c1..caad43162a 100644 --- a/src/cli/package-install.js +++ b/src/cli/package-install.js @@ -66,7 +66,7 @@ function installAll() { } } } catch (e) { - // ignore + console.error(e); } try { cproc.execSync(command + (prod ? ' --production' : ''), { diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js index 8ec46f7a62..2359bcc767 100644 --- a/src/cli/upgrade-plugins.js +++ b/src/cli/upgrade-plugins.js @@ -1,6 +1,5 @@ 'use strict'; -const async = require('async'); const prompt = require('prompt'); const request = require('request'); const cproc = require('child_process'); @@ -8,6 +7,7 @@ const semver = require('semver'); const fs = require('fs'); const path = require('path'); const nconf = require('nconf'); +const util = require('util'); const { paths, pluginNamePattern } = require('../constants'); @@ -22,190 +22,147 @@ if (process.platform === 'win32') { packageManagerExecutable += '.cmd'; } -function getModuleVersions(modules, callback) { +async function getModuleVersions(modules) { const versionHash = {}; - - async.eachLimit(modules, 50, (module, next) => { - fs.readFile(path.join(paths.nodeModules, module, 'package.json'), { encoding: 'utf-8' }, (err, pkg) => { - if (err) { - return next(err); - } - - try { - pkg = JSON.parse(pkg); - versionHash[module] = pkg.version; - next(); - } catch (err) { - next(err); - } - }); - }, (err) => { - callback(err, versionHash); - }); -} - -function getInstalledPlugins(callback) { - async.parallel({ - files: async.apply(fs.readdir, paths.nodeModules), - deps: async.apply(fs.readFile, paths.currentPackage, { encoding: 'utf-8' }), - bundled: async.apply(fs.readFile, paths.installPackage, { encoding: 'utf-8' }), - }, (err, payload) => { - if (err) { - return callback(err); - } - - payload.files = payload.files.filter(file => pluginNamePattern.test(file)); - - try { - payload.deps = Object.keys(JSON.parse(payload.deps).dependencies); - payload.bundled = Object.keys(JSON.parse(payload.bundled).dependencies); - } catch (err) { - return callback(err); - } - - payload.bundled = payload.bundled.filter(pkgName => pluginNamePattern.test(pkgName)); - payload.deps = payload.deps.filter(pkgName => pluginNamePattern.test(pkgName)); - - // Whittle down deps to send back only extraneously installed plugins/themes/etc - const checklist = payload.deps.filter((pkgName) => { - if (payload.bundled.includes(pkgName)) { - return false; - } - - // Ignore git repositories - try { - fs.accessSync(path.join(paths.nodeModules, pkgName, '.git')); - return false; - } catch (e) { - return true; - } - }); - - getModuleVersions(checklist, callback); - }); -} - -function getCurrentVersion(callback) { - fs.readFile(paths.installPackage, { encoding: 'utf-8' }, (err, pkg) => { - if (err) { - return callback(err); - } - - try { + const batch = require('../batch'); + await batch.processArray(modules, async (moduleNames) => { + await Promise.all(moduleNames.map(async (module) => { + let pkg = await fs.promises.readFile( + path.join(paths.nodeModules, module, 'package.json'), { encoding: 'utf-8' } + ); pkg = JSON.parse(pkg); - } catch (err) { - return callback(err); - } - callback(null, pkg.version); + versionHash[module] = pkg.version; + })); + }, { + batch: 50, }); + + return versionHash; } -function checkPlugins(standalone, callback) { - if (standalone) { - process.stdout.write('Checking installed plugins and themes for updates... '); - } +async function getInstalledPlugins() { + let [deps, bundled] = await Promise.all([ + fs.promises.readFile(paths.currentPackage, { encoding: 'utf-8' }), + fs.promises.readFile(paths.installPackage, { encoding: 'utf-8' }), + ]); - async.waterfall([ - async.apply(async.parallel, { - plugins: getInstalledPlugins, - version: getCurrentVersion, - }), - function (payload, next) { - const toCheck = Object.keys(payload.plugins); + deps = Object.keys(JSON.parse(deps).dependencies) + .filter(pkgName => pluginNamePattern.test(pkgName)); + bundled = Object.keys(JSON.parse(bundled).dependencies) + .filter(pkgName => pluginNamePattern.test(pkgName)); - if (!toCheck.length) { - process.stdout.write(' OK'.green + ''.reset); - return next(null, []); // no extraneous plugins installed - } - request({ - method: 'GET', - url: `https://packages.nodebb.org/api/v1/suggest?version=${payload.version}&package[]=${toCheck.join('&package[]=')}`, - json: true, - }, (err, res, body) => { - if (err) { - process.stdout.write('error'.red + ''.reset); - return next(err); - } - process.stdout.write(' OK'.green + ''.reset); - - if (!Array.isArray(body) && toCheck.length === 1) { - body = [body]; - } - - let current; - let suggested; - const upgradable = body.map((suggestObj) => { - current = payload.plugins[suggestObj.package]; - suggested = suggestObj.version; - - if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { - return { - name: suggestObj.package, - current: current, - suggested: suggested, - }; - } - return null; - }).filter(Boolean); - - next(null, upgradable); - }); - }, - ], callback); -} - -function upgradePlugins(callback) { - let standalone = false; - if (typeof callback !== 'function') { - callback = function () {}; - standalone = true; - } - - checkPlugins(standalone, (err, found) => { - if (err) { - console.log('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability'.reset); - return callback(err); + // Whittle down deps to send back only extraneously installed plugins/themes/etc + const checklist = deps.filter((pkgName) => { + if (bundled.includes(pkgName)) { + return false; } + // Ignore git repositories + try { + fs.accessSync(path.join(paths.nodeModules, pkgName, '.git')); + return false; + } catch (e) { + return true; + } + }); + + return await getModuleVersions(checklist); +} + +async function getCurrentVersion() { + let pkg = await fs.promises.readFile(paths.installPackage, { encoding: 'utf-8' }); + pkg = JSON.parse(pkg); + return pkg.version; +} + +const getSuggestedModules = util.promisify((nbbVersion, toCheck, cb) => { + request({ + method: 'GET', + url: `https://packages.nodebb.org/api/v1/suggest?version=${nbbVersion}&package[]=${toCheck.join('&package[]=')}`, + json: true, + }, (err, res, body) => { + if (err) { + process.stdout.write('error'.red + ''.reset); + return cb(err); + } + if (!Array.isArray(body) && toCheck.length === 1) { + body = [body]; + } + cb(null, body); + }); +}); + +async function checkPlugins() { + process.stdout.write('Checking installed plugins and themes for updates... '); + const [plugins, nbbVersion] = await Promise.all([ + getInstalledPlugins, + getCurrentVersion, + ]); + + const toCheck = Object.keys(plugins); + if (!toCheck.length) { + process.stdout.write(' OK'.green + ''.reset); + return []; // no extraneous plugins installed + } + const suggestedModules = await getSuggestedModules(nbbVersion, toCheck); + process.stdout.write(' OK'.green + ''.reset); + + let current; + let suggested; + const upgradable = suggestedModules.map((suggestObj) => { + current = plugins[suggestObj.package]; + suggested = suggestObj.version; + + if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { + return { + name: suggestObj.package, + current: current, + suggested: suggested, + }; + } + return null; + }).filter(Boolean); + + return upgradable; +} + +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`); found.forEach((suggestObj) => { process.stdout.write(`${' * '.yellow + suggestObj.name.reset} (${suggestObj.current.yellow}${' -> '.reset}${suggestObj.suggested.green}${')\n'.reset}`); }); } else { - if (standalone) { - console.log('\nAll packages up-to-date!'.green + ''.reset); - } - return callback(); + console.log('\nAll packages up-to-date!'.green + ''.reset); + return; } prompt.message = ''; prompt.delimiter = ''; + const promptGet = util.promisify((schema, callback) => prompt.get(schema, callback)); prompt.start(); - prompt.get({ + const result = await promptGet({ name: 'upgrade', description: '\nProceed with upgrade (y|n)?'.reset, type: 'string', - }, (err, result) => { - if (err) { - return callback(err); - } - - if (['y', 'Y', 'yes', 'YES'].includes(result.upgrade)) { - console.log('\nUpgrading packages...'); - const args = packageManagerInstallArgs.concat(found.map(suggestObj => `${suggestObj.name}@${suggestObj.suggested}`)); - - cproc.execFile(packageManagerExecutable, args, { stdio: 'ignore' }, (err) => { - callback(err, false); - }); - } else { - console.log('Package upgrades skipped'.yellow + '. Check for upgrades at any time by running "'.reset + './nodebb upgrade -p'.green + '".'.reset); - callback(); - } }); - }); + + if (['y', 'Y', 'yes', 'YES'].includes(result.upgrade)) { + console.log('\nUpgrading packages...'); + const args = packageManagerInstallArgs.concat(found.map(suggestObj => `${suggestObj.name}@${suggestObj.suggested}`)); + + 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); + } + } catch (err) { + console.log('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability'.reset); + throw err; + } } exports.upgradePlugins = upgradePlugins; diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js index 1210c23ef2..2198203b53 100644 --- a/src/cli/upgrade.js +++ b/src/cli/upgrade.js @@ -1,6 +1,5 @@ 'use strict'; -const async = require('async'); const nconf = require('nconf'); const packageInstall = require('./package-install'); @@ -9,61 +8,52 @@ const { upgradePlugins } = require('./upgrade-plugins'); const steps = { package: { message: 'Updating package.json file with defaults...', - handler: function (next) { + handler: function () { packageInstall.updatePackageFile(); packageInstall.preserveExtraneousPlugins(); process.stdout.write(' OK\n'.green); - next(); }, }, install: { message: 'Bringing base dependencies up to date...', - handler: function (next) { + handler: function () { process.stdout.write(' started\n'.green); packageInstall.installAll(); - next(); }, }, plugins: { message: 'Checking installed plugins for updates...', - handler: function (next) { - async.series([ - require('../database').init, - upgradePlugins, - ], next); + handler: async function () { + await require('../database').init(); + await upgradePlugins(); }, }, schema: { message: 'Updating NodeBB data store schema...', - handler: function (next) { - async.series([ - require('../database').init, - require('../meta').configs.init, - require('../upgrade').run, - ], next); + handler: async function () { + await require('../database').init(); + await require('../meta').configs.init(); + await require('../upgrade').run(); }, }, build: { message: 'Rebuilding assets...', - handler: require('../meta/build').buildAll, + handler: async function () { + await require('../meta/build').buildAll(); + }, }, }; -function runSteps(tasks) { - tasks = tasks.map((key, i) => function (next) { - process.stdout.write(`\n${(`${i + 1}. `).bold}${steps[key].message.yellow}`); - return steps[key].handler((err) => { - if (err) { return next(err); } - next(); - }); - }); - - async.series(tasks, (err) => { - if (err) { - console.error(`Error occurred during upgrade: ${err.stack}`); - throw err; +async function runSteps(tasks) { + try { + 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}`); + /* eslint-disable-next-line */ + await step.handler(); + } } - const message = 'NodeBB Upgrade Complete!'; // some consoles will return undefined/zero columns, // so just use 2 spaces in upgrade script if we can't get our column count @@ -73,10 +63,13 @@ function runSteps(tasks) { console.log(`\n\n${spaces}${message.green.bold}${'\n'.reset}`); process.exit(); - }); + } catch (err) { + console.error(`Error occurred during upgrade: ${err.stack}`); + throw err; + } } -function runUpgrade(upgrades, options) { +async function runUpgrade(upgrades, options) { console.log('\nUpdating NodeBB...'.cyan); options = options || {}; // disable mongo timeouts during upgrade @@ -88,23 +81,14 @@ function runUpgrade(upgrades, options) { options.plugins || options.schema || options.build) { tasks = tasks.filter(key => options[key]); } - runSteps(tasks); + await runSteps(tasks); return; } - async.series([ - require('../database').init, - require('../meta').configs.init, - async function () { - await require('../upgrade').runParticular(upgrades); - }, - ], (err) => { - if (err) { - throw err; - } - - process.exit(0); - }); + await require('../database').init(); + await require('../meta').configs.init(); + await require('../upgrade').runParticular(upgrades); + process.exit(0); } exports.upgrade = runUpgrade; From 1ec9739629bc62d03f5c61ab611e84493fa88c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 17 May 2021 17:24:23 -0400 Subject: [PATCH 087/116] switch to request-promise-native (#9561) * refactor: cli/upgrade async/await async/await cli/upgrade-plugins remove unused payload.files * fix: add missing await * refactor: use request-promise-native --- src/cli/upgrade-plugins.js | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/cli/upgrade-plugins.js b/src/cli/upgrade-plugins.js index 2359bcc767..b6cd6ac2a7 100644 --- a/src/cli/upgrade-plugins.js +++ b/src/cli/upgrade-plugins.js @@ -1,7 +1,7 @@ 'use strict'; const prompt = require('prompt'); -const request = require('request'); +const request = require('request-promise-native'); const cproc = require('child_process'); const semver = require('semver'); const fs = require('fs'); @@ -76,22 +76,17 @@ async function getCurrentVersion() { return pkg.version; } -const getSuggestedModules = util.promisify((nbbVersion, toCheck, cb) => { - request({ +async function getSuggestedModules(nbbVersion, toCheck) { + let body = await request({ method: 'GET', url: `https://packages.nodebb.org/api/v1/suggest?version=${nbbVersion}&package[]=${toCheck.join('&package[]=')}`, json: true, - }, (err, res, body) => { - if (err) { - process.stdout.write('error'.red + ''.reset); - return cb(err); - } - if (!Array.isArray(body) && toCheck.length === 1) { - body = [body]; - } - cb(null, body); }); -}); + if (!Array.isArray(body) && toCheck.length === 1) { + body = [body]; + } + return body; +} async function checkPlugins() { process.stdout.write('Checking installed plugins and themes for updates... '); From 2d0564cb7808788817cd387ebf30c093940c73d6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 19:22:38 -0400 Subject: [PATCH 088/116] fix(deps): update dependency nodebb-plugin-dbsearch to v5.0.2 (#9562) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 7ca8cc1811..c38658af4c 100644 --- a/install/package.json +++ b/install/package.json @@ -85,7 +85,7 @@ "@nodebb/bootswatch": "3.4.2", "nconf": "^0.11.2", "nodebb-plugin-composer-default": "6.5.28", - "nodebb-plugin-dbsearch": "5.0.1", + "nodebb-plugin-dbsearch": "5.0.2", "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", "nodebb-plugin-markdown": "8.12.10", From ca7c77bc1dfced349a0ca34c215bfccfcfaa05da Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 19:22:44 -0400 Subject: [PATCH 089/116] fix(deps): update socket.io packages to v4.1.2 (#9563) Co-authored-by: Renovate Bot --- install/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/package.json b/install/package.json index c38658af4c..8c38646e2f 100644 --- a/install/package.json +++ b/install/package.json @@ -119,9 +119,9 @@ "sharp": "0.28.2", "sitemap": "^7.0.0", "slideout": "1.0.1", - "socket.io": "4.1.1", + "socket.io": "4.1.2", "socket.io-adapter-cluster": "^1.0.1", - "socket.io-client": "4.1.1", + "socket.io-client": "4.1.2", "@socket.io/redis-adapter": "7.0.0", "sortablejs": "1.13.0", "spdx-license-list": "^6.4.0", From f5847f4f024b0bb24dd2b772d8ba106be0f7ff10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Mon, 17 May 2021 20:18:33 -0400 Subject: [PATCH 090/116] feat: #9559, set order help text --- public/language/en-GB/admin/manage/categories.json | 1 + public/src/admin/manage/categories.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/en-GB/admin/manage/categories.json +++ b/public/language/en-GB/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index d077ad9d39..c6d1307a4d 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -49,7 +49,7 @@ define('admin/manage/categories', [ var order = $(this).attr('data-order'); var modal = bootbox.dialog({ title: '[[admin/manage/categories:set-order]]', - message: '', + message: '

[[admin/manage/categories:set-order-help]]

', show: true, buttons: { save: { From 9b7653cccb8cfb4e9b9912ce63abbf0880944233 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 18 May 2021 00:51:50 +0000 Subject: [PATCH 091/116] fix(deps): update dependency textcomplete to ^0.18.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 8c38646e2f..9e74c9648f 100644 --- a/install/package.json +++ b/install/package.json @@ -126,7 +126,7 @@ "sortablejs": "1.13.0", "spdx-license-list": "^6.4.0", "spider-detector": "2.0.0", - "textcomplete": "^0.17.1", + "textcomplete": "^0.18.0", "textcomplete.contenteditable": "^0.1.1", "timeago": "^1.6.7", "tinycon": "0.6.8", From d81ce3e566f6ec09cc3f3212bd61affe6ed4f681 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Tue, 18 May 2021 09:07:32 +0000 Subject: [PATCH 092/116] Latest translations and fallbacks --- .../language/ar/admin/manage/categories.json | 1 + .../language/bg/admin/manage/categories.json | 1 + .../language/bn/admin/manage/categories.json | 1 + .../language/cs/admin/manage/categories.json | 1 + .../language/da/admin/manage/categories.json | 1 + .../language/de/admin/manage/categories.json | 1 + .../language/el/admin/manage/categories.json | 1 + .../en-US/admin/manage/categories.json | 1 + .../en-x-pirate/admin/manage/categories.json | 1 + .../language/es/admin/manage/categories.json | 1 + .../language/et/admin/manage/categories.json | 1 + .../fa-IR/admin/manage/categories.json | 1 + .../language/fi/admin/manage/categories.json | 1 + .../language/fr/admin/manage/categories.json | 1 + .../language/gl/admin/manage/categories.json | 1 + .../language/he/admin/manage/categories.json | 1 + .../language/hr/admin/manage/categories.json | 1 + .../language/hu/admin/manage/categories.json | 1 + .../language/id/admin/manage/categories.json | 1 + .../language/it/admin/manage/categories.json | 1 + .../language/ja/admin/manage/categories.json | 1 + .../language/ko/admin/manage/categories.json | 1 + .../language/lt/admin/manage/categories.json | 1 + .../language/lv/admin/manage/categories.json | 1 + .../language/ms/admin/manage/categories.json | 1 + public/language/nb/admin/advanced/logs.json | 10 +-- .../language/nb/admin/appearance/themes.json | 16 ++-- .../language/nb/admin/manage/categories.json | 1 + public/language/nb/modules.json | 26 +++--- public/language/nb/post-queue.json | 28 +++---- public/language/nb/register.json | 4 +- public/language/nb/reset_password.json | 2 +- public/language/nb/topic.json | 82 +++++++++---------- public/language/nb/unread.json | 2 +- public/language/nb/uploads.json | 14 ++-- .../language/nl/admin/manage/categories.json | 1 + .../language/pl/admin/manage/categories.json | 1 + .../pt-BR/admin/manage/categories.json | 1 + .../pt-PT/admin/manage/categories.json | 1 + .../language/ro/admin/manage/categories.json | 1 + .../language/ru/admin/manage/categories.json | 1 + .../language/rw/admin/manage/categories.json | 1 + .../language/sc/admin/manage/categories.json | 1 + .../language/sk/admin/manage/categories.json | 1 + .../language/sl/admin/manage/categories.json | 1 + .../language/sr/admin/manage/categories.json | 1 + .../language/sv/admin/manage/categories.json | 1 + .../language/th/admin/manage/categories.json | 1 + .../language/tr/admin/manage/categories.json | 1 + .../language/uk/admin/manage/categories.json | 1 + .../language/vi/admin/manage/categories.json | 1 + .../zh-CN/admin/manage/categories.json | 1 + .../zh-TW/admin/manage/categories.json | 1 + 53 files changed, 136 insertions(+), 92 deletions(-) diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index 89bde1d9d0..9139872a6d 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 7b8ed29fb3..a024272dc9 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Анализи", "view-category": "Преглед на категорията", "set-order": "Запазване на реда", + "set-order-help": "Задаването на позиция за категорията ще я премести на желаното място и ще промени местата на другите категории, ако е необходимо. Най-малкият възможен номер е 1, което ще постави категорията най-отгоре.", "select-category": "Изберете категория", "set-parent-category": "Задайте базова категория", diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index ecd5d09438..7d7719e51c 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytika", "view-category": "Zobrazit kategorii", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Vyberte kategorii", "set-parent-category": "Nastavit nadřazenou kategorii", diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index 2709567719..63c6de56ea 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Kategorie auswählen", "set-parent-category": "Übergeordnete Kategorie festlegen", diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index 22bb6256e7..977744d05e 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Seleccionar Categoría", "set-parent-category": "Fijar Categoría Superior", diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index 29558b95b5..8cc20c9205 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index 52f0441c6e..c3ddb80aab 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Statistiques", "view-category": "Voir la catégorie", "set-order": "Définir l'ordre", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Sélectionner une catégorie", "set-parent-category": "Définissez une catégorie parente", diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index fe1a4a5b94..fcc8cf1483 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "נתח", "view-category": "הצג קטגוריה", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "בחר קטגוריה", "set-parent-category": "הגדר קטגוריית אב", diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index 0ec362b08c..6108057152 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Odabri kategoriju", "set-parent-category": "Postavi roditeljsku kategoriju ", diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index 2de62865d9..42b11ebd47 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analitika", "view-category": "Kategória megtekintése", "set-order": "Sorrend beállítása", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Kategória kiválasztása", "set-parent-category": "Szülő kategória beállítása", diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index 9664c1bc23..894330f2eb 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analitica", "view-category": "Visualizza categoria", "set-order": "Imposta ordine", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Seleziona Categoria", "set-parent-category": "Imposta la Categoria Padre", diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index 2e5f25ff97..388c342602 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "カテゴリを選択", "set-parent-category": "親カテゴリとして設定", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 383856822a..0898a79f6d 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "애널리틱스", "view-category": "카테고리 보기", "set-order": "순서 설정", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "카테고리 선택", "set-parent-category": "상위 카테고리 설정", diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index a08912e4b7..050b03d33a 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Atlasīt kategoriju", "set-parent-category": "Iestatīt virskategoriju", diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/nb/admin/advanced/logs.json b/public/language/nb/admin/advanced/logs.json index b9de400e1c..ba29274563 100644 --- a/public/language/nb/admin/advanced/logs.json +++ b/public/language/nb/admin/advanced/logs.json @@ -1,7 +1,7 @@ { - "logs": "Logs", - "control-panel": "Logs Control Panel", - "reload": "Reload Logs", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "logs": "Logger", + "control-panel": "Kontrollpanel for logg", + "reload": "Last inn logg på nytt", + "clear": "Tøm logg", + "clear-success": "Logg er tømt!" } \ No newline at end of file diff --git a/public/language/nb/admin/appearance/themes.json b/public/language/nb/admin/appearance/themes.json index 597830f379..fcb509e365 100644 --- a/public/language/nb/admin/appearance/themes.json +++ b/public/language/nb/admin/appearance/themes.json @@ -1,11 +1,11 @@ { "checking-for-installed": "Checking for installed themes...", - "homepage": "Homepage", - "select-theme": "Select Theme", - "current-theme": "Current Theme", - "no-themes": "No installed themes found", - "revert-confirm": "Are you sure you wish to restore the default NodeBB theme?", - "theme-changed": "Theme Changed", - "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", - "restart-to-activate": "Please rebuild and restart your NodeBB to fully activate this theme." + "homepage": "Hjemmeside", + "select-theme": "Velg tema", + "current-theme": "Nåværende tema", + "no-themes": "Ingen installerte temaer funnet", + "revert-confirm": "Er du sikker på at du vil gjenopprette standard NodeBB-tema?", + "theme-changed": "Tema endret", + "revert-success": "Du har tilbakestilt NodeBB til standardtemaet.", + "restart-to-activate": "Vennligst bygg og start NodeBB for å aktivere dette temaet fullt ut." } \ No newline at end of file diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index 569c3a5e6f..28d2bc5d4d 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/nb/modules.json b/public/language/nb/modules.json index d0d341f252..02bf041915 100644 --- a/public/language/nb/modules.json +++ b/public/language/nb/modules.json @@ -1,7 +1,7 @@ { "chat.chatting_with": "Chat med", "chat.placeholder": "Skriv chat-melding her, trykk enter for å sende", - "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", + "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.", "chat.user_typing": "%1 skriver ...", @@ -13,18 +13,18 @@ "chat.recent-chats": "Nylige chatter", "chat.contacts": "Kontakter", "chat.message-history": "Meldingshistorikk", - "chat.message-deleted": "Message Deleted", - "chat.options": "Chat options", - "chat.pop-out": "Pop-out chat", - "chat.minimize": "Minimize", + "chat.message-deleted": "Melding slettet", + "chat.options": "Alternativer for chatt", + "chat.pop-out": "Pop-out chatt", + "chat.minimize": "Mimimer", "chat.maximize": "Maksimer", "chat.seven_days": "7 dager", "chat.thirty_days": "30 dager", "chat.three_months": "3 måneder", - "chat.delete_message_confirm": "Are you sure you wish to delete this message?", - "chat.retrieving-users": "Retrieving users...", + "chat.delete_message_confirm": "Er du sikker på at du vil slette denne meldingen?", + "chat.retrieving-users": "Henter brukere ...", "chat.manage-room": "Manage Chat Room", - "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", + "chat.add-user-help": "Søk etter brukere her. Når dette er valgt, blir brukeren lagt til i chatten. Den nye brukeren vil ikke kunne se chatmeldinger skrevet før de ble lagt til i samtalen. Bare romeiere () kan fjerne brukere fra chatterom.", "chat.confirm-chat-with-dnd-user": "This user has set their status to DnD(Do not disturb). Do you still want to chat with them?", "chat.rename-room": "Rename Room", "chat.rename-placeholder": "Enter your room name here", @@ -58,13 +58,13 @@ "composer.upload-picture": "Upload Image", "composer.upload-file": "Upload File", "composer.zen_mode": "Zen Mode", - "composer.select_category": "Select a category", + "composer.select_category": "Velg en kategori", "composer.textarea.placeholder": "Enter your post content here, drag and drop images", "composer.schedule-for": "Schedule topic for", "composer.schedule-date": "Date", "composer.schedule-time": "Time", "composer.cancel-scheduling": "Cancel Scheduling", - "composer.set-schedule-date": "Set Date", + "composer.set-schedule-date": "Angitt dato", "bootbox.ok": "OK", "bootbox.cancel": "Avbryt", "bootbox.confirm": "Bekreft", @@ -74,7 +74,7 @@ "thumbs.modal.title": "Manage topic thumbnails", "thumbs.modal.no-thumbs": "No thumbnails found.", "thumbs.modal.resize-note": "Note: This forum is configured to resize topic thumbnails down to a maximum width of %1px", - "thumbs.modal.add": "Add thumbnail", - "thumbs.modal.remove": "Remove thumbnail", - "thumbs.modal.confirm-remove": "Are you sure you want to remove this thumbnail?" + "thumbs.modal.add": "Legg til miniatyrbilde", + "thumbs.modal.remove": "Fjern miniatyrbilde ", + "thumbs.modal.confirm-remove": "Er du sikker på at du vil fjerne dette miniatyrbilde? " } \ No newline at end of file diff --git a/public/language/nb/post-queue.json b/public/language/nb/post-queue.json index bfaa367870..b4d3610009 100644 --- a/public/language/nb/post-queue.json +++ b/public/language/nb/post-queue.json @@ -1,18 +1,18 @@ { - "post-queue": "Post Queue", + "post-queue": "Innleggskø", "description": "There are no posts in the post queue.
To enable this feature, go to Settings → Post → Post Queue and enable Post Queue.", - "user": "User", - "category": "Category", - "title": "Title", - "content": "Content", - "posted": "Posted", - "reply-to": "Reply to \"%1\"", - "content-editable": "Click on content to edit", - "category-editable": "Click on category to edit", - "title-editable": "Click on title to edit", - "reply": "Reply", - "topic": "Topic", - "accept": "Accept", - "reject": "Reject" + "user": "Bruker", + "category": "Kategori", + "title": "Tittel", + "content": "Innhold", + "posted": "Postet", + "reply-to": "Svar til \"%1\"", + "content-editable": "Klikk på innhold for å redigere", + "category-editable": "Klikk på kategori for å redigere", + "title-editable": "Klikk på tittel for å redigere ", + "reply": "Svare", + "topic": "Emne", + "accept": "Aksepter ", + "reject": "Avvis" } \ No newline at end of file diff --git a/public/language/nb/register.json b/public/language/nb/register.json index 2aaa2428ab..22730f7756 100644 --- a/public/language/nb/register.json +++ b/public/language/nb/register.json @@ -1,6 +1,6 @@ { "register": "Registrer", - "cancel_registration": "Cancel Registration", + "cancel_registration": "Avbryt registrering ", "help.email": "Som standard, holdes din e-post skjult for offentligheten.", "help.username_restrictions": "Et unikt brukernavn mellom %1 og %2 tegn. Andre kan nevne deg med @brukernavn.", "help.minimum_password_length": "Ditt passord må være minst %1 tegn.", @@ -16,7 +16,7 @@ "alternative_registration": "Alternativ registrering", "terms_of_use": "Vilkårene for bruk", "agree_to_terms_of_use": "Jeg godtar vilkårene for bruk", - "terms_of_use_error": "You must agree to the Terms of Use", + "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": "Our average time for approving memberships is %1 hours %2 minutes.", "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", diff --git a/public/language/nb/reset_password.json b/public/language/nb/reset_password.json index ecb1a63e89..cbc576f70b 100644 --- a/public/language/nb/reset_password.json +++ b/public/language/nb/reset_password.json @@ -7,7 +7,7 @@ "wrong_reset_code.message": "Tilbakestillingskoden mottatt var feil. Vennligst prøv igjen, eller be om en ny tilbakestillingskode.", "new_password": "Nytt passord", "repeat_password": "Bekreft passord", - "changing_password": "Changing Password", + "changing_password": "Endrer passord", "enter_email": "Vennligst skriv inn e-post-adressen din, så sender vi en e-post med instruksjoner om hvordan du tilbakestiller kontoen din.", "enter_email_address": "Skriv e-postadresse", "password_reset_sent": "Hvis den spesifiserte e-postadressen hører til en eksisterende konto blir en e-post med instruksjoner for gjenoppretting av passord sendt. Merk at kun en e-post vil bli sendt ut per minutt.", diff --git a/public/language/nb/topic.json b/public/language/nb/topic.json index 275fd77bfc..55d5b1eb77 100644 --- a/public/language/nb/topic.json +++ b/public/language/nb/topic.json @@ -94,51 +94,51 @@ "topic_move_success": "Denne tråden vil straks bli flyttet til \"%1\". Klikk her for å angre.", "topic_move_multiple_success": "Disse emnene vil straks bli flyttet til \"%1\". Klikk her for å angre.", "topic_move_all_success": "Alle emner vil straks bli flyttet til \"%1\". Klikk her for å angre.", - "topic_move_undone": "Topic move undone", - "topic_move_posts_success": "Posts will be moved shortly. Click here to undo.", - "topic_move_posts_undone": "Post move undone", + "topic_move_undone": "Flytting av emne angret", + "topic_move_posts_success": "Innlegg flyttes om kort tid. Klikk her for å angre.", + "topic_move_posts_undone": "Flytting av innlegg angret", "post_delete_confirm": "Er du sikker på at du vil slette dette innlegget?", "post_restore_confirm": "Er du sikker på at du vil gjenopprette dette innlegget?", "post_purge_confirm": "Er du sikker på at du vil renske dette innlegget?", - "pin-modal-expiry": "Expiration Date", - "pin-modal-help": "You can optionally set an expiration date for the pinned topic(s) here. Alternatively, you can leave this field blank to have the topic stay pinned until it is manually unpinned.", + "pin-modal-expiry": "Utløpsdato", + "pin-modal-help": "Du kan eventuelt angi en utløpsdato for de festede emnene her. Alternativt kan du la dette feltet stå tomt for å holde emnet festet til det manuelt løsnes.", "load_categories": "Laster kategorier", "confirm_move": "Flytt", "confirm_fork": "Forgren", - "bookmark": "Bookmark", - "bookmarks": "Bookmarks", - "bookmarks.has_no_bookmarks": "You haven't bookmarked any posts yet.", + "bookmark": "Bokmerke", + "bookmarks": "Bokmerker", + "bookmarks.has_no_bookmarks": "Du har ikke bokmerket noen innlegg ennå.", "loading_more_posts": "Laster flere innlegg", "move_topic": "Flytt tård", "move_topics": "Flytt tråder", "move_post": "Flytt innlegg", "post_moved": "Innlegg flyttet!", "fork_topic": "Forgren tråd", - "enter-new-topic-title": "Enter new topic title", + "enter-new-topic-title": "Tast inn tittel på emne", "fork_topic_instruction": "Trykk på innleggene du vil forgrene", "fork_no_pids": "Ingen innlegg valgt!", - "no-posts-selected": "No posts selected!", - "x-posts-selected": "%1 post(s) selected", - "x-posts-will-be-moved-to-y": "%1 post(s) will be moved to \"%2\"", - "fork_pid_count": "%1 post(s) selected", + "no-posts-selected": "Ingen innlegg valgt.", + "x-posts-selected": "%1 innlegg valgt", + "x-posts-will-be-moved-to-y": "%1 innlegg(ene) vil bli flyttet til \"%2\"", + "fork_pid_count": "%1 innlegg valgt", "fork_success": "Denne tråden ble forgrenet! Klikk for å gå til forgrenet tråd.", - "delete_posts_instruction": "Click the posts you want to delete/purge", - "merge_topics_instruction": "Click the topics you want to merge or search for them", - "merge-topic-list-title": "List of topics to be merged", - "merge-options": "Merge options", - "merge-select-main-topic": "Select the main topic", - "merge-new-title-for-topic": "New title for topic", - "topic-id": "Topic ID", - "move_posts_instruction": "Click the posts you want to move then enter a topic ID or go to the target topic", - "change_owner_instruction": "Click the posts you want to assign to another user", + "delete_posts_instruction": "Klikk på innleggene du ønsker å slette/rense", + "merge_topics_instruction": "Klikk på emnene du du ønsker å slå sammen eller søk på dem", + "merge-topic-list-title": "Liste over emner som skal slås sammen", + "merge-options": "Slå sammen alternativer", + "merge-select-main-topic": "Velg hovedemne", + "merge-new-title-for-topic": "Ny tittel for emne", + "topic-id": "Emne ID", + "move_posts_instruction": "Klikk på innleggene du vil flytte, og skriv deretter inn en emne-ID, eller gå til målemnet", + "change_owner_instruction": "Klikk på innleggene du vil tildele til en annen bruker", "composer.title_placeholder": "Skriv din tråd-tittel her", - "composer.handle_placeholder": "Enter your name/handle here", + "composer.handle_placeholder": "Skriv inn navnet ditt / signatur her", "composer.discard": "Forkast", "composer.submit": "Send", - "composer.schedule": "Schedule", + "composer.schedule": "Timeplan", "composer.replying_to": "Svarer i %1", "composer.new_topic": "Ny tråd", - "composer.editing": "Editing", + "composer.editing": "Redigering", "composer.uploading": "laster opp...", "composer.thumb_url_label": "Lim inn som tråd-minatyr URL", "composer.thumb_title": "Legg til minatyr til denne tråden", @@ -153,25 +153,25 @@ "sort_by": "Sorter etter", "oldest_to_newest": "Eldste til nyeste", "newest_to_oldest": "Nyeste til eldste", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "Flest stemmer", + "most_posts": "Flest innlegg", "stale.title": "Lag en ny tråd i stedet?", "stale.warning": "Tråden du svarer på er ganske gammel. Vil du heller lage en ny tråd og refere til denne i den?", "stale.create": "Lag en ny tråd", "stale.reply_anyway": "Svar på denne tråden allikevel", "link_back": "Re: [%1](%2)", - "diffs.title": "Post Edit History", - "diffs.description": "This post has %1 revisions. Click one of the revisions below to see the post content at that point in time.", - "diffs.no-revisions-description": "This post has %1 revisions.", - "diffs.current-revision": "current revision", - "diffs.original-revision": "original revision", - "diffs.restore": "Restore this revision", - "diffs.restore-description": "A new revision will be appended to this post's edit history after restoring.", - "diffs.post-restored": "Post successfully restored to earlier revision", - "diffs.delete": "Delete this revision", - "diffs.deleted": "Revision deleted", - "timeago_later": "%1 later", - "timeago_earlier": "%1 earlier", - "first-post": "First post", - "last-post": "Last post" + "diffs.title": "Redigeringshistorikk for innlegg", + "diffs.description": "Dette innlegget har %1 redigeringer. Klikk på en av revisjonene nedenfor for å se innholdet på innlegget på det tidspunktet.", + "diffs.no-revisions-description": "Denne posten har %1 redigeringer.", + "diffs.current-revision": "Nåværende redigering ", + "diffs.original-revision": "Orginalversjon", + "diffs.restore": "Gjenopprett denne versjonen ", + "diffs.restore-description": "En ny revisjon vil bli lagt til dette innleggets redigeringshistorikk etter gjenoppretting.", + "diffs.post-restored": "Innlegget ble vellykket gjenopprettet til tidligere revisjon", + "diffs.delete": "Slett denne versjonen", + "diffs.deleted": "Versjon slettet", + "timeago_later": "%1 senere", + "timeago_earlier": "%1 tidligere", + "first-post": "Første innlegg", + "last-post": "Seneste innlegg" } \ No newline at end of file diff --git a/public/language/nb/unread.json b/public/language/nb/unread.json index c9cbfe5c8c..d8ba73fc3a 100644 --- a/public/language/nb/unread.json +++ b/public/language/nb/unread.json @@ -10,6 +10,6 @@ "all-topics": "Alle tråder", "new-topics": "Nye tråder", "watched-topics": "Fulgte tråder", - "unreplied-topics": "Unreplied Topics", + "unreplied-topics": "Emner som ikke er svart på", "multiple-categories-selected": "Multiple Selected" } \ No newline at end of file diff --git a/public/language/nb/uploads.json b/public/language/nb/uploads.json index 651a839876..283e0120dd 100644 --- a/public/language/nb/uploads.json +++ b/public/language/nb/uploads.json @@ -1,9 +1,9 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", - "upload-success": "File uploaded successfully!", - "maximum-file-size": "Maximum %1 kb", - "no-uploads-found": "No uploads found", - "public-uploads-info": "Uploads are public, all visitors can see them.", - "private-uploads-info": "Uploads are private, only logged in users can see them." + "uploading-file": "Laster opp filen...", + "select-file-to-upload": "Velg en fil å laste opp!", + "upload-success": "Filen ble suksessfullt lastet opp!", + "maximum-file-size": "Maksimum %1 kb", + "no-uploads-found": "Ingen opplastninger funnet", + "public-uploads-info": "Opplastninger er offentlige, alle besøkende kan se dem. ", + "private-uploads-info": "Opplastninger er private, kun innloggede brukere kan se dem. " } \ No newline at end of file diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index 90c02b956c..4380f5c465 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 908ef5eda0..924fa27e13 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analityka", "view-category": "Wyświetl kategorię", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Wybierz kategorię", "set-parent-category": "Ustaw nadrzędną kategorie", diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 8f82d94c7a..885c20d280 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Selecionar Categoria", "set-parent-category": "Definir Categoria-Mãe", diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 5da0d472c4..d029ce59b9 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Selecionar Categoria", "set-parent-category": "Definir uma Categoria Pai", diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index b203aff17f..5d453c102b 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Аналитика", "view-category": "Перейти в категорию", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Указать категорию", "set-parent-category": "Указать родительскую категорию", diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index a0dadc02c7..907b0962af 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Vyberte kategóriu", "set-parent-category": "Nastaviť nadradenú kategóriu", diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index db353a8ce2..ed5462e9be 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Select Category", "set-parent-category": "Set Parent Category", diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 12e5a42de0..5d09d269e6 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analiz", "view-category": "Kategori Görüntüle", "set-order": "Bir sıra ayarla", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Kategori Seç", "set-parent-category": "Ana Kategori Ayarla", diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index 771588b319..6198af0464 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Вибрати категорію", "set-parent-category": "Встановити батьківську категорію", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 833b2ffc2f..096ff61330 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Phân tích", "view-category": "Xem chuyên mục", "set-order": "Đặt thứ tự", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "Chọn Chuyên Mục", "set-parent-category": "Đặt Chuyên Mục Chính", diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index a4e8536ede..febfc938ed 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "分析", "view-category": "查看版块", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "选择版块", "set-parent-category": "设置父版块", diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index 6ff8e3121d..6f79081a24 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -33,6 +33,7 @@ "analytics": "Analytics", "view-category": "View category", "set-order": "Set order", + "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", "select-category": "選擇版面", "set-parent-category": "設置上層版面", From d35c64b1a26a10a03743e46635a54e996657290d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 18 May 2021 10:54:43 -0400 Subject: [PATCH 093/116] feat: add filter:flags.getFlagIdsWithFilters --- src/flags.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/flags.js b/src/flags.js index 0d20815756..a25f3e1c7b 100644 --- a/src/flags.js +++ b/src/flags.js @@ -167,7 +167,12 @@ Flags.getFlagIdsWithFilters = async function ({ filters, uid }) { } } - return flagIds; + const result = await plugins.hooks.fire('filter:flags.getFlagIdsWithFilters', { + filters, + uid, + flagIds, + }); + return result.flagIds; }; Flags.list = async function (data) { From f29e4e87ef6da81e192202423c916a70c272fe38 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 18 May 2021 19:30:21 +0000 Subject: [PATCH 094/116] fix(deps): update dependency mongodb to v3.6.7 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 9e74c9648f..86aaf8eae7 100644 --- a/install/package.json +++ b/install/package.json @@ -78,7 +78,7 @@ "material-design-lite": "^1.3.0", "mime": "^2.5.2", "mkdirp": "^1.0.4", - "mongodb": "3.6.6", + "mongodb": "3.6.7", "morgan": "^1.10.0", "mousetrap": "^1.6.5", "multiparty": "4.2.2", From 573a6e11e3b88b1425c52141eccee0b4c3efa530 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 19 May 2021 09:11:31 +0000 Subject: [PATCH 095/116] Latest translations and fallbacks --- public/language/nb/unread.json | 2 +- public/language/pt-BR/admin/dashboard.json | 14 ++-- .../pt-BR/admin/development/info.json | 2 +- .../language/pt-BR/admin/extend/plugins.json | 2 +- .../language/pt-BR/admin/extend/widgets.json | 16 ++-- .../pt-BR/admin/manage/categories.json | 22 ++--- .../language/pt-BR/admin/manage/digest.json | 34 ++++---- .../language/pt-BR/admin/manage/groups.json | 8 +- .../pt-BR/admin/manage/privileges.json | 52 ++++++------ public/language/pt-BR/admin/manage/tags.json | 8 +- public/language/pt-BR/admin/manage/users.json | 28 +++---- public/language/pt-BR/admin/menu.json | 28 +++---- .../pt-BR/admin/settings/advanced.json | 26 +++--- public/language/pt-BR/admin/settings/api.json | 22 ++--- .../language/pt-BR/admin/settings/chat.json | 2 +- .../pt-BR/admin/settings/cookies.json | 2 +- .../language/pt-BR/admin/settings/email.json | 12 +-- .../pt-BR/admin/settings/general.json | 20 ++--- .../language/pt-BR/admin/settings/group.json | 2 +- .../language/pt-BR/admin/settings/guest.json | 6 +- .../pt-BR/admin/settings/pagination.json | 4 +- .../language/pt-BR/admin/settings/post.json | 16 ++-- .../pt-BR/admin/settings/reputation.json | 14 ++-- .../language/pt-BR/admin/settings/tags.json | 6 +- .../pt-BR/admin/settings/uploads.json | 6 +- .../language/pt-BR/admin/settings/user.json | 12 +-- public/language/pt-BR/category.json | 2 +- public/language/pt-BR/email.json | 16 ++-- public/language/pt-BR/error.json | 80 +++++++++---------- public/language/pt-BR/flags.json | 54 ++++++------- public/language/pt-BR/global.json | 16 ++-- public/language/pt-BR/groups.json | 8 +- public/language/pt-BR/login.json | 2 +- public/language/pt-BR/modules.json | 34 ++++---- public/language/pt-BR/notifications.json | 20 ++--- public/language/pt-BR/post-queue.json | 16 ++-- public/language/pt-BR/register.json | 10 +-- public/language/pt-BR/reset_password.json | 4 +- public/language/pt-BR/search.json | 2 +- public/language/pt-BR/success.json | 2 +- public/language/pt-BR/tags.json | 2 +- public/language/pt-BR/topic.json | 56 ++++++------- public/language/pt-BR/user.json | 38 ++++----- public/language/pt-BR/users.json | 2 +- .../language/vi/admin/manage/categories.json | 2 +- 45 files changed, 366 insertions(+), 366 deletions(-) diff --git a/public/language/nb/unread.json b/public/language/nb/unread.json index d8ba73fc3a..627d36ad28 100644 --- a/public/language/nb/unread.json +++ b/public/language/nb/unread.json @@ -11,5 +11,5 @@ "new-topics": "Nye tråder", "watched-topics": "Fulgte tråder", "unreplied-topics": "Emner som ikke er svart på", - "multiple-categories-selected": "Multiple Selected" + "multiple-categories-selected": "Flere valg" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/dashboard.json b/public/language/pt-BR/admin/dashboard.json index c84209bfce..5769a80e97 100644 --- a/public/language/pt-BR/admin/dashboard.json +++ b/public/language/pt-BR/admin/dashboard.json @@ -30,7 +30,7 @@ "upgrade-available": "

Uma nova versão (v%1) foi lançada. Considere atualizar o seu NodeBB.

", "prerelease-upgrade-available": "

Esta é uma versão de pré-lançamento desatualizada do NodeBB. Uma nova versão (v%1) foi lançada. Considere atualizar o seu NodeBB.

", "prerelease-warning": "

Esta é uma versão de pré-lançamento do NodeBB. Bugs inesperados podem ocorrer.

", - "fallback-emailer-not-found": "Fallback emailer not found!", + "fallback-emailer-not-found": "Emailer substituto não encontrado!", "running-in-development": "O fórum está sendo executado em modo de desenvolvedor. O fórum pode estar sujeito a potenciais vulnerabilidades; por favor, entre em contato com o seu administrador de sistemas.", "latest-lookup-failed": "

Falha ao procurar a versão mais recente disponível do NodeBB

", @@ -79,10 +79,10 @@ "last-restarted-by": "Última vez reiniciado por", "no-users-browsing": "Nenhum usuário navegando", - "back-to-dashboard": "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-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" + "back-to-dashboard": "De volta ao Painel", + "details.no-users": "Nenhum usuário ingressou dentro do período de tempo selecionado", + "details.no-topics": "Nenhum tópico foi postado dentro do período de tempo selecionado", + "details.no-logins": "Nenhum login foi registrado dentro do período de tempo selecionado", + "details.logins-static": "O NodeBB só salva os dados da sessão por %1 dias, então esta tabela abaixo mostrará apenas as sessões ativas mais recentemente", + "details.logins-login-time": "Hora de Login" } diff --git a/public/language/pt-BR/admin/development/info.json b/public/language/pt-BR/admin/development/info.json index fb17421447..cb67c31ed3 100644 --- a/public/language/pt-BR/admin/development/info.json +++ b/public/language/pt-BR/admin/development/info.json @@ -1,5 +1,5 @@ { - "you-are-on": "You are on %1:%2", + "you-are-on": "Você está em %1:%2", "ip": "IP %1", "nodes-responded": "%1 nodes respondidos dentro de %2ms!", "host": "host", diff --git a/public/language/pt-BR/admin/extend/plugins.json b/public/language/pt-BR/admin/extend/plugins.json index f9e3609e06..4ed999a60a 100644 --- a/public/language/pt-BR/admin/extend/plugins.json +++ b/public/language/pt-BR/admin/extend/plugins.json @@ -39,7 +39,7 @@ "alert.upgraded": "Plugin Atualizado", "alert.installed": "Plugin Instalado", "alert.uninstalled": "Plugin Desinstalado", - "alert.activate-success": "Please rebuild and restart your NodeBB to fully activate this plugin", + "alert.activate-success": "Por favor, reconstrua e reinicie o seu NodeBB para ativar totalmente este plugin", "alert.deactivate-success": "Plugin desativado com sucesso", "alert.upgrade-success": "Por favor, recompile e reinicie seu NodeBB para atualizar totalmente este plugin.", "alert.install-success": "Plugin instalado com sucesso, por favor ative o plugin.", diff --git a/public/language/pt-BR/admin/extend/widgets.json b/public/language/pt-BR/admin/extend/widgets.json index bc22f12488..f9930d4a39 100644 --- a/public/language/pt-BR/admin/extend/widgets.json +++ b/public/language/pt-BR/admin/extend/widgets.json @@ -1,7 +1,7 @@ { "available": "Widgets Disponíveis", "explanation": "Escolha um widget do menu de dropdown e então arraste e solte numa área de widget do template à esquerda.", - "none-installed": "No widgets found! Activate the widget essentials plugin in the plugins control panel.", + "none-installed": "Nenhum widget encontrado! Ative o plug-in de widgets básicos no painel de controle de plugins.", "clone-from": "Copiar widgets de", "containers.available": "Contêineres Disponíveis", "containers.explanation": "Arrastar e soltar em cima de qualquer widget ativo", @@ -20,11 +20,11 @@ "error.select-clone": "Por favor, selecione a página a ser copiada", - "title": "Title", - "title.placeholder": "Title (only shown on some containers)", - "container": "Container", - "container.placeholder": "Drag and drop a container or enter HTML here.", - "show-to-groups": "Show to groups", - "hide-from-groups": "Hide from groups", - "hide-on-mobile": "Hide on mobile" + "title": "Título", + "title.placeholder": "Título (mostrado apenas em alguns contêineres)", + "container": "Contêiner", + "container.placeholder": "Arraste e solte um contêiner ou insira HTML aqui.", + "show-to-groups": "Mostrar para grupos", + "hide-from-groups": "Esconder dos grupos", + "hide-on-mobile": "Esconder no móvel" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 885c20d280..8d8b38f147 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -10,16 +10,16 @@ "custom-class": "Classe Personalizada", "num-recent-replies": "# de Respostas Recentes", "ext-link": "Link Externo", - "subcategories-per-page": "Subcategories per page", + "subcategories-per-page": "Subcategorias por página", "is-section": "Trate esta categoria como uma seção", - "post-queue": "Post queue", - "tag-whitelist": "Tag Whitelist", + "post-queue": "Fila de posts", + "tag-whitelist": "Lista Branca de Tags", "upload-image": "Enviar Imagem", "delete-image": "Remover", "category-image": "Imagem da Categoria", "parent-category": "Categoria-Mãe", "optional-parent-category": "(Opcional) Categoria-Mãe", - "top-level": "Top Level", + "top-level": "Nível Superior", "parent-category-none": "(Nenhum)", "copy-parent": "Copiar Mãe", "copy-settings": "Copiar Configurações De", @@ -31,9 +31,9 @@ "disable": "Desativar", "edit": "Editar", "analytics": "Analytics", - "view-category": "View category", - "set-order": "Set order", - "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", + "view-category": "Ver categoria", + "set-order": "Definir ordem", + "set-order-help": "Definir a ordem da categoria moverá esta categoria para aquela ordem e atualizará a ordem das outras categorias conforme necessário. A ordem mínima é 1, o que coloca a categoria no topo.", "select-category": "Selecionar Categoria", "set-parent-category": "Definir Categoria-Mãe", @@ -50,8 +50,8 @@ "privileges.no-users": "Sem privilégios para usuários específicos nesta categoria.", "privileges.section-group": "Grupo", "privileges.group-private": "Este grupo é privado", - "privileges.inheritance-exception": "This group does not inherit privileges from registered-users group", - "privileges.banned-user-inheritance": "Banned users inherit privileges from banned-users group", + "privileges.inheritance-exception": "Este grupo não herda privilégios do grupo registered-users", + "privileges.banned-user-inheritance": "Usuários banidos herdam privilégios do grupo banned-users", "privileges.search-group": "Adicionar Grupo", "privileges.copy-to-children": "Copiar para Filhos", "privileges.copy-from-category": "Copiar da Categoria", @@ -84,9 +84,9 @@ "alert.user-search": "Procure por um usuário aqui...", "alert.find-group": "Encontre um Grupo", "alert.group-search": "Pesquise por um grupo aqui...", - "alert.not-enough-whitelisted-tags": "Whitelisted tags are less than minimum tags, you need to create more whitelisted tags!", + "alert.not-enough-whitelisted-tags": "As tags na lista de permissões são em menor número do que as tags mínimas, você precisa criar mais tags na lista de permissões!", "collapse-all": "Esconder todos", "expand-all": "Expandir todos", "disable-on-create": "Desativar ao criar", - "no-matches": "No matches" + "no-matches": "Nada encontrado" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/manage/digest.json b/public/language/pt-BR/admin/manage/digest.json index 8f3661698a..c62371c550 100644 --- a/public/language/pt-BR/admin/manage/digest.json +++ b/public/language/pt-BR/admin/manage/digest.json @@ -1,21 +1,21 @@ { - "lead": "A listing of digest delivery stats and times is displayed below.", - "disclaimer": "Please be advised that email delivery is not guaranteed, due to the nature of email technology. Many variables factor into whether an email sent to the recipient server is ultimately delivered into the user's inbox, including server reputation, blacklisted IP addresses, and whether DKIM/SPF/DMARC is configured.", - "disclaimer-continued": "A successful delivery means the message was sent successfully by NodeBB and acknowledged by the recipient server. It does not mean the email landed in the inbox. For best results, we recommend using a third-party email delivery service such as SendGrid.", + "lead": "Uma lista de estatísticas e tempos de entrega de resumo é exibida abaixo.", + "disclaimer": "Informamos que a entrega de e-mail não é garantida, devido à natureza da tecnologia de e-mail. Muitos fatores variáveis ​​determinam se um e-mail enviado ao servidor do destinatário é entregue na caixa de entrada do usuário, incluindo reputação do servidor, endereços IP na lista negra e se DKIM/SPF/DMARC está configurado.", + "disclaimer-continued": "Uma entrega bem-sucedida significa que a mensagem foi enviada com sucesso pelo NodeBB e confirmada pelo servidor do destinatário. Isso não significa que o e-mail foi parar na caixa de entrada. Para obter melhores resultados, recomendamos o uso de um serviço de entrega de e-mail de terceiros, como o SendGrid.", - "user": "User", - "subscription": "Subscription Type", - "last-delivery": "Last successful delivery", - "default": "System default", - "default-help": "System default means the user has not explicitly overridden the global forum setting for digests, which is currently: "%1"", - "resend": "Resend Digest", - "resend-all-confirm": "Are you sure you wish to manually execute this digest run?", - "resent-single": "Manual digest resend completed", - "resent-day": "Daily digest resent", - "resent-week": "Weekly digest resent", - "resent-month": "Monthly digest resent", - "null": "Never", - "manual-run": "Manual digest run:", + "user": "Usuário", + "subscription": "Tipo de Inscrição", + "last-delivery": "Última entrega bem sucedida", + "default": "Padrão do sistema", + "default-help": "Padrão do sistema significa que o usuário não substituiu explicitamente a configuração global do fórum para resumos, a qual atualmente é: \"%1\"", + "resend": "Reenviar Resumo", + "resend-all-confirm": "Tem certeza de que deseja executar manualmente esta execução de resumo?", + "resent-single": "Reenvio manual de resumos concluído", + "resent-day": "Resumo diário reenviado", + "resent-week": "Resumo semanal reenviado", + "resent-month": "Resumo mensal reenviado", + "null": "Nunca", + "manual-run": "Execução de resumo manual:", - "no-delivery-data": "No delivery data found" + "no-delivery-data": "Nenhum dado de entrega encontrado" } diff --git a/public/language/pt-BR/admin/manage/groups.json b/public/language/pt-BR/admin/manage/groups.json index 2ebae71be2..07b24ad3a6 100644 --- a/public/language/pt-BR/admin/manage/groups.json +++ b/public/language/pt-BR/admin/manage/groups.json @@ -8,8 +8,8 @@ "hidden": "Oculto", "private": "Privado", "edit": "Editar", - "delete": "Delete", - "privileges": "Privileges", + "delete": "Excluir", + "privileges": "Privilégios", "download-csv": "CSV", "search-placeholder": "Procurar", "create": "Criar Grupo", @@ -28,8 +28,8 @@ "edit.show-badge": "Mostrar Insígnia", "edit.private-details": "Se ativado, entrar em grupos requer a aprovação do dono do grupo.", "edit.private-override": "Aviso: grupos privados estão desabilitados no sistema, o que sobrepõe esta opção.", - "edit.disable-join": "Disable join requests", - "edit.disable-leave": "Disallow users from leaving the group", + "edit.disable-join": "Desativar pedidos de adesão", + "edit.disable-leave": "Impedir que usuários saiam do grupo", "edit.hidden": "Oculto", "edit.hidden-details": "Se ligado, o grupo não será encontrado nas listagens de grupos, e os usuários terão de ser convidados manualmente", "edit.add-user": "Adicionar Usuário ao Grupo", diff --git a/public/language/pt-BR/admin/manage/privileges.json b/public/language/pt-BR/admin/manage/privileges.json index 3b0c46efb7..9d3c7afd38 100644 --- a/public/language/pt-BR/admin/manage/privileges.json +++ b/public/language/pt-BR/admin/manage/privileges.json @@ -1,16 +1,16 @@ { "global": "Global", "admin": "Admin", - "group-privileges": "Group Privileges", - "user-privileges": "User Privileges", - "edit-privileges": "Edit Privileges", - "select-clear-all": "Select/Clear All", + "group-privileges": "Privilégios do Grupo", + "user-privileges": "Privilégios do Usuário", + "edit-privileges": "Editar Privilégios", + "select-clear-all": "Selecionar/Limpar Tudo", "chat": "Conversar", "upload-images": "Enviar Imagens", "upload-files": "Enviar Arquivos", "signature": "Assinatura", "ban": "Banir", - "invite": "Invite", + "invite": "Convidar", "search-content": "Pesquisar Conteúdo", "search-users": "Pesquisar Usuários", "search-tags": "Pesquisar Tags", @@ -19,13 +19,13 @@ "view-groups": "Ver Grupos", "allow-local-login": "Login Local", "allow-group-creation": "Criar Grupo", - "view-users-info": "View Users Info", + "view-users-info": "Ver Informações dos Usuários", "find-category": "Encontrar Categoria", "access-category": "Acessar Categoria", "access-topics": "Acessar Tópicos", "create-topics": "Criar Tópicos", "reply-to-topics": "Responder aos Tópicos", - "schedule-topics": "Schedule Topics", + "schedule-topics": "Agendar Tópicos", "tag-topics": "Definir tag em tópicos", "edit-posts": "Editar Posts", "view-edit-history": "Ver Histórico de Edição", @@ -36,25 +36,25 @@ "delete-topics": "Deletar Tópicos", "purge": "Purgar", "moderate": "Moderar", - "admin-dashboard": "Dashboard", - "admin-categories": "Categories", - "admin-privileges": "Privileges", - "admin-users": "Users", - "admin-admins-mods": "Admins & Mods", - "admin-groups": "Groups", + "admin-dashboard": "Painel", + "admin-categories": "Categorias", + "admin-privileges": "Privilégios", + "admin-users": "Usuários", + "admin-admins-mods": "Admins e Moderadores", + "admin-groups": "Grupos", "admin-tags": "Tags", - "admin-settings": "Settings", + "admin-settings": "Configurações", - "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-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": "Please confirm your intention to save these privileges", - "alert.saved": "Privilege changes saved and applied", - "alert.confirm-discard": "Are you sure you wish to discard your privilege changes?", - "alert.discarded": "Privilege changes discarded", - "alert.confirm-copyToAll": "Are you sure you wish to apply this privilege set to all categories?", - "alert.confirm-copyToAllGroup": "Are you sure you wish to apply this group's privilege set to all categories?", - "alert.confirm-copyToChildren": "Are you sure you wish to apply this privilege set to all descendant (child) categories?", - "alert.confirm-copyToChildrenGroup": "Are you sure you wish to apply this group's privilege set to all descendant (child) categories?", - "alert.no-undo": "This action cannot be undone.", - "alert.admin-warning": "Administrators implicitly get all privileges" + "alert.confirm-moderate": "Tem certeza de que deseja conceder o privilégio de moderação a este grupo de usuários? Este grupo é público e qualquer usuário pode entrar à vontade.", + "alert.confirm-admins-mods": "Tem certeza de que deseja conceder o privilégio de 'Administradores e Mods' a este usuário/grupo? Os usuários com este privilégio podem promover e rebaixar outros usuários a posições privilegiadas, incluindo superadministrador", + "alert.confirm-save": "Por favor, confirme a sua intenção de salvar estes privilégios", + "alert.saved": "Alterações de privilégio salvas e aplicadas", + "alert.confirm-discard": "Você tem certeza que quer descartar suas mudanças nos privilégios?", + "alert.discarded": "Mudanças de privilégio descartadas", + "alert.confirm-copyToAll": "Tem certeza de que deseja aplicar este conjunto de privilégios a todas as categorias?", + "alert.confirm-copyToAllGroup": "Tem certeza de que deseja aplicar o conjunto de privilégios deste grupo a todas as categorias?", + "alert.confirm-copyToChildren": "Tem certeza de que deseja aplicar este conjunto de privilégios a todas as categorias descendentes (filhos)?", + "alert.confirm-copyToChildrenGroup": "Tem certeza de que deseja aplicar o conjunto de privilégios deste grupo a todas as categorias descendentes (filhos)?", + "alert.no-undo": "Esta ação não pode ser desfeita.", + "alert.admin-warning": "Os administradores obtêm implicitamente todos os privilégios" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/manage/tags.json b/public/language/pt-BR/admin/manage/tags.json index 4e1111bae4..70964c7e09 100644 --- a/public/language/pt-BR/admin/manage/tags.json +++ b/public/language/pt-BR/admin/manage/tags.json @@ -3,17 +3,17 @@ "bg-color": "Cor de Fundo", "text-color": "Cor do Text", "create-modify": "Criar & Modificar Tags", - "description": "Select tags by clicking or dragging, use CTRL to select multiple tags.", + "description": "Selecione as tags clicando ou arrastando, use CTRL para selecionar várias tags.", "create": "Criar Tag", "modify": "Modificar Tags", "rename": "Renomear Tags", "delete": "Excluir Tags Selecionadas", "search": "Pesquisar por tags...", - "settings": "Tags Settings", + "settings": "Configurações de Tags", "name": "Nome da Tag", - "alerts.editing": "Editing tag(s)", + "alerts.editing": "Editando tag(s)", "alerts.confirm-delete": "Você deseja excluir as tags selecionadas?", "alerts.update-success": "Tag Atualizada!", - "reset-colors": "Reset colors" + "reset-colors": "Redefinir cores" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/manage/users.json b/public/language/pt-BR/admin/manage/users.json index 2d301cb0a2..d4b8931069 100644 --- a/public/language/pt-BR/admin/manage/users.json +++ b/public/language/pt-BR/admin/manage/users.json @@ -12,17 +12,17 @@ "unban": "Desbanir Usuário(s)", "reset-lockout": "Excluir Bloqueio", "reset-flags": "Resetar Sinalizações", - "delete": "Delete User(s)", - "delete-content": "Delete User(s) Content", - "purge": "Delete User(s) and Content", + "delete": "Excluir Usuário(s)", + "delete-content": "Excluir Conteúdo do(s) Usuário(s)", + "purge": "Excluir Usuário(s) e Conteúdo", "download-csv": "Baixar CSV", - "manage-groups": "Manage Groups", - "add-group": "Add Group", + "manage-groups": "Gerenciar Grupos", + "add-group": "Adicionar Grupo", "invite": "Convidar", "new": "Novo Usuário", - "filter-by": "Filter by", + "filter-by": "Filtrar por", "pills.unvalidated": "Não Validado", - "pills.validated": "Validated", + "pills.validated": "Validado", "pills.banned": "Banido", "50-per-page": "50 por página", @@ -88,11 +88,11 @@ "alerts.validate-email-success": "E-mails validados", "alerts.validate-force-password-reset-success": "A senha do(s) usuário(s) foi redefinida e as suas sessões existentes foram revogadas.", "alerts.password-reset-confirm": "Você quer enviar e-mail(s) de redefinição de senha para este(s) usuário(s)?", - "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.confirm-delete": "Aviso!

Você realmente quer deletar usuário(s)?

Esta ação não é reversível! Apenas a conta do usuário será excluída, suas postagens e tópicos permanecerão.

", "alerts.delete-success": "Usuário(s) Deletados!", - "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.confirm-delete-content": "Aviso!

Você realmente deseja excluir o conteúdo destes usuários?

Esta ação não é reversível! As contão permanecerão, mas seus posts e tópicos serão excluídos.

", + "alerts.delete-content-success": "Conteúdo do(s) Usuário(s) Excluído!", + "alerts.confirm-purge": "Aviso!

Você realmente quer excluir usuário(s) e seu conteúdo?

Essa ação não é reversível! Todos os dados e conteúdo dos usuários serão apagados!

", "alerts.create": "Criar Usuário", "alerts.button-create": "Criar", "alerts.button-cancel": "Cancelar", @@ -102,7 +102,7 @@ "alerts.prompt-email": "E-mails:", "alerts.email-sent-to": "Um e-mail de convite foi enviado para %1", - "alerts.x-users-found": "%1 user(s) found, (%2 seconds)", - "export-users-started": "Exporting users as csv, this might take a while. You will receive a notification when it is complete.", - "export-users-completed": "Users exported as csv, click here to download." + "alerts.x-users-found": "%1 usuário(s) encontrados, (%2 segundos)", + "export-users-started": "Exportando usuários como csv, isso pode demorar um pouco. Você receberá uma notificação quando isso for concluído.", + "export-users-completed": "Usuários exportados como csv, clique aqui para fazer o download." } \ No newline at end of file diff --git a/public/language/pt-BR/admin/menu.json b/public/language/pt-BR/admin/menu.json index 837ada6f17..df133d872f 100644 --- a/public/language/pt-BR/admin/menu.json +++ b/public/language/pt-BR/admin/menu.json @@ -1,9 +1,9 @@ { - "section-dashboard": "Dashboards", - "dashboard/overview": "Overview", + "section-dashboard": "Painéis", + "dashboard/overview": "Visão Geral", "dashboard/logins": "Logins", - "dashboard/users": "Users", - "dashboard/topics": "Topics", + "dashboard/users": "Usuários", + "dashboard/topics": "Tópicos", "section-general": "Geral", "section-manage": "Administrar", @@ -17,26 +17,26 @@ "manage/groups": "Grupos", "manage/ip-blacklist": "Lista Negra de IPs", "manage/uploads": "Uploads", - "manage/digest": "Digests", + "manage/digest": "Resumos", "section-settings": "Configurações", "settings/general": "Geral", - "settings/homepage": "Home Page", - "settings/navigation": "Navigation", - "settings/reputation": "Reputation & Flags", + "settings/homepage": "Página Inicial", + "settings/navigation": "Navegação", + "settings/reputation": "Reputação & Sinalizações", "settings/email": "E-mail", - "settings/user": "Users", - "settings/group": "Groups", + "settings/user": "Usuários", + "settings/group": "Grupos", "settings/guest": "Visitantes", "settings/uploads": "Uploads", - "settings/languages": "Languages", + "settings/languages": "Idiomas", "settings/post": "Posts", "settings/chat": "Chats", "settings/pagination": "Paginação", "settings/tags": "Tags", "settings/notifications": "Notificações", - "settings/api": "API Access", - "settings/sounds": "Sounds", + "settings/api": "Acesso a API", + "settings/sounds": "Sons", "settings/social": "Social", "settings/cookies": "Cookies", "settings/web-crawler": "Motores de Busca", @@ -75,7 +75,7 @@ "logout": "Sair da Conta", "view-forum": "Ver Fórum", - "search.placeholder": "Press "/" to search for settings", + "search.placeholder": "Pressione \"/\" para pesquisar por configurações", "search.no-results": "Sem resultados...", "search.search-forum": "Pesquisar o fórum por ", "search.keep-typing": "Digite para ver mais resultados...", diff --git a/public/language/pt-BR/admin/settings/advanced.json b/public/language/pt-BR/admin/settings/advanced.json index 9443dd64ad..6439ba1147 100644 --- a/public/language/pt-BR/admin/settings/advanced.json +++ b/public/language/pt-BR/admin/settings/advanced.json @@ -5,8 +5,8 @@ "maintenance-mode.message": "Mensagem de Manutenção", "headers": "Cabeçalhos", "headers.allow-from": "Defina ALLOW-FROM para Colocar o NodeBB em um iFrame", - "headers.csp-frame-ancestors": "Set Content-Security-Policy frame-ancestors header to Place NodeBB in an iFrame", - "headers.csp-frame-ancestors-help": "'none', 'self'(default) or list of URIs to allow.", + "headers.csp-frame-ancestors": "Define o cabeçalho de Content-Security-Policy frame-ancestors para Colocar o NodeBB em um iFrame", + "headers.csp-frame-ancestors-help": "'none', 'self' (padrão) ou lista de URIs a permitir.", "headers.powered-by": "Personalizar o cabeçalho de \"Powered By\" enviado pelo NodeBB", "headers.acao": "Access-Control-Allow-Origin", "headers.acao-regex": "Access-Control-Allow-Origin Regular Expression", @@ -22,22 +22,22 @@ "hsts.preload": "Permitir pré-carregamento do cabeçalho do HSTS", "hsts.help": "Se habilitado, um cabeçalho de HSTS será enviado para este site. Você pode selecionar tanto quais subdomínios deseja incluir, como quais serão as flags de pré-carregamento no seu cabeçalho. Se estiver em dúvida, você pode deixar esta opção desmarcada. Mais informações", "traffic-management": "Administração de Tráfego", - "traffic.help": "NodeBB uses a module that automatically denies requests in high-traffic situations. You can tune these settings here, although the defaults are a good starting point.", + "traffic.help": "NodeBB usa um módulo que automaticamente nega requisições em situações de alto tráfego. Você pode ajustar estas configurações aqui, apesar de que os padrões são um bom ponto de partida.", "traffic.enable": "Ativar a Administração de Tráfego", "traffic.event-lag": "Limite do Lag do Loop de Eventos (em milisegundos)", "traffic.event-lag-help": "Abaixar este valor diminui o tempo de espera para o carregamentos de página, mas irá também mostrar a mensagem de \"carga excessiva\" para mais usuários. (É necessário reiniciar)", "traffic.lag-check-interval": "Intervalo de Checagem (em milisegundos)", "traffic.lag-check-interval-help": "Diminuir esse valor faz com que o NodeBB fique mais sensível a picos de carga, mas também pode fazer com que a verificação fique muito sensível. (É necessário reiniciar)", - "sockets.settings": "WebSocket Settings", - "sockets.max-attempts": "Max Reconnection Attempts", - "sockets.default-placeholder": "Default: %1", - "sockets.delay": "Reconnection Delay", + "sockets.settings": "Configurações de WebSocket", + "sockets.max-attempts": "Máx. Tentativas de Reconexão", + "sockets.default-placeholder": "Padrão: %1", + "sockets.delay": "Espera de Reconexão", - "analytics.settings": "Analytics Settings", - "analytics.max-cache": "Analytics Cache Max Value", - "analytics.max-cache-help": "On high-traffic installs, the cache could be exhausted continuously if there are more concurrent active users than the Max Cache value. (Restart required)", - "compression.settings": "Compression Settings", - "compression.enable": "Enable Compression", - "compression.help": "This setting enables gzip compression. For a high-traffic website in production, the best way to put compression in place is to implement it at a reverse proxy level. You can enable it here for testing purposes." + "analytics.settings": "Configurações de Analytics", + "analytics.max-cache": "Valor Máx. do Cache de Analytics", + "analytics.max-cache-help": "Em instalações de alto tráfego, o cache pode ser exaurido continuamente se houver mais usuários ativos simultâneos do que o valor Max Cache. (É necessário reiniciar)", + "compression.settings": "Configurções de Compressão", + "compression.enable": "Habilitar Compreesão", + "compression.help": "Esta configuração ativa a compactação gzip. Para um site de alto tráfego em produção, a melhor maneira de implementar a compactação é implementá-la em um nível de proxy reverso. Você pode habilitá-lo aqui para fins de teste." } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/api.json b/public/language/pt-BR/admin/settings/api.json index 50892925f3..a7427d4aeb 100644 --- a/public/language/pt-BR/admin/settings/api.json +++ b/public/language/pt-BR/admin/settings/api.json @@ -1,16 +1,16 @@ { "tokens": "Tokens", - "settings": "Settings", - "lead-text": "From this page you can configure access to the Write API in NodeBB.", - "intro": "By default, the Write API authenticates users based on their session cookie, but NodeBB also supports Bearer authentication via tokens generated via this page.", - "docs": "Click here to access the full API specification", + "settings": "Configurações", + "lead-text": "Nesta página, você pode configurar o acesso à API de Escrita no NodeBB.", + "intro": "Por padrão, a API de Escrita autentica os usuários com base em seu cookie de \nsessão, mas o NodeBB também oferece suporte à autenticação Bearer por\n meio de tokens gerados por meio desta página.", + "docs": "Clique aqui para acessar a especificação completa da API", - "require-https": "Require API usage via HTTPS only", - "require-https-caveat": "Note: Some installations involving load balancers may proxy their requests to NodeBB using HTTP, in which case this option should remain disabled.", + "require-https": "Exigir uso da API apenas via HTTPS", + "require-https-caveat": "Nota: Algumas instalações que envolvem balanceadores de carga podem fazer proxy de suas solicitações para NodeBB usando HTTP, caso em que esta opção deve permanecer desabilitada.", - "uid": "User ID", - "uid-help-text": "Specify a User ID to associate with this token. If the user ID is 0, it will be considered a master token, which can assume the identity of other users based on the _uid parameter", - "description": "Description", - "no-description": "No description specified.", - "token-on-save": "Token will be generated once form is saved" + "uid": "ID do Usuário", + "uid-help-text": "Especifique um ID de usuário para associar a este token. Se o ID do usuário for0, ele será considerada uma token master, que pode assumir a identidade de outros usuários com base no parâmetro _uid", + "description": "Descrição", + "no-description": "Nenhuma descrição especificada.", + "token-on-save": "O token será gerado assim que o formulário for salvo" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/chat.json b/public/language/pt-BR/admin/settings/chat.json index 8e06b1fd64..710c1e29c4 100644 --- a/public/language/pt-BR/admin/settings/chat.json +++ b/public/language/pt-BR/admin/settings/chat.json @@ -6,7 +6,7 @@ "max-length": "Tamanho máximo das mensagens de chat", "max-room-size": "Número máximo de usuários nas salas de chat", "delay": "Tempo entre mensagens de chat em milisegundos", - "notification-delay": "Notification delay for chat messages. (0 for no delay)", + "notification-delay": "Tempo de espera para notificação de mensagens de bate-papo. (0 para não esperar)", "restrictions.seconds-edit-after": "Número de segundos que uma mensagem de chat permanecerá editável. (0 desligado)", "restrictions.seconds-delete-after": "Número de segundos que uma mensagem de chat permanecerá deletável. (0 desligado)" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/cookies.json b/public/language/pt-BR/admin/settings/cookies.json index c8c77ff6af..a59e7b91f0 100644 --- a/public/language/pt-BR/admin/settings/cookies.json +++ b/public/language/pt-BR/admin/settings/cookies.json @@ -8,6 +8,6 @@ "consent.blank-localised-default": "Deixar em branco para utilizar os padrões de localidade do NodeBB", "settings": "Configurações", "cookie-domain": "Domínio da sessão de cookie", - "max-user-sessions": "Max active sessions per user", + "max-user-sessions": "Máximo de sessões ativas por usuário", "blank-default": "Deixe em branco para o valor padrão" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/email.json b/public/language/pt-BR/admin/settings/email.json index 6d233e6dfd..3997f2502f 100644 --- a/public/language/pt-BR/admin/settings/email.json +++ b/public/language/pt-BR/admin/settings/email.json @@ -22,8 +22,8 @@ "smtp-transport.username": "Nome de usuário", "smtp-transport.username-help": "Para o serviço do Gmail, entre com o endereço de e-mail completo aqui, principalmente se você estiver usando um domínio administrado pelo Google Apps.", "smtp-transport.password": "Senha", - "smtp-transport.pool": "Enable pooled connections", - "smtp-transport.pool-help": "Pooling connections prevents NodeBB from creating a new connection for every email. This option only applies if SMTP Transport is enabled.", + "smtp-transport.pool": "Habilitar conexões em pool", + "smtp-transport.pool-help": "O pool de conexões evita que o NodeBB crie uma nova conexão para cada e-mail. Esta opção se aplica apenas se o Transporte SMTP estiver habilitado.", "template": "Editar Modelo do E-mail", "template.select": "Escolher Modelo do E-mail", @@ -32,10 +32,10 @@ "testing.select": "Escolher Modelo do E-mail", "testing.send": "Enviar E-mail de Teste", "testing.send-help": "O e-mail de teste será enviado para o seu endereço de e-mail.", - "subscriptions": "Email Digests", - "subscriptions.disable": "Disable email digests", + "subscriptions": "Resumos por Email", + "subscriptions.disable": "Desabilitar resumos por email", "subscriptions.hour": "Hora de Envio dos Resumos", "subscriptions.hour-help": "Por favor, entre um número representando a hora para enviar os resumos agendados via e-mail (por exemplo: 0 para meia-noite, 17 para 5:00pm). Tenha em mente que esta é a hora de acordo com o servidor e pode não combinar exatamente com o relógio do seu sistema.
O horário aproximado do servidor é:
O próximo resumo diário está agendado para ser enviado ", - "notifications.settings": "Email notification settings", - "notifications.remove-images": "Remove images from email notifications" + "notifications.settings": "Configurações de notificação por email", + "notifications.remove-images": "Remover imagens de notificações por e-mail" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/general.json b/public/language/pt-BR/admin/settings/general.json index ebde895c12..ce5942ef06 100644 --- a/public/language/pt-BR/admin/settings/general.json +++ b/public/language/pt-BR/admin/settings/general.json @@ -1,8 +1,8 @@ { "site-settings": "Configurações do Site", "title": "Título do Site", - "title.short": "Short Title", - "title.short-placeholder": "If no short title is specified, the site title will be used", + "title.short": "Título Curto", + "title.short-placeholder": "Se nenhum título curto for especificado, o título do site será usado", "title.url": "URL", "title.url-placeholder": "A URL do título do site", "title.url-help": "Quando o título é clicado, enviar os usuários para este endereço. Se deixado em branco, o usuário será enviado para a página inicial do fórum.", @@ -28,17 +28,17 @@ "favicon": "Favicon", "favicon.upload": "Enviar", "pwa": "Progressive Web App", - "touch-icon": "Touch Icon", + "touch-icon": "Ícone para Touch", "touch-icon.upload": "Enviar", - "touch-icon.help": "Recommended size and format: 512x512, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", - "maskable-icon": "Maskable (Homescreen) Icon", - "maskable-icon.help": "Recommended size and format: 512x512, PNG format only. If no maskable icon is specified, NodeBB will fall back to the Touch Icon.", + "touch-icon.help": "Tamanho e formato recomendados: 512x512, somente formato PNG. Se nenhum ícone para touch for especificado, o NodeBB usará o seu próprio favicon.", + "maskable-icon": "Ícone Mascarável (de Tela Inicial)", + "maskable-icon.help": "Tamanho e formato recomendados: 512x512, somente formato PNG. Se nenhum ícone mascarável for especificado, o NodeBB usará o seu próprio Ícone para Touch.", "outgoing-links": "Links Externos", "outgoing-links.warning-page": "Habilitar Página de Aviso de Links Externos", "search-default-sort-by": "Padrão de ordenação de pesquisa por", "outgoing-links.whitelist": "Domínios que não receberão o aviso de link externo quando clicados", - "site-colors": "Site Color Metadata", - "theme-color": "Theme Color", - "background-color": "Background Color", - "background-color-help": "Color used for splash screen background when website is installed as a PWA" + "site-colors": "Metadados de Cores do Site", + "theme-color": "Cor do Thema", + "background-color": "Cor de Fundo", + "background-color-help": "Cor usada para o fundo da tela inicial quando o site é instalado como um PWA" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/group.json b/public/language/pt-BR/admin/settings/group.json index 476ed36bbc..e5e37f5c0c 100644 --- a/public/language/pt-BR/admin/settings/group.json +++ b/public/language/pt-BR/admin/settings/group.json @@ -3,7 +3,7 @@ "private-groups": "Grupos Privados", "private-groups.help": "Se habilitado, a entrada nos grupos exigirá a apovação do dono do grupo (Padrão: ligado)", "private-groups.warning": "Atenção! Se esta opção estiver desabilitada e você tiver grupos privados, eles automaticamente se tornarão públicos.", - "allow-multiple-badges": "Allow Multiple Badges", + "allow-multiple-badges": "Permitir Vários Emblemas", "allow-multiple-badges-help": "Esta opção pode ser usada para permitir que os usuários selecionem várias insígnias de grupo, requer suporte ao tema.", "max-name-length": "Tamanho Máximo do Nome do Grupo", "max-title-length": "Tamanho Máximo do Título do Grupo", diff --git a/public/language/pt-BR/admin/settings/guest.json b/public/language/pt-BR/admin/settings/guest.json index 84e3098de0..7e80da5987 100644 --- a/public/language/pt-BR/admin/settings/guest.json +++ b/public/language/pt-BR/admin/settings/guest.json @@ -1,7 +1,7 @@ { - "settings": "Settings", + "settings": "Configurações", "handles.enabled": "Permitir que visitantes escolham um nome", "handles.enabled-help": "Esta opção mostra um novo campo que permite visitantes de escolher um nome para associar a cada post que eles fizerem. Se desabilitado, eles serão simplesmente chamados de \"Visitante\".", - "topic-views.enabled": "Allow guests to increase topic view counts", - "reply-notifications.enabled": "Allow guests to generate reply notifications" + "topic-views.enabled": "Permitir que visitantes aumentem a contagem de visualizações do tópico", + "reply-notifications.enabled": "Permitir que convidados gerem notificações de resposta" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/pagination.json b/public/language/pt-BR/admin/settings/pagination.json index ede7316379..65535045f7 100644 --- a/public/language/pt-BR/admin/settings/pagination.json +++ b/public/language/pt-BR/admin/settings/pagination.json @@ -1,12 +1,12 @@ { "pagination": "Configurações de Paginação", "enable": "Paginar posts e tópicos ao invés de usar rolagem infinita.", - "posts": "Post Pagination", + "posts": "Paginação do Post", "topics": "Paginação de Tópico", "posts-per-page": "Posts por Página", "max-posts-per-page": "Máximo de posts por página", "categories": "Paginação de Categorias", "topics-per-page": "Tópicos por Página", "max-topics-per-page": "Máximo de tópicos por página", - "categories-per-page": "Categories per page" + "categories-per-page": "Categorias por página" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/post.json b/public/language/pt-BR/admin/settings/post.json index 3e914dd082..764ec57c0a 100644 --- a/public/language/pt-BR/admin/settings/post.json +++ b/public/language/pt-BR/admin/settings/post.json @@ -7,12 +7,12 @@ "sorting.most-posts": "Mais postados", "sorting.topic-default": "Ordenação Padrão de Tópicos", "length": "Tamanho do Post", - "post-queue": "Post Queue", + "post-queue": "Fila de Posts", "restrictions": "Restições de Postagem", "restrictions-new": "Restrições a Novos Usuários", "restrictions.post-queue": "Ativar enfileiramento de posts", - "restrictions.post-queue-rep-threshold": "Reputation required to bypass post queue", - "restrictions.groups-exempt-from-post-queue": "Select groups that should be exempt from the post queue", + "restrictions.post-queue-rep-threshold": "Reputação exigida para evitar a fila de posts", + "restrictions.groups-exempt-from-post-queue": "Selecionar grupos que devem ficar isentos da fila de postagem", "restrictions-new.post-queue": "Ativar novas restrições de usuários", "restrictions.post-queue-help": "Habilitar a fila de postagens colocará as postagens de novos usuários na fila para aprovação", "restrictions-new.post-queue-help": "Habilitar restrições a novos usuários irá estabelecer restrições em postagens criadas por novos usuários", @@ -32,10 +32,10 @@ "timestamp": "Timestamp", "timestamp.cut-off": "Data de corte (em dias)", "timestamp.cut-off-help": "Datas & horários serão exibidos de uma forma relativa (por exemplo: \"3 horas atrás\" / \"5 dias atrás\"), e de acordo com os mais diversos\n\t\t\t\t\tidiomas. Após um certo ponto, este texto pode ser trocado para mostrar a própria data local\n\t\t\t\t\t(por exemplo: 5 Nov 2016 15:30).
(Padrão: 30, ou um mês). Defina como 0 para sempre mostrar datas, deixe em branco para sempre mostrar horários relativos.", - "timestamp.necro-threshold": "Necro Threshold (in days)", - "timestamp.necro-threshold-help": "A message will be shown between posts if the time between them is longer than the necro threshold. (Default: 7, or one week). Set to 0 to disable.", - "timestamp.topic-views-interval": "Increment topic views interval (in minutes)", - "timestamp.topic-views-interval-help": "Topic views will only increment once every X minutes as defined by this setting.", + "timestamp.necro-threshold": "Limiar para Necro (em dias)", + "timestamp.necro-threshold-help": "Uma mensagem será exibida entre as postagens se o tempo entre elas for maior do que o limite necro. (Padrão: 7, ou uma semana). Defina como 0 para desativar.", + "timestamp.topic-views-interval": "Intervalo de incrementação de visualizações do tópico (em minutos)", + "timestamp.topic-views-interval-help": "As visualizações de tópico serão incrementadas apenas uma vez a cada X minutos, conforme definido por esta configuração.", "teaser": "Post de Propaganda", "teaser.last-post": "Último – Exibir o último post, incluindo o post original, se não houver respostas", "teaser.last-reply": "Último – Exibir a última resposta, ou um marcador \"Sem respostas\" se não houver respostas", @@ -44,7 +44,7 @@ "unread.cutoff": "Data de corte de não-lidos", "unread.min-track-last": "Mínimo de posts no tópico antes de rastrear o último lido", "recent": "Configurações Recentes", - "recent.max-topics": "Maximum topics on /recent", + "recent.max-topics": "Máximo de tópicos em /recent", "recent.categoryFilter.disable": "Desailitar filtragem de tópicos em categorias ignoradas na página /recente", "signature": "Configurações de Assinatura", "signature.disable": "Desabilitar assinaturas", diff --git a/public/language/pt-BR/admin/settings/reputation.json b/public/language/pt-BR/admin/settings/reputation.json index 3e568926e9..899ee2bc3d 100644 --- a/public/language/pt-BR/admin/settings/reputation.json +++ b/public/language/pt-BR/admin/settings/reputation.json @@ -5,8 +5,8 @@ "votes-are-public": "Todos os Votos São Públicos", "thresholds": "Limites às atividades", "min-rep-downvote": "Reputação mínima para votar negativamente em posts", - "downvotes-per-day": "Downvotes per day (set to 0 for unlimited downvotes)", - "downvotes-per-user-per-day": "Downvotes per user per day (set to 0 for unlimited downvotes)", + "downvotes-per-day": "Votos negativos por dia (definido como 0 para votos negativos ilimitados)", + "downvotes-per-user-per-day": "Votos negativos por usuário por dia (definido como 0 para votos negativos ilimitados)", "min-rep-flag": "Reputação mínima para sinalizar posts", "min-rep-website": "Reputação mínima para adicionar \"Website\" ao perfil do usuário", "min-rep-aboutme": "Reputação mínima para adicionar \"Sobre mim\" ao perfil do usuário", @@ -14,9 +14,9 @@ "min-rep-profile-picture": "Reputação mínima para adicionar \"Foto do Perfil\" ao perfil do usuário", "min-rep-cover-picture": "Reputação mínima para adicionar \"Foto de Capa\" ao perfil do usuário", - "flags": "Flag Settings", - "flags.limit-per-target": "Maximum number of times something can be flagged", - "flags.limit-per-target-placeholder": "Default: 0", - "flags.limit-per-target-help": "When a post or user is flagged multiple times, each additional flag is considered a "report" and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.", - "flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned" + "flags": "Configurações de Sinalização", + "flags.limit-per-target": "Número máximo de vezes que algo pode ser sinalizado", + "flags.limit-per-target-placeholder": "Padrão: 0", + "flags.limit-per-target-help": "Quando uma postagem ou usuário é sinalizado várias vezes, cada sinalizador adicional é considerado uma 'reportagem' e adicionado ao sinalizador original. Defina esta opção com um número diferente de zero para limitar o número de relatórios que um item pode receber.", + "flags.auto-resolve-on-ban": "Resolver automaticamente todos os tickets de um usuário quando eles são banidos" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/tags.json b/public/language/pt-BR/admin/settings/tags.json index c08d3c7628..f44e8ba6b3 100644 --- a/public/language/pt-BR/admin/settings/tags.json +++ b/public/language/pt-BR/admin/settings/tags.json @@ -1,8 +1,8 @@ { "tag": "Configurações de Tag", - "link-to-manage": "Manage Tags", - "system-tags": "System Tags", - "system-tags-help": "Only privileged users will be able to use these tags.", + "link-to-manage": "Gerenciar Tags", + "system-tags": "Tags do Sistema", + "system-tags-help": "Apenas usuários privilegiados poderão usar essas tags.", "min-per-topic": "Mínimo de Tags por Tópico", "max-per-topic": "Máximo de Tags por Tópico", "min-length": "Tamanho Mínimo das Tags", diff --git a/public/language/pt-BR/admin/settings/uploads.json b/public/language/pt-BR/admin/settings/uploads.json index 07c5602541..e8b9b7728b 100644 --- a/public/language/pt-BR/admin/settings/uploads.json +++ b/public/language/pt-BR/admin/settings/uploads.json @@ -21,9 +21,9 @@ "topic-thumb-size": "Tamanho da Miniatura de Tópico", "allowed-file-extensions": "Extensões de Arquivo Permitidas", "allowed-file-extensions-help": "Digite uma lista, separada por vírgulas, de extensões de arquivos aqui (por exemplo: pdf,xls,doc). Uma lista vazia significa que todas as extensões são permitidas.", - "upload-limit-threshold": "Rate limit user uploads to:", - "upload-limit-threshold-per-minute": "Per %1 Minute", - "upload-limit-threshold-per-minutes": "Per %1 Minutes", + "upload-limit-threshold": "Limitar a taxa de uploads de usuários para:", + "upload-limit-threshold-per-minute": "A Cada %1 Minuto", + "upload-limit-threshold-per-minutes": "A Cada %1 Minutos", "profile-avatars": "Avatares de Perfil", "allow-profile-image-uploads": "Permitir usuários de enviar imagens de perfil", "convert-profile-image-png": "Converter imagens de perfil enviadas para PNG", diff --git a/public/language/pt-BR/admin/settings/user.json b/public/language/pt-BR/admin/settings/user.json index 1af9f279f2..bb44efa13a 100644 --- a/public/language/pt-BR/admin/settings/user.json +++ b/public/language/pt-BR/admin/settings/user.json @@ -9,14 +9,14 @@ "allow-login-with.email": "Apenas E-mail", "account-settings": "Configurações de Conta", "gdpr_enabled": "Ativar coleta de consentimento do GDPR", - "gdpr_enabled_help": "When enabled, all new registrants will be required to explicitly give consent for data collection and usage under the General Data Protection Regulation (GDPR). Note: Enabling GDPR does not force pre-existing users to provide consent. To do so, you will need to install the GDPR plugin.", + "gdpr_enabled_help": "Quando ativado, todos os novos registrantes serão obrigados a dar consentimento explícito para a coleta de dados e uso sob o General Data Protection Regulation (GDPR). Nota: Ativar o GDPR não força usuários pré-existentes a fornecer consentimento. Para fazer isso, você precisará instalar o plug-in GDPR.", "disable-username-changes": "Desabilitar mudança de nome de usuário", "disable-email-changes": "Desabilitar mudanças de e-mail", "disable-password-changes": "Desabilitar mudanças de senha", "allow-account-deletion": "Permitir exclusão de conta", "hide-fullname": "Esconder nome completo de outros usuários", "hide-email": "Esconder e-mail de outros usuários", - "show-fullname-as-displayname": "Show user's full name as their display name if available", + "show-fullname-as-displayname": "Mostrar o nome completo do usuário como nome de exibição, se disponível", "themes": "Temas", "disable-user-skins": "Impedir usuários de escolherem um tema diferente", "account-protection": "Proteção de Conta", @@ -44,9 +44,9 @@ "registration-type.disabled": "Desativar registros", "registration-type.help": "Normal - Usuários podem se registrar pela página /register.
\nApenas Convite - Usuários podem convidar outros da página usuários.
\nApenas Convite do Administrador - Apenas administradores podem convidar das páginas de usuários e administração/administrar/usuários .
\nSem registro - Sem registro de usuários.
", "registration-approval-type.help": "Normal - Usuários são registrados imediatamente.
\nAprovação do Admin - Registros de usuários são colocados em uma fila de aprovação por administradores.
\nAprovação do Admin por IPs - Normal para novos usuários, Aprovação do Admin por endereços IPs que já têm uma conta.
", - "registration-queue-auto-approve-time": "Automatic Approval Time", - "registration-queue-auto-approve-time-help": "Hours before user is approved automatically. 0 to disable.", - "registration-queue-show-average-time": "Show users average time it takes to approve a new user", + "registration-queue-auto-approve-time": "Tempo de Aprovação Automática", + "registration-queue-auto-approve-time-help": "Horas antes que o usuário seja aprovado automaticamente. 0 para desativar.", + "registration-queue-show-average-time": "Mostrar aos usuários o tempo médio de demora para aprovar um novo usuário", "registration.max-invites": "Máximo de Convites por Usuário", "max-invites": "Máximo de Convites por Usuário", "max-invites-help": "0 para nenhuma restrição. Administradores têm convites infinitos.
Apenas aplicável para \"Apenas por Convite\".", @@ -66,7 +66,7 @@ "restrict-chat": "Permitir apenas mensagens de chat de usuários que eu sigo", "outgoing-new-tab": "Abrir links externos em nova aba", "topic-search": "Permitir Busca dentro do Tópico", - "update-url-with-post-index": "Update url with post index while browsing topics", + "update-url-with-post-index": "Atualizar url com índice de postagem enquanto navega pelos tópicos", "digest-freq": "Habilitar o recebimento de Resumos", "digest-freq.off": "Desligado", "digest-freq.daily": "Diário", diff --git a/public/language/pt-BR/category.json b/public/language/pt-BR/category.json index 48e7596dbc..d608582acc 100644 --- a/public/language/pt-BR/category.json +++ b/public/language/pt-BR/category.json @@ -19,5 +19,5 @@ "notwatching.message": "Agora, você não está acompanhando as novidades nem desta categoria e nem de suas subcategorias", "ignoring.message": "Agora, você está ignorando as novidades desta categorias e de todas as suas subcategorias", "watched-categories": "Categorias acompanhadas", - "x-more-categories": "%1 more categories" + "x-more-categories": "mais %1 categorias" } \ No newline at end of file diff --git a/public/language/pt-BR/email.json b/public/language/pt-BR/email.json index 3887479965..64221ab6d9 100644 --- a/public/language/pt-BR/email.json +++ b/public/language/pt-BR/email.json @@ -21,22 +21,22 @@ "reset.notify.text1": "Nós estamos notificando você que em %1, sua senha foi alterada com sucesso.", "reset.notify.text2": "Se você não autorizou isso, por favor notifique um administrador imediatamente.", "digest.latest_topics": "Últimos tópicos de %1", - "digest.top-topics": "Top topics from %1", - "digest.popular-topics": "Popular topics from %1", + "digest.top-topics": "Tópicos principais de %1", + "digest.popular-topics": "Tópicos populares de %1", "digest.cta": "Clique aqui para visitar %1", "digest.unsub.info": "Este resumo foi enviado para você devido às suas configurações de assinatura.", "digest.day": "dia", "digest.week": "semana", "digest.month": "mês", "digest.subject": "Resumo de %1", - "digest.title.day": "Your Daily Digest", - "digest.title.week": "Your Weekly Digest", - "digest.title.month": "Your Monthly Digest", + "digest.title.day": "Seu Resumo Diário", + "digest.title.week": "Seu Resumo Semanal", + "digest.title.month": "Seu Resumo Mensal", "notif.chat.subject": "Nova mensagem de chat recebida de %1", "notif.chat.cta": "Clique aqui para continuar a conversa", "notif.chat.unsub.info": "Esta notificação de chat foi enviada a você devido às suas configurações de assinatura.", "notif.post.unsub.info": "Esta notificação de postagem foi enviada para você devido as suas configurações de assinatura.", - "notif.post.unsub.one-click": "Alternatively, unsubscribe from future emails like this, by clicking", + "notif.post.unsub.one-click": "Como alternativa, cancele a inscrição de futuros e-mails como este clicando em", "notif.cta": "Para o fórum", "notif.cta-new-reply": "Ver Post", "notif.cta-new-chat": "Ver Chat", @@ -44,8 +44,8 @@ "notif.test.long": "Este é um teste do email de notificações. Envie ajuda!", "test.text1": "Este é um e-mail de teste, para verificar que o enviador de emails está corretamente configurado no seu NodeBB.", "unsub.cta": "Clique aqui para alterar estas configurações", - "unsubscribe": "unsubscribe", - "unsub.success": "You will no longer receive emails from the %1 mailing list", + "unsubscribe": "desinscrever", + "unsub.success": " Você não receberá mais e-mails da lista de emails %1", "banned.subject": "Você foi banido de %1", "banned.text1": "O usuário %1 foi banido de %2.", "banned.text2": "Este banimento durará até %1.", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index af35c489b4..ca330f4306 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -9,12 +9,12 @@ "invalid-tid": "ID de Tópico Inválido", "invalid-pid": "ID de Post Inválido", "invalid-uid": "ID de Usuário Inválido", - "invalid-date": "A valid date must be provided", + "invalid-date": "Uma data válida deve ser fornecida", "invalid-username": "Nome de Usuário Inválido", "invalid-email": "Email Inválido", - "invalid-fullname": "Invalid Fullname", - "invalid-location": "Invalid Location", - "invalid-birthday": "Invalid Birthday", + "invalid-fullname": "Nome Completo Inválido", + "invalid-location": "Localização Inválida", + "invalid-birthday": "Data de Nascimento Inválida", "invalid-title": "Título inválido", "invalid-user-data": "Dados de Usuário Inválidos", "invalid-password": "Senha Inválida", @@ -22,26 +22,26 @@ "invalid-username-or-password": "Por favor especifique ambos nome de usuário e senha", "invalid-search-term": "Termo de pesquisa inválido", "invalid-url": "URL Inválido", - "invalid-event": "Invalid event: %1", + "invalid-event": "Evento inválido: %1", "local-login-disabled": "O sistema de login local foi desativado para contas sem privilégios.", "csrf-invalid": "Não foi possível realizar o seu login, provavelmente porque a sua sessão expirou. Por favor, tente novamente.", "invalid-pagination-value": "Valor de paginação inválido, precisa ser no mínimo %1 e no máximo %2", "username-taken": "Nome de usuário já existe", "email-taken": "Email já cadastrado", - "email-invited": "Email was already invited", - "email-not-confirmed": "You are unable to post until your email is confirmed, please click here to confirm your email.", + "email-invited": "O email já foi convidado", + "email-not-confirmed": "Você não poderá postar até que seu e-mail seja confirmado, clique aqui para confirmar seu e-mail.", "email-not-confirmed-chat": "Você não está habilitado a conversar até que seu email seja confirmado, por favor clique aqui para confirmar seu email.", - "email-not-confirmed-email-sent": "Your email has not been confirmed yet, please check your inbox for the confirmation email. You won't be able to post or chat until your email is confirmed.", + "email-not-confirmed-email-sent": "Seu e-mail ainda não foi confirmado, verifique sua caixa de entrada para o e-mail de confirmação. Você não poderá postar ou usar o chat até que seu e-mail seja confirmado.", "no-email-to-confirm": "Este fórum exige confirmação de email, por gentileza clique aqui para digitar um email", "email-confirm-failed": "Nós não pudemos confirmar seu email, por gentileza tente novamente mais tarde.", "confirm-email-already-sent": "O email de confirmação já foi enviado, por favor aguarde %1 minuto(s) para enviar outro.", "sendmail-not-found": "O executável do sendmail não pôde ser encontrado. Por favor, certifique-se de que ele está instalado e que está autorizado a ser executado pelo usuário que roda o NodeBB.", - "digest-not-enabled": "This user does not have digests enabled, or the system default is not configured to send digests", + "digest-not-enabled": "Este usuário não tem resumos habilitados ou o padrão do sistema não está configurado para enviar resumos", "username-too-short": "Nome de usuário muito curto", "username-too-long": "Nome de usuário muito longo", "password-too-long": "A senha é muito grande", "reset-rate-limited": "Muitas solicitações de redefinição de senha (taxa de ação limitada)", - "reset-same-password": "Please use a password that is different from your current one", + "reset-same-password": "Use uma senha diferente da atual", "user-banned": "Usuário banido", "user-banned-reason": "Desculpa, esta conta foi banida (Motivo: %1)", "user-banned-reason-until": "Desculpa, esta conta foi banida até %1 (Motivo: %2)", @@ -84,25 +84,25 @@ "tag-too-long": "Por favor digite uma tag menor. Tags não podem conter mais que %1 caractere(s)", "not-enough-tags": "Sem tags suficientes. Tópicos devem ter no mínimo %1 tag(s)", "too-many-tags": "Muitas tags. Tópicos não podem ter mais que %1 tag(s)", - "cant-use-system-tag": "You can not use this system tag.", + "cant-use-system-tag": "Você não pode usar esta tag de sistema.", "still-uploading": "Aguarde a conclusão dos uploads.", "file-too-big": "O tamanho máximo permitido de arquivo é de %1 kB - por favor faça upload de um arquivo menor", "guest-upload-disabled": "O upload por visitantes foi desabilitado", "cors-error": "Não é possível fazer o upload da imagem devido ao CORS mal configurado", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", - "scheduling-to-past": "Please select a date in the future.", - "invalid-schedule-date": "Please enter a valid date and time.", - "cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.", - "cant-merge-scheduled": "Scheduled topics cannot be merged.", - "cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.", - "cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.", + "upload-ratelimit-reached": "Você fez upload de muitos arquivos de uma vez. Por favor, tente novamente mais tarde.", + "scheduling-to-past": "Selecione uma data no futuro.", + "invalid-schedule-date": "Por favor, insira uma data e hora válidas.", + "cant-pin-scheduled": "Tópicos agendados não podem ser (des)fixados.", + "cant-merge-scheduled": "Os tópicos agendados não podem ser mesclados.", + "cant-move-posts-to-scheduled": "Não é possível mover posts para um tópico agendado.", + "cant-move-from-scheduled-to-existing": "Não é possível mover postagens de um tópico agendado para um tópico existente.", "already-bookmarked": "Você já adicionou este post aos favoritos", "already-unbookmarked": "Você já removeu este post dos favoritos", "cant-ban-other-admins": "Você não pode banir outros administradores!", "cant-remove-last-admin": "Você é o único administrador. Adicione outro usuário como administrador antes de remover a si mesmo como admin", - "account-deletion-disabled": "Account deletion is disabled", + "account-deletion-disabled": "A exclusão de conta está desabilitada", "cant-delete-admin": "Remova os privilégios de administrador dessa conta antes de tentar excluí-la.", - "already-deleting": "Already deleting", + "already-deleting": "Já excluindo", "invalid-image": "Imagem Inválida", "invalid-image-type": "Tipo inválido de imagem. Os tipos permitidos são: %1", "invalid-image-extension": "Extensão de imagem inválida", @@ -117,8 +117,8 @@ "group-needs-owner": "Este grupo requer ao menos um dono", "group-already-invited": "Esse usuário já foi convidado", "group-already-requested": "Seu pedido de filiação já foi enviado", - "group-join-disabled": "You are not able to join this group at this time", - "group-leave-disabled": "You are not able to leave this group at this time", + "group-join-disabled": "Você não pode entrar neste grupo no momento", + "group-leave-disabled": "Você não pode sair deste grupo no momento", "post-already-deleted": "Este post já foi deletado", "post-already-restored": "Este post já foi restaurado", "topic-already-deleted": "Esté tópico já foi deletado", @@ -142,7 +142,7 @@ "chat-delete-duration-expired": "Você só pode deletar mensagens de chat %1 segundo(s) após postar", "chat-deleted-already": "Essa mensagem de chat já foi deletada", "chat-restored-already": "Essa mensagem de chat já foi restaurada.", - "chat-room-does-not-exist": "Chat room does not exist.", + "chat-room-does-not-exist": "A sala de chat não existe.", "already-voting-for-this-post": "Você já votou neste post.", "reputation-system-disabled": "O sistema de reputação está desabilitado.", "downvoting-disabled": "Negativação está desabilitada", @@ -153,14 +153,14 @@ "not-enough-reputation-min-rep-signature": "Você não possui reputação suficiente para adicionar uma assinatura", "not-enough-reputation-min-rep-profile-picture": "Você não possui reputação suficiente para adicionar uma imagem de perfil", "not-enough-reputation-min-rep-cover-picture": "Você não possui reputação suficiente para adicionar uma imagem de capa", - "post-already-flagged": "You have already flagged this post", - "user-already-flagged": "You have already flagged this user", - "post-flagged-too-many-times": "This post has been flagged by others already", - "user-flagged-too-many-times": "This user has been flagged by others already", - "cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)", + "post-already-flagged": "Você já sinalizou esse post", + "user-already-flagged": "Você já sinalizou esse usuário", + "post-flagged-too-many-times": "Esta postagem já foi sinalizada por outras pessoas", + "user-flagged-too-many-times": "Este usuário já foi sinalizado por outros", + "cant-flag-privileged": "Você não tem permissão para sinalizar os perfis ou o conteúdo de usuários privilegiados (moderadores/moderadores globais/administradores)", "self-vote": "Você não pode votar no seu próprio post", - "too-many-downvotes-today": "You can only downvote %1 times a day", - "too-many-downvotes-today-user": "You can only downvote a user %1 times a day", + "too-many-downvotes-today": "Você só pode votar negativamente %1 vezes por dia", + "too-many-downvotes-today-user": "Você só pode votar contra um usuário %1 vezes por dia", "reload-failed": "O NodeBB encontrou um problema ao recarregar: \"%1\". O NodeBB continuará a servir os assets existentes no lado do cliente, apesar de que você deve desfazer o que você fez antes de recarregar.", "registration-error": "Erro de Cadastro", "parse-error": "Algo deu errado ao receber a resposta do servidor", @@ -174,22 +174,22 @@ "cant-kick-self": "Você não pode kickar a si mesmo do grupo", "no-users-selected": "Nenhuma escolha de usuário(s) foi feita", "invalid-home-page-route": "Rota de página inicial inválida", - "invalid-session": "Invalid Session", - "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", - "session-mismatch": "Session Mismatch", - "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", + "invalid-session": "Sessão Inválida", + "invalid-session-text": "Parece que a sua sessão de login não está mais ativa. Por favor, atualize esta página.", + "session-mismatch": "Sessão Incompatível", + "session-mismatch-text": "Parece que sua sessão de login não combina mais com a do servidor. Por favor, atualize esta página.", "no-topics-selected": "Nenhum tópico selecionado!", "cant-move-to-same-topic": "Não é possível mover um post para o mesmo tópico!", - "cant-move-topic-to-same-category": "Can't move topic to the same category!", + "cant-move-topic-to-same-category": "Não é possível mover o tópico para a mesma categoria!", "cannot-block-self": "Você pode bloquear a si mesmo!", "cannot-block-privileged": "Você não pode bloquear administradores e moderadores globais", "cannot-block-guest": "Vistantes não podem bloquear outros usuários", "already-blocked": "Este usuário já foi bloqueado", "already-unblocked": "Este usuário já foi desbloqueado", "no-connection": "Parece haver um problema com a sua conexão com a internet", - "socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later", - "plugin-not-whitelisted": "Unable to install plugin – only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP", - "topic-event-unrecognized": "Topic event '%1' unrecognized", - "cant-set-child-as-parent": "Can't set child as parent category", - "cant-set-self-as-parent": "Can't set self as parent category" + "socket-reconnect-failed": "Não foi possível acessar o servidor neste momento. Clique aqui para tentar novamente ou tente novamente mais tarde", + "plugin-not-whitelisted": "Não foi possível instalar o plugin - apenas os plug-ins permitidos pelo NodeBB Package Manager podem ser instalados através do ACP", + "topic-event-unrecognized": "Evento de tópico '%1' não reconhecido", + "cant-set-child-as-parent": "Não é possível definir filho como categoria pai", + "cant-set-self-as-parent": "Não é possível definir a si mesmo como categoria pai" } \ No newline at end of file diff --git a/public/language/pt-BR/flags.json b/public/language/pt-BR/flags.json index 3dcb4d2310..48c144057f 100644 --- a/public/language/pt-BR/flags.json +++ b/public/language/pt-BR/flags.json @@ -1,12 +1,12 @@ { "state": "Estado", - "reports": "Reports", - "first-reported": "First Reported", + "reports": "Reportagens", + "first-reported": "Primeiro Reportado", "no-flags": "Ihuul! Nenhuma sinalização encontrada.", "assignee": "Responsável", "update": "Atualizar", "updated": "Atualizado", - "resolved": "Resolved", + "resolved": "Resolvido", "target-purged": "O conteúdo ao qual essa sinalização se referia foi removido e não está mais disponível.", "graph-label": "Sinalizações Diárias", @@ -26,18 +26,18 @@ "filter-quick-mine": "Atribuído a mim", "filter-cid-all": "Todas as categorias", "apply-filters": "Aplicar Filtros", - "more-filters": "More Filters", - "fewer-filters": "Fewer Filters", + "more-filters": "Mais Filtros", + "fewer-filters": "Menos Filtros", - "quick-actions": "Quick Actions", + "quick-actions": "Ações Rápidas", "flagged-user": "Usuário Sinalizado", "view-profile": "Ver Perfil", "start-new-chat": "Iniciar Novo Chat", "go-to-target": "Ver o Sinalizado", - "assign-to-me": "Assign To Me", - "delete-post": "Delete Post", - "purge-post": "Purge Post", - "restore-post": "Restore Post", + "assign-to-me": "Atribuir À Mim", + "delete-post": "Excluir Post", + "purge-post": "Expurgar Post", + "restore-post": "Restaurar Post", "user-view": "Ver Perfil", "user-edit": "Editar Perfil", @@ -45,11 +45,11 @@ "notes": "Notas da Sinalização", "add-note": "Adicionar Nota", "no-notes": "Nenhuma nota compartilhada.", - "delete-note-confirm": "Are you sure you want to delete this flag note?", + "delete-note-confirm": "Tem certeza de que deseja excluir esta nota de sinalização?", "note-added": "Nota Adicionada", - "note-deleted": "Note Deleted", + "note-deleted": "Nota Excluída", - "history": "Account & Flag History", + "history": "Histórico da Conta & Sinalizações", "no-history": "Sem histórico de sinalizações.", "state-all": "Todos os estados", @@ -59,17 +59,17 @@ "state-rejected": "Rejeitado", "no-assignee": "Não Atribuído", - "sort": "Sort by", - "sort-newest": "Newest first", - "sort-oldest": "Oldest first", - "sort-reports": "Most reports", - "sort-all": "All flag types...", - "sort-posts-only": "Posts only...", - "sort-downvotes": "Most downvotes", - "sort-upvotes": "Most upvotes", - "sort-replies": "Most replies", + "sort": "Ordenar por", + "sort-newest": "Mais recentes primeiro", + "sort-oldest": "Mais antigos primeiro", + "sort-reports": "Mais reportagens", + "sort-all": "Todos os tipos de sinalização...", + "sort-posts-only": "Posts apenas...", + "sort-downvotes": "Mais baixovotos", + "sort-upvotes": "Mais cimavotos", + "sort-replies": "Mais réplicas", - "modal-title": "Report Content", + "modal-title": "Reportar Conteúdo", "modal-body": "Por favor, especifique a razão pela qual você está sinalizando %1 %2 para a revisão. Alternativamente, use um dos botões de reporte rápido se for aplicável.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Ofensivo", @@ -81,8 +81,8 @@ "modal-submit-confirm-text": "Você já especificou um motivo individual. Tem certeza de que deseja enviar uma denúncia rápida?", "modal-submit-confirm-text-help": "O envio de uma denúncia rápida substituirá os motivos individuais especificados.", - "bulk-actions": "Bulk Actions", - "bulk-resolve": "Resolve Flag(s)", - "bulk-success": "%1 flags updated", - "flagged-timeago-readable": "Flagged (%2)" + "bulk-actions": "Ações em Massa", + "bulk-resolve": "Resolver Sinalização(ões)", + "bulk-success": "%1 sinalizações atualizadas", + "flagged-timeago-readable": "Sinalizado (%2)" } \ No newline at end of file diff --git a/public/language/pt-BR/global.json b/public/language/pt-BR/global.json index 8a7669005f..657fadf7ee 100644 --- a/public/language/pt-BR/global.json +++ b/public/language/pt-BR/global.json @@ -30,7 +30,7 @@ "header.unread": "Não Lido", "header.tags": "Tags", "header.popular": "Popular", - "header.top": "Top", + "header.top": "Topo", "header.users": "Usuários", "header.groups": "Grupos", "header.chats": "Chats", @@ -46,9 +46,9 @@ "alert.success": "Sucesso", "alert.error": "Erro", "alert.banned": "Banido", - "alert.banned.message": "You have just been banned, your access is now restricted.", - "alert.unbanned": "Unbanned", - "alert.unbanned.message": "Your ban has been lifted.", + "alert.banned.message": "Você acaba de ser banido, seu acesso agora está restrito.", + "alert.unbanned": "Des-banido", + "alert.unbanned.message": "Seu banimento foi suspenso.", "alert.unfollow": "Você deixou de seguir %1!", "alert.follow": "Agora você está seguindo %1!", "users": "Usuários", @@ -57,8 +57,8 @@ "x-posts": "%1 posts", "best": "Melhor", "votes": "Votos", - "x-votes": "%1 votes", - "voters": "Voters", + "x-votes": "%1 votos", + "voters": "Votantes", "upvoters": "Votos positivos", "upvoted": "Votou positivamente", "downvoters": "Votos negativos", @@ -95,8 +95,8 @@ "guest": "Visitante", "guests": "Visitantes", "former_user": "Um ex-usuário", - "system-user": "System", - "unknown-user": "Unknown user", + "system-user": "Sistema", + "unknown-user": "Usuário desconhecido", "updated.title": "Fórum Atualizado", "updated.message": "Este fórum foi atualizado para sua última versão. Clique aqui para atualizar a página.", "privacy": "Privacidade", diff --git a/public/language/pt-BR/groups.json b/public/language/pt-BR/groups.json index 846f06d9d6..c4a056a8dd 100644 --- a/public/language/pt-BR/groups.json +++ b/public/language/pt-BR/groups.json @@ -25,7 +25,7 @@ "details.latest_posts": "Últimos Posts", "details.private": "Particular", "details.disableJoinRequests": "Desabilitar pedidos de participação", - "details.disableLeave": "Disallow users from leaving the group", + "details.disableLeave": "Impedir que usuários saiam do grupo", "details.grant": "Conceder/Retomar a Posse", "details.kick": "Chutar", "details.kick_confirm": "Você tem certeza de que deseja remover este membro do grupo?", @@ -35,7 +35,7 @@ "details.member_count": "Número de Membros", "details.creation_date": "Data de Criação", "details.description": "Descrição", - "details.member-post-cids": "Category IDs to display posts from", + "details.member-post-cids": "IDs de categoria das quais exibir postagens", "details.badge_preview": "Visualização do Distintivo", "details.change_icon": "Mudar Ícone", "details.change_label_colour": "Alterar Cor do Rótulo", @@ -50,11 +50,11 @@ "event.updated": "Os detalhes do grupo foram atualizados", "event.deleted": "O grupo \"%1\" foi deletado", "membership.accept-invitation": "Aceitar Convite", - "membership.accept.notification_title": "You are now a member of %1", + "membership.accept.notification_title": "Você agora é um membro de %1", "membership.invitation-pending": "Convite Pendente", "membership.join-group": "Entrar no Grupo", "membership.leave-group": "Deixar Grupo", - "membership.leave.notification_title": "%1 has left group %2", + "membership.leave.notification_title": "%1 saiu do grupo %2", "membership.reject": "Rejeitar", "new-group.group_name": "Nome do Grupo:", "upload-group-cover": "Fazer upload de capa do grupo", diff --git a/public/language/pt-BR/login.json b/public/language/pt-BR/login.json index 1c838ed13a..3d7dafb7af 100644 --- a/public/language/pt-BR/login.json +++ b/public/language/pt-BR/login.json @@ -9,5 +9,5 @@ "login_successful": "Você logou com sucesso!", "dont_have_account": "Não tem uma conta?", "logged-out-due-to-inactivity": "Você saiu do Painel de Controle de Administração devido à inatividade", - "caps-lock-enabled": "Caps Lock is enabled" + "caps-lock-enabled": "Caps Lock está ligada" } \ No newline at end of file diff --git a/public/language/pt-BR/modules.json b/public/language/pt-BR/modules.json index d5f9fa1c1e..570b9f3eb7 100644 --- a/public/language/pt-BR/modules.json +++ b/public/language/pt-BR/modules.json @@ -1,7 +1,7 @@ { "chat.chatting_with": "Conversar com", "chat.placeholder": "Digite a mensagem de chat aqui, pressione enter para enviar", - "chat.scroll-up-alert": "You are looking at older messages, click here to go to most recent message.", + "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.", "chat.user_typing": "%1 está digitando ...", @@ -13,7 +13,7 @@ "chat.recent-chats": "Conversas Recentes", "chat.contacts": "Contatos", "chat.message-history": "Histórico de Mensagens", - "chat.message-deleted": "Message Deleted", + "chat.message-deleted": "Mensagem Excluída", "chat.options": "Opções da conversa", "chat.pop-out": "Pop-out o chat", "chat.minimize": "Minimizar", @@ -36,9 +36,9 @@ "chat.kick": "Expulsar", "chat.show-ip": "Mostrar IP", "chat.owner": "Dono da Sala", - "chat.system.user-join": "%1 has joined the room", - "chat.system.user-leave": "%1 has left the room", - "chat.system.room-rename": "%2 has renamed this room: %1", + "chat.system.user-join": "%1 entrou na sala", + "chat.system.user-leave": "%1 saiu da sala", + "chat.system.room-rename": "%2 renomeou esta sala: %1", "composer.compose": "Compor", "composer.show_preview": "Exibir Pré-visualização", "composer.hide_preview": "Esconder Pré-visualização", @@ -59,22 +59,22 @@ "composer.upload-file": "Fazer upload de Arquivo", "composer.zen_mode": "Modo Zen", "composer.select_category": "Escolha uma categoria", - "composer.textarea.placeholder": "Enter your post content here, drag and drop images", - "composer.schedule-for": "Schedule topic for", - "composer.schedule-date": "Date", - "composer.schedule-time": "Time", - "composer.cancel-scheduling": "Cancel Scheduling", - "composer.set-schedule-date": "Set Date", + "composer.textarea.placeholder": "Insira o conteúdo da sua postagem aqui, arraste e solte as imagens", + "composer.schedule-for": "Agendar tópico para", + "composer.schedule-date": "Data", + "composer.schedule-time": "Hora", + "composer.cancel-scheduling": "Cancelar Agendamento", + "composer.set-schedule-date": "Definir Data", "bootbox.ok": "OK", "bootbox.cancel": "Cancelar", "bootbox.confirm": "Confirmar", "cover.dragging_title": "Posicionamento da Foto de Capa", "cover.dragging_message": "Arraste a foto de capa na posição desejada e clique em \"Salvar\"", "cover.saved": "Imagem de foto da capa e posição foram gravadas", - "thumbs.modal.title": "Manage topic thumbnails", - "thumbs.modal.no-thumbs": "No thumbnails found.", - "thumbs.modal.resize-note": "Note: This forum is configured to resize topic thumbnails down to a maximum width of %1px", - "thumbs.modal.add": "Add thumbnail", - "thumbs.modal.remove": "Remove thumbnail", - "thumbs.modal.confirm-remove": "Are you sure you want to remove this thumbnail?" + "thumbs.modal.title": "Gerenciar miniaturas do tópico", + "thumbs.modal.no-thumbs": "Nenhuma miniatura encontrada.", + "thumbs.modal.resize-note": "Nota: Este fórum está configurado para redimensionar as miniaturas dos tópicos para uma largura máxima de %1px", + "thumbs.modal.add": "Adicionar miniatura", + "thumbs.modal.remove": "Remover miniatura", + "thumbs.modal.confirm-remove": "Você tem certeza que você quer remover esta miniatura?" } \ No newline at end of file diff --git a/public/language/pt-BR/notifications.json b/public/language/pt-BR/notifications.json index ed96ffd3c4..44d2a41783 100644 --- a/public/language/pt-BR/notifications.json +++ b/public/language/pt-BR/notifications.json @@ -35,7 +35,7 @@ "user_posted_to_dual": "%1 e %2 postaram respostas para: %3", "user_posted_to_multiple": "%1 e %2 outros postaram respostas para: %3", "user_posted_topic": "%1 postou um novo tópico: %2", - "user_edited_post": "%1 has edited a post in %2", + "user_edited_post": "%1 editou um post em %2", "user_started_following_you": "%1 começou a seguir você.", "user_started_following_you_dual": "%1 e %2 começaram a lhe acompanhar.", "user_started_following_you_multiple": "%1 e %2 outros começaram a lhe acompanhar.", @@ -43,12 +43,12 @@ "new_register_multiple": "Há %1 pedidos de registro aguardando revisão.", "flag_assigned_to_you": "A Sinalização %1
foi atribuída a você", "post_awaiting_review": "Post aguardando revisão", - "profile-exported": "%1 profile exported, click to download", - "posts-exported": "%1 posts exported, click to download", - "uploads-exported": "%1 uploads exported, click to download", - "users-csv-exported": "Users csv exported, click to download", - "post-queue-accepted": "Your queued post has been accepted. Click here to see your post.", - "post-queue-rejected": "Your queued post has been rejected.", + "profile-exported": "%1 perfil exportado, clique para fazer download", + "posts-exported": "%1 posts exportados, clique para fazer download", + "uploads-exported": "%1 uploads exportados, clique para fazer download", + "users-csv-exported": "Usuários csv exportados, clique para fazer o download", + "post-queue-accepted": "Sua postagem na fila foi aceita. Clique aqui para ver sua postagem.", + "post-queue-rejected": "Sua postagem na fila foi rejeitada.", "email-confirmed": "Email Confirmado", "email-confirmed-message": "Obrigado por validar o seu email. Agora sua conta está plenamente ativada.", "email-confirm-error-message": "Houve um problema ao validar o seu endereço de email. Talvez o código era invalido ou tenha expirado.", @@ -60,12 +60,12 @@ "notificationType_upvote": "Quando alguém dá um voto positivo em seu post", "notificationType_new-topic": "Quando alguém que você segue posta um tópico", "notificationType_new-reply": "Quando uma nova resposta é postada em um tópico que você está acompanhando", - "notificationType_post-edit": "When a post is edited in a topic you are watching", + "notificationType_post-edit": "Quando uma postagem é editada em um tópico que você está assistindo", "notificationType_follow": "Quando alguém começar a seguir você", "notificationType_new-chat": "Quando você receber uma mensagem de chat", - "notificationType_new-group-chat": "When you receive a group chat message", + "notificationType_new-group-chat": "Quando você recebe uma mensagem de chat em grupo", "notificationType_group-invite": "Quando você receber um convite para um grupo", - "notificationType_group-leave": "When a user leaves your group", + "notificationType_group-leave": "Quando um usuário sai do seu grupo", "notificationType_group-request-membership": "Quando alguém pede para participar de um grupo que você é dono", "notificationType_new-register": "Quando alguém for adicionado à fila de registro", "notificationType_post-queue": "Quando um novo post entrar na fila", diff --git a/public/language/pt-BR/post-queue.json b/public/language/pt-BR/post-queue.json index dd6fd18d3d..f6265a18aa 100644 --- a/public/language/pt-BR/post-queue.json +++ b/public/language/pt-BR/post-queue.json @@ -1,18 +1,18 @@ { "post-queue": "Fila de Posts", - "description": "There are no posts in the post queue.
To enable this feature, go to Settings → Post → Post Queue and enable Post Queue.", + "description": "Não há posts na fila de posts.
Para habilitar essa função, vá até Configurações → Post → Fila de Posts e habilite Fila de Posts.", "user": "Usuário", "category": "Categoria", "title": "Título", "content": "Conteúdo", "posted": "Postado", "reply-to": "Resposta para \"%1\"", - "content-editable": "Click on content to edit", - "category-editable": "Click on category to edit", - "title-editable": "Click on title to edit", - "reply": "Reply", - "topic": "Topic", - "accept": "Accept", - "reject": "Reject" + "content-editable": "Clique no conteúdo para editar", + "category-editable": "Clique na categoria para editar", + "title-editable": "Clique no título para editar", + "reply": "Responder", + "topic": "Tópico", + "accept": "Aceitar", + "reject": "Rejeitar" } \ No newline at end of file diff --git a/public/language/pt-BR/register.json b/public/language/pt-BR/register.json index 28269ae4c1..b798390893 100644 --- a/public/language/pt-BR/register.json +++ b/public/language/pt-BR/register.json @@ -18,14 +18,14 @@ "agree_to_terms_of_use": "Eu concordo com os Termos de Uso", "terms_of_use_error": "Você deve concordar com os Termos de Uso", "registration-added-to-queue": "O seu cadastro foi adicionado à fila de aprovação. Você receberá um email quando ele for aceito por um administrador.", - "registration-queue-average-time": "Our average time for approving memberships is %1 hours %2 minutes.", - "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", + "registration-queue-average-time": "Nosso tempo médio para aprovação de associações é de %1 horas e %2 minutos.", + "registration-queue-auto-approve-time": "Sua associação a este fórum será totalmente ativada em até %1 horas.", "interstitial.intro": "Precisamos de algumas informações adicionais antes de podermos criar sua conta.", "interstitial.errors-found": "Não foi possível concluir o seu cadastro:", "gdpr_agree_data": "Eu concordo com a coleta e o processamento de minhas informações pessoais neste site.", "gdpr_agree_email": "Eu concordo em receber e-mails de resumo e notificação deste site.", "gdpr_consent_denied": "Você deve autorizar não só que este site colete e processe suas informações, como também de permitir que este envie e-mails para você.", - "invite.error-admin-only": "Direct user registration has been disabled. Please contact an administrator for more details.", - "invite.error-invite-only": "Direct user registration has been disabled. You must be invited by an existing user in order to access this forum.", - "invite.error-invalid-data": "The registration data received does not correspond to our records. Please contact an administrator for more details" + "invite.error-admin-only": "O registro direto do usuário foi desativado. Entre em contato com um administrador para obter mais detalhes.", + "invite.error-invite-only": "O registro direto do usuário foi desativado. Você deve ser convidado por um usuário existente para acessar este fórum.", + "invite.error-invalid-data": "Os dados cadastrais recebidos não correspondem aos nossos registros. Entre em contato com um administrador para obter mais detalhes" } \ No newline at end of file diff --git a/public/language/pt-BR/reset_password.json b/public/language/pt-BR/reset_password.json index 759ac33050..a455018695 100644 --- a/public/language/pt-BR/reset_password.json +++ b/public/language/pt-BR/reset_password.json @@ -7,10 +7,10 @@ "wrong_reset_code.message": "O código de reconfiguração recebido estava incorreto. Por favor tente novamente, ou peça um novo código de reconfiguração.", "new_password": "Nova Senha", "repeat_password": "Confirmar Senha", - "changing_password": "Changing Password", + "changing_password": "Mudando Senha", "enter_email": "Por favor digite seu endereço de email e nós iremos lhe enviar em email com instruções de como reconfigurar a sua conta.", "enter_email_address": "Digite seu Email", - "password_reset_sent": "If the specified address corresponds to an existing user account, a password reset email was sent. Please note that only one email will be sent per minute.", + "password_reset_sent": "Se o endereço especificado corresponder a uma conta de usuário existente, um e-mail de redefinição de senha será enviado. Observe que apenas um e-mail será enviado por minuto.", "invalid_email": "Email Inválido / Email não existe!", "password_too_short": "A senha entrada é muito curta, por favor escolha uma senha diferente.", "passwords_do_not_match": "As duas senhas que você digitou não combinam.", diff --git a/public/language/pt-BR/search.json b/public/language/pt-BR/search.json index e77b350df3..7e3682d528 100644 --- a/public/language/pt-BR/search.json +++ b/public/language/pt-BR/search.json @@ -45,5 +45,5 @@ "search-preferences-cleared": "Preferências de pesquisa limpas", "show-results-as": "Mostrar resultados como", "see-more-results": "Veja mais resultados (%1)", - "search-in-category": "Search in \"%1\"" + "search-in-category": "Pesquisar em '%1'" } \ No newline at end of file diff --git a/public/language/pt-BR/success.json b/public/language/pt-BR/success.json index 2eb8d19a85..b9c3e17124 100644 --- a/public/language/pt-BR/success.json +++ b/public/language/pt-BR/success.json @@ -1,7 +1,7 @@ { "success": "Sucesso", "topic-post": "Você postou com sucesso.", - "post-queued": "Your post is queued for approval. You will get a notification when it is accepted or rejected.", + "post-queued": "Sua postagem está na fila para aprovação. Você receberá uma notificação quando for aceito ou rejeitado.", "authentication-successful": "Autenticação Bem-sucedida", "settings-saved": "Configurações salvas!" } \ No newline at end of file diff --git a/public/language/pt-BR/tags.json b/public/language/pt-BR/tags.json index bec0e6d608..36ce0d46df 100644 --- a/public/language/pt-BR/tags.json +++ b/public/language/pt-BR/tags.json @@ -4,5 +4,5 @@ "enter_tags_here": "Digite as tags aqui, entre %1 e %2 caracteres cada.", "enter_tags_here_short": "Digite tags...", "no_tags": "Ainda não há tags.", - "select_tags": "Select Tags" + "select_tags": "Selecionar Tags" } \ No newline at end of file diff --git a/public/language/pt-BR/topic.json b/public/language/pt-BR/topic.json index 8f1b4d6e91..ca15c285a0 100644 --- a/public/language/pt-BR/topic.json +++ b/public/language/pt-BR/topic.json @@ -48,9 +48,9 @@ "flag-post": "Marque este post", "flag-user": "Marque este usuário", "already-flagged": "Já marcado", - "view-flag-report": "View Flag Report", + "view-flag-report": "Ver Relatório da Sinalização", "resolve-flag": "Resolver marcação", - "merged_message": "This topic has been merged into %2", + "merged_message": "Este tópico foi fundido com %2", "deleted_message": "Este tópico foi deletado. Apenas usuários com privilégios de moderação de tópico podem vê-lo.", "following_topic.message": "Agora você receberá notificações quando alguém responder este tópico.", "not_following_topic.message": "Você verá este tópico na lista de tópicos não-lidos, mas você não receberá notificações quando alguém postar no tópico.", @@ -91,17 +91,17 @@ "thread_tools.purge_confirm": "Tem certeza que deseja expurgar este tópico? ", "thread_tools.merge_topics": "Mesclar Tópicos", "thread_tools.merge": "Mesclar", - "topic_move_success": "This topic will be moved to \"%1\" shortly. Click here to undo.", - "topic_move_multiple_success": "These topics will be moved to \"%1\" shortly. Click here to undo.", - "topic_move_all_success": "All topics will be moved to \"%1\" shortly. Click here to undo.", - "topic_move_undone": "Topic move undone", - "topic_move_posts_success": "Posts will be moved shortly. Click here to undo.", - "topic_move_posts_undone": "Post move undone", + "topic_move_success": "Este tópico será movido para '% 1' em breve. Clique aqui para desfazer.", + "topic_move_multiple_success": "Esses tópicos serão movidos para '%1' em breve. Clique aqui para desfazer.", + "topic_move_all_success": "Todos os tópicos serão movidos para '%1' em breve. Clique aqui para desfazer.", + "topic_move_undone": "Movimento de tópico desfeito", + "topic_move_posts_success": "As postagens serão movidas em breve. Clique aqui para desfazer.", + "topic_move_posts_undone": "Movimentação de post desfeita", "post_delete_confirm": "Tem certeza que deseja deletar este post?", "post_restore_confirm": "Tem certeza que deseja restaurar este post?", "post_purge_confirm": "Tem certeza que deseja expurgar este post?", "pin-modal-expiry": "Data de expiração", - "pin-modal-help": "You can optionally set an expiration date for the pinned topic(s) here. Alternatively, you can leave this field blank to have the topic stay pinned until it is manually unpinned.", + "pin-modal-help": "Você pode, opcionalmente, definir uma data de validade para o(s) tópico(s) fixado(s) aqui. Como alternativa, você pode deixar este campo em branco para que o tópico permaneça fixado até que seja liberado manualmente.", "load_categories": "Carregando Categorias", "confirm_move": "Mover", "confirm_fork": "Ramificar", @@ -114,31 +114,31 @@ "move_post": "Mover Post", "post_moved": "Post movido!", "fork_topic": "Ramificar Tópico", - "enter-new-topic-title": "Enter new topic title", + "enter-new-topic-title": "Insira o novo título do tópico", "fork_topic_instruction": "Clique nos posts que você quer ramificar", "fork_no_pids": "Nenhum post selecionado!", "no-posts-selected": "Nenhum post selecionado!", - "x-posts-selected": "%1 post(s) selected", - "x-posts-will-be-moved-to-y": "%1 post(s) will be moved to \"%2\"", + "x-posts-selected": "%1 post(s) selecionados", + "x-posts-will-be-moved-to-y": "%1 post(s) serão movidos para \"%2\"", "fork_pid_count": "%1 post(s) selecionado(s)", "fork_success": "Tópico ramificado com sucesso! Clique aqui para ir ao tópico ramificado.", "delete_posts_instruction": "Clique nos posts que você deseja deletar/limpar", - "merge_topics_instruction": "Click the topics you want to merge or search for them", + "merge_topics_instruction": "Clique nos tópicos que deseja mesclar ou pesquise por eles", "merge-topic-list-title": "Lista de tópicos para mesclar", "merge-options": "Mesclar opções", - "merge-select-main-topic": "Select the main topic", - "merge-new-title-for-topic": "New title for topic", - "topic-id": "Topic ID", - "move_posts_instruction": "Click the posts you want to move then enter a topic ID or go to the target topic", + "merge-select-main-topic": "Escolher o tópico principal", + "merge-new-title-for-topic": "Novo título para o tópico", + "topic-id": "ID do Tópico", + "move_posts_instruction": "Clique nas postagens que deseja mover e insira um ID de tópico ou vá para o tópico de destino", "change_owner_instruction": "Clique na postagem que você quer associar a outro usuário", "composer.title_placeholder": "Digite aqui o título para o seu tópico...", - "composer.handle_placeholder": "Enter your name/handle here", + "composer.handle_placeholder": "Digite seu nome/usuário aqui", "composer.discard": "Descartar", "composer.submit": "Enviar", - "composer.schedule": "Schedule", + "composer.schedule": "Agendar", "composer.replying_to": "Respondendo para %1", "composer.new_topic": "Novo Tópico", - "composer.editing": "Editing", + "composer.editing": "Editando", "composer.uploading": "enviando...", "composer.thumb_url_label": "Cole o endereço de um thumbnail para o tópico", "composer.thumb_title": "Adicionar um thumbnail para este tópico", @@ -165,13 +165,13 @@ "diffs.no-revisions-description": "Este post foi revisado %1 vezes.", "diffs.current-revision": "revisão atual", "diffs.original-revision": "revisão original", - "diffs.restore": "Restore this revision", - "diffs.restore-description": "A new revision will be appended to this post's edit history after restoring.", - "diffs.post-restored": "Post successfully restored to earlier revision", - "diffs.delete": "Delete this revision", - "diffs.deleted": "Revision deleted", + "diffs.restore": "Restaurar esta revisão", + "diffs.restore-description": "Uma nova revisão será anexada ao histórico de edição desta postagem após a restauração.", + "diffs.post-restored": "Postagem restaurada com sucesso para a revisão anterior", + "diffs.delete": "Excluir esta revisão", + "diffs.deleted": "Revisão excluída", "timeago_later": "%1 depois", - "timeago_earlier": "%1 earlier", - "first-post": "First post", - "last-post": "Last post" + "timeago_earlier": "%1 mais cedo", + "first-post": "Primeiro post", + "last-post": "Último post" } \ No newline at end of file diff --git a/public/language/pt-BR/user.json b/public/language/pt-BR/user.json index 4df9b978b0..0120dd2e91 100644 --- a/public/language/pt-BR/user.json +++ b/public/language/pt-BR/user.json @@ -8,20 +8,20 @@ "email": "Email", "confirm_email": "Confirmar Email", "account_info": "Informações da Conta", - "admin_actions_label": "Administrative Actions", + "admin_actions_label": "Ações Administrativas", "ban_account": "Banir Conta", "ban_account_confirm": "Você realmente quer banir esse usuario?", "unban_account": "Desbanir Conta", "delete_account": "Deletar Conta", - "delete_account_as_admin": "Delete Account", - "delete_content": "Delete Account Content", - "delete_all": "Delete Account and Content", - "delete_account_confirm": "Are you sure you want to anonymize your posts and delete your account?
This action is irreversible and you will not be able to recover any of your data

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

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

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

", + "delete_account_as_admin": "Deletar Conta", + "delete_content": "Excluir Conteúdo da Conta", + "delete_all": "Deletar Conta e Conteúdo", + "delete_account_confirm": "Você tem certeza que você quer anonimizar os seus posts e excluir a sua conta?
Esta ação é irreversível e você não poderá recuperar quaisquer dos seus dados

Entre com a sua senha para confirmar que você quer destruir esta conta.", + "delete_this_account_confirm": "Tem certeza de que deseja excluir esta conta, deixando seu conteúdo para trás?
Esta ação é irreversível, as postagens serão feitas anônimas e você não poderá restaurar associações de postagens com a conta excluída

", + "delete_account_content_confirm": "Tem certeza de que deseja excluir o conteúdo desta conta (postagens/tópicos/uploads)?
Esta ação é irreversível e você não poderá recuperar quaisquer dados

", + "delete_all_confirm": "Tem certeza de que deseja excluir esta conta e todo o seu conteúdo (postagens/tópicos/uploads)?
Esta ação é irreversível e você não será capaz de recuperar nenhum dado

", "account-deleted": "Conta excluída", - "account-content-deleted": "Account content deleted", + "account-content-deleted": "Conteúdo da conta excluído", "fullname": "Nome Completo", "website": "Website", "location": "Local", @@ -33,7 +33,7 @@ "reputation": "Reputação", "bookmarks": "Favoritos", "watched_categories": "Categorias acompanhadas", - "change_all": "Change All", + "change_all": "Mudar Tudo", "watched": "Acompanhado", "ignored": "Ignorado", "default-category-watch-state": "Configuração padrão em relação a acompanhar as novidades das categorias", @@ -84,7 +84,7 @@ "remove_cover_picture_confirm": "Tem certeza que deseja remover a imagem de capa?", "crop_picture": "Cortar imagem", "upload_cropped_picture": "Cortar e enviar", - "avatar-background-colour": "Avatar background colour", + "avatar-background-colour": "Cor de fundo do avatar", "settings": "Configurações", "show_email": "Mostrar Meu Email", "show_fullname": "Mostrar Meu Nome Completo", @@ -112,7 +112,7 @@ "posts_per_page": "Posts por Página", "max_items_per_page": "No máximo 1%", "acp_language": "Idioma da Página de Administrador", - "notifications": "Notifications", + "notifications": "Notificações", "upvote-notif-freq": "Frequência de Notificação de Votos Positivos", "upvote-notif-freq.all": "Todos os Votos Positivos", "upvote-notif-freq.first": "Primeiro Por Post", @@ -124,19 +124,19 @@ "open_links_in_new_tab": "Abrir links externos em nova aba", "enable_topic_searching": "Habilitar Pesquisa dentro de Tópico", "topic_search_help": "Se habilitado, a pesquisa dentro do tópico irá substituir a pesquisa padrão do seu navegador. Assim, você poderá pesquisar pelo tópico inteiro, e não apenas pelo o que está sendo exibido na tela.", - "update_url_with_post_index": "Update url with post index while browsing topics", + "update_url_with_post_index": "Atualizar url com índice de postagem enquanto navega pelos tópicos", "scroll_to_my_post": "Ao responder um tópico, role a página até a minha postagem", "follow_topics_you_reply_to": "Acompanhar os tópicos que você responde", "follow_topics_you_create": "Acompanhar os tópicos que você cria", "grouptitle": "Título do Grupo", - "group-order-help": "Select a group and use the arrows to order titles", + "group-order-help": "Selecione um grupo e use as setas para ordenar os títulos", "no-group-title": "Sem título de grupo", "select-skin": "Escolha uma Skin", "select-homepage": "Selecione uma página inicial", "homepage": "Página inicial", "homepage_description": "Selecione uma página para usar como página inicial do fórum ou 'Nenhum' para usar a página inicial padrão.", "custom_route": "Rota da página inicial personalizada", - "custom_route_help": "Enter a route name here, without any preceding slash (e.g. \"recent\" or \"category/2/general-discussion\")", + "custom_route_help": "Insira um nome de rota aqui, sem nenhuma barra no final (por exemplo, 'recente' ou 'categoria/2/discussao-geral')", "sso.title": "Logar por outros Serviços", "sso.associated": "Associado com", "sso.not-associated": "Clique aqui para associar com", @@ -148,7 +148,7 @@ "info.ban-history": "Histórico de Banimentos Recentes", "info.no-ban-history": "Este usuário nunca foi banido", "info.banned-until": "Banido até %1", - "info.banned-expiry": "Expiry", + "info.banned-expiry": "Validade", "info.banned-permanently": "Banido permanentemente", "info.banned-reason-label": "Motivo", "info.banned-no-reason": "Sem motivo escolhido.", @@ -175,10 +175,10 @@ "consent.right_to_erasure_description": "A qualquer momento, você pode revogar o consentimento à coleta e/ou ao processamento de dados excluindo sua conta. Seu perfil individual pode ser excluído, no entanto, as suas postagens serão mantidas. Se você desejar deletar tanto a sua conta e as suas postagens, por favor, entre em contato com a equipe administrativa deste site.", "consent.right_to_data_portability": "Você tem o Direito de Portabilidade de Dados", "consent.right_to_data_portability_description": "Você pode solicitar de nós uma exportação legível por máquina de quaisquer dados coletados sobre você e sua conta. Você pode fazer isso clicando no botão apropriado abaixo.", - "consent.export_profile": "Export Profile (.json)", + "consent.export_profile": "Exportar Perfil (.json)", "consent.export-profile-success": "Exporting profile, you will get a notification when it is complete.", "consent.export_uploads": "Exportar Arquivos Enviados (.zip)", - "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", + "consent.export-uploads-success": "Exportando uploads, você receberá uma notificação quando estiver concluído.", "consent.export_posts": "Exportar Posts (.csv)", - "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete." + "consent.export-posts-success": "Exportando postagens, você receberá uma notificação quando estiver concluído." } \ No newline at end of file diff --git a/public/language/pt-BR/users.json b/public/language/pt-BR/users.json index ceef5faffa..b16313c1d5 100644 --- a/public/language/pt-BR/users.json +++ b/public/language/pt-BR/users.json @@ -11,7 +11,7 @@ "online-only": "Apenas Online", "invite": "Convidar", "prompt-email": "E-mails:", - "groups-to-join": "Groups to be joined when invite is accepted:", + "groups-to-join": "Grupos a serem inscritos quando o convite é aceito:", "invitation-email-sent": "Um email de convite foi enviado para %1", "user_list": "Lista de Usuários", "recent_topics": "Tópicos Recentes", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 096ff61330..391eecb2f5 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -33,7 +33,7 @@ "analytics": "Phân tích", "view-category": "Xem chuyên mục", "set-order": "Đặt thứ tự", - "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", + "set-order-help": "Đặt thứ tự của danh mục sẽ chuyển danh mục này sang thứ tự đó và cập nhật thứ tự của các danh mục khác khi cần thiết. Thứ tự tối thiểu là 1 đặt danh mục ở trên cùng.", "select-category": "Chọn Chuyên Mục", "set-parent-category": "Đặt Chuyên Mục Chính", From 3d6bdeb3dfc0c0ef36bdfe502373695c2e6dc7cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 19 May 2021 10:01:33 -0400 Subject: [PATCH 096/116] feat: add req.query to flags.list/getCount --- src/controllers/mods.js | 1 + src/flags.js | 8 +++++--- src/middleware/header.js | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/controllers/mods.js b/src/controllers/mods.js index 936fd70107..7bbe91cdff 100644 --- a/src/controllers/mods.js +++ b/src/controllers/mods.js @@ -83,6 +83,7 @@ modsController.flags.list = async function (req, res, next) { filters: filters, sort: sort, uid: req.uid, + query: req.query, }), analytics.getDailyStatsForSet('analytics:flags', Date.now(), 30), helpers.getSelectedCategory(filters.cid), diff --git a/src/flags.js b/src/flags.js index a25f3e1c7b..e119a00e97 100644 --- a/src/flags.js +++ b/src/flags.js @@ -121,13 +121,13 @@ Flags.get = async function (flagId) { return data.flag; }; -Flags.getCount = async function ({ uid, filters }) { +Flags.getCount = async function ({ uid, filters, query }) { filters = filters || {}; - const flagIds = await Flags.getFlagIdsWithFilters({ filters, uid }); + const flagIds = await Flags.getFlagIdsWithFilters({ filters, uid, query }); return flagIds.length; }; -Flags.getFlagIdsWithFilters = async function ({ filters, uid }) { +Flags.getFlagIdsWithFilters = async function ({ filters, uid, query }) { let sets = []; const orSets = []; @@ -170,6 +170,7 @@ Flags.getFlagIdsWithFilters = async function ({ filters, uid }) { const result = await plugins.hooks.fire('filter:flags.getFlagIdsWithFilters', { filters, uid, + query, flagIds, }); return result.flagIds; @@ -180,6 +181,7 @@ Flags.list = async function (data) { let flagIds = await Flags.getFlagIdsWithFilters({ filters, uid: data.uid, + query: data.query, }); flagIds = await Flags.sort(flagIds, data.sort); diff --git a/src/middleware/header.js b/src/middleware/header.js index 9bd0acaed7..4f5aaad734 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -109,6 +109,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) { unreadCount: templateValues.unreadCount, } = await appendUnreadCounts({ uid: req.uid, + query: req.query, navigation: results.navigation, unreadData, })); @@ -152,7 +153,7 @@ middleware.renderHeader = async function renderHeader(req, res, data) { return await req.app.renderAsync('header', hookReturn.templateValues); }; -async function appendUnreadCounts({ uid, navigation, unreadData }) { +async function appendUnreadCounts({ uid, navigation, unreadData, query }) { const originalRoutes = navigation.map(nav => nav.originalRoute); const calls = { unreadData: topics.getUnreadData({ uid: uid }), @@ -162,6 +163,7 @@ async function appendUnreadCounts({ uid, navigation, unreadData }) { if (originalRoutes.includes('/flags') && await user.isPrivileged(uid)) { return flags.getCount({ uid, + query, filters: { quick: 'unresolved', cid: (await user.isAdminOrGlobalMod(uid)) ? [] : (await user.getModeratedCids(uid)), From 0a5f1653710f318934f63d5da31f72e87d6d08a3 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 20 May 2021 09:12:29 +0000 Subject: [PATCH 097/116] Latest translations and fallbacks --- public/language/it/admin/manage/categories.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index 894330f2eb..5166ed1b90 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -33,7 +33,7 @@ "analytics": "Analitica", "view-category": "Visualizza categoria", "set-order": "Imposta ordine", - "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", + "set-order-help": "L'impostazione dell'ordine della categoria sposterà questa categoria in quell'ordine e aggiornerà l'ordine delle altre categorie, se necessario. L'ordine minimo è 1 che mette la categoria in cima.", "select-category": "Seleziona Categoria", "set-parent-category": "Imposta la Categoria Padre", From e6ef0940793a941f8a142851a44e0c264de0d70e Mon Sep 17 00:00:00 2001 From: Mats Date: Thu, 20 May 2021 16:24:16 +0200 Subject: [PATCH 098/116] Re-enable "change username" button after failed attempt (#9568) * Re-enable "change username" button after failed attempt * chore: proper indentation --- public/src/client/account/edit/username.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/public/src/client/account/edit/username.js b/public/src/client/account/edit/username.js index 350ce38bd3..076da3e452 100644 --- a/public/src/client/account/edit/username.js +++ b/public/src/client/account/edit/username.js @@ -27,7 +27,6 @@ define('forum/account/edit/username', [ btn.addClass('disabled').find('i').removeClass('hide'); api.put('/users/' + userData.uid, userData).then((response) => { - btn.removeClass('disabled').find('i').addClass('hide'); var userslug = slugify(userData.username); if (userData.username && userslug && parseInt(userData.uid, 10) === parseInt(app.user.uid, 10)) { $('[component="header/profilelink"]').attr('href', config.relative_path + '/user/' + userslug); @@ -38,7 +37,10 @@ define('forum/account/edit/username', [ } ajaxify.go('user/' + userslug + '/edit'); - }).catch(app.alertError); + }).catch(app.alertError) + .finally(() => { + btn.removeClass('disabled').find('i').addClass('hide'); + }); return false; }); From 5215c30aded231ef6089c7dc404f9709d32f6068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 20 May 2021 10:41:47 -0400 Subject: [PATCH 099/116] fix: #9567, use regular 404 --- src/routes/feeds.js | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index ff2e508ce7..445b966e96 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -13,7 +13,6 @@ const helpers = require('../controllers/helpers'); const privileges = require('../privileges'); const db = require('../database'); const utils = require('../utils'); -const controllers404 = require('../controllers/404.js'); const terms = { daily: 'day', @@ -60,9 +59,9 @@ async function validateTokenIfRequiresLogin(requiresLogin, cid, req, res) { return true; } -async function generateForTopic(req, res) { +async function generateForTopic(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const tid = req.params.topic_id; @@ -73,7 +72,7 @@ async function generateForTopic(req, res) { ]); if (!privileges.topics.canViewDeletedScheduled(topic, userPrivileges)) { - return controllers404.send404(req, res); + return next(); } if (await validateTokenIfRequiresLogin(!userPrivileges['topics:read'], topic.cid, req, res)) { @@ -116,11 +115,8 @@ async function generateForTopic(req, res) { } async function generateForCategory(req, res, next) { - if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); - } const cid = req.params.category_id; - if (!parseInt(cid, 10)) { + if (meta.config['feeds:disableRSS'] || !parseInt(cid, 10)) { return next(); } @@ -153,9 +149,9 @@ async function generateForCategory(req, res, next) { } } -async function generateForTopics(req, res) { +async function generateForTopics(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } let token = null; if (req.query.token && req.query.uid) { @@ -171,9 +167,9 @@ async function generateForTopics(req, res) { }, 'topics:tid', res); } -async function generateForRecent(req, res) { +async function generateForRecent(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } let token = null; if (req.query.token && req.query.uid) { @@ -189,9 +185,9 @@ async function generateForRecent(req, res) { }, 'topics:recent', res); } -async function generateForTop(req, res) { +async function generateForTop(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const term = terms[req.params.term] || 'day'; @@ -221,9 +217,9 @@ async function generateForTop(req, res) { sendFeed(feed, res); } -async function generateForPopular(req, res) { +async function generateForPopular(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const term = terms[req.params.term] || 'day'; @@ -309,9 +305,9 @@ async function generateTopicsFeed(feedOptions, feedTopics) { return feed; } -async function generateForRecentPosts(req, res) { +async function generateForRecentPosts(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const postData = await posts.getRecentPosts(req.uid, 0, 19, 'month'); const feed = generateForPostsFeed({ @@ -324,9 +320,9 @@ async function generateForRecentPosts(req, res) { sendFeed(feed, res); } -async function generateForCategoryRecentPosts(req, res) { +async function generateForCategoryRecentPosts(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const cid = req.params.category_id; @@ -337,7 +333,7 @@ async function generateForCategoryRecentPosts(req, res) { ]); if (!category) { - return controllers404.send404(req, res); + return next(); } if (await validateTokenIfRequiresLogin(!userPrivileges.read, cid, req, res)) { @@ -378,7 +374,7 @@ function generateForPostsFeed(feedOptions, posts) { async function generateForUserTopics(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const { userslug } = req.params; @@ -396,9 +392,9 @@ async function generateForUserTopics(req, res, next) { }, `uid:${userData.uid}:topics`, res); } -async function generateForTag(req, res) { +async function generateForTag(req, res, next) { if (meta.config['feeds:disableRSS']) { - return controllers404.send404(req, res); + return next(); } const tag = validator.escape(String(req.params.tag)); const page = parseInt(req.query.page, 10) || 1; From 951e71a0e54b896df700aa003204dae11194d467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 20 May 2021 11:20:19 -0400 Subject: [PATCH 100/116] fix: #9567 fix tests --- src/routes/feeds.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/routes/feeds.js b/src/routes/feeds.js index 445b966e96..7ace7cf216 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -13,6 +13,7 @@ const helpers = require('../controllers/helpers'); const privileges = require('../privileges'); const db = require('../database'); const utils = require('../utils'); +const controllers404 = require('../controllers/404'); const terms = { daily: 'day', @@ -320,9 +321,9 @@ async function generateForRecentPosts(req, res, next) { sendFeed(feed, res); } -async function generateForCategoryRecentPosts(req, res, next) { +async function generateForCategoryRecentPosts(req, res) { if (meta.config['feeds:disableRSS']) { - return next(); + return controllers404.handle404(req, res); } const cid = req.params.category_id; @@ -333,7 +334,7 @@ async function generateForCategoryRecentPosts(req, res, next) { ]); if (!category) { - return next(); + return controllers404.handle404(req, res); } if (await validateTokenIfRequiresLogin(!userPrivileges.read, cid, req, res)) { @@ -392,9 +393,9 @@ async function generateForUserTopics(req, res, next) { }, `uid:${userData.uid}:topics`, res); } -async function generateForTag(req, res, next) { +async function generateForTag(req, res) { if (meta.config['feeds:disableRSS']) { - return next(); + return controllers404.handle404(req, res); } const tag = validator.escape(String(req.params.tag)); const page = parseInt(req.query.page, 10) || 1; From 8d7e442065b953566f95af56e09ae9ff06e6eb9d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 20 May 2021 18:32:37 +0000 Subject: [PATCH 101/116] fix(deps): update dependency nodebb-plugin-composer-default to v6.5.29 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 86aaf8eae7..753ec59cf0 100644 --- a/install/package.json +++ b/install/package.json @@ -84,7 +84,7 @@ "multiparty": "4.2.2", "@nodebb/bootswatch": "3.4.2", "nconf": "^0.11.2", - "nodebb-plugin-composer-default": "6.5.28", + "nodebb-plugin-composer-default": "6.5.29", "nodebb-plugin-dbsearch": "5.0.2", "nodebb-plugin-emoji": "^3.5.0", "nodebb-plugin-emoji-android": "2.0.5", From 403bcfac10f37cdccb8a281ae8fa34c5df7449ef Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 20 May 2021 19:47:35 +0000 Subject: [PATCH 102/116] fix(deps): update dependency nodebb-theme-persona to v11.0.20 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 753ec59cf0..899be4c1ec 100644 --- a/install/package.json +++ b/install/package.json @@ -93,7 +93,7 @@ "nodebb-plugin-spam-be-gone": "0.7.9", "nodebb-rewards-essentials": "0.1.4", "nodebb-theme-lavender": "5.2.1", - "nodebb-theme-persona": "11.0.19", + "nodebb-theme-persona": "11.0.20", "nodebb-theme-slick": "1.4.7", "nodebb-theme-vanilla": "12.0.7", "nodebb-widget-essentials": "5.0.4", From ad4afd599c63ef78b1d7a2b5980cd1bc6687c888 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 21 May 2021 05:21:45 +0000 Subject: [PATCH 103/116] fix(deps): update dependency postcss to v8.3.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 899be4c1ec..70f6cf804d 100644 --- a/install/package.json +++ b/install/package.json @@ -104,7 +104,7 @@ "passport-local": "1.0.0", "pg": "^8.5.1", "pg-cursor": "^2.5.2", - "postcss": "8.2.15", + "postcss": "8.3.0", "postcss-clean": "1.2.0", "prompt": "^1.1.0", "ioredis": "4.27.2", From 99472e76526e9ef21682ee298457f58c38076c11 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 21 May 2021 09:08:15 +0000 Subject: [PATCH 104/116] Latest translations and fallbacks --- public/language/he/admin/advanced/database.json | 8 ++++---- public/language/he/admin/menu.json | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/language/he/admin/advanced/database.json b/public/language/he/admin/advanced/database.json index a17b7832d1..b18bbe3f6a 100644 --- a/public/language/he/admin/advanced/database.json +++ b/public/language/he/admin/advanced/database.json @@ -21,8 +21,8 @@ "mongo.bytes-in": "ביטים נכנסים", "mongo.bytes-out": "ביטים יוצאים", "mongo.num-requests": "מספר בקשות", - "mongo.raw-info": "מידע לא מעובד מMongoDB", - "mongo.unauthorized": "NodeBB לא הצליחה לקבל את המידע הדרוש מMongoDB. אנא בדוק שלמשתמש יש הרשאת clusterMonitor לadmin database.", + "mongo.raw-info": "מידע לא מעובד מ-MongoDB", + "mongo.unauthorized": "NodeBB לא הצליחה לקבל את המידע הדרוש מ-MongoDB. אנא בדוק שלמשתמש יש הרשאת clusterMonitor ל-admin database.", "redis": "Redis", "redis.version": "גרסת Redis", @@ -37,8 +37,8 @@ "redis.total-connections-recieved": "סך כל החיבורים שהתקבלו", "redis.total-commands-processed": "סך כל הפקודות שעובדו", "redis.iops": "אפשרויות מידיות לשניה", - "redis.iinput": "Instantaneous Input Per Second", - "redis.ioutput": "Instantaneous Output Per Second", + "redis.iinput": "קלט מיידי לשנייה", + "redis.ioutput": "פלט מיידי לשנייה", "redis.total-input": "סך הכל מידע נכנס", "redis.total-output": "סך הכל מידע יוצא", diff --git a/public/language/he/admin/menu.json b/public/language/he/admin/menu.json index 60af5a6eb1..c4d31c775d 100644 --- a/public/language/he/admin/menu.json +++ b/public/language/he/admin/menu.json @@ -1,9 +1,9 @@ { - "section-dashboard": "Dashboards", - "dashboard/overview": "Overview", - "dashboard/logins": "Logins", - "dashboard/users": "Users", - "dashboard/topics": "Topics", + "section-dashboard": "לוח מחוונים", + "dashboard/overview": "סקירה כללית", + "dashboard/logins": "כניסות", + "dashboard/users": "משתמשים", + "dashboard/topics": "נושאים", "section-general": "כללי", "section-manage": "ניהול", From 64935787494834e6c4b99dfd06d8360c88bc6f83 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 14:39:41 -0400 Subject: [PATCH 105/116] fix(deps): update dependency mongodb to v3.6.8 (#9573) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 70f6cf804d..4e1c3060ea 100644 --- a/install/package.json +++ b/install/package.json @@ -78,7 +78,7 @@ "material-design-lite": "^1.3.0", "mime": "^2.5.2", "mkdirp": "^1.0.4", - "mongodb": "3.6.7", + "mongodb": "3.6.8", "morgan": "^1.10.0", "mousetrap": "^1.6.5", "multiparty": "4.2.2", From 10290f54ae591a7b42ba3b3713250489d47046e1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 14:39:50 -0400 Subject: [PATCH 106/116] fix(deps): update dependency nodebb-theme-vanilla to v12.0.8 (#9574) Co-authored-by: Renovate Bot --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 4e1c3060ea..c7d1f3a7b8 100644 --- a/install/package.json +++ b/install/package.json @@ -95,7 +95,7 @@ "nodebb-theme-lavender": "5.2.1", "nodebb-theme-persona": "11.0.20", "nodebb-theme-slick": "1.4.7", - "nodebb-theme-vanilla": "12.0.7", + "nodebb-theme-vanilla": "12.0.8", "nodebb-widget-essentials": "5.0.4", "nodemailer": "^6.5.0", "nprogress": "0.2.0", From 075dab27fa38e5672366e13985156b4abb304075 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 22 May 2021 03:17:48 +0000 Subject: [PATCH 107/116] fix(deps): update dependency ioredis to v4.27.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c7d1f3a7b8..06d4d89910 100644 --- a/install/package.json +++ b/install/package.json @@ -107,7 +107,7 @@ "postcss": "8.3.0", "postcss-clean": "1.2.0", "prompt": "^1.1.0", - "ioredis": "4.27.2", + "ioredis": "4.27.3", "request": "2.88.2", "request-promise-native": "^1.0.9", "requirejs": "2.3.6", From 298af98d529d27750843e103f99da16883084ac0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 22 May 2021 05:21:21 +0000 Subject: [PATCH 108/116] chore(deps): update dependency eslint to v7.27.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 06d4d89910..a96e643a48 100644 --- a/install/package.json +++ b/install/package.json @@ -145,7 +145,7 @@ "@commitlint/cli": "12.1.4", "@commitlint/config-angular": "12.1.4", "coveralls": "3.1.0", - "eslint": "7.26.0", + "eslint": "7.27.0", "eslint-config-airbnb-base": "14.2.1", "eslint-plugin-import": "2.22.1", "grunt": "1.4.0", From 609e57944218d70bcb4aedccbfd2826e5d92d13d Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Sat, 22 May 2021 09:09:27 +0000 Subject: [PATCH 109/116] Latest translations and fallbacks --- public/language/fr/admin/manage/categories.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index c3ddb80aab..39f68b7f6d 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -33,7 +33,7 @@ "analytics": "Statistiques", "view-category": "Voir la catégorie", "set-order": "Définir l'ordre", - "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", + "set-order-help": "Configuration des catégories. Vous pouvez déplacer vos catégories dans l'ordre que vous le souhaitez. La commande minimum est de 1, ce qui place la catégorie au sommet.", "select-category": "Sélectionner une catégorie", "set-parent-category": "Définissez une catégorie parente", From 60170ad68c4fa5a8c8b50f2f376a445498e09301 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 23 May 2021 21:39:48 +0000 Subject: [PATCH 110/116] chore(deps): update dependency jsdom to v16.6.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index a96e643a48..c95e7165ed 100644 --- a/install/package.json +++ b/install/package.json @@ -151,7 +151,7 @@ "grunt": "1.4.0", "grunt-contrib-watch": "1.1.0", "husky": "6.0.0", - "jsdom": "16.5.3", + "jsdom": "16.6.0", "lint-staged": "11.0.0", "mocha": "8.4.0", "mocha-lcov-reporter": "1.3.0", From 0e37bbfd2cf1242b6f98f82a46d03edaea182511 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 May 2021 16:07:15 +0000 Subject: [PATCH 111/116] chore(deps): update dependency grunt to v1.4.1 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index c95e7165ed..f66ce5686f 100644 --- a/install/package.json +++ b/install/package.json @@ -148,7 +148,7 @@ "eslint": "7.27.0", "eslint-config-airbnb-base": "14.2.1", "eslint-plugin-import": "2.22.1", - "grunt": "1.4.0", + "grunt": "1.4.1", "grunt-contrib-watch": "1.1.0", "husky": "6.0.0", "jsdom": "16.6.0", From 963a9fe60019427ba23e75d351996f7277bcb5f8 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 24 May 2021 16:56:54 +0000 Subject: [PATCH 112/116] fix(deps): update dependency sharp to v0.28.3 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index f66ce5686f..3cb383970c 100644 --- a/install/package.json +++ b/install/package.json @@ -116,7 +116,7 @@ "sanitize-html": "^2.3.2", "semver": "^7.3.4", "serve-favicon": "^2.5.0", - "sharp": "0.28.2", + "sharp": "0.28.3", "sitemap": "^7.0.0", "slideout": "1.0.1", "socket.io": "4.1.2", From 77dde41f7b5a9da53a2f7368e1a420a1611cdf34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 25 May 2021 11:57:10 -0400 Subject: [PATCH 113/116] feat: keep query string when redirecting category --- src/controllers/category.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/controllers/category.js b/src/controllers/category.js index b8c7c56323..04bd22d213 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -14,6 +14,7 @@ const helpers = require('./helpers'); const utils = require('../utils'); const translator = require('../translator'); const analytics = require('../analytics'); +const qs = require('querystring'); const categoryController = module.exports; @@ -42,7 +43,7 @@ categoryController.get = async function (req, res, next) { return next(); } if (topicIndex < 0) { - return helpers.redirect(res, `/category/${categoryFields.slug}`); + return helpers.redirect(res, `/category/${categoryFields.slug}?${qs.stringify(req.query)}`); } if (!userPrivileges.read) { @@ -50,7 +51,7 @@ categoryController.get = async function (req, res, next) { } if (!res.locals.isAPI && !req.params.slug && (categoryFields.slug && categoryFields.slug !== `${cid}/`)) { - return helpers.redirect(res, `/category/${categoryFields.slug}`, true); + return helpers.redirect(res, `/category/${categoryFields.slug}?${qs.stringify(req.query)}`, true); } if (categoryFields.link) { @@ -86,7 +87,7 @@ categoryController.get = async function (req, res, next) { } if (topicIndex > Math.max(categoryData.topic_count - 1, 0)) { - return helpers.redirect(res, `/category/${categoryData.slug}/${categoryData.topic_count}`); + return helpers.redirect(res, `/category/${categoryData.slug}/${categoryData.topic_count}?${qs.stringify(req.query)}`); } const pageCount = Math.max(1, Math.ceil(categoryData.topic_count / userSettings.topicsPerPage)); if (userSettings.usePagination && currentPage > pageCount) { From 09f51792160052f87a96c9f51354723d6c94b20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 25 May 2021 12:04:34 -0400 Subject: [PATCH 114/116] fix: lint --- src/controllers/category.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/category.js b/src/controllers/category.js index 04bd22d213..a2449957b1 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -3,6 +3,7 @@ const nconf = require('nconf'); const validator = require('validator'); +const qs = require('querystring'); const db = require('../database'); const privileges = require('../privileges'); @@ -14,7 +15,6 @@ const helpers = require('./helpers'); const utils = require('../utils'); const translator = require('../translator'); const analytics = require('../analytics'); -const qs = require('querystring'); const categoryController = module.exports; From 9ebfdeb7ee860a3fd9da599b30bd66eafe7738f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 25 May 2021 12:44:17 -0400 Subject: [PATCH 115/116] fix: #9580, proper 404 when ajaxifying --- src/controllers/404.js | 21 ++++++++++++++++++--- src/middleware/helpers.js | 35 +++++++++++++++++++++++++++++++++++ src/middleware/render.js | 36 +++--------------------------------- 3 files changed, 56 insertions(+), 36 deletions(-) diff --git a/src/controllers/404.js b/src/controllers/404.js index da7a8141cd..c364ccd3fc 100644 --- a/src/controllers/404.js +++ b/src/controllers/404.js @@ -7,6 +7,7 @@ const validator = require('validator'); const meta = require('../meta'); const plugins = require('../plugins'); const middleware = require('../middleware'); +const helpers = require('../middleware/helpers'); exports.handle404 = function handle404(req, res) { const relativePath = nconf.get('relative_path'); @@ -22,7 +23,13 @@ exports.handle404 = function handle404(req, res) { if (isClientScript.test(req.url)) { res.type('text/javascript').status(404).send('Not Found'); - } else if (req.path.startsWith(`${relativePath}/assets/uploads`) || (req.get('accept') && !req.get('accept').includes('text/html')) || req.path === '/favicon.ico') { + } else if ( + !res.locals.isAPI && ( + req.path.startsWith(`${relativePath}/assets/uploads`) || + (req.get('accept') && !req.get('accept').includes('text/html')) || + req.path === '/favicon.ico' + ) + ) { meta.errors.log404(req.path || ''); res.sendStatus(404); } else if (req.accepts('html')) { @@ -41,7 +48,11 @@ exports.send404 = async function (req, res) { res.status(404); const path = String(req.path || ''); if (res.locals.isAPI) { - return res.json({ path: validator.escape(path.replace(/^\/api/, '')), title: '[[global:404.title]]' }); + return res.json({ + path: validator.escape(path.replace(/^\/api/, '')), + title: '[[global:404.title]]', + bodyClass: helpers.buildBodyClass(req, res), + }); } if (req.method === 'GET') { @@ -49,5 +60,9 @@ exports.send404 = async function (req, res) { } await middleware.buildHeaderAsync(req, res); - await res.render('404', { path: validator.escape(path), title: '[[global:404.title]]' }); + await res.render('404', { + path: validator.escape(path), + title: '[[global:404.title]]', + bodyClass: helpers.buildBodyClass(req, res), + }); }; diff --git a/src/middleware/helpers.js b/src/middleware/helpers.js index cb67b454c5..b0bb86cefe 100644 --- a/src/middleware/helpers.js +++ b/src/middleware/helpers.js @@ -1,5 +1,9 @@ 'use strict'; +const winston = require('winston'); +const validator = require('validator'); +const slugify = require('../slugify'); + const helpers = module.exports; helpers.try = function (middleware) { @@ -20,3 +24,34 @@ helpers.try = function (middleware) { } }; }; + +helpers.buildBodyClass = function (req, res, templateData = {}) { + const clean = req.path.replace(/^\/api/, '').replace(/^\/|\/$/g, ''); + const parts = clean.split('/').slice(0, 3); + parts.forEach((p, index) => { + try { + p = slugify(decodeURIComponent(p)); + } catch (err) { + winston.error(err.stack); + p = ''; + } + p = validator.escape(String(p)); + parts[index] = index ? `${parts[0]}-${p}` : `page-${p || 'home'}`; + }); + + if (templateData.template && templateData.template.topic) { + parts.push(`page-topic-category-${templateData.category.cid}`); + parts.push(`page-topic-category-${slugify(templateData.category.name)}`); + } + + if (Array.isArray(templateData.breadcrumbs)) { + templateData.breadcrumbs.forEach((crumb) => { + if (crumb && crumb.hasOwnProperty('cid')) { + parts.push(`parent-category-${crumb.cid}`); + } + }); + } + + parts.push(`page-status-${res.statusCode}`); + return parts.join(' '); +}; diff --git a/src/middleware/render.js b/src/middleware/render.js index 6e5ddb6074..9132b18f93 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -2,14 +2,14 @@ const nconf = require('nconf'); const validator = require('validator'); -const winston = require('winston'); + const plugins = require('../plugins'); const meta = require('../meta'); const translator = require('../translator'); const widgets = require('../widgets'); const utils = require('../utils'); -const slugify = require('../slugify'); +const helpers = require('./helpers'); const relative_path = nconf.get('relative_path'); @@ -31,7 +31,7 @@ module.exports = function (middleware) { options.relative_path = relative_path; options.template = { name: template, [template]: true }; options.url = (req.baseUrl + req.path.replace(/^\/api/, '')); - options.bodyClass = buildBodyClass(req, res, options); + options.bodyClass = helpers.buildBodyClass(req, res, options); const buildResult = await plugins.hooks.fire(`filter:${template}.build`, { req: req, res: res, templateData: options }); if (res.headersSent) { @@ -123,34 +123,4 @@ module.exports = function (middleware) { const translated = await translator.translate(str, language); return translator.unescape(translated); } - - function buildBodyClass(req, res, templateData) { - const clean = req.path.replace(/^\/api/, '').replace(/^\/|\/$/g, ''); - const parts = clean.split('/').slice(0, 3); - parts.forEach((p, index) => { - try { - p = slugify(decodeURIComponent(p)); - } catch (err) { - winston.error(err.stack); - p = ''; - } - p = validator.escape(String(p)); - parts[index] = index ? `${parts[0]}-${p}` : `page-${p || 'home'}`; - }); - - if (templateData.template.topic) { - parts.push(`page-topic-category-${templateData.category.cid}`); - parts.push(`page-topic-category-${slugify(templateData.category.name)}`); - } - if (templateData.breadcrumbs) { - templateData.breadcrumbs.forEach((crumb) => { - if (crumb.hasOwnProperty('cid')) { - parts.push(`parent-category-${crumb.cid}`); - } - }); - } - - parts.push(`page-status-${res.statusCode}`); - return parts.join(' '); - } }; From 925883bf4c586dfce1ddf7948158be714acda1ed Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Wed, 26 May 2021 09:08:53 +0000 Subject: [PATCH 116/116] Latest translations and fallbacks --- public/language/bn/uploads.json | 4 +- .../language/ko/admin/manage/categories.json | 2 +- public/language/ko/error.json | 8 +-- public/language/nb/category.json | 10 ++-- public/language/nb/email.json | 54 +++++++++---------- public/language/nb/groups.json | 24 ++++----- public/language/nb/ip-blacklist.json | 10 ++-- public/language/nb/register.json | 20 +++---- public/language/ru/error.json | 14 ++--- public/language/ru/modules.json | 10 ++-- public/language/ru/topic.json | 4 +- 11 files changed, 80 insertions(+), 80 deletions(-) diff --git a/public/language/bn/uploads.json b/public/language/bn/uploads.json index 651a839876..fa1a858dcb 100644 --- a/public/language/bn/uploads.json +++ b/public/language/bn/uploads.json @@ -1,6 +1,6 @@ { - "uploading-file": "Uploading the file...", - "select-file-to-upload": "Select a file to upload!", + "uploading-file": "ফাইল পাঠানো হচ্ছে...", + "select-file-to-upload": "পাঠানোর জন্য নথি নির্বাচন", "upload-success": "File uploaded successfully!", "maximum-file-size": "Maximum %1 kb", "no-uploads-found": "No uploads found", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 0898a79f6d..692d1ee508 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -33,7 +33,7 @@ "analytics": "애널리틱스", "view-category": "카테고리 보기", "set-order": "순서 설정", - "set-order-help": "Setting the order of the category will move this category to that order and update the order of other categories as necessary. Minimum order is 1 which puts the category at the top.", + "set-order-help": "카테고리의 순서를 설정하면 해당 위치로 순서가 변경되며 다른 카테고리의 순서도 함께 변경됩니다. 최소 설정값은 1이며 최상단에 위치됩니다.", "select-category": "카테고리 선택", "set-parent-category": "상위 카테고리 설정", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index 25588a9a31..cc71f95327 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -174,10 +174,10 @@ "cant-kick-self": "스스로 이 그룹을 탈퇴할 수 없습니다.", "no-users-selected": "선택된 사용자가 없습니다.", "invalid-home-page-route": "올바르지 않은 홈페이지 경로입니다. ", - "invalid-session": "Invalid Session", - "invalid-session-text": "It looks like your login session is no longer active. Please refresh this page.", - "session-mismatch": "Session Mismatch", - "session-mismatch-text": "It looks like your login session no longer matches with the server. Please refresh this page.", + "invalid-session": "세션 오류", + "invalid-session-text": "로그인 세션이 종료됐습니다. 페이지를 새로고침 해주세요.", + "session-mismatch": "세션 불일치", + "session-mismatch-text": "로그인 세션이 서버와 일치하지 않습니다. 페이지를 새로고침 해주세요.", "no-topics-selected": "선택된 화제가 없습니다!", "cant-move-to-same-topic": "동일한 화제로 포스트를 이동할 수 없습니다!", "cant-move-topic-to-same-category": "동일한 카테고리로 화제를 이동할 수 없습니다!", diff --git a/public/language/nb/category.json b/public/language/nb/category.json index 19fc5f8881..d441bfd637 100644 --- a/public/language/nb/category.json +++ b/public/language/nb/category.json @@ -13,11 +13,11 @@ "not-watching": "Følger ikke", "ignoring": "Ignorerer", "watching.description": "Vis tråder blandt uleste og nylige", - "not-watching.description": "Do not show topics in unread, show in recent", + "not-watching.description": "Ikke vis emner i ulest, vis nylig ", "ignoring.description": "Ikke vis tråder blandt uleste og nylige", - "watching.message": "You are now watching updates from this category and all subcategories", - "notwatching.message": "You are not watching updates from this category and all subcategories", - "ignoring.message": "You are now ignoring updates from this category and all subcategories", + "watching.message": "Du ser nå på oppdateringer fra denne kategorien og alle underkategorier", + "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 more categories" + "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 e9894775f4..8d1feefa57 100644 --- a/public/language/nb/email.json +++ b/public/language/nb/email.json @@ -1,19 +1,19 @@ { - "test-email.subject": "Test Email", - "password-reset-requested": "Password Reset Requested!", + "test-email.subject": "Test e-post", + "password-reset-requested": "Tilbakestilling av passord er påkrevd!", "welcome-to": "Velkommen til %1", "invite": "Invitasjon fra %1", "greeting_no_name": "Hei", "greeting_with_name": "Hei, %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Bekreft e-postadressen din ", + "email.verify.text1": "E-postadressen er endret! ", "welcome.text1": "Takk for at du registrerte deg hos %1!", "welcome.text2": "For å aktivere kontoen din må vi verifisere at du eier e-postadressen du registrerte deg med.", "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": "Your invitation will expire in %1 days.", - "invitation.cta": "Click here to create your account.", + "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:", "reset.cta": "Klikk her for å tilbakestille passordet ditt", @@ -21,34 +21,34 @@ "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": "Top topics from %1", - "digest.popular-topics": "Popular topics from %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.", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", - "digest.subject": "Digest for %1", - "digest.title.day": "Your Daily Digest", - "digest.title.week": "Your Weekly Digest", - "digest.title.month": "Your Monthly Digest", + "digest.day": "Dag", + "digest.week": "Uke", + "digest.month": "Måned", + "digest.subject": "Sammendrag for %1", + "digest.title.day": "Ditt daglige sammendrag", + "digest.title.week": "Ditt ukentlige sammendrag ", + "digest.title.month": "Ditt månedlige sammendrag", "notif.chat.subject": "Ny samtalemelding mottatt fra %1", "notif.chat.cta": "Klikk her for å fortsette samtalen", "notif.chat.unsub.info": "Denne samtale-varselen ble sendt til deg basert på dine innstillinger for abonnering.", "notif.post.unsub.info": "Dette innleggsvarselet ble sendt til deg basert på dine innstillinger for abonnering.", - "notif.post.unsub.one-click": "Alternatively, unsubscribe from future emails like this, by clicking", - "notif.cta": "To the forum", - "notif.cta-new-reply": "View Post", - "notif.cta-new-chat": "View Chat", - "notif.test.short": "Testing Notifications", - "notif.test.long": "This is a test of the notifications email. Send help!", + "notif.post.unsub.one-click": "Alternativt kan du avslutte abonnementet på fremtidige e-poster som dette, ved å klikke", + "notif.cta": "Til forum", + "notif.cta-new-reply": "Vis post", + "notif.cta-new-chat": "Vis chatt", + "notif.test.short": "Testing av varsler ", + "notif.test.long": "Dette er en test av e-postmeldingen. Send hjelp!", "test.text1": "Dette er en test e-post for å verifisere at e-postsystemet i NodeBB fungerer som det skal.", "unsub.cta": "Klikk her for å endre disse innstillingene", - "unsubscribe": "unsubscribe", - "unsub.success": "You will no longer receive emails from the %1 mailing list", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", - "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "unsubscribe": "Avfølg", + "unsub.success": "Du vil ikke lenger motta e-poster fra %1 utsendelseslisten ", + "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/groups.json b/public/language/nb/groups.json index e3d6ff9760..f1526365be 100644 --- a/public/language/nb/groups.json +++ b/public/language/nb/groups.json @@ -24,12 +24,12 @@ "details.has_no_posts": "Medlemmene i denne gruppen har ikke skrevet noen innlegg.", "details.latest_posts": "Seneste innlegg", "details.private": "Privat", - "details.disableJoinRequests": "Disable join requests", - "details.disableLeave": "Disallow users from leaving the group", + "details.disableJoinRequests": "Deaktiver forespørsler om å bli med", + "details.disableLeave": "Tillat brukere å forlate gruppen", "details.grant": "Gi/Opphev Eierskap", "details.kick": "Kast ut", - "details.kick_confirm": "Are you sure you want to remove this member from the group?", - "details.add-member": "Add Member", + "details.kick_confirm": "Er du sikker på at du vil fjerne dette medlemmet fra gruppen?", + "details.add-member": "Legg til medlem", "details.owner_options": "Gruppeadministrasjon", "details.group_name": "Gruppenavn", "details.member_count": "Antall medlemmer", @@ -38,27 +38,27 @@ "details.member-post-cids": "Category IDs to display posts from", "details.badge_preview": "Forhåndsvisning av skilt", "details.change_icon": "Endre ikon", - "details.change_label_colour": "Change Label Colour", - "details.change_text_colour": "Change Text Colour", + "details.change_label_colour": "Endre fargen på etiketten", + "details.change_text_colour": "Endre farge på tekst", "details.badge_text": "Skilt-tekst", "details.userTitleEnabled": "Vis skilt", "details.private_help": "Hvis aktivert, vil medlemskap i grupper kreve godkjennelse fra en gruppeeier", "details.hidden": "Skjult", "details.hidden_help": "Hvis aktivert, vil ikke denne gruppen bli funnet i gruppelisten, og brukere må inviteres manuelt", "details.delete_group": "Slett gruppe", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Private grupper er deaktivert på systemnivå, dette alternativet gjør ikke noe ytterligere ", "event.updated": "Gruppedetaljer har blitt oppdatert", "event.deleted": "Gruppen \"%1\" har blitt slettet", "membership.accept-invitation": "Aksepter invitasjon", - "membership.accept.notification_title": "You are now a member of %1", + "membership.accept.notification_title": "Du er nå et medlem av %1", "membership.invitation-pending": "Invitasjon venter", "membership.join-group": "Bli med i gruppe", "membership.leave-group": "Forlat gruppe", - "membership.leave.notification_title": "%1 has left group %2", + "membership.leave.notification_title": "%1 har forlatt gruppen %2", "membership.reject": "Avslå", "new-group.group_name": "Gruppenavn:", - "upload-group-cover": "Upload group cover", - "bulk-invite-instructions": "Enter a list of comma separated usernames to invite to this group", + "upload-group-cover": "Last opp et deksel for gruppen ", + "bulk-invite-instructions": "Skriv inn en liste over kommaseparerte brukernavn for å invitere til denne gruppen", "bulk-invite": "Bulk Invite", - "remove_group_cover_confirm": "Are you sure you want to remove the cover picture?" + "remove_group_cover_confirm": "Er du sikker på at du vil fjerne omslagsbildet? " } \ No newline at end of file diff --git a/public/language/nb/ip-blacklist.json b/public/language/nb/ip-blacklist.json index 588fbd62b6..5f48821483 100644 --- a/public/language/nb/ip-blacklist.json +++ b/public/language/nb/ip-blacklist.json @@ -1,9 +1,9 @@ { - "lead": "Configure your IP blacklist here.", - "description": "Occasionally, a user account ban is not enough of a deterrant. Other times, restricting access to the forum to a specific IP or a range of IPs is the best way to protect a forum. In these scenarios, you can add troublesome IP addresses or entire CIDR blocks to this blacklist, and they will be prevented from logging in to or registering a new account.", + "lead": "Konfigurer IP-svartelisten din her.", + "description": "Noen ganger er blokkering av brukerkontoer ikke tilstrekkelig avskrekkende. Andre ganger er derfor den beste måten å beskytte et forum på å begrense tilgangen til forumet for en bestemt IP eller en rekke IP-er. I disse scenariene kan du legge til IP-adresser eller hele CIDR-blokker i denne svartelisten, og de vil bli forhindret fra å logge på eller registrere en ny konto.", "active-rules": "Active Rules", - "validate": "Validate Blacklist", - "apply": "Apply Blacklist", + "validate": "Valider svartelisten", + "apply": "Bruk svarteliste", "hints": "Syntax Hints", "hint-1": "Define a single IP addresses per line. You can add IP blocks as long as they follow the CIDR format (e.g. 192.168.100.0/22).", "hint-2": "You can add in comments by starting lines with the # symbol.", @@ -15,5 +15,5 @@ "analytics.blacklist-hourly": "Figure 1 – Blacklist hits per hour", "analytics.blacklist-daily": "Figure 2 – Blacklist hits per day", - "ip-banned": "IP banned" + "ip-banned": "IP er utestengt" } \ No newline at end of file diff --git a/public/language/nb/register.json b/public/language/nb/register.json index 22730f7756..c1aae58d10 100644 --- a/public/language/nb/register.json +++ b/public/language/nb/register.json @@ -18,14 +18,14 @@ "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": "Our average time for approving memberships is %1 hours %2 minutes.", - "registration-queue-auto-approve-time": "Your membership to this forum will be fully activated in up to %1 hours.", - "interstitial.intro": "We require some additional information before we can create your account.", - "interstitial.errors-found": "We could not complete your registration:", - "gdpr_agree_data": "I consent to the collection and processing of my personal information on this website.", - "gdpr_agree_email": "I consent to receive digest and notification emails from this website.", - "gdpr_consent_denied": "You must give consent to this site to collect/process your information, and to send you emails.", - "invite.error-admin-only": "Direct user registration has been disabled. Please contact an administrator for more details.", - "invite.error-invite-only": "Direct user registration has been disabled. You must be invited by an existing user in order to access this forum.", - "invite.error-invalid-data": "The registration data received does not correspond to our records. Please contact an administrator for more details" + "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": "Vi krever litt tilleggsinformasjon før vi kan opprette kontoen din.", + "interstitial.errors-found": "Vi kunne ikke fullføre registreringen:\n ", + "gdpr_agree_data": "Jeg samtykker til innsamling og behandling av min personlige informasjon på dette nettstedet.", + "gdpr_agree_email": "Jeg samtykker i å motta forumsammendrag og varsler på e-postmeldinger fra dette nettstedet. ", + "gdpr_consent_denied": "Du må gi samtykke til at dette nettstedet kan samle inn / behandle informasjonen din, og til å sende deg e-post. ", + "invite.error-admin-only": "Direkte brukerregistrering er deaktivert. Kontakt en administrator for mer informasjon. ", + "invite.error-invite-only": "Direkte brukerregistrering er deaktivert. Du må bli invitert av en eksisterende bruker for å få tilgang til dette forumet. ", + "invite.error-invalid-data": "Registrerte data som mottas samsvarer ikke med registrene våre. Kontakt en administrator for mer informasjon." } \ No newline at end of file diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 8d1f4fa7b9..27374b15ab 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -89,13 +89,13 @@ "file-too-big": "Слишком большой файл. Максимальный размер: %1 Кбайт.", "guest-upload-disabled": "Загрузка файлов для гостей отключена. Чтобы загрузить файл, пожалуйста, войдите или зарегистрируйтесь на сайте.", "cors-error": "Невозможно загрузить изображение из-за некорректного CORS", - "upload-ratelimit-reached": "You have uploaded too many files at one time. Please try again later.", - "scheduling-to-past": "Please select a date in the future.", - "invalid-schedule-date": "Please enter a valid date and time.", - "cant-pin-scheduled": "Scheduled topics cannot be (un)pinned.", - "cant-merge-scheduled": "Scheduled topics cannot be merged.", - "cant-move-posts-to-scheduled": "Can't move posts to a scheduled topic.", - "cant-move-from-scheduled-to-existing": "Can't move posts from a scheduled topic to an existing topic.", + "upload-ratelimit-reached": "Вы загрузили слишком много файлов за один раз. Пожалуйста, повторите попытку позже.", + "scheduling-to-past": "Пожалуйста, выберите дату в будущем", + "invalid-schedule-date": "Пожалуйста, выберите нужную дату и время", + "cant-pin-scheduled": "Запланированные темы нельзя закрепить или открепить.", + "cant-merge-scheduled": "Запланированные темы не могут быть объединены.", + "cant-move-posts-to-scheduled": "Невозможно переместить сообщения в запланированную тему.", + "cant-move-from-scheduled-to-existing": "Невозможно переместить сообщения из запланированной темы в существующую тему.", "already-bookmarked": "Вы уже добавили это сообщение в закладки", "already-unbookmarked": "Вы уже удалили это сообщение из закладок", "cant-ban-other-admins": "Вы не можете заблокировать других администраторов!", diff --git a/public/language/ru/modules.json b/public/language/ru/modules.json index 80263443e1..3ed9b99f97 100644 --- a/public/language/ru/modules.json +++ b/public/language/ru/modules.json @@ -60,11 +60,11 @@ "composer.zen_mode": "Полноэкранный режим", "composer.select_category": "Выберите категорию", "composer.textarea.placeholder": "Введите содержание вашего сообщения здесь, перетащите изображения", - "composer.schedule-for": "Schedule topic for", - "composer.schedule-date": "Date", - "composer.schedule-time": "Time", - "composer.cancel-scheduling": "Cancel Scheduling", - "composer.set-schedule-date": "Set Date", + "composer.schedule-for": "Установить дату публикации", + "composer.schedule-date": "Дата", + "composer.schedule-time": "Время", + "composer.cancel-scheduling": "Отменить отложенную публикацию", + "composer.set-schedule-date": "Установить дату", "bootbox.ok": "ОК", "bootbox.cancel": "Отмена", "bootbox.confirm": "Подтвердить", diff --git a/public/language/ru/topic.json b/public/language/ru/topic.json index 1ea7b81c62..15d7c6236b 100644 --- a/public/language/ru/topic.json +++ b/public/language/ru/topic.json @@ -31,7 +31,7 @@ "locked": "Закрыта", "pinned": "Прикреплена", "pinned-with-expiry": "Закреплен до %1", - "scheduled": "Scheduled", + "scheduled": "Запланировано", "moved": "Перенесена", "moved-from": "Перенесено с %1", "copy-ip": "Копировать IP", @@ -135,7 +135,7 @@ "composer.handle_placeholder": "Введите ваше имя здесь", "composer.discard": "Отменить", "composer.submit": "Отправить", - "composer.schedule": "Schedule", + "composer.schedule": "Запланировать", "composer.replying_to": "Ответ %1", "composer.new_topic": "Создать тему", "composer.editing": "Редактирование \"%1\"",